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"
74#include <algorithm>
75#include <cassert>
76#include <cstdint>
77#include <cstdlib>
78#include <limits>
79#include <optional>
80#include <string>
81#include <utility>
82#include <vector>
83
84using namespace llvm;
85using namespace llvm::SDPatternMatch;
86
87/// makeVTList - Return an instance of the SDVTList struct initialized with the
88/// specified members.
89static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
90 SDVTList Res = {VTs, NumVTs};
91 return Res;
92}
93
94// Default null implementations of the callbacks.
98
99void SelectionDAG::DAGNodeDeletedListener::anchor() {}
100void SelectionDAG::DAGNodeInsertedListener::anchor() {}
101
102#define DEBUG_TYPE "selectiondag"
103
104static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
105 cl::Hidden, cl::init(true),
106 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
107
108static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
109 cl::desc("Number limit for gluing ld/st of memcpy."),
110 cl::Hidden, cl::init(0));
111
113 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
114 cl::desc("DAG combiner limit number of steps when searching DAG "
115 "for predecessor nodes"));
116
118 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
119}
120
122
123//===----------------------------------------------------------------------===//
124// ConstantFPSDNode Class
125//===----------------------------------------------------------------------===//
126
127/// isExactlyValue - We don't rely on operator== working on double values, as
128/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
129/// As such, this method can be used to do an exact bit-for-bit comparison of
130/// two floating point values.
132 return getValueAPF().bitwiseIsEqual(V);
133}
134
136 const APFloat& Val) {
137 assert(VT.isFloatingPoint() && "Can only convert between FP types");
138
139 // convert modifies in place, so make a copy.
140 APFloat Val2 = APFloat(Val);
141 bool losesInfo;
143 &losesInfo);
144 return !losesInfo;
145}
146
147//===----------------------------------------------------------------------===//
148// ISD Namespace
149//===----------------------------------------------------------------------===//
150
151bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
152 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
153 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
154 unsigned EltSize =
155 N->getValueType(0).getVectorElementType().getSizeInBits();
156 SplatVal = OptAPInt->trunc(EltSize);
157 return true;
158 }
159 }
160
161 auto *BV = dyn_cast<BuildVectorSDNode>(N);
162 if (!BV)
163 return false;
164
165 APInt SplatUndef;
166 unsigned SplatBitSize;
167 bool HasUndefs;
168 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
169 // Endianness does not matter here. We are checking for a splat given the
170 // element size of the vector, and if we find such a splat for little endian
171 // layout, then that should be valid also for big endian (as the full vector
172 // size is known to be a multiple of the element size).
173 const bool IsBigEndian = false;
174 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
175 EltSize, IsBigEndian) &&
176 EltSize == SplatBitSize;
177}
178
179// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
180// specializations of the more general isConstantSplatVector()?
181
182bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
183 // Look through a bit convert.
184 while (N->getOpcode() == ISD::BITCAST)
185 N = N->getOperand(0).getNode();
186
187 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
188 APInt SplatVal;
189 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
190 }
191
192 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
193
194 unsigned i = 0, e = N->getNumOperands();
195
196 // Skip over all of the undef values.
197 while (i != e && N->getOperand(i).isUndef())
198 ++i;
199
200 // Do not accept an all-undef vector.
201 if (i == e) return false;
202
203 // Do not accept build_vectors that aren't all constants or which have non-~0
204 // elements. We have to be a bit careful here, as the type of the constant
205 // may not be the same as the type of the vector elements due to type
206 // legalization (the elements are promoted to a legal type for the target and
207 // a vector of a type may be legal when the base element type is not).
208 // We only want to check enough bits to cover the vector elements, because
209 // we care if the resultant vector is all ones, not whether the individual
210 // constants are.
211 SDValue NotZero = N->getOperand(i);
212 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
213 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
214 if (OptAPInt->countr_one() < EltSize)
215 return false;
216 } else
217 return false;
218
219 // Okay, we have at least one ~0 value, check to see if the rest match or are
220 // undefs. Even with the above element type twiddling, this should be OK, as
221 // the same type legalization should have applied to all the elements.
222 for (++i; i != e; ++i)
223 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
224 return false;
225 return true;
226}
227
228bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
229 // Look through a bit convert.
230 while (N->getOpcode() == ISD::BITCAST)
231 N = N->getOperand(0).getNode();
232
233 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
234 APInt SplatVal;
235 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
236 }
237
238 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
239
240 bool IsAllUndef = true;
241 for (const SDValue &Op : N->op_values()) {
242 if (Op.isUndef())
243 continue;
244 IsAllUndef = false;
245 // Do not accept build_vectors that aren't all constants or which have non-0
246 // elements. We have to be a bit careful here, as the type of the constant
247 // may not be the same as the type of the vector elements due to type
248 // legalization (the elements are promoted to a legal type for the target
249 // and a vector of a type may be legal when the base element type is not).
250 // We only want to check enough bits to cover the vector elements, because
251 // we care if the resultant vector is all zeros, not whether the individual
252 // constants are.
253 if (auto OptAPInt = Op->bitcastToAPInt()) {
254 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
255 if (OptAPInt->countr_zero() < EltSize)
256 return false;
257 } else
258 return false;
259 }
260
261 // Do not accept an all-undef vector.
262 if (IsAllUndef)
263 return false;
264 return true;
265}
266
268 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
269}
270
272 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
273}
274
276 if (N->getOpcode() != ISD::BUILD_VECTOR)
277 return false;
278
279 for (const SDValue &Op : N->op_values()) {
280 if (Op.isUndef())
281 continue;
283 return false;
284 }
285 return true;
286}
287
289 if (N->getOpcode() != ISD::BUILD_VECTOR)
290 return false;
291
292 for (const SDValue &Op : N->op_values()) {
293 if (Op.isUndef())
294 continue;
296 return false;
297 }
298 return true;
299}
300
301bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
302 bool Signed) {
303 assert(N->getValueType(0).isVector() && "Expected a vector!");
304
305 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
306 if (EltSize <= NewEltSize)
307 return false;
308
309 if (N->getOpcode() == ISD::ZERO_EXTEND) {
310 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
311 NewEltSize) &&
312 !Signed;
313 }
314 if (N->getOpcode() == ISD::SIGN_EXTEND) {
315 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
316 NewEltSize) &&
317 Signed;
318 }
319 if (N->getOpcode() != ISD::BUILD_VECTOR)
320 return false;
321
322 for (const SDValue &Op : N->op_values()) {
323 if (Op.isUndef())
324 continue;
326 return false;
327
328 APInt C = Op->getAsAPIntVal().trunc(EltSize);
329 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
330 return false;
331 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
332 return false;
333 }
334
335 return true;
336}
337
339 // Return false if the node has no operands.
340 // This is "logically inconsistent" with the definition of "all" but
341 // is probably the desired behavior.
342 if (N->getNumOperands() == 0)
343 return false;
344 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
345}
346
348 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
349}
350
351template <typename ConstNodeType>
353 std::function<bool(ConstNodeType *)> Match,
354 bool AllowUndefs, bool AllowTruncation) {
355 // FIXME: Add support for scalar UNDEF cases?
356 if (auto *C = dyn_cast<ConstNodeType>(Op))
357 return Match(C);
358
359 // FIXME: Add support for vector UNDEF cases?
360 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
361 ISD::SPLAT_VECTOR != Op.getOpcode())
362 return false;
363
364 EVT SVT = Op.getValueType().getScalarType();
365 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
366 if (AllowUndefs && Op.getOperand(i).isUndef()) {
367 if (!Match(nullptr))
368 return false;
369 continue;
370 }
371
372 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
373 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
374 !Match(Cst))
375 return false;
376 }
377 return true;
378}
379// Build used template types.
381 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
383 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
384
386 SDValue LHS, SDValue RHS,
387 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
388 bool AllowUndefs, bool AllowTypeMismatch) {
389 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
390 return false;
391
392 // TODO: Add support for scalar UNDEF cases?
393 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
394 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
395 return Match(LHSCst, RHSCst);
396
397 // TODO: Add support for vector UNDEF cases?
398 if (LHS.getOpcode() != RHS.getOpcode() ||
399 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
400 LHS.getOpcode() != ISD::SPLAT_VECTOR))
401 return false;
402
403 EVT SVT = LHS.getValueType().getScalarType();
404 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
405 SDValue LHSOp = LHS.getOperand(i);
406 SDValue RHSOp = RHS.getOperand(i);
407 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
408 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
409 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
410 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
411 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
412 return false;
413 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
414 LHSOp.getValueType() != RHSOp.getValueType()))
415 return false;
416 if (!Match(LHSCst, RHSCst))
417 return false;
418 }
419 return true;
420}
421
423 switch (MinMaxOpc) {
424 default:
425 llvm_unreachable("unrecognized opcode");
426 case ISD::UMIN:
427 return ISD::UMAX;
428 case ISD::UMAX:
429 return ISD::UMIN;
430 case ISD::SMIN:
431 return ISD::SMAX;
432 case ISD::SMAX:
433 return ISD::SMIN;
434 }
435}
436
438 switch (MinMaxOpc) {
439 default:
440 llvm_unreachable("unrecognized min/max opcode");
441 case ISD::SMIN:
442 return ISD::UMIN;
443 case ISD::SMAX:
444 return ISD::UMAX;
445 case ISD::UMIN:
446 return ISD::SMIN;
447 case ISD::UMAX:
448 return ISD::SMAX;
449 }
450}
451
453 switch (VecReduceOpcode) {
454 default:
455 llvm_unreachable("Expected VECREDUCE opcode");
458 case ISD::VP_REDUCE_FADD:
459 case ISD::VP_REDUCE_SEQ_FADD:
460 return ISD::FADD;
463 case ISD::VP_REDUCE_FMUL:
464 case ISD::VP_REDUCE_SEQ_FMUL:
465 return ISD::FMUL;
467 case ISD::VP_REDUCE_ADD:
468 return ISD::ADD;
470 case ISD::VP_REDUCE_MUL:
471 return ISD::MUL;
473 case ISD::VP_REDUCE_AND:
474 return ISD::AND;
476 case ISD::VP_REDUCE_OR:
477 return ISD::OR;
479 case ISD::VP_REDUCE_XOR:
480 return ISD::XOR;
482 case ISD::VP_REDUCE_SMAX:
483 return ISD::SMAX;
485 case ISD::VP_REDUCE_SMIN:
486 return ISD::SMIN;
488 case ISD::VP_REDUCE_UMAX:
489 return ISD::UMAX;
491 case ISD::VP_REDUCE_UMIN:
492 return ISD::UMIN;
494 case ISD::VP_REDUCE_FMAX:
495 return ISD::FMAXNUM;
497 case ISD::VP_REDUCE_FMIN:
498 return ISD::FMINNUM;
500 case ISD::VP_REDUCE_FMAXIMUM:
501 return ISD::FMAXIMUM;
503 case ISD::VP_REDUCE_FMINIMUM:
504 return ISD::FMINIMUM;
505 }
506}
507
509 switch (MaskedOpc) {
510 case ISD::MASKED_UDIV:
511 return ISD::UDIV;
512 case ISD::MASKED_SDIV:
513 return ISD::SDIV;
514 case ISD::MASKED_UREM:
515 return ISD::UREM;
516 case ISD::MASKED_SREM:
517 return ISD::SREM;
518 default:
519 llvm_unreachable("Expected masked binop opcode");
520 }
521}
522
523bool ISD::isVPOpcode(unsigned Opcode) {
524 switch (Opcode) {
525 default:
526 return false;
527#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
528 case ISD::VPSD: \
529 return true;
530#include "llvm/IR/VPIntrinsics.def"
531 }
532}
533
534bool ISD::isVPBinaryOp(unsigned Opcode) {
535 switch (Opcode) {
536 default:
537 break;
538#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
539#define VP_PROPERTY_BINARYOP return true;
540#define END_REGISTER_VP_SDNODE(VPSD) break;
541#include "llvm/IR/VPIntrinsics.def"
542 }
543 return false;
544}
545
546bool ISD::isVPReduction(unsigned Opcode) {
547 switch (Opcode) {
548 default:
549 return false;
550 case ISD::VP_REDUCE_ADD:
551 case ISD::VP_REDUCE_MUL:
552 case ISD::VP_REDUCE_AND:
553 case ISD::VP_REDUCE_OR:
554 case ISD::VP_REDUCE_XOR:
555 case ISD::VP_REDUCE_SMAX:
556 case ISD::VP_REDUCE_SMIN:
557 case ISD::VP_REDUCE_UMAX:
558 case ISD::VP_REDUCE_UMIN:
559 case ISD::VP_REDUCE_FMAX:
560 case ISD::VP_REDUCE_FMIN:
561 case ISD::VP_REDUCE_FMAXIMUM:
562 case ISD::VP_REDUCE_FMINIMUM:
563 case ISD::VP_REDUCE_FADD:
564 case ISD::VP_REDUCE_FMUL:
565 case ISD::VP_REDUCE_SEQ_FADD:
566 case ISD::VP_REDUCE_SEQ_FMUL:
567 return true;
568 }
569}
570
571/// The operand position of the vector mask.
572std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
573 switch (Opcode) {
574 default:
575 return std::nullopt;
576#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
577 case ISD::VPSD: \
578 return MASKPOS;
579#include "llvm/IR/VPIntrinsics.def"
580 }
581}
582
583/// The operand position of the explicit vector length parameter.
584std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
585 switch (Opcode) {
586 default:
587 return std::nullopt;
588#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
589 case ISD::VPSD: \
590 return EVLPOS;
591#include "llvm/IR/VPIntrinsics.def"
592 }
593}
594
595std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
596 bool hasFPExcept) {
597 // FIXME: Return strict opcodes in case of fp exceptions.
598 switch (VPOpcode) {
599 default:
600 return std::nullopt;
601#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
602#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
603#define END_REGISTER_VP_SDNODE(VPOPC) break;
604#include "llvm/IR/VPIntrinsics.def"
605 }
606 return std::nullopt;
607}
608
609std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
610 switch (Opcode) {
611 default:
612 return std::nullopt;
613#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
614#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
615#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
616#include "llvm/IR/VPIntrinsics.def"
617 }
618}
619
621 switch (ExtType) {
622 case ISD::EXTLOAD:
623 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
624 case ISD::SEXTLOAD:
625 return ISD::SIGN_EXTEND;
626 case ISD::ZEXTLOAD:
627 return ISD::ZERO_EXTEND;
628 default:
629 break;
630 }
631
632 llvm_unreachable("Invalid LoadExtType");
633}
634
636 // To perform this operation, we just need to swap the L and G bits of the
637 // operation.
638 unsigned OldL = (Operation >> 2) & 1;
639 unsigned OldG = (Operation >> 1) & 1;
640 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
641 (OldL << 1) | // New G bit
642 (OldG << 2)); // New L bit.
643}
644
646 unsigned Operation = Op;
647 if (isIntegerLike)
648 Operation ^= 7; // Flip L, G, E bits, but not U.
649 else
650 Operation ^= 15; // Flip all of the condition bits.
651
653 Operation &= ~8; // Don't let N and U bits get set.
654
655 return ISD::CondCode(Operation);
656}
657
661
663 bool isIntegerLike) {
664 return getSetCCInverseImpl(Op, isIntegerLike);
665}
666
667/// For an integer comparison, return 1 if the comparison is a signed operation
668/// and 2 if the result is an unsigned comparison. Return zero if the operation
669/// does not depend on the sign of the input (setne and seteq).
670static int isSignedOp(ISD::CondCode Opcode) {
671 switch (Opcode) {
672 default: llvm_unreachable("Illegal integer setcc operation!");
673 case ISD::SETEQ:
674 case ISD::SETNE: return 0;
675 case ISD::SETLT:
676 case ISD::SETLE:
677 case ISD::SETGT:
678 case ISD::SETGE: return 1;
679 case ISD::SETULT:
680 case ISD::SETULE:
681 case ISD::SETUGT:
682 case ISD::SETUGE: return 2;
683 }
684}
685
687 EVT Type) {
688 bool IsInteger = Type.isInteger();
689 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
690 // Cannot fold a signed integer setcc with an unsigned integer setcc.
691 return ISD::SETCC_INVALID;
692
693 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
694
695 // If the N and U bits get set, then the resultant comparison DOES suddenly
696 // care about orderedness, and it is true when ordered.
697 if (Op > ISD::SETTRUE2)
698 Op &= ~16; // Clear the U bit if the N bit is set.
699
700 // Canonicalize illegal integer setcc's.
701 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
702 Op = ISD::SETNE;
703
704 return ISD::CondCode(Op);
705}
706
708 EVT Type) {
709 bool IsInteger = Type.isInteger();
710 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
711 // Cannot fold a signed setcc with an unsigned setcc.
712 return ISD::SETCC_INVALID;
713
714 // Combine all of the condition bits.
715 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
716
717 // Canonicalize illegal integer setcc's.
718 if (IsInteger) {
719 switch (Result) {
720 default: break;
721 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
722 case ISD::SETOEQ: // SETEQ & SETU[LG]E
723 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
724 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
725 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
726 }
727 }
728
729 return Result;
730}
731
732//===----------------------------------------------------------------------===//
733// SDNode Profile Support
734//===----------------------------------------------------------------------===//
735
736/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
737static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
738 ID.AddInteger(OpC);
739}
740
741/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
742/// solely with their pointer.
744 ID.AddPointer(VTList.VTs);
745}
746
747/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
750 for (const auto &Op : Ops) {
751 ID.AddPointer(Op.getNode());
752 ID.AddInteger(Op.getResNo());
753 }
754}
755
756/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
759 for (const auto &Op : Ops) {
760 ID.AddPointer(Op.getNode());
761 ID.AddInteger(Op.getResNo());
762 }
763}
764
765static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
766 SDVTList VTList, ArrayRef<SDValue> OpList) {
767 AddNodeIDOpcode(ID, OpC);
768 AddNodeIDValueTypes(ID, VTList);
769 AddNodeIDOperands(ID, OpList);
770}
771
772/// If this is an SDNode with special info, add this info to the NodeID data.
774 switch (N->getOpcode()) {
777 case ISD::MCSymbol:
778 llvm_unreachable("Should only be used on nodes with operands");
779 default: break; // Normal nodes don't need extra info.
781 case ISD::Constant: {
783 ID.AddPointer(C->getConstantIntValue());
784 ID.AddBoolean(C->isOpaque());
785 break;
786 }
788 case ISD::ConstantFP:
789 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
790 break;
796 ID.AddPointer(GA->getGlobal());
797 ID.AddInteger(GA->getOffset());
798 ID.AddInteger(GA->getTargetFlags());
799 break;
800 }
801 case ISD::BasicBlock:
803 break;
804 case ISD::Register:
805 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
806 break;
808 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
809 break;
810 case ISD::SRCVALUE:
811 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
812 break;
813 case ISD::FrameIndex:
815 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
816 break;
818 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
819 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
820 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
821 break;
822 case ISD::JumpTable:
824 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
825 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
826 break;
830 ID.AddInteger(CP->getAlign().value());
831 ID.AddInteger(CP->getOffset());
834 else
835 ID.AddPointer(CP->getConstVal());
836 ID.AddInteger(CP->getTargetFlags());
837 break;
838 }
839 case ISD::TargetIndex: {
841 ID.AddInteger(TI->getIndex());
842 ID.AddInteger(TI->getOffset());
843 ID.AddInteger(TI->getTargetFlags());
844 break;
845 }
846 case ISD::LOAD: {
847 const LoadSDNode *LD = cast<LoadSDNode>(N);
848 ID.AddInteger(LD->getMemoryVT().getRawBits());
849 ID.AddInteger(LD->getRawSubclassData());
850 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(LD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::STORE: {
855 const StoreSDNode *ST = cast<StoreSDNode>(N);
856 ID.AddInteger(ST->getMemoryVT().getRawBits());
857 ID.AddInteger(ST->getRawSubclassData());
858 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
859 ID.AddInteger(ST->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_LOAD: {
863 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
864 ID.AddInteger(ELD->getMemoryVT().getRawBits());
865 ID.AddInteger(ELD->getRawSubclassData());
866 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
867 ID.AddInteger(ELD->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::VP_LOAD_FF: {
871 const auto *LD = cast<VPLoadFFSDNode>(N);
872 ID.AddInteger(LD->getMemoryVT().getRawBits());
873 ID.AddInteger(LD->getRawSubclassData());
874 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
875 ID.AddInteger(LD->getMemOperand()->getFlags());
876 break;
877 }
878 case ISD::VP_STORE: {
879 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
880 ID.AddInteger(EST->getMemoryVT().getRawBits());
881 ID.AddInteger(EST->getRawSubclassData());
882 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
883 ID.AddInteger(EST->getMemOperand()->getFlags());
884 break;
885 }
886 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
888 ID.AddInteger(SLD->getMemoryVT().getRawBits());
889 ID.AddInteger(SLD->getRawSubclassData());
890 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
891 break;
892 }
893 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
895 ID.AddInteger(SST->getMemoryVT().getRawBits());
896 ID.AddInteger(SST->getRawSubclassData());
897 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
898 break;
899 }
900 case ISD::VP_GATHER: {
902 ID.AddInteger(EG->getMemoryVT().getRawBits());
903 ID.AddInteger(EG->getRawSubclassData());
904 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
905 ID.AddInteger(EG->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::VP_SCATTER: {
910 ID.AddInteger(ES->getMemoryVT().getRawBits());
911 ID.AddInteger(ES->getRawSubclassData());
912 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
913 ID.AddInteger(ES->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MLOAD: {
918 ID.AddInteger(MLD->getMemoryVT().getRawBits());
919 ID.AddInteger(MLD->getRawSubclassData());
920 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MLD->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSTORE: {
926 ID.AddInteger(MST->getMemoryVT().getRawBits());
927 ID.AddInteger(MST->getRawSubclassData());
928 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MST->getMemOperand()->getFlags());
930 break;
931 }
932 case ISD::MGATHER: {
934 ID.AddInteger(MG->getMemoryVT().getRawBits());
935 ID.AddInteger(MG->getRawSubclassData());
936 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
937 ID.AddInteger(MG->getMemOperand()->getFlags());
938 break;
939 }
940 case ISD::MSCATTER: {
942 ID.AddInteger(MS->getMemoryVT().getRawBits());
943 ID.AddInteger(MS->getRawSubclassData());
944 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
945 ID.AddInteger(MS->getMemOperand()->getFlags());
946 break;
947 }
950 case ISD::ATOMIC_SWAP:
962 case ISD::ATOMIC_LOAD:
963 case ISD::ATOMIC_STORE: {
964 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
965 ID.AddInteger(AT->getMemoryVT().getRawBits());
966 ID.AddInteger(AT->getRawSubclassData());
967 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
968 ID.AddInteger(AT->getMemOperand()->getFlags());
969 break;
970 }
971 case ISD::VECTOR_SHUFFLE: {
972 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
973 for (int M : Mask)
974 ID.AddInteger(M);
975 break;
976 }
977 case ISD::ADDRSPACECAST: {
979 ID.AddInteger(ASC->getSrcAddressSpace());
980 ID.AddInteger(ASC->getDestAddressSpace());
981 break;
982 }
984 case ISD::BlockAddress: {
986 ID.AddPointer(BA->getBlockAddress());
987 ID.AddInteger(BA->getOffset());
988 ID.AddInteger(BA->getTargetFlags());
989 break;
990 }
991 case ISD::AssertAlign:
992 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
993 break;
994 case ISD::PREFETCH:
997 // Handled by MemIntrinsicSDNode check after the switch.
998 break;
1000 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
1001 break;
1002 } // end switch (N->getOpcode())
1003
1004 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
1005 // to check.
1006 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
1007 ID.AddInteger(MN->getRawSubclassData());
1008 ID.AddInteger(MN->getMemoryVT().getRawBits());
1009 for (const MachineMemOperand *MMO : MN->memoperands()) {
1010 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
1011 ID.AddInteger(MMO->getFlags());
1012 }
1013 }
1014}
1015
1016/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1017/// data.
1019 AddNodeIDOpcode(ID, N->getOpcode());
1020 // Add the return value info.
1021 AddNodeIDValueTypes(ID, N->getVTList());
1022 // Add the operand info.
1023 AddNodeIDOperands(ID, N->ops());
1024
1025 // Handle SDNode leafs with special info.
1027}
1028
1029//===----------------------------------------------------------------------===//
1030// SelectionDAG Class
1031//===----------------------------------------------------------------------===//
1032
1033/// doNotCSE - Return true if CSE should not be performed for this node.
1034static bool doNotCSE(SDNode *N) {
1035 if (N->getValueType(0) == MVT::Glue)
1036 return true; // Never CSE anything that produces a glue result.
1037
1038 switch (N->getOpcode()) {
1039 default: break;
1040 case ISD::HANDLENODE:
1041 case ISD::EH_LABEL:
1042 return true; // Never CSE these nodes.
1043 }
1044
1045 // Check that remaining values produced are not flags.
1046 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1047 if (N->getValueType(i) == MVT::Glue)
1048 return true; // Never CSE anything that produces a glue result.
1049
1050 return false;
1051}
1052
1053/// Construct a DemandedElts mask which demands all elements of \p V.
1054/// If \p V is not a fixed-length vector, then this will return a single bit.
1056 EVT VT = V.getValueType();
1057 // Since the number of lanes in a scalable vector is unknown at compile time,
1058 // we track one bit which is implicitly broadcast to all lanes. This means
1059 // that all lanes in a scalable vector are considered demanded.
1061 : APInt(1, 1);
1062}
1063
1064/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1065/// SelectionDAG.
1067 // Create a dummy node (which is not added to allnodes), that adds a reference
1068 // to the root node, preventing it from being deleted.
1069 HandleSDNode Dummy(getRoot());
1070
1071 SmallVector<SDNode*, 128> DeadNodes;
1072
1073 // Add all obviously-dead nodes to the DeadNodes worklist.
1074 for (SDNode &Node : allnodes())
1075 if (Node.use_empty())
1076 DeadNodes.push_back(&Node);
1077
1078 RemoveDeadNodes(DeadNodes);
1079
1080 // If the root changed (e.g. it was a dead load, update the root).
1081 setRoot(Dummy.getValue());
1082}
1083
1084/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1085/// given list, and any nodes that become unreachable as a result.
1087
1088 // Process the worklist, deleting the nodes and adding their uses to the
1089 // worklist.
1090 while (!DeadNodes.empty()) {
1091 SDNode *N = DeadNodes.pop_back_val();
1092 // Skip to next node if we've already managed to delete the node. This could
1093 // happen if replacing a node causes a node previously added to the node to
1094 // be deleted.
1095 if (N->getOpcode() == ISD::DELETED_NODE)
1096 continue;
1097
1098 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1099 DUL->NodeDeleted(N, nullptr);
1100
1101 // Take the node out of the appropriate CSE map.
1102 RemoveNodeFromCSEMaps(N);
1103
1104 // Next, brutally remove the operand list. This is safe to do, as there are
1105 // no cycles in the graph.
1106 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1107 SDUse &Use = *I++;
1108 SDNode *Operand = Use.getNode();
1109 Use.set(SDValue());
1110
1111 // Now that we removed this operand, see if there are no uses of it left.
1112 if (Operand->use_empty())
1113 DeadNodes.push_back(Operand);
1114 }
1115
1116 DeallocateNode(N);
1117 }
1118}
1119
1121 SmallVector<SDNode*, 16> DeadNodes(1, N);
1122
1123 // Create a dummy node that adds a reference to the root node, preventing
1124 // it from being deleted. (This matters if the root is an operand of the
1125 // dead node.)
1126 HandleSDNode Dummy(getRoot());
1127
1128 RemoveDeadNodes(DeadNodes);
1129}
1130
1132 // First take this out of the appropriate CSE map.
1133 RemoveNodeFromCSEMaps(N);
1134
1135 // Finally, remove uses due to operands of this node, remove from the
1136 // AllNodes list, and delete the node.
1137 DeleteNodeNotInCSEMaps(N);
1138}
1139
1140void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1141 assert(N->getIterator() != AllNodes.begin() &&
1142 "Cannot delete the entry node!");
1143 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1144
1145 // Drop all of the operands and decrement used node's use counts.
1146 N->DropOperands();
1147
1148 DeallocateNode(N);
1149}
1150
1151void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1152 assert(!(V->isVariadic() && isParameter));
1153 if (isParameter)
1154 ByvalParmDbgValues.push_back(V);
1155 else
1156 DbgValues.push_back(V);
1157 for (const SDNode *Node : V->getSDNodes())
1158 if (Node)
1159 DbgValMap[Node].push_back(V);
1160}
1161
1163 DbgValMapType::iterator I = DbgValMap.find(Node);
1164 if (I == DbgValMap.end())
1165 return;
1166 for (auto &Val: I->second)
1167 Val->setIsInvalidated();
1168 DbgValMap.erase(I);
1169}
1170
1171void SelectionDAG::DeallocateNode(SDNode *N) {
1172 // If we have operands, deallocate them.
1174
1175 NodeAllocator.Deallocate(AllNodes.remove(N));
1176
1177 // Set the opcode to DELETED_NODE to help catch bugs when node
1178 // memory is reallocated.
1179 // FIXME: There are places in SDag that have grown a dependency on the opcode
1180 // value in the released node.
1181 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1182 N->NodeType = ISD::DELETED_NODE;
1183
1184 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1185 // them and forget about that node.
1186 DbgInfo->erase(N);
1187
1188 // Invalidate extra info.
1189 SDEI.erase(N);
1190}
1191
1192#ifndef NDEBUG
1193/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1194void SelectionDAG::verifyNode(SDNode *N) const {
1195 switch (N->getOpcode()) {
1196 default:
1197 if (N->isTargetOpcode())
1199 break;
1200 case ISD::BUILD_PAIR: {
1201 EVT VT = N->getValueType(0);
1202 assert(N->getNumValues() == 1 && "Too many results!");
1203 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1204 "Wrong return type!");
1205 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1206 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1207 "Mismatched operand types!");
1208 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1209 "Wrong operand type!");
1210 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1211 "Wrong return type size");
1212 break;
1213 }
1214 case ISD::BUILD_VECTOR: {
1215 assert(N->getNumValues() == 1 && "Too many results!");
1216 assert(N->getValueType(0).isVector() && "Wrong return type!");
1217 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1218 "Wrong number of operands!");
1219 EVT EltVT = N->getValueType(0).getVectorElementType();
1220 for (const SDUse &Op : N->ops()) {
1221 assert((Op.getValueType() == EltVT ||
1222 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1223 EltVT.bitsLE(Op.getValueType()))) &&
1224 "Wrong operand type!");
1225 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1226 "Operands must all have the same type");
1227 }
1228 break;
1229 }
1230 case ISD::SADDO:
1231 case ISD::UADDO:
1232 case ISD::SSUBO:
1233 case ISD::USUBO:
1234 assert(N->getNumValues() == 2 && "Wrong number of results!");
1235 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1236 "Invalid add/sub overflow op!");
1237 assert(N->getVTList().VTs[0].isInteger() &&
1238 N->getVTList().VTs[1].isInteger() &&
1239 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1240 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1241 "Binary operator types must match!");
1242 break;
1243 }
1244}
1245#endif // NDEBUG
1246
1247/// Insert a newly allocated node into the DAG.
1248///
1249/// Handles insertion into the all nodes list and CSE map, as well as
1250/// verification and other common operations when a new node is allocated.
1251void SelectionDAG::InsertNode(SDNode *N) {
1252 AllNodes.push_back(N);
1253#ifndef NDEBUG
1254 N->PersistentId = NextPersistentId++;
1255 verifyNode(N);
1256#endif
1257 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1258 DUL->NodeInserted(N);
1259}
1260
1261/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1262/// correspond to it. This is useful when we're about to delete or repurpose
1263/// the node. We don't want future request for structurally identical nodes
1264/// to return N anymore.
1265bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1266 bool Erased = false;
1267 switch (N->getOpcode()) {
1268 case ISD::HANDLENODE: return false; // noop.
1269 case ISD::CONDCODE:
1270 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1271 "Cond code doesn't exist!");
1272 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1273 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1274 break;
1276 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1277 break;
1279 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1280 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1281 ESN->getSymbol(), ESN->getTargetFlags()));
1282 break;
1283 }
1284 case ISD::MCSymbol: {
1285 auto *MCSN = cast<MCSymbolSDNode>(N);
1286 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1287 break;
1288 }
1289 case ISD::VALUETYPE: {
1290 EVT VT = cast<VTSDNode>(N)->getVT();
1291 if (VT.isExtended()) {
1292 Erased = ExtendedValueTypeNodes.erase(VT);
1293 } else {
1294 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1295 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1296 }
1297 break;
1298 }
1299 default:
1300 // Remove it from the CSE Map.
1301 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1302 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1303 Erased = CSEMap.RemoveNode(N);
1304 break;
1305 }
1306#ifndef NDEBUG
1307 // Verify that the node was actually in one of the CSE maps, unless it has a
1308 // glue result (which cannot be CSE'd) or is one of the special cases that are
1309 // not subject to CSE.
1310 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1311 !N->isMachineOpcode() && !doNotCSE(N)) {
1312 N->dump(this);
1313 dbgs() << "\n";
1314 llvm_unreachable("Node is not in map!");
1315 }
1316#endif
1317 return Erased;
1318}
1319
1320/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1321/// maps and modified in place. Add it back to the CSE maps, unless an identical
1322/// node already exists, in which case transfer all its users to the existing
1323/// node. This transfer can potentially trigger recursive merging.
1324void
1325SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1326 // For node types that aren't CSE'd, just act as if no identical node
1327 // already exists.
1328 if (!doNotCSE(N)) {
1329 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1330 if (Existing != N) {
1331 // If there was already an existing matching node, use ReplaceAllUsesWith
1332 // to replace the dead one with the existing one. This can cause
1333 // recursive merging of other unrelated nodes down the line.
1334 Existing->intersectFlagsWith(N->getFlags());
1335 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1336 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1337 ReplaceAllUsesWith(N, Existing);
1338
1339 // N is now dead. Inform the listeners and delete it.
1340 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1341 DUL->NodeDeleted(N, Existing);
1342 DeleteNodeNotInCSEMaps(N);
1343 return;
1344 }
1345 }
1346
1347 // If the node doesn't already exist, we updated it. Inform listeners.
1348 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1349 DUL->NodeUpdated(N);
1350}
1351
1352/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1353/// were replaced with those specified. If this node is never memoized,
1354/// return null, otherwise return a pointer to the slot it would take. If a
1355/// node already exists with these operands, the slot will be non-null.
1356SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1357 void *&InsertPos) {
1358 if (doNotCSE(N))
1359 return nullptr;
1360
1361 SDValue Ops[] = { Op };
1362 FoldingSetNodeID ID;
1363 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1365 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1366 if (Node)
1367 Node->intersectFlagsWith(N->getFlags());
1368 return Node;
1369}
1370
1371/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1372/// were replaced with those specified. If this node is never memoized,
1373/// return null, otherwise return a pointer to the slot it would take. If a
1374/// node already exists with these operands, the slot will be non-null.
1375SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1376 SDValue Op1, SDValue Op2,
1377 void *&InsertPos) {
1378 if (doNotCSE(N))
1379 return nullptr;
1380
1381 SDValue Ops[] = { Op1, Op2 };
1382 FoldingSetNodeID ID;
1383 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1385 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1386 if (Node)
1387 Node->intersectFlagsWith(N->getFlags());
1388 return Node;
1389}
1390
1391/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1392/// were replaced with those specified. If this node is never memoized,
1393/// return null, otherwise return a pointer to the slot it would take. If a
1394/// node already exists with these operands, the slot will be non-null.
1395SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1396 void *&InsertPos) {
1397 if (doNotCSE(N))
1398 return nullptr;
1399
1400 FoldingSetNodeID ID;
1401 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1403 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1404 if (Node)
1405 Node->intersectFlagsWith(N->getFlags());
1406 return Node;
1407}
1408
1410 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1411 : VT.getTypeForEVT(*getContext());
1412
1413 return getDataLayout().getABITypeAlign(Ty);
1414}
1415
1416// EntryNode could meaningfully have debug info if we can find it...
1418 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1419 getVTList(MVT::Other, MVT::Glue)),
1420 Root(getEntryNode()) {
1421 InsertNode(&EntryNode);
1422 DbgInfo = new SDDbgInfo();
1423}
1424
1426 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1427 const TargetLibraryInfo *LibraryInfo,
1428 const LibcallLoweringInfo *LibcallsInfo,
1429 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1431 FunctionVarLocs const *VarLocs) {
1432 MF = &NewMF;
1433 SDAGISelPass = PassPtr;
1434 ORE = &NewORE;
1437 LibInfo = LibraryInfo;
1438 Libcalls = LibcallsInfo;
1439 Context = &MF->getFunction().getContext();
1440 UA = NewUA;
1441 PSI = PSIin;
1442 BFI = BFIin;
1443 MMI = &MMIin;
1444 FnVarLocs = VarLocs;
1445}
1446
1448 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1449 allnodes_clear();
1450 OperandRecycler.clear(OperandAllocator);
1451 delete DbgInfo;
1452}
1453
1455 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1456}
1457
1458void SelectionDAG::allnodes_clear() {
1459 assert(&*AllNodes.begin() == &EntryNode);
1460 AllNodes.remove(AllNodes.begin());
1461 while (!AllNodes.empty())
1462 DeallocateNode(&AllNodes.front());
1463#ifndef NDEBUG
1464 NextPersistentId = 0;
1465#endif
1466}
1467
1468SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1469 void *&InsertPos) {
1470 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1471 if (N) {
1472 switch (N->getOpcode()) {
1473 default: break;
1474 case ISD::Constant:
1475 case ISD::ConstantFP:
1476 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1477 "debug location. Use another overload.");
1478 }
1479 }
1480 return N;
1481}
1482
1483SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1484 const SDLoc &DL, void *&InsertPos) {
1485 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1486 if (N) {
1487 switch (N->getOpcode()) {
1488 case ISD::Constant:
1489 case ISD::ConstantFP:
1490 // Erase debug location from the node if the node is used at several
1491 // different places. Do not propagate one location to all uses as it
1492 // will cause a worse single stepping debugging experience.
1493 if (N->getDebugLoc() != DL.getDebugLoc())
1494 N->setDebugLoc(DebugLoc());
1495 break;
1496 default:
1497 // When the node's point of use is located earlier in the instruction
1498 // sequence than its prior point of use, update its debug info to the
1499 // earlier location.
1500 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1501 N->setDebugLoc(DL.getDebugLoc());
1502 break;
1503 }
1504 }
1505 return N;
1506}
1507
1509 allnodes_clear();
1510 OperandRecycler.clear(OperandAllocator);
1511 OperandAllocator.Reset();
1512 CSEMap.clear();
1513
1514 ExtendedValueTypeNodes.clear();
1515 ExternalSymbols.clear();
1516 TargetExternalSymbols.clear();
1517 MCSymbols.clear();
1518 SDEI.clear();
1519 llvm::fill(CondCodeNodes, nullptr);
1520 llvm::fill(ValueTypeNodes, nullptr);
1521
1522 EntryNode.UseList = nullptr;
1523 InsertNode(&EntryNode);
1524 Root = getEntryNode();
1525 DbgInfo->clear();
1526}
1527
1529 return VT.bitsGT(Op.getValueType())
1530 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1531 : getNode(ISD::FP_ROUND, DL, VT, Op,
1532 getIntPtrConstant(0, DL, /*isTarget=*/true));
1533}
1534
1535std::pair<SDValue, SDValue>
1537 const SDLoc &DL, EVT VT) {
1538 assert(!VT.bitsEq(Op.getValueType()) &&
1539 "Strict no-op FP extend/round not allowed.");
1540 SDValue Res =
1541 VT.bitsGT(Op.getValueType())
1542 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1543 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1544 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1545
1546 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1547}
1548
1550 return VT.bitsGT(Op.getValueType()) ?
1551 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1552 getNode(ISD::TRUNCATE, DL, VT, Op);
1553}
1554
1556 return VT.bitsGT(Op.getValueType()) ?
1557 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1558 getNode(ISD::TRUNCATE, DL, VT, Op);
1559}
1560
1562 return VT.bitsGT(Op.getValueType()) ?
1563 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1564 getNode(ISD::TRUNCATE, DL, VT, Op);
1565}
1566
1568 EVT VT) {
1569 assert(!VT.isVector());
1570 auto Type = Op.getValueType();
1571 SDValue DestOp;
1572 if (Type == VT)
1573 return Op;
1574 auto Size = Op.getValueSizeInBits();
1575 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1576 if (DestOp.getValueType() == VT)
1577 return DestOp;
1578
1579 return getAnyExtOrTrunc(DestOp, DL, VT);
1580}
1581
1583 EVT VT) {
1584 assert(!VT.isVector());
1585 auto Type = Op.getValueType();
1586 SDValue DestOp;
1587 if (Type == VT)
1588 return Op;
1589 auto Size = Op.getValueSizeInBits();
1590 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1591 if (DestOp.getValueType() == VT)
1592 return DestOp;
1593
1594 return getSExtOrTrunc(DestOp, DL, VT);
1595}
1596
1598 EVT VT) {
1599 assert(!VT.isVector());
1600 auto Type = Op.getValueType();
1601 SDValue DestOp;
1602 if (Type == VT)
1603 return Op;
1604 auto Size = Op.getValueSizeInBits();
1605 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1606 if (DestOp.getValueType() == VT)
1607 return DestOp;
1608
1609 return getZExtOrTrunc(DestOp, DL, VT);
1610}
1611
1613 EVT OpVT) {
1614 if (VT.bitsLE(Op.getValueType()))
1615 return getNode(ISD::TRUNCATE, SL, VT, Op);
1616
1617 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1618 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1619}
1620
1622 EVT OpVT = Op.getValueType();
1623 assert(VT.isInteger() && OpVT.isInteger() &&
1624 "Cannot getZeroExtendInReg FP types");
1625 assert(VT.isVector() == OpVT.isVector() &&
1626 "getZeroExtendInReg type should be vector iff the operand "
1627 "type is vector!");
1628 assert((!VT.isVector() ||
1630 "Vector element counts must match in getZeroExtendInReg");
1631 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1632 if (OpVT == VT)
1633 return Op;
1634 // TODO: Use computeKnownBits instead of AssertZext.
1635 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1636 ->getVT()
1637 .getScalarType()
1638 .bitsLE(VT.getScalarType()))
1639 return Op;
1641 VT.getScalarSizeInBits());
1642 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1643}
1644
1646 SDValue EVL, const SDLoc &DL,
1647 EVT VT) {
1648 EVT OpVT = Op.getValueType();
1649 assert(VT.isInteger() && OpVT.isInteger() &&
1650 "Cannot getVPZeroExtendInReg FP types");
1651 assert(VT.isVector() && OpVT.isVector() &&
1652 "getVPZeroExtendInReg type and operand type should be vector!");
1654 "Vector element counts must match in getZeroExtendInReg");
1655 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1656 if (OpVT == VT)
1657 return Op;
1659 VT.getScalarSizeInBits());
1660 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1661 EVL);
1662}
1663
1665 // Only unsigned pointer semantics are supported right now. In the future this
1666 // might delegate to TLI to check pointer signedness.
1667 return getZExtOrTrunc(Op, DL, VT);
1668}
1669
1671 // Only unsigned pointer semantics are supported right now. In the future this
1672 // might delegate to TLI to check pointer signedness.
1673 return getZeroExtendInReg(Op, DL, VT);
1674}
1675
1677 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1678}
1679
1680/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1682 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1683}
1684
1686 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1687 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1688}
1689
1691 SDValue Mask, SDValue EVL, EVT VT) {
1692 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1693 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1694}
1695
1697 SDValue Mask, SDValue EVL) {
1698 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1699}
1700
1702 SDValue Mask, SDValue EVL) {
1703 if (VT.bitsGT(Op.getValueType()))
1704 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1705 if (VT.bitsLT(Op.getValueType()))
1706 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1707 return Op;
1708}
1709
1711 EVT OpVT) {
1712 if (!V)
1713 return getConstant(0, DL, VT);
1714
1715 switch (TLI->getBooleanContents(OpVT)) {
1718 return getConstant(1, DL, VT);
1720 return getAllOnesConstant(DL, VT);
1721 }
1722 llvm_unreachable("Unexpected boolean content enum!");
1723}
1724
1726 bool isT, bool isO) {
1727 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1728 DL, VT, isT, isO);
1729}
1730
1732 bool isT, bool isO) {
1733 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1734}
1735
1737 EVT VT, bool isT, bool isO) {
1738 assert(VT.isInteger() && "Cannot create FP integer constant!");
1739
1740 EVT EltVT = VT.getScalarType();
1741 const ConstantInt *Elt = &Val;
1742
1743 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1744 // to-be-splatted scalar ConstantInt.
1745 if (isa<VectorType>(Elt->getType()))
1746 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1747
1748 // In some cases the vector type is legal but the element type is illegal and
1749 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1750 // inserted value (the type does not need to match the vector element type).
1751 // Any extra bits introduced will be truncated away.
1752 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1754 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1755 APInt NewVal;
1756 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1757 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1758 else
1759 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1760 Elt = ConstantInt::get(*getContext(), NewVal);
1761 }
1762 // In other cases the element type is illegal and needs to be expanded, for
1763 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1764 // the value into n parts and use a vector type with n-times the elements.
1765 // Then bitcast to the type requested.
1766 // Legalizing constants too early makes the DAGCombiner's job harder so we
1767 // only legalize if the DAG tells us we must produce legal types.
1768 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1769 TLI->getTypeAction(*getContext(), EltVT) ==
1771 const APInt &NewVal = Elt->getValue();
1772 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1773 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1774
1775 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1776 if (VT.isScalableVector() ||
1777 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1778 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1779 "Can only handle an even split!");
1780 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1781
1782 SmallVector<SDValue, 2> ScalarParts;
1783 for (unsigned i = 0; i != Parts; ++i)
1784 ScalarParts.push_back(getConstant(
1785 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1786 ViaEltVT, isT, isO));
1787
1788 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1789 }
1790
1791 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1792 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1793
1794 // Check the temporary vector is the correct size. If this fails then
1795 // getTypeToTransformTo() probably returned a type whose size (in bits)
1796 // isn't a power-of-2 factor of the requested type size.
1797 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1798
1799 SmallVector<SDValue, 2> EltParts;
1800 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1801 EltParts.push_back(getConstant(
1802 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1803 ViaEltVT, isT, isO));
1804
1805 // EltParts is currently in little endian order. If we actually want
1806 // big-endian order then reverse it now.
1807 if (getDataLayout().isBigEndian())
1808 std::reverse(EltParts.begin(), EltParts.end());
1809
1810 // The elements must be reversed when the element order is different
1811 // to the endianness of the elements (because the BITCAST is itself a
1812 // vector shuffle in this situation). However, we do not need any code to
1813 // perform this reversal because getConstant() is producing a vector
1814 // splat.
1815 // This situation occurs in MIPS MSA.
1816
1818 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1819 llvm::append_range(Ops, EltParts);
1820
1821 SDValue V =
1822 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1823 return V;
1824 }
1825
1826 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1827 "APInt size does not match type size!");
1828 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1829 SDVTList VTs = getVTList(EltVT);
1831 AddNodeIDNode(ID, Opc, VTs, {});
1832 ID.AddPointer(Elt);
1833 ID.AddBoolean(isO);
1834 void *IP = nullptr;
1835 SDNode *N = nullptr;
1836 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1837 if (!VT.isVector())
1838 return SDValue(N, 0);
1839
1840 if (!N) {
1841 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1842 if (!isT)
1843 N->setDebugLoc(DL.getDebugLoc());
1844 CSEMap.InsertNode(N, IP);
1845 InsertNode(N);
1846 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1847 }
1848
1849 SDValue Result(N, 0);
1850 if (VT.isVector())
1851 Result = getSplat(VT, DL, Result);
1852 return Result;
1853}
1854
1856 bool isT, bool isO) {
1857 unsigned Size = VT.getScalarSizeInBits();
1858 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1859}
1860
1862 bool IsOpaque) {
1864 IsTarget, IsOpaque);
1865}
1866
1868 bool isTarget) {
1869 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1870}
1871
1873 const SDLoc &DL) {
1874 assert(VT.isInteger() && "Shift amount is not an integer type!");
1875 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1876 return getConstant(Val, DL, ShiftVT);
1877}
1878
1880 const SDLoc &DL) {
1881 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1882 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1883}
1884
1886 bool isTarget) {
1887 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1888}
1889
1891 bool isTarget) {
1892 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1893}
1894
1896 EVT VT, bool isTarget) {
1897 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1898
1899 EVT EltVT = VT.getScalarType();
1900 const ConstantFP *Elt = &V;
1901
1902 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1903 // the to-be-splatted scalar ConstantFP.
1904 if (isa<VectorType>(Elt->getType()))
1905 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1906
1907 // Do the map lookup using the actual bit pattern for the floating point
1908 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1909 // we don't have issues with SNANs.
1910 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1911 SDVTList VTs = getVTList(EltVT);
1913 AddNodeIDNode(ID, Opc, VTs, {});
1914 ID.AddPointer(Elt);
1915 void *IP = nullptr;
1916 SDNode *N = nullptr;
1917 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1918 if (!VT.isVector())
1919 return SDValue(N, 0);
1920
1921 if (!N) {
1922 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1923 CSEMap.InsertNode(N, IP);
1924 InsertNode(N);
1925 }
1926
1927 SDValue Result(N, 0);
1928 if (VT.isVector())
1929 Result = getSplat(VT, DL, Result);
1930 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1931 return Result;
1932}
1933
1935 bool isTarget) {
1936 EVT EltVT = VT.getScalarType();
1937 if (EltVT == MVT::f32)
1938 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1939 if (EltVT == MVT::f64)
1940 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1941 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1942 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1943 bool Ignored;
1944 APFloat APF = APFloat(Val);
1946 &Ignored);
1947 return getConstantFP(APF, DL, VT, isTarget);
1948 }
1949 llvm_unreachable("Unsupported type in getConstantFP");
1950}
1951
1953 EVT VT, int64_t Offset, bool isTargetGA,
1954 unsigned TargetFlags) {
1955 assert((TargetFlags == 0 || isTargetGA) &&
1956 "Cannot set target flags on target-independent globals");
1957
1958 // Truncate (with sign-extension) the offset value to the pointer size.
1960 if (BitWidth < 64)
1962
1963 unsigned Opc;
1964 if (GV->isThreadLocal())
1966 else
1968
1969 SDVTList VTs = getVTList(VT);
1971 AddNodeIDNode(ID, Opc, VTs, {});
1972 ID.AddPointer(GV);
1973 ID.AddInteger(Offset);
1974 ID.AddInteger(TargetFlags);
1975 void *IP = nullptr;
1976 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1977 return SDValue(E, 0);
1978
1979 auto *N = newSDNode<GlobalAddressSDNode>(
1980 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1981 CSEMap.InsertNode(N, IP);
1982 InsertNode(N);
1983 return SDValue(N, 0);
1984}
1985
1987 SDVTList VTs = getVTList(MVT::Untyped);
1990 ID.AddPointer(GV);
1991 void *IP = nullptr;
1992 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1993 return SDValue(E, 0);
1994
1995 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1996 CSEMap.InsertNode(N, IP);
1997 InsertNode(N);
1998 return SDValue(N, 0);
1999}
2000
2001SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
2002 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
2003 SDVTList VTs = getVTList(VT);
2005 AddNodeIDNode(ID, Opc, VTs, {});
2006 ID.AddInteger(FI);
2007 void *IP = nullptr;
2008 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2009 return SDValue(E, 0);
2010
2011 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
2012 CSEMap.InsertNode(N, IP);
2013 InsertNode(N);
2014 return SDValue(N, 0);
2015}
2016
2017SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
2018 unsigned TargetFlags) {
2019 assert((TargetFlags == 0 || isTarget) &&
2020 "Cannot set target flags on target-independent jump tables");
2021 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
2022 SDVTList VTs = getVTList(VT);
2024 AddNodeIDNode(ID, Opc, VTs, {});
2025 ID.AddInteger(JTI);
2026 ID.AddInteger(TargetFlags);
2027 void *IP = nullptr;
2028 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2029 return SDValue(E, 0);
2030
2031 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2032 CSEMap.InsertNode(N, IP);
2033 InsertNode(N);
2034 return SDValue(N, 0);
2035}
2036
2038 const SDLoc &DL) {
2040 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2041 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2042}
2043
2045 MaybeAlign Alignment, int Offset,
2046 bool isTarget, unsigned TargetFlags) {
2047 assert((TargetFlags == 0 || isTarget) &&
2048 "Cannot set target flags on target-independent globals");
2049 if (!Alignment)
2050 Alignment = shouldOptForSize()
2051 ? getDataLayout().getABITypeAlign(C->getType())
2052 : getDataLayout().getPrefTypeAlign(C->getType());
2053 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2054 SDVTList VTs = getVTList(VT);
2056 AddNodeIDNode(ID, Opc, VTs, {});
2057 ID.AddInteger(Alignment->value());
2058 ID.AddInteger(Offset);
2059 ID.AddPointer(C);
2060 ID.AddInteger(TargetFlags);
2061 void *IP = nullptr;
2062 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2063 return SDValue(E, 0);
2064
2065 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2066 TargetFlags);
2067 CSEMap.InsertNode(N, IP);
2068 InsertNode(N);
2069 SDValue V = SDValue(N, 0);
2070 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2071 return V;
2072}
2073
2075 MaybeAlign Alignment, int Offset,
2076 bool isTarget, unsigned TargetFlags) {
2077 assert((TargetFlags == 0 || isTarget) &&
2078 "Cannot set target flags on target-independent globals");
2079 if (!Alignment)
2080 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2081 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2082 SDVTList VTs = getVTList(VT);
2084 AddNodeIDNode(ID, Opc, VTs, {});
2085 ID.AddInteger(Alignment->value());
2086 ID.AddInteger(Offset);
2087 C->addSelectionDAGCSEId(ID);
2088 ID.AddInteger(TargetFlags);
2089 void *IP = nullptr;
2090 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2091 return SDValue(E, 0);
2092
2093 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2094 TargetFlags);
2095 CSEMap.InsertNode(N, IP);
2096 InsertNode(N);
2097 return SDValue(N, 0);
2098}
2099
2102 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2103 ID.AddPointer(MBB);
2104 void *IP = nullptr;
2105 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2106 return SDValue(E, 0);
2107
2108 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2109 CSEMap.InsertNode(N, IP);
2110 InsertNode(N);
2111 return SDValue(N, 0);
2112}
2113
2115 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2116 ValueTypeNodes.size())
2117 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2118
2119 SDNode *&N = VT.isExtended() ?
2120 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2121
2122 if (N) return SDValue(N, 0);
2123 N = newSDNode<VTSDNode>(VT);
2124 InsertNode(N);
2125 return SDValue(N, 0);
2126}
2127
2129 SDNode *&N = ExternalSymbols[Sym];
2130 if (N) return SDValue(N, 0);
2131 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2132 InsertNode(N);
2133 return SDValue(N, 0);
2134}
2135
2136SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2138 return getExternalSymbol(SymName.data(), VT);
2139}
2140
2142 SDNode *&N = MCSymbols[Sym];
2143 if (N)
2144 return SDValue(N, 0);
2145 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2146 InsertNode(N);
2147 return SDValue(N, 0);
2148}
2149
2151 unsigned TargetFlags) {
2152 SDNode *&N =
2153 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2154 if (N) return SDValue(N, 0);
2155 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2156 InsertNode(N);
2157 return SDValue(N, 0);
2158}
2159
2161 EVT VT, unsigned TargetFlags) {
2163 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2164}
2165
2167 if ((unsigned)Cond >= CondCodeNodes.size())
2168 CondCodeNodes.resize(Cond+1);
2169
2170 if (!CondCodeNodes[Cond]) {
2171 auto *N = newSDNode<CondCodeSDNode>(Cond);
2172 CondCodeNodes[Cond] = N;
2173 InsertNode(N);
2174 }
2175
2176 return SDValue(CondCodeNodes[Cond], 0);
2177}
2178
2180 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2181 "APInt size does not match type size!");
2182
2183 if (MulImm == 0)
2184 return getConstant(0, DL, VT);
2185
2186 const MachineFunction &MF = getMachineFunction();
2187 const Function &F = MF.getFunction();
2188 ConstantRange CR = getVScaleRange(&F, 64);
2189 if (const APInt *C = CR.getSingleElement())
2190 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2191
2192 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2193}
2194
2195/// \returns a value of type \p VT that represents the runtime value of \p
2196/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2197/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2198/// or TypeSize.
2199template <typename Ty>
2201 EVT VT, Ty Quantity) {
2202 if (Quantity.isScalable())
2203 return DAG.getVScale(
2204 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2205
2206 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2207}
2208
2210 ElementCount EC) {
2211 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2212}
2213
2215 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2216}
2217
2219 ElementCount EC) {
2220 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2221 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2222 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2223 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2224}
2225
2227 APInt One(ResVT.getScalarSizeInBits(), 1);
2228 return getStepVector(DL, ResVT, One);
2229}
2230
2232 const APInt &StepVal) {
2233 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2234 if (ResVT.isScalableVector())
2235 return getNode(
2236 ISD::STEP_VECTOR, DL, ResVT,
2237 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2238
2239 SmallVector<SDValue, 16> OpsStepConstants;
2240 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2241 OpsStepConstants.push_back(
2242 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2243 return getBuildVector(ResVT, DL, OpsStepConstants);
2244}
2245
2246/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2247/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2252
2254 SDValue N2, ArrayRef<int> Mask) {
2255 assert(VT.getVectorNumElements() == Mask.size() &&
2256 "Must have the same number of vector elements as mask elements!");
2257 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2258 "Invalid VECTOR_SHUFFLE");
2259
2260 // Canonicalize shuffle undef, undef -> undef
2261 if (N1.isUndef() && N2.isUndef())
2262 return getUNDEF(VT);
2263
2264 // Validate that all indices in Mask are within the range of the elements
2265 // input to the shuffle.
2266 int NElts = Mask.size();
2267 assert(llvm::all_of(Mask,
2268 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2269 "Index out of range");
2270
2271 // Copy the mask so we can do any needed cleanup.
2272 SmallVector<int, 8> MaskVec(Mask);
2273
2274 // Canonicalize shuffle v, v -> v, undef
2275 if (N1 == N2) {
2276 N2 = getUNDEF(VT);
2277 for (int i = 0; i != NElts; ++i)
2278 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2279 }
2280
2281 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2282 if (N1.isUndef())
2283 commuteShuffle(N1, N2, MaskVec);
2284
2285 if (TLI->hasVectorBlend()) {
2286 // If shuffling a splat, try to blend the splat instead. We do this here so
2287 // that even when this arises during lowering we don't have to re-handle it.
2288 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2289 BitVector UndefElements;
2290 SDValue Splat = BV->getSplatValue(&UndefElements);
2291 if (!Splat)
2292 return;
2293
2294 for (int i = 0; i < NElts; ++i) {
2295 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2296 continue;
2297
2298 // If this input comes from undef, mark it as such.
2299 if (UndefElements[MaskVec[i] - Offset]) {
2300 MaskVec[i] = -1;
2301 continue;
2302 }
2303
2304 // If we can blend a non-undef lane, use that instead.
2305 if (!UndefElements[i])
2306 MaskVec[i] = i + Offset;
2307 }
2308 };
2309 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2310 BlendSplat(N1BV, 0);
2311 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2312 BlendSplat(N2BV, NElts);
2313 }
2314
2315 // Canonicalize all index into lhs, -> shuffle lhs, undef
2316 // Canonicalize all index into rhs, -> shuffle rhs, undef
2317 bool AllLHS = true, AllRHS = true;
2318 bool N2Undef = N2.isUndef();
2319 for (int i = 0; i != NElts; ++i) {
2320 if (MaskVec[i] >= NElts) {
2321 if (N2Undef)
2322 MaskVec[i] = -1;
2323 else
2324 AllLHS = false;
2325 } else if (MaskVec[i] >= 0) {
2326 AllRHS = false;
2327 }
2328 }
2329 if (AllLHS && AllRHS)
2330 return getUNDEF(VT);
2331 if (AllLHS && !N2Undef)
2332 N2 = getUNDEF(VT);
2333 if (AllRHS) {
2334 N1 = getUNDEF(VT);
2335 commuteShuffle(N1, N2, MaskVec);
2336 }
2337 // Reset our undef status after accounting for the mask.
2338 N2Undef = N2.isUndef();
2339 // Re-check whether both sides ended up undef.
2340 if (N1.isUndef() && N2Undef)
2341 return getUNDEF(VT);
2342
2343 // If Identity shuffle return that node.
2344 bool Identity = true, AllSame = true;
2345 for (int i = 0; i != NElts; ++i) {
2346 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2347 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2348 }
2349 if (Identity && NElts)
2350 return N1;
2351
2352 // Shuffling a constant splat doesn't change the result.
2353 if (N2Undef) {
2354 SDValue V = N1;
2355
2356 // Look through any bitcasts. We check that these don't change the number
2357 // (and size) of elements and just changes their types.
2358 while (V.getOpcode() == ISD::BITCAST)
2359 V = V->getOperand(0);
2360
2361 // A splat should always show up as a build vector node.
2362 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2363 BitVector UndefElements;
2364 SDValue Splat = BV->getSplatValue(&UndefElements);
2365 // If this is a splat of an undef, shuffling it is also undef.
2366 if (Splat && Splat.isUndef())
2367 return getUNDEF(VT);
2368
2369 bool SameNumElts =
2370 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2371
2372 // We only have a splat which can skip shuffles if there is a splatted
2373 // value and no undef lanes rearranged by the shuffle.
2374 if (Splat && UndefElements.none()) {
2375 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2376 // number of elements match or the value splatted is a zero constant.
2377 if (SameNumElts || isNullConstant(Splat))
2378 return N1;
2379 }
2380
2381 // If the shuffle itself creates a splat, build the vector directly.
2382 if (AllSame && SameNumElts) {
2383 EVT BuildVT = BV->getValueType(0);
2384 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2385 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2386
2387 // We may have jumped through bitcasts, so the type of the
2388 // BUILD_VECTOR may not match the type of the shuffle.
2389 if (BuildVT != VT)
2390 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2391 return NewBV;
2392 }
2393 }
2394 }
2395
2396 SDVTList VTs = getVTList(VT);
2398 SDValue Ops[2] = { N1, N2 };
2400 for (int i = 0; i != NElts; ++i)
2401 ID.AddInteger(MaskVec[i]);
2402
2403 void* IP = nullptr;
2404 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2405 return SDValue(E, 0);
2406
2407 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2408 // SDNode doesn't have access to it. This memory will be "leaked" when
2409 // the node is deallocated, but recovered when the NodeAllocator is released.
2410 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2411 llvm::copy(MaskVec, MaskAlloc);
2412
2413 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2414 dl.getDebugLoc(), MaskAlloc);
2415 createOperands(N, Ops);
2416
2417 CSEMap.InsertNode(N, IP);
2418 InsertNode(N);
2419 SDValue V = SDValue(N, 0);
2420 NewSDValueDbgMsg(V, "Creating new node: ", this);
2421 return V;
2422}
2423
2425 EVT VT = SV.getValueType(0);
2426 SmallVector<int, 8> MaskVec(SV.getMask());
2428
2429 SDValue Op0 = SV.getOperand(0);
2430 SDValue Op1 = SV.getOperand(1);
2431 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2432}
2433
2435 SDVTList VTs = getVTList(VT);
2437 AddNodeIDNode(ID, ISD::Register, VTs, {});
2438 ID.AddInteger(Reg.id());
2439 void *IP = nullptr;
2440 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2441 return SDValue(E, 0);
2442
2443 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2444 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2445 CSEMap.InsertNode(N, IP);
2446 InsertNode(N);
2447 return SDValue(N, 0);
2448}
2449
2452 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2453 ID.AddPointer(RegMask);
2454 void *IP = nullptr;
2455 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2456 return SDValue(E, 0);
2457
2458 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2459 CSEMap.InsertNode(N, IP);
2460 InsertNode(N);
2461 return SDValue(N, 0);
2462}
2463
2465 MCSymbol *Label) {
2466 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2467}
2468
2469SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2470 SDValue Root, MCSymbol *Label) {
2472 SDValue Ops[] = { Root };
2473 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2474 ID.AddPointer(Label);
2475 void *IP = nullptr;
2476 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2477 return SDValue(E, 0);
2478
2479 auto *N =
2480 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2481 createOperands(N, Ops);
2482
2483 CSEMap.InsertNode(N, IP);
2484 InsertNode(N);
2485 return SDValue(N, 0);
2486}
2487
2489 int64_t Offset, bool isTarget,
2490 unsigned TargetFlags) {
2491 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2492 SDVTList VTs = getVTList(VT);
2493
2495 AddNodeIDNode(ID, Opc, VTs, {});
2496 ID.AddPointer(BA);
2497 ID.AddInteger(Offset);
2498 ID.AddInteger(TargetFlags);
2499 void *IP = nullptr;
2500 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2501 return SDValue(E, 0);
2502
2503 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2504 CSEMap.InsertNode(N, IP);
2505 InsertNode(N);
2506 return SDValue(N, 0);
2507}
2508
2511 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2512 ID.AddPointer(V);
2513
2514 void *IP = nullptr;
2515 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2516 return SDValue(E, 0);
2517
2518 auto *N = newSDNode<SrcValueSDNode>(V);
2519 CSEMap.InsertNode(N, IP);
2520 InsertNode(N);
2521 return SDValue(N, 0);
2522}
2523
2526 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2527 ID.AddPointer(MD);
2528
2529 void *IP = nullptr;
2530 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2531 return SDValue(E, 0);
2532
2533 auto *N = newSDNode<MDNodeSDNode>(MD);
2534 CSEMap.InsertNode(N, IP);
2535 InsertNode(N);
2536 return SDValue(N, 0);
2537}
2538
2540 if (VT == V.getValueType())
2541 return V;
2542
2543 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2544}
2545
2547 unsigned SrcAS, unsigned DestAS) {
2548 SDVTList VTs = getVTList(VT);
2549 SDValue Ops[] = {Ptr};
2552 ID.AddInteger(SrcAS);
2553 ID.AddInteger(DestAS);
2554
2555 void *IP = nullptr;
2556 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2557 return SDValue(E, 0);
2558
2559 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2560 VTs, SrcAS, DestAS);
2561 createOperands(N, Ops);
2562
2563 CSEMap.InsertNode(N, IP);
2564 InsertNode(N);
2565 return SDValue(N, 0);
2566}
2567
2569 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2570}
2571
2573 UndefPoisonKind Kind) {
2574 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind))
2575 return V;
2576 return getFreeze(V);
2577}
2578
2579/// getShiftAmountOperand - Return the specified value casted to
2580/// the target's desired shift amount type.
2582 EVT OpTy = Op.getValueType();
2583 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2584 if (OpTy == ShTy || OpTy.isVector()) return Op;
2585
2586 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2587}
2588
2590 SDLoc dl(Node);
2592 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2593 EVT VT = Node->getValueType(0);
2594 SDValue Tmp1 = Node->getOperand(0);
2595 SDValue Tmp2 = Node->getOperand(1);
2596 const MaybeAlign MA(Node->getConstantOperandVal(3));
2597
2598 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2599 Tmp2, MachinePointerInfo(V));
2600 SDValue VAList = VAListLoad;
2601
2602 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2603 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2604 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2605
2606 VAList = getNode(
2607 ISD::AND, dl, VAList.getValueType(), VAList,
2608 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2609 }
2610
2611 // Increment the pointer, VAList, to the next vaarg
2612 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2613 getConstant(getDataLayout().getTypeAllocSize(
2614 VT.getTypeForEVT(*getContext())),
2615 dl, VAList.getValueType()));
2616 // Store the incremented VAList to the legalized pointer
2617 Tmp1 =
2618 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2619 // Load the actual argument out of the pointer VAList
2620 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2621}
2622
2624 SDLoc dl(Node);
2626 // This defaults to loading a pointer from the input and storing it to the
2627 // output, returning the chain.
2628 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2629 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2630 SDValue Tmp1 =
2631 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2632 Node->getOperand(2), MachinePointerInfo(VS));
2633 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2634 MachinePointerInfo(VD));
2635}
2636
2638 const DataLayout &DL = getDataLayout();
2639 Type *Ty = VT.getTypeForEVT(*getContext());
2640 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2641
2642 if (TLI->isTypeLegal(VT) || !VT.isVector())
2643 return RedAlign;
2644
2645 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2646 const Align StackAlign = TFI->getStackAlign();
2647
2648 // See if we can choose a smaller ABI alignment in cases where it's an
2649 // illegal vector type that will get broken down.
2650 if (RedAlign > StackAlign) {
2651 EVT IntermediateVT;
2652 MVT RegisterVT;
2653 unsigned NumIntermediates;
2654 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2655 NumIntermediates, RegisterVT);
2656 Ty = IntermediateVT.getTypeForEVT(*getContext());
2657 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2658 if (RedAlign2 < RedAlign)
2659 RedAlign = RedAlign2;
2660
2661 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2662 // If the stack is not realignable, the alignment should be limited to the
2663 // StackAlignment
2664 RedAlign = std::min(RedAlign, StackAlign);
2665 }
2666
2667 return RedAlign;
2668}
2669
2671 MachineFrameInfo &MFI = MF->getFrameInfo();
2672 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2673 int StackID = 0;
2674 if (Bytes.isScalable())
2675 StackID = TFI->getStackIDForScalableVectors();
2676 // The stack id gives an indication of whether the object is scalable or
2677 // not, so it's safe to pass in the minimum size here.
2678 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2679 false, nullptr, StackID);
2680 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2681}
2682
2684 Type *Ty = VT.getTypeForEVT(*getContext());
2685 Align StackAlign =
2686 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2687 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2688}
2689
2691 TypeSize VT1Size = VT1.getStoreSize();
2692 TypeSize VT2Size = VT2.getStoreSize();
2693 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2694 "Don't know how to choose the maximum size when creating a stack "
2695 "temporary");
2696 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2697 ? VT1Size
2698 : VT2Size;
2699
2700 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2701 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2702 const DataLayout &DL = getDataLayout();
2703 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2704 return CreateStackTemporary(Bytes, Align);
2705}
2706
2708 ISD::CondCode Cond, const SDLoc &dl,
2709 SDNodeFlags Flags) {
2710 EVT OpVT = N1.getValueType();
2711
2712 auto GetUndefBooleanConstant = [&]() {
2713 if (VT.getScalarType() == MVT::i1 ||
2714 TLI->getBooleanContents(OpVT) ==
2716 return getUNDEF(VT);
2717 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2718 // so we cannot use getUNDEF(). Return zero instead.
2719 return getConstant(0, dl, VT);
2720 };
2721
2722 // These setcc operations always fold.
2723 switch (Cond) {
2724 default: break;
2725 case ISD::SETFALSE:
2726 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2727 case ISD::SETTRUE:
2728 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2729
2730 case ISD::SETOEQ:
2731 case ISD::SETOGT:
2732 case ISD::SETOGE:
2733 case ISD::SETOLT:
2734 case ISD::SETOLE:
2735 case ISD::SETONE:
2736 case ISD::SETO:
2737 case ISD::SETUO:
2738 case ISD::SETUEQ:
2739 case ISD::SETUNE:
2740 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2741 break;
2742 }
2743
2744 if (OpVT.isInteger()) {
2745 // For EQ and NE, we can always pick a value for the undef to make the
2746 // predicate pass or fail, so we can return undef.
2747 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2748 // icmp eq/ne X, undef -> undef.
2749 if ((N1.isUndef() || N2.isUndef()) &&
2750 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2751 return GetUndefBooleanConstant();
2752
2753 // If both operands are undef, we can return undef for int comparison.
2754 // icmp undef, undef -> undef.
2755 if (N1.isUndef() && N2.isUndef())
2756 return GetUndefBooleanConstant();
2757
2758 // icmp X, X -> true/false
2759 // icmp X, undef -> true/false because undef could be X.
2760 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2761 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2762 }
2763
2765 const APInt &C2 = N2C->getAPIntValue();
2767 const APInt &C1 = N1C->getAPIntValue();
2768
2770 dl, VT, OpVT);
2771 }
2772 }
2773
2774 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2775 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2776
2777 if (N1CFP && N2CFP) {
2778 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2779 switch (Cond) {
2780 default: break;
2781 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2782 return GetUndefBooleanConstant();
2783 [[fallthrough]];
2784 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2785 OpVT);
2786 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2787 return GetUndefBooleanConstant();
2788 [[fallthrough]];
2790 R==APFloat::cmpLessThan, dl, VT,
2791 OpVT);
2792 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2793 return GetUndefBooleanConstant();
2794 [[fallthrough]];
2795 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2796 OpVT);
2797 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2798 return GetUndefBooleanConstant();
2799 [[fallthrough]];
2801 VT, OpVT);
2802 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2803 return GetUndefBooleanConstant();
2804 [[fallthrough]];
2806 R==APFloat::cmpEqual, dl, VT,
2807 OpVT);
2808 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2809 return GetUndefBooleanConstant();
2810 [[fallthrough]];
2812 R==APFloat::cmpEqual, dl, VT, OpVT);
2813 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2814 OpVT);
2815 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2816 OpVT);
2818 R==APFloat::cmpEqual, dl, VT,
2819 OpVT);
2820 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2821 OpVT);
2823 R==APFloat::cmpLessThan, dl, VT,
2824 OpVT);
2826 R==APFloat::cmpUnordered, dl, VT,
2827 OpVT);
2829 VT, OpVT);
2830 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2831 OpVT);
2832 }
2833 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2834 // Ensure that the constant occurs on the RHS.
2836 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2837 return SDValue();
2838 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2839 /*IsSignaling=*/false, Flags);
2840 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2841 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2842 // If an operand is known to be a nan (or undef that could be a nan), we can
2843 // fold it.
2844 // Choosing NaN for the undef will always make unordered comparison succeed
2845 // and ordered comparison fails.
2846 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2847 switch (ISD::getUnorderedFlavor(Cond)) {
2848 default:
2849 llvm_unreachable("Unknown flavor!");
2850 case 0: // Known false.
2851 return getBoolConstant(false, dl, VT, OpVT);
2852 case 1: // Known true.
2853 return getBoolConstant(true, dl, VT, OpVT);
2854 case 2: // Undefined.
2855 return GetUndefBooleanConstant();
2856 }
2857 }
2858
2859 // Could not fold it.
2860 return SDValue();
2861}
2862
2863/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2864/// use this predicate to simplify operations downstream.
2866 unsigned BitWidth = Op.getScalarValueSizeInBits();
2868}
2869
2870// TODO: Should have argument to specify if sign bit of nan is ignorable.
2872 if (Depth >= MaxRecursionDepth)
2873 return false; // Limit search depth.
2874
2875 unsigned Opc = Op.getOpcode();
2876 switch (Opc) {
2877 case ISD::FABS:
2878 return true;
2879 case ISD::AssertNoFPClass: {
2880 FPClassTest NoFPClass =
2881 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2882
2883 const FPClassTest TestMask = fcNan | fcNegative;
2884 return (NoFPClass & TestMask) == TestMask;
2885 }
2886 case ISD::ARITH_FENCE:
2887 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2888 case ISD::FEXP:
2889 case ISD::FEXP2:
2890 case ISD::FEXP10:
2891 return Op->getFlags().hasNoNaNs();
2892 case ISD::FMINNUM:
2893 case ISD::FMINNUM_IEEE:
2894 case ISD::FMINIMUM:
2895 case ISD::FMINIMUMNUM:
2896 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2897 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2898 case ISD::FMAXNUM:
2899 case ISD::FMAXNUM_IEEE:
2900 case ISD::FMAXIMUM:
2901 case ISD::FMAXIMUMNUM:
2902 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2903 // is sufficient.
2904 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2905 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2906 default:
2907 return false;
2908 }
2909
2910 llvm_unreachable("covered opcode switch");
2911}
2912
2913/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2914/// this predicate to simplify operations downstream. Mask is known to be zero
2915/// for bits that V cannot have.
2917 unsigned Depth) const {
2918 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2919}
2920
2921/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2922/// DemandedElts. We use this predicate to simplify operations downstream.
2923/// Mask is known to be zero for bits that V cannot have.
2925 const APInt &DemandedElts,
2926 unsigned Depth) const {
2927 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2928}
2929
2930/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2931/// DemandedElts. We use this predicate to simplify operations downstream.
2933 unsigned Depth /* = 0 */) const {
2934 return computeKnownBits(V, DemandedElts, Depth).isZero();
2935}
2936
2937/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2939 unsigned Depth) const {
2940 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2941}
2942
2944 const APInt &DemandedElts,
2945 unsigned Depth) const {
2946 EVT VT = Op.getValueType();
2947 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2948
2949 unsigned NumElts = VT.getVectorNumElements();
2950 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2951
2952 APInt KnownZeroElements = APInt::getZero(NumElts);
2953 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2954 if (!DemandedElts[EltIdx])
2955 continue; // Don't query elements that are not demanded.
2956 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2957 if (MaskedVectorIsZero(Op, Mask, Depth))
2958 KnownZeroElements.setBit(EltIdx);
2959 }
2960 return KnownZeroElements;
2961}
2962
2963/// isSplatValue - Return true if the vector V has the same value
2964/// across all DemandedElts. For scalable vectors, we don't know the
2965/// number of lanes at compile time. Instead, we use a 1 bit APInt
2966/// to represent a conservative value for all lanes; that is, that
2967/// one bit value is implicitly splatted across all lanes.
2968bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2969 APInt &UndefElts, unsigned Depth) const {
2970 unsigned Opcode = V.getOpcode();
2971 EVT VT = V.getValueType();
2972 assert(VT.isVector() && "Vector type expected");
2973 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2974 "scalable demanded bits are ignored");
2975
2976 if (!DemandedElts)
2977 return false; // No demanded elts, better to assume we don't know anything.
2978
2979 if (Depth >= MaxRecursionDepth)
2980 return false; // Limit search depth.
2981
2982 // Deal with some common cases here that work for both fixed and scalable
2983 // vector types.
2984 switch (Opcode) {
2985 case ISD::SPLAT_VECTOR:
2986 UndefElts = V.getOperand(0).isUndef()
2987 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2988 : APInt(DemandedElts.getBitWidth(), 0);
2989 return true;
2990 case ISD::ADD:
2991 case ISD::SUB:
2992 case ISD::AND:
2993 case ISD::XOR:
2994 case ISD::OR: {
2995 APInt UndefLHS, UndefRHS;
2996 SDValue LHS = V.getOperand(0);
2997 SDValue RHS = V.getOperand(1);
2998 // Only recognize splats with the same demanded undef elements for both
2999 // operands, otherwise we might fail to handle binop-specific undef
3000 // handling.
3001 // e.g. (and undef, 0) -> 0 etc.
3002 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
3003 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
3004 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
3005 UndefElts = UndefLHS | UndefRHS;
3006 return true;
3007 }
3008 return false;
3009 }
3010 case ISD::ABS:
3012 case ISD::TRUNCATE:
3013 case ISD::SIGN_EXTEND:
3014 case ISD::ZERO_EXTEND:
3015 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3016 default:
3017 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3018 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3019 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3020 Depth);
3021 break;
3022 }
3023
3024 // We don't support other cases than those above for scalable vectors at
3025 // the moment.
3026 if (VT.isScalableVector())
3027 return false;
3028
3029 unsigned NumElts = VT.getVectorNumElements();
3030 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3031 UndefElts = APInt::getZero(NumElts);
3032
3033 switch (Opcode) {
3034 case ISD::BUILD_VECTOR: {
3035 SDValue Scl;
3036 for (unsigned i = 0; i != NumElts; ++i) {
3037 SDValue Op = V.getOperand(i);
3038 if (Op.isUndef()) {
3039 UndefElts.setBit(i);
3040 continue;
3041 }
3042 if (!DemandedElts[i])
3043 continue;
3044 if (Scl && Scl != Op)
3045 return false;
3046 Scl = Op;
3047 }
3048 return true;
3049 }
3050 case ISD::VECTOR_SHUFFLE: {
3051 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3052 APInt DemandedLHS = APInt::getZero(NumElts);
3053 APInt DemandedRHS = APInt::getZero(NumElts);
3054 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3055 for (int i = 0; i != (int)NumElts; ++i) {
3056 int M = Mask[i];
3057 if (M < 0) {
3058 UndefElts.setBit(i);
3059 continue;
3060 }
3061 if (!DemandedElts[i])
3062 continue;
3063 if (M < (int)NumElts)
3064 DemandedLHS.setBit(M);
3065 else
3066 DemandedRHS.setBit(M - NumElts);
3067 }
3068
3069 // If we aren't demanding either op, assume there's no splat.
3070 // If we are demanding both ops, assume there's no splat.
3071 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3072 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3073 return false;
3074
3075 // See if the demanded elts of the source op is a splat or we only demand
3076 // one element, which should always be a splat.
3077 // TODO: Handle source ops splats with undefs.
3078 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3079 APInt SrcUndefs;
3080 return (SrcElts.popcount() == 1) ||
3081 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3082 (SrcElts & SrcUndefs).isZero());
3083 };
3084 if (!DemandedLHS.isZero())
3085 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3086 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3087 }
3089 // Offset the demanded elts by the subvector index.
3090 SDValue Src = V.getOperand(0);
3091 // We don't support scalable vectors at the moment.
3092 if (Src.getValueType().isScalableVector())
3093 return false;
3094 uint64_t Idx = V.getConstantOperandVal(1);
3095 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3096 APInt UndefSrcElts;
3097 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3098 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3099 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3100 return true;
3101 }
3102 break;
3103 }
3107 // Widen the demanded elts by the src element count.
3108 SDValue Src = V.getOperand(0);
3109 // We don't support scalable vectors at the moment.
3110 if (Src.getValueType().isScalableVector())
3111 return false;
3112 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3113 APInt UndefSrcElts;
3114 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3115 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3116 UndefElts = UndefSrcElts.trunc(NumElts);
3117 return true;
3118 }
3119 break;
3120 }
3121 case ISD::BITCAST: {
3122 SDValue Src = V.getOperand(0);
3123 EVT SrcVT = Src.getValueType();
3124 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3125 unsigned BitWidth = VT.getScalarSizeInBits();
3126
3127 // Ignore bitcasts from unsupported types.
3128 // TODO: Add fp support?
3129 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3130 break;
3131
3132 // Bitcast 'small element' vector to 'large element' vector.
3133 if ((BitWidth % SrcBitWidth) == 0) {
3134 // See if each sub element is a splat.
3135 unsigned Scale = BitWidth / SrcBitWidth;
3136 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3137 APInt ScaledDemandedElts =
3138 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3139 for (unsigned I = 0; I != Scale; ++I) {
3140 APInt SubUndefElts;
3141 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3142 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3143 SubDemandedElts &= ScaledDemandedElts;
3144 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3145 return false;
3146 // TODO: Add support for merging sub undef elements.
3147 if (!SubUndefElts.isZero())
3148 return false;
3149 }
3150 return true;
3151 }
3152 break;
3153 }
3154 }
3155
3156 return false;
3157}
3158
3159/// Helper wrapper to main isSplatValue function.
3160bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3161 EVT VT = V.getValueType();
3162 assert(VT.isVector() && "Vector type expected");
3163
3164 APInt UndefElts;
3165 // Since the number of lanes in a scalable vector is unknown at compile time,
3166 // we track one bit which is implicitly broadcast to all lanes. This means
3167 // that all lanes in a scalable vector are considered demanded.
3168 APInt DemandedElts
3170 return isSplatValue(V, DemandedElts, UndefElts) &&
3171 (AllowUndefs || !UndefElts);
3172}
3173
3176
3177 EVT VT = V.getValueType();
3178 unsigned Opcode = V.getOpcode();
3179 switch (Opcode) {
3180 default: {
3181 APInt UndefElts;
3182 // Since the number of lanes in a scalable vector is unknown at compile time,
3183 // we track one bit which is implicitly broadcast to all lanes. This means
3184 // that all lanes in a scalable vector are considered demanded.
3185 APInt DemandedElts
3187
3188 if (isSplatValue(V, DemandedElts, UndefElts)) {
3189 if (VT.isScalableVector()) {
3190 // DemandedElts and UndefElts are ignored for scalable vectors, since
3191 // the only supported cases are SPLAT_VECTOR nodes.
3192 SplatIdx = 0;
3193 } else {
3194 // Handle case where all demanded elements are UNDEF.
3195 if (DemandedElts.isSubsetOf(UndefElts)) {
3196 SplatIdx = 0;
3197 return getUNDEF(VT);
3198 }
3199 SplatIdx = (UndefElts & DemandedElts).countr_one();
3200 }
3201 return V;
3202 }
3203 break;
3204 }
3205 case ISD::SPLAT_VECTOR:
3206 SplatIdx = 0;
3207 return V;
3208 case ISD::VECTOR_SHUFFLE: {
3209 assert(!VT.isScalableVector());
3210 // Check if this is a shuffle node doing a splat.
3211 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3212 // getTargetVShiftNode currently struggles without the splat source.
3213 auto *SVN = cast<ShuffleVectorSDNode>(V);
3214 if (!SVN->isSplat())
3215 break;
3216 int Idx = SVN->getSplatIndex();
3217 int NumElts = V.getValueType().getVectorNumElements();
3218 SplatIdx = Idx % NumElts;
3219 return V.getOperand(Idx / NumElts);
3220 }
3221 }
3222
3223 return SDValue();
3224}
3225
3227 int SplatIdx;
3228 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3229 EVT SVT = SrcVector.getValueType().getScalarType();
3230 EVT LegalSVT = SVT;
3231 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3232 if (!SVT.isInteger())
3233 return SDValue();
3234 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3235 if (LegalSVT.bitsLT(SVT))
3236 return SDValue();
3237 }
3238 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3239 }
3240 return SDValue();
3241}
3242
3243std::optional<ConstantRange>
3245 unsigned Depth) const {
3246 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3247 V.getOpcode() == ISD::SRA) &&
3248 "Unknown shift node");
3249 // Shifting more than the bitwidth is not valid.
3250 unsigned BitWidth = V.getScalarValueSizeInBits();
3251
3252 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3253 const APInt &ShAmt = Cst->getAPIntValue();
3254 if (ShAmt.uge(BitWidth))
3255 return std::nullopt;
3256 return ConstantRange(ShAmt);
3257 }
3258
3259 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3260 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3261 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3262 if (!DemandedElts[i])
3263 continue;
3264 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3265 if (!SA) {
3266 MinAmt = MaxAmt = nullptr;
3267 break;
3268 }
3269 const APInt &ShAmt = SA->getAPIntValue();
3270 if (ShAmt.uge(BitWidth))
3271 return std::nullopt;
3272 if (!MinAmt || MinAmt->ugt(ShAmt))
3273 MinAmt = &ShAmt;
3274 if (!MaxAmt || MaxAmt->ult(ShAmt))
3275 MaxAmt = &ShAmt;
3276 }
3277 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3278 "Failed to find matching min/max shift amounts");
3279 if (MinAmt && MaxAmt)
3280 return ConstantRange(*MinAmt, *MaxAmt + 1);
3281 }
3282
3283 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3284 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3285 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3286 if (KnownAmt.getMaxValue().ult(BitWidth))
3287 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3288
3289 return std::nullopt;
3290}
3291
3292std::optional<unsigned>
3294 unsigned Depth) const {
3295 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3296 V.getOpcode() == ISD::SRA) &&
3297 "Unknown shift node");
3298 if (std::optional<ConstantRange> AmtRange =
3299 getValidShiftAmountRange(V, DemandedElts, Depth))
3300 if (const APInt *ShAmt = AmtRange->getSingleElement())
3301 return ShAmt->getZExtValue();
3302 return std::nullopt;
3303}
3304
3305std::optional<unsigned>
3307 APInt DemandedElts = getDemandAllEltsMask(V);
3308 return getValidShiftAmount(V, DemandedElts, Depth);
3309}
3310
3311std::optional<unsigned>
3313 unsigned Depth) const {
3314 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3315 V.getOpcode() == ISD::SRA) &&
3316 "Unknown shift node");
3317 if (std::optional<ConstantRange> AmtRange =
3318 getValidShiftAmountRange(V, DemandedElts, Depth))
3319 return AmtRange->getUnsignedMin().getZExtValue();
3320 return std::nullopt;
3321}
3322
3323std::optional<unsigned>
3325 APInt DemandedElts = getDemandAllEltsMask(V);
3326 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3327}
3328
3329std::optional<unsigned>
3331 unsigned Depth) const {
3332 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3333 V.getOpcode() == ISD::SRA) &&
3334 "Unknown shift node");
3335 if (std::optional<ConstantRange> AmtRange =
3336 getValidShiftAmountRange(V, DemandedElts, Depth))
3337 return AmtRange->getUnsignedMax().getZExtValue();
3338 return std::nullopt;
3339}
3340
3341std::optional<unsigned>
3343 APInt DemandedElts = getDemandAllEltsMask(V);
3344 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3345}
3346
3347/// Determine which bits of Op are known to be either zero or one and return
3348/// them in Known. For vectors, the known bits are those that are shared by
3349/// every vector element.
3351 APInt DemandedElts = getDemandAllEltsMask(Op);
3352 return computeKnownBits(Op, DemandedElts, Depth);
3353}
3354
3355/// Determine which bits of Op are known to be either zero or one and return
3356/// them in Known. The DemandedElts argument allows us to only collect the known
3357/// bits that are shared by the requested vector elements.
3359 unsigned Depth) const {
3360 unsigned BitWidth = Op.getScalarValueSizeInBits();
3361
3362 KnownBits Known(BitWidth); // Don't know anything.
3363
3364 if (auto OptAPInt = Op->bitcastToAPInt()) {
3365 // We know all of the bits for a constant!
3366 return KnownBits::makeConstant(*std::move(OptAPInt));
3367 }
3368
3369 if (Depth >= MaxRecursionDepth)
3370 return Known; // Limit search depth.
3371
3372 KnownBits Known2;
3373 unsigned NumElts = DemandedElts.getBitWidth();
3374 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3375 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3376 assert((!Op.getValueType().isFixedLengthVector() ||
3377 NumElts == Op.getValueType().getVectorNumElements()) &&
3378 "Unexpected vector size");
3379
3380 if (!DemandedElts)
3381 return Known; // No demanded elts, better to assume we don't know anything.
3382
3383 unsigned Opcode = Op.getOpcode();
3384 switch (Opcode) {
3385 case ISD::MERGE_VALUES:
3386 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3387 Depth + 1);
3388 case ISD::SPLAT_VECTOR: {
3389 SDValue SrcOp = Op.getOperand(0);
3390 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3391 "Expected SPLAT_VECTOR implicit truncation");
3392 // Implicitly truncate the bits to match the official semantics of
3393 // SPLAT_VECTOR.
3395 break;
3396 }
3398 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3399 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3400 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3401 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3402 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3403 }
3404 break;
3405 }
3406 case ISD::STEP_VECTOR: {
3407 const APInt &Step = Op.getConstantOperandAPInt(0);
3408
3409 if (Step.isPowerOf2())
3410 Known.Zero.setLowBits(Step.logBase2());
3411
3413
3414 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3415 break;
3416 const APInt MinNumElts =
3417 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3418
3419 bool Overflow;
3420 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3422 .umul_ov(MinNumElts, Overflow);
3423 if (Overflow)
3424 break;
3425
3426 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3427 if (Overflow)
3428 break;
3429
3430 Known.Zero.setHighBits(MaxValue.countl_zero());
3431 break;
3432 }
3433 case ISD::BUILD_VECTOR:
3434 assert(!Op.getValueType().isScalableVector());
3435 // Collect the known bits that are shared by every demanded vector element.
3436 Known.setAllConflict();
3437 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3438 if (!DemandedElts[i])
3439 continue;
3440
3441 SDValue SrcOp = Op.getOperand(i);
3442 Known2 = computeKnownBits(SrcOp, Depth + 1);
3443
3444 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3445 if (SrcOp.getValueSizeInBits() != BitWidth) {
3446 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3447 "Expected BUILD_VECTOR implicit truncation");
3448 Known2 = Known2.trunc(BitWidth);
3449 }
3450
3451 // Known bits are the values that are shared by every demanded element.
3452 Known = Known.intersectWith(Known2);
3453
3454 // If we don't know any bits, early out.
3455 if (Known.isUnknown())
3456 break;
3457 }
3458 break;
3459 case ISD::VECTOR_COMPRESS: {
3460 SDValue Vec = Op.getOperand(0);
3461 SDValue PassThru = Op.getOperand(2);
3462 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3463 // If we don't know any bits, early out.
3464 if (Known.isUnknown())
3465 break;
3466 Known2 = computeKnownBits(Vec, Depth + 1);
3467 Known = Known.intersectWith(Known2);
3468 break;
3469 }
3470 case ISD::VECTOR_SHUFFLE: {
3471 assert(!Op.getValueType().isScalableVector());
3472 // Collect the known bits that are shared by every vector element referenced
3473 // by the shuffle.
3474 APInt DemandedLHS, DemandedRHS;
3476 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3477 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3478 DemandedLHS, DemandedRHS))
3479 break;
3480
3481 // Known bits are the values that are shared by every demanded element.
3482 Known.setAllConflict();
3483 if (!!DemandedLHS) {
3484 SDValue LHS = Op.getOperand(0);
3485 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3486 Known = Known.intersectWith(Known2);
3487 }
3488 // If we don't know any bits, early out.
3489 if (Known.isUnknown())
3490 break;
3491 if (!!DemandedRHS) {
3492 SDValue RHS = Op.getOperand(1);
3493 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3494 Known = Known.intersectWith(Known2);
3495 }
3496 break;
3497 }
3498 case ISD::VSCALE: {
3500 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3502 break;
3503 }
3504 case ISD::CONCAT_VECTORS: {
3505 if (Op.getValueType().isScalableVector())
3506 break;
3507 // Split DemandedElts and test each of the demanded subvectors.
3508 Known.setAllConflict();
3509 EVT SubVectorVT = Op.getOperand(0).getValueType();
3510 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3511 unsigned NumSubVectors = Op.getNumOperands();
3512 for (unsigned i = 0; i != NumSubVectors; ++i) {
3513 APInt DemandedSub =
3514 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3515 if (!!DemandedSub) {
3516 SDValue Sub = Op.getOperand(i);
3517 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3518 Known = Known.intersectWith(Known2);
3519 }
3520 // If we don't know any bits, early out.
3521 if (Known.isUnknown())
3522 break;
3523 }
3524 break;
3525 }
3526 case ISD::INSERT_SUBVECTOR: {
3527 if (Op.getValueType().isScalableVector())
3528 break;
3529 // Demand any elements from the subvector and the remainder from the src its
3530 // inserted into.
3531 SDValue Src = Op.getOperand(0);
3532 SDValue Sub = Op.getOperand(1);
3533 uint64_t Idx = Op.getConstantOperandVal(2);
3534 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3535 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3536 APInt DemandedSrcElts = DemandedElts;
3537 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3538
3539 Known.setAllConflict();
3540 if (!!DemandedSubElts) {
3541 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3542 if (Known.isUnknown())
3543 break; // early-out.
3544 }
3545 if (!!DemandedSrcElts) {
3546 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3547 Known = Known.intersectWith(Known2);
3548 }
3549 break;
3550 }
3552 // Offset the demanded elts by the subvector index.
3553 SDValue Src = Op.getOperand(0);
3554
3555 APInt DemandedSrcElts;
3556 if (Src.getValueType().isScalableVector())
3557 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3558 else {
3559 uint64_t Idx = Op.getConstantOperandVal(1);
3560 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3561 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3562 }
3563 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3564 break;
3565 }
3566 case ISD::SCALAR_TO_VECTOR: {
3567 if (Op.getValueType().isScalableVector())
3568 break;
3569 // We know about scalar_to_vector as much as we know about it source,
3570 // which becomes the first element of otherwise unknown vector.
3571 if (DemandedElts != 1)
3572 break;
3573
3574 SDValue N0 = Op.getOperand(0);
3575 Known = computeKnownBits(N0, Depth + 1);
3576 if (N0.getValueSizeInBits() != BitWidth)
3577 Known = Known.trunc(BitWidth);
3578
3579 break;
3580 }
3581 case ISD::BITCAST: {
3582 if (Op.getValueType().isScalableVector())
3583 break;
3584
3585 SDValue N0 = Op.getOperand(0);
3586 EVT SubVT = N0.getValueType();
3587 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3588
3589 // Ignore bitcasts from unsupported types.
3590 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3591 break;
3592
3593 // Fast handling of 'identity' bitcasts.
3594 if (BitWidth == SubBitWidth) {
3595 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3596 break;
3597 }
3598
3599 bool IsLE = getDataLayout().isLittleEndian();
3600
3601 // Bitcast 'small element' vector to 'large element' scalar/vector.
3602 if ((BitWidth % SubBitWidth) == 0) {
3603 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3604
3605 // Collect known bits for the (larger) output by collecting the known
3606 // bits from each set of sub elements and shift these into place.
3607 // We need to separately call computeKnownBits for each set of
3608 // sub elements as the knownbits for each is likely to be different.
3609 unsigned SubScale = BitWidth / SubBitWidth;
3610 APInt SubDemandedElts(NumElts * SubScale, 0);
3611 for (unsigned i = 0; i != NumElts; ++i)
3612 if (DemandedElts[i])
3613 SubDemandedElts.setBit(i * SubScale);
3614
3615 for (unsigned i = 0; i != SubScale; ++i) {
3616 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3617 Depth + 1);
3618 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3619 Known.insertBits(Known2, SubBitWidth * Shifts);
3620 }
3621 }
3622
3623 // Bitcast 'large element' scalar/vector to 'small element' vector.
3624 if ((SubBitWidth % BitWidth) == 0) {
3625 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3626
3627 // Collect known bits for the (smaller) output by collecting the known
3628 // bits from the overlapping larger input elements and extracting the
3629 // sub sections we actually care about.
3630 unsigned SubScale = SubBitWidth / BitWidth;
3631 APInt SubDemandedElts =
3632 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3633 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3634
3635 Known.setAllConflict();
3636 for (unsigned i = 0; i != NumElts; ++i)
3637 if (DemandedElts[i]) {
3638 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3639 unsigned Offset = (Shifts % SubScale) * BitWidth;
3640 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3641 // If we don't know any bits, early out.
3642 if (Known.isUnknown())
3643 break;
3644 }
3645 }
3646 break;
3647 }
3648 case ISD::AND:
3649 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3650 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3651
3652 Known &= Known2;
3653 break;
3654 case ISD::OR:
3655 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3656 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3657
3658 Known |= Known2;
3659 break;
3660 case ISD::XOR:
3661 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3662 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3663
3664 Known ^= Known2;
3665 break;
3666 case ISD::MUL: {
3667 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3668 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3669 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3670 // TODO: SelfMultiply can be poison, but not undef.
3671 if (SelfMultiply)
3672 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3673 Op.getOperand(0), DemandedElts, UndefPoisonKind::UndefOrPoison,
3674 Depth + 1);
3675 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3676
3677 // If the multiplication is known not to overflow, the product of a number
3678 // with itself is non-negative. Only do this if we didn't already computed
3679 // the opposite value for the sign bit.
3680 if (Op->getFlags().hasNoSignedWrap() &&
3681 Op.getOperand(0) == Op.getOperand(1) &&
3682 !Known.isNegative())
3683 Known.makeNonNegative();
3684 break;
3685 }
3686 case ISD::MULHU: {
3687 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3688 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3689 Known = KnownBits::mulhu(Known, Known2);
3690 break;
3691 }
3692 case ISD::MULHS: {
3693 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3694 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3695 Known = KnownBits::mulhs(Known, Known2);
3696 break;
3697 }
3698 case ISD::ABDU: {
3699 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3700 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3701 Known = KnownBits::abdu(Known, Known2);
3702 break;
3703 }
3704 case ISD::ABDS: {
3705 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3706 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3707 Known = KnownBits::abds(Known, Known2);
3708 unsigned SignBits1 =
3709 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3710 if (SignBits1 == 1)
3711 break;
3712 unsigned SignBits0 =
3713 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3714 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3715 break;
3716 }
3717 case ISD::UMUL_LOHI: {
3718 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3719 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3720 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3721 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3722 if (Op.getResNo() == 0)
3723 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3724 else
3725 Known = KnownBits::mulhu(Known, Known2);
3726 break;
3727 }
3728 case ISD::SMUL_LOHI: {
3729 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3730 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3731 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3732 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3733 if (Op.getResNo() == 0)
3734 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3735 else
3736 Known = KnownBits::mulhs(Known, Known2);
3737 break;
3738 }
3739 case ISD::AVGFLOORU: {
3740 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3741 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3742 Known = KnownBits::avgFloorU(Known, Known2);
3743 break;
3744 }
3745 case ISD::AVGCEILU: {
3746 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3747 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3748 Known = KnownBits::avgCeilU(Known, Known2);
3749 break;
3750 }
3751 case ISD::AVGFLOORS: {
3752 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3753 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3754 Known = KnownBits::avgFloorS(Known, Known2);
3755 break;
3756 }
3757 case ISD::AVGCEILS: {
3758 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3759 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3760 Known = KnownBits::avgCeilS(Known, Known2);
3761 break;
3762 }
3763 case ISD::SELECT:
3764 case ISD::VSELECT:
3765 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3766 // If we don't know any bits, early out.
3767 if (Known.isUnknown())
3768 break;
3769 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3770
3771 // Only known if known in both the LHS and RHS.
3772 Known = Known.intersectWith(Known2);
3773 break;
3774 case ISD::SELECT_CC:
3775 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3776 // If we don't know any bits, early out.
3777 if (Known.isUnknown())
3778 break;
3779 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3780
3781 // Only known if known in both the LHS and RHS.
3782 Known = Known.intersectWith(Known2);
3783 break;
3784 case ISD::SMULO:
3785 case ISD::UMULO:
3786 if (Op.getResNo() != 1)
3787 break;
3788 // The boolean result conforms to getBooleanContents.
3789 // If we know the result of a setcc has the top bits zero, use this info.
3790 // We know that we have an integer-based boolean since these operations
3791 // are only available for integer.
3792 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3794 BitWidth > 1)
3795 Known.Zero.setBitsFrom(1);
3796 break;
3797 case ISD::SETCC:
3798 case ISD::SETCCCARRY:
3799 case ISD::STRICT_FSETCC:
3800 case ISD::STRICT_FSETCCS: {
3801 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3802 // If we know the result of a setcc has the top bits zero, use this info.
3803 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3805 BitWidth > 1)
3806 Known.Zero.setBitsFrom(1);
3807 break;
3808 }
3809 case ISD::SHL: {
3810 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3811 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3812
3813 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3814 bool NSW = Op->getFlags().hasNoSignedWrap();
3815
3816 bool ShAmtNonZero = Known2.isNonZero();
3817
3818 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3819
3820 // Minimum shift low bits are known zero.
3821 if (std::optional<unsigned> ShMinAmt =
3822 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3823 Known.Zero.setLowBits(*ShMinAmt);
3824 break;
3825 }
3826 case ISD::SRL:
3827 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3828 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3829 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3830 Op->getFlags().hasExact());
3831
3832 // Minimum shift high bits are known zero.
3833 if (std::optional<unsigned> ShMinAmt =
3834 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3835 Known.Zero.setHighBits(*ShMinAmt);
3836 break;
3837 case ISD::SRA:
3838 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3839 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3840 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3841 Op->getFlags().hasExact());
3842 break;
3843 case ISD::ROTL:
3844 case ISD::ROTR:
3845 if (ConstantSDNode *C =
3846 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3847 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3848
3849 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3850
3851 // Canonicalize to ROTR.
3852 if (Opcode == ISD::ROTL && Amt != 0)
3853 Amt = BitWidth - Amt;
3854
3855 Known.Zero = Known.Zero.rotr(Amt);
3856 Known.One = Known.One.rotr(Amt);
3857 }
3858 break;
3859 case ISD::FSHL:
3860 case ISD::FSHR:
3861 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3862 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3863
3864 // For fshl, 0-shift returns the 1st arg.
3865 // For fshr, 0-shift returns the 2nd arg.
3866 if (Amt == 0) {
3867 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3868 DemandedElts, Depth + 1);
3869 break;
3870 }
3871
3872 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3873 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3874 const APInt ShAmt(BitWidth, Amt);
3875 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3876 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3877 Known = Opcode == ISD::FSHL ? KnownBits::fshl(Known, Known2, ShAmt)
3878 : KnownBits::fshr(Known, Known2, ShAmt);
3879 }
3880 break;
3881 case ISD::SHL_PARTS:
3882 case ISD::SRA_PARTS:
3883 case ISD::SRL_PARTS: {
3884 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3885
3886 // Collect lo/hi source values and concatenate.
3887 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3888 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3889 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3890 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3891 Known = Known2.concat(Known);
3892
3893 // Collect shift amount.
3894 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3895
3896 if (Opcode == ISD::SHL_PARTS)
3897 Known = KnownBits::shl(Known, Known2);
3898 else if (Opcode == ISD::SRA_PARTS)
3899 Known = KnownBits::ashr(Known, Known2);
3900 else // if (Opcode == ISD::SRL_PARTS)
3901 Known = KnownBits::lshr(Known, Known2);
3902
3903 // TODO: Minimum shift low/high bits are known zero.
3904
3905 if (Op.getResNo() == 0)
3906 Known = Known.extractBits(LoBits, 0);
3907 else
3908 Known = Known.extractBits(HiBits, LoBits);
3909 break;
3910 }
3912 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3913 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3914 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3915 break;
3916 }
3917 case ISD::CTTZ:
3918 case ISD::CTTZ_ZERO_POISON: {
3919 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3920 // If we have a known 1, its position is our upper bound.
3921 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3922 unsigned LowBits = llvm::bit_width(PossibleTZ);
3923 Known.Zero.setBitsFrom(LowBits);
3924 break;
3925 }
3926 case ISD::CTLZ:
3927 case ISD::CTLZ_ZERO_POISON: {
3928 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3929 // If we have a known 1, its position is our upper bound.
3930 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3931 unsigned LowBits = llvm::bit_width(PossibleLZ);
3932 Known.Zero.setBitsFrom(LowBits);
3933 break;
3934 }
3935 case ISD::CTLS: {
3936 unsigned MinRedundantSignBits =
3937 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3938 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3940 Known = Range.toKnownBits();
3941 break;
3942 }
3943 case ISD::CTPOP: {
3944 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3945 // If we know some of the bits are zero, they can't be one.
3946 unsigned PossibleOnes = Known2.countMaxPopulation();
3947 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3948 break;
3949 }
3950 case ISD::PARITY: {
3951 // Parity returns 0 everywhere but the LSB.
3952 Known.Zero.setBitsFrom(1);
3953 break;
3954 }
3955 case ISD::PDEP: {
3956 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3957 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3958 Known = KnownBits::pdep(Known2, Known);
3959 break;
3960 }
3961 case ISD::PEXT: {
3962 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3963 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3964 Known = KnownBits::pext(Known2, Known);
3965 break;
3966 }
3967 case ISD::CLMUL: {
3968 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3969 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3970 Known = KnownBits::clmul(Known, Known2);
3971 break;
3972 }
3973 case ISD::MGATHER:
3974 case ISD::MLOAD: {
3975 ISD::LoadExtType ETy =
3976 (Opcode == ISD::MGATHER)
3977 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3978 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3979 if (ETy == ISD::ZEXTLOAD) {
3980 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3981 KnownBits Known0(MemVT.getScalarSizeInBits());
3982 return Known0.zext(BitWidth);
3983 }
3984 break;
3985 }
3986 case ISD::LOAD: {
3988 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3989 if (ISD::isNON_EXTLoad(LD) && Cst) {
3990 // Determine any common known bits from the loaded constant pool value.
3991 Type *CstTy = Cst->getType();
3992 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3993 !Op.getValueType().isScalableVector()) {
3994 // If its a vector splat, then we can (quickly) reuse the scalar path.
3995 // NOTE: We assume all elements match and none are UNDEF.
3996 if (CstTy->isVectorTy()) {
3997 if (const Constant *Splat = Cst->getSplatValue()) {
3998 Cst = Splat;
3999 CstTy = Cst->getType();
4000 }
4001 }
4002 // TODO - do we need to handle different bitwidths?
4003 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
4004 // Iterate across all vector elements finding common known bits.
4005 Known.setAllConflict();
4006 for (unsigned i = 0; i != NumElts; ++i) {
4007 if (!DemandedElts[i])
4008 continue;
4009 if (Constant *Elt = Cst->getAggregateElement(i)) {
4010 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4011 const APInt &Value = CInt->getValue();
4012 Known.One &= Value;
4013 Known.Zero &= ~Value;
4014 continue;
4015 }
4016 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4017 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4018 Known.One &= Value;
4019 Known.Zero &= ~Value;
4020 continue;
4021 }
4022 }
4023 Known.One.clearAllBits();
4024 Known.Zero.clearAllBits();
4025 break;
4026 }
4027 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4028 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4029 Known = KnownBits::makeConstant(CInt->getValue());
4030 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4031 Known =
4032 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4033 }
4034 }
4035 }
4036 } else if (Op.getResNo() == 0) {
4037 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4038 KnownBits KnownScalarMemory(ScalarMemorySize);
4039 if (const MDNode *MD = LD->getRanges())
4040 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4041
4042 // Extend the Known bits from memory to the size of the scalar result.
4043 if (ISD::isZEXTLoad(Op.getNode()))
4044 Known = KnownScalarMemory.zext(BitWidth);
4045 else if (ISD::isSEXTLoad(Op.getNode()))
4046 Known = KnownScalarMemory.sext(BitWidth);
4047 else if (ISD::isEXTLoad(Op.getNode()))
4048 Known = KnownScalarMemory.anyext(BitWidth);
4049 else
4050 Known = KnownScalarMemory;
4051 assert(Known.getBitWidth() == BitWidth);
4052 return Known;
4053 }
4054 break;
4055 }
4057 if (Op.getValueType().isScalableVector())
4058 break;
4059 EVT InVT = Op.getOperand(0).getValueType();
4060 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4061 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4062 Known = Known.zext(BitWidth);
4063 break;
4064 }
4065 case ISD::ZERO_EXTEND: {
4066 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4067 Known = Known.zext(BitWidth);
4068 break;
4069 }
4071 if (Op.getValueType().isScalableVector())
4072 break;
4073 EVT InVT = Op.getOperand(0).getValueType();
4074 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4075 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4076 // If the sign bit is known to be zero or one, then sext will extend
4077 // it to the top bits, else it will just zext.
4078 Known = Known.sext(BitWidth);
4079 break;
4080 }
4081 case ISD::SIGN_EXTEND: {
4082 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4083 // If the sign bit is known to be zero or one, then sext will extend
4084 // it to the top bits, else it will just zext.
4085 Known = Known.sext(BitWidth);
4086 break;
4087 }
4089 if (Op.getValueType().isScalableVector())
4090 break;
4091 EVT InVT = Op.getOperand(0).getValueType();
4092 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4093 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4094 Known = Known.anyext(BitWidth);
4095 break;
4096 }
4097 case ISD::ANY_EXTEND: {
4098 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4099 Known = Known.anyext(BitWidth);
4100 break;
4101 }
4102 case ISD::TRUNCATE: {
4103 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4104 Known = Known.trunc(BitWidth);
4105 break;
4106 }
4107 case ISD::TRUNCATE_SSAT_S: {
4108 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4109 Known = Known.truncSSat(BitWidth);
4110 break;
4111 }
4112 case ISD::TRUNCATE_SSAT_U: {
4113 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4114 Known = Known.truncSSatU(BitWidth);
4115 break;
4116 }
4117 case ISD::TRUNCATE_USAT_U: {
4118 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4119 Known = Known.truncUSat(BitWidth);
4120 break;
4121 }
4122 case ISD::AssertZext: {
4123 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4125 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4126 Known.Zero |= (~InMask);
4127 Known.One &= (~Known.Zero);
4128 break;
4129 }
4130 case ISD::AssertAlign: {
4131 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4132 assert(LogOfAlign != 0);
4133
4134 // TODO: Should use maximum with source
4135 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4136 // well as clearing one bits.
4137 Known.Zero.setLowBits(LogOfAlign);
4138 Known.One.clearLowBits(LogOfAlign);
4139 break;
4140 }
4141 case ISD::AssertNoFPClass: {
4142 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4143
4144 FPClassTest NoFPClass =
4145 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4146 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4147 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4148 // Cannot be negative.
4149 Known.makeNonNegative();
4150 }
4151
4152 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4153 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4154 // Cannot be positive.
4155 Known.makeNegative();
4156 }
4157
4158 break;
4159 }
4160 case ISD::FABS:
4161 // fabs clears the sign bit
4162 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4163 Known.makeNonNegative();
4164 break;
4165 case ISD::FGETSIGN:
4166 // All bits are zero except the low bit.
4167 Known.Zero.setBitsFrom(1);
4168 break;
4169 case ISD::ADD: {
4170 SDNodeFlags Flags = Op.getNode()->getFlags();
4171 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4172 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4173 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4175 Op.getOperand(0), DemandedElts,
4177 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4178 Flags.hasNoUnsignedWrap(), SelfAdd);
4179 break;
4180 }
4181 case ISD::SUB: {
4182 SDNodeFlags Flags = Op.getNode()->getFlags();
4183 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4184 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4185 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4186 Flags.hasNoUnsignedWrap());
4187 break;
4188 }
4189 case ISD::USUBO:
4190 case ISD::SSUBO:
4191 case ISD::USUBO_CARRY:
4192 case ISD::SSUBO_CARRY:
4193 if (Op.getResNo() == 1) {
4194 // If we know the result of a setcc has the top bits zero, use this info.
4195 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4197 BitWidth > 1)
4198 Known.Zero.setBitsFrom(1);
4199 break;
4200 }
4201 [[fallthrough]];
4202 case ISD::SUBC: {
4203 assert(Op.getResNo() == 0 &&
4204 "We only compute knownbits for the difference here.");
4205
4206 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4207 KnownBits Borrow(1);
4208 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4209 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4210 // Borrow has bit width 1
4211 Borrow = Borrow.trunc(1);
4212 } else {
4213 Borrow.setAllZero();
4214 }
4215
4216 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4217 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4218 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4219 break;
4220 }
4221 case ISD::UADDO:
4222 case ISD::SADDO:
4223 case ISD::UADDO_CARRY:
4224 case ISD::SADDO_CARRY:
4225 if (Op.getResNo() == 1) {
4226 // If we know the result of a setcc has the top bits zero, use this info.
4227 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4229 BitWidth > 1)
4230 Known.Zero.setBitsFrom(1);
4231 break;
4232 }
4233 [[fallthrough]];
4234 case ISD::ADDC:
4235 case ISD::ADDE: {
4236 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4237
4238 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4239 KnownBits Carry(1);
4240 if (Opcode == ISD::ADDE)
4241 // Can't track carry from glue, set carry to unknown.
4242 Carry.resetAll();
4243 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4244 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4245 // Carry has bit width 1
4246 Carry = Carry.trunc(1);
4247 } else {
4248 Carry.setAllZero();
4249 }
4250
4251 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4252 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4253 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4254 break;
4255 }
4256 case ISD::UDIV: {
4257 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4258 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4259 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4260 break;
4261 }
4262 case ISD::SDIV: {
4263 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4264 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4265 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4266 break;
4267 }
4268 case ISD::SREM: {
4269 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4270 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4271 Known = KnownBits::srem(Known, Known2);
4272 break;
4273 }
4274 case ISD::UREM: {
4275 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4276 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4277 Known = KnownBits::urem(Known, Known2);
4278 break;
4279 }
4280 case ISD::EXTRACT_ELEMENT: {
4281 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4282 const unsigned Index = Op.getConstantOperandVal(1);
4283 const unsigned EltBitWidth = Op.getValueSizeInBits();
4284
4285 // Remove low part of known bits mask
4286 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4287 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4288
4289 // Remove high part of known bit mask
4290 Known = Known.trunc(EltBitWidth);
4291 break;
4292 }
4294 SDValue InVec = Op.getOperand(0);
4295 SDValue EltNo = Op.getOperand(1);
4296 EVT VecVT = InVec.getValueType();
4297 // computeKnownBits not yet implemented for scalable vectors.
4298 if (VecVT.isScalableVector())
4299 break;
4300 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4301 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4302
4303 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4304 // anything about the extended bits.
4305 if (BitWidth > EltBitWidth)
4306 Known = Known.trunc(EltBitWidth);
4307
4308 // If we know the element index, just demand that vector element, else for
4309 // an unknown element index, ignore DemandedElts and demand them all.
4310 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4311 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4312 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4313 DemandedSrcElts =
4314 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4315
4316 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4317 if (BitWidth > EltBitWidth)
4318 Known = Known.anyext(BitWidth);
4319 break;
4320 }
4322 if (Op.getValueType().isScalableVector())
4323 break;
4324
4325 // If we know the element index, split the demand between the
4326 // source vector and the inserted element, otherwise assume we need
4327 // the original demanded vector elements and the value.
4328 SDValue InVec = Op.getOperand(0);
4329 SDValue InVal = Op.getOperand(1);
4330 SDValue EltNo = Op.getOperand(2);
4331 bool DemandedVal = true;
4332 APInt DemandedVecElts = DemandedElts;
4333 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4334 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4335 unsigned EltIdx = CEltNo->getZExtValue();
4336 DemandedVal = !!DemandedElts[EltIdx];
4337 DemandedVecElts.clearBit(EltIdx);
4338 }
4339 Known.setAllConflict();
4340 if (DemandedVal) {
4341 Known2 = computeKnownBits(InVal, Depth + 1);
4342 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4343 }
4344 if (!!DemandedVecElts) {
4345 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4346 Known = Known.intersectWith(Known2);
4347 }
4348 break;
4349 }
4350 case ISD::BITREVERSE: {
4351 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4352 Known = Known2.reverseBits();
4353 break;
4354 }
4355 case ISD::BSWAP: {
4356 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4357 Known = Known2.byteSwap();
4358 break;
4359 }
4360 case ISD::ABS:
4361 case ISD::ABS_MIN_POISON: {
4362 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4363 Known = Known2.abs();
4364 Known.Zero.setHighBits(
4365 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4366 break;
4367 }
4368 case ISD::USUBSAT: {
4369 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4370 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4371 Known = KnownBits::usub_sat(Known, Known2);
4372 break;
4373 }
4374 case ISD::UMIN: {
4375 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4376 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4377 Known = KnownBits::umin(Known, Known2);
4378 break;
4379 }
4380 case ISD::UMAX: {
4381 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4382 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4383 Known = KnownBits::umax(Known, Known2);
4384 break;
4385 }
4386 case ISD::SMIN:
4387 case ISD::SMAX: {
4388 // If we have a clamp pattern, we know that the number of sign bits will be
4389 // the minimum of the clamp min/max range.
4390 bool IsMax = (Opcode == ISD::SMAX);
4391 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4392 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4393 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4394 CstHigh =
4395 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4396 if (CstLow && CstHigh) {
4397 if (!IsMax)
4398 std::swap(CstLow, CstHigh);
4399
4400 const APInt &ValueLow = CstLow->getAPIntValue();
4401 const APInt &ValueHigh = CstHigh->getAPIntValue();
4402 if (ValueLow.sle(ValueHigh)) {
4403 unsigned LowSignBits = ValueLow.getNumSignBits();
4404 unsigned HighSignBits = ValueHigh.getNumSignBits();
4405 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4406 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4407 Known.One.setHighBits(MinSignBits);
4408 break;
4409 }
4410 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4411 Known.Zero.setHighBits(MinSignBits);
4412 break;
4413 }
4414 }
4415 }
4416
4417 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4418 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4419 if (IsMax)
4420 Known = KnownBits::smax(Known, Known2);
4421 else
4422 Known = KnownBits::smin(Known, Known2);
4423
4424 // For SMAX, if CstLow is non-negative we know the result will be
4425 // non-negative and thus all sign bits are 0.
4426 // TODO: There's an equivalent of this for smin with negative constant for
4427 // known ones.
4428 if (IsMax && CstLow) {
4429 const APInt &ValueLow = CstLow->getAPIntValue();
4430 if (ValueLow.isNonNegative()) {
4431 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4432 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4433 }
4434 }
4435
4436 break;
4437 }
4438 case ISD::UINT_TO_FP: {
4439 Known.makeNonNegative();
4440 break;
4441 }
4442 case ISD::SINT_TO_FP: {
4443 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4444 if (Known2.isNonNegative())
4445 Known.makeNonNegative();
4446 else if (Known2.isNegative())
4447 Known.makeNegative();
4448 break;
4449 }
4450 case ISD::FP_TO_UINT_SAT: {
4451 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4452 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4454 break;
4455 }
4456 case ISD::ATOMIC_LOAD: {
4457 // If we are looking at the loaded value.
4458 if (Op.getResNo() == 0) {
4459 auto *AT = cast<AtomicSDNode>(Op);
4460 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4461 KnownBits KnownScalarMemory(ScalarMemorySize);
4462 if (const MDNode *MD = AT->getRanges())
4463 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4464
4465 switch (AT->getExtensionType()) {
4466 case ISD::ZEXTLOAD:
4467 Known = KnownScalarMemory.zext(BitWidth);
4468 break;
4469 case ISD::SEXTLOAD:
4470 Known = KnownScalarMemory.sext(BitWidth);
4471 break;
4472 case ISD::EXTLOAD:
4473 switch (TLI->getExtendForAtomicOps()) {
4474 case ISD::ZERO_EXTEND:
4475 Known = KnownScalarMemory.zext(BitWidth);
4476 break;
4477 case ISD::SIGN_EXTEND:
4478 Known = KnownScalarMemory.sext(BitWidth);
4479 break;
4480 default:
4481 Known = KnownScalarMemory.anyext(BitWidth);
4482 break;
4483 }
4484 break;
4485 case ISD::NON_EXTLOAD:
4486 Known = KnownScalarMemory;
4487 break;
4488 }
4489 assert(Known.getBitWidth() == BitWidth);
4490 }
4491 break;
4492 }
4494 if (Op.getResNo() == 1) {
4495 // The boolean result conforms to getBooleanContents.
4496 // If we know the result of a setcc has the top bits zero, use this info.
4497 // We know that we have an integer-based boolean since these operations
4498 // are only available for integer.
4499 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4501 BitWidth > 1)
4502 Known.Zero.setBitsFrom(1);
4503 break;
4504 }
4505 [[fallthrough]];
4507 case ISD::ATOMIC_SWAP:
4518 case ISD::ATOMIC_LOAD_UMAX: {
4519 // If we are looking at the loaded value.
4520 if (Op.getResNo() == 0) {
4521 auto *AT = cast<AtomicSDNode>(Op);
4522 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4523
4524 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4525 Known.Zero.setBitsFrom(MemBits);
4526 }
4527 break;
4528 }
4529 case ISD::FrameIndex:
4530 case ISD::TargetFrameIndex: {
4531 const MachineFunction &MF = getMachineFunction();
4532 int FrameIdx = cast<FrameIndexSDNode>(Op)->getIndex();
4533 TLI->computeKnownBitsForStackObjectPointer(
4534 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4535 break;
4536 }
4537
4538 default:
4539 if (Opcode < ISD::BUILTIN_OP_END)
4540 break;
4541 [[fallthrough]];
4545 // Allow the target to implement this method for its nodes.
4546 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4547 break;
4548 }
4549
4550 return Known;
4551}
4552
4553/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4566
4569 // X + 0 never overflow
4570 if (isNullConstant(N1))
4571 return OFK_Never;
4572
4573 // If both operands each have at least two sign bits, the addition
4574 // cannot overflow.
4575 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4576 return OFK_Never;
4577
4578 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4579 return OFK_Sometime;
4580}
4581
4584 // X + 0 never overflow
4585 if (isNullConstant(N1))
4586 return OFK_Never;
4587
4588 // mulhi + 1 never overflow
4589 KnownBits N1Known = computeKnownBits(N1);
4590 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4591 N1Known.getMaxValue().ult(2))
4592 return OFK_Never;
4593
4594 KnownBits N0Known = computeKnownBits(N0);
4595 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4596 N0Known.getMaxValue().ult(2))
4597 return OFK_Never;
4598
4599 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4600 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4601 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4602 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4603}
4604
4607 // X - 0 never overflow
4608 if (isNullConstant(N1))
4609 return OFK_Never;
4610
4611 // If both operands each have at least two sign bits, the subtraction
4612 // cannot overflow.
4613 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4614 return OFK_Never;
4615
4616 KnownBits N0Known = computeKnownBits(N0);
4617 KnownBits N1Known = computeKnownBits(N1);
4618 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4619 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4620 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4621}
4622
4625 // X - 0 never overflow
4626 if (isNullConstant(N1))
4627 return OFK_Never;
4628
4629 ConstantRange N0Range =
4630 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4631 ConstantRange N1Range =
4632 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4633 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4634}
4635
4638 // X * 0 and X * 1 never overflow.
4639 if (isNullConstant(N1) || isOneConstant(N1))
4640 return OFK_Never;
4641
4644 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4645}
4646
4649 // X * 0 and X * 1 never overflow.
4650 if (isNullConstant(N1) || isOneConstant(N1))
4651 return OFK_Never;
4652
4653 // Get the size of the result.
4654 unsigned BitWidth = N0.getScalarValueSizeInBits();
4655
4656 // Sum of the sign bits.
4657 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4658
4659 // If we have enough sign bits, then there's no overflow.
4660 if (SignBits > BitWidth + 1)
4661 return OFK_Never;
4662
4663 if (SignBits == BitWidth + 1) {
4664 // The overflow occurs when the true multiplication of the
4665 // the operands is the minimum negative number.
4666 KnownBits N0Known = computeKnownBits(N0);
4667 KnownBits N1Known = computeKnownBits(N1);
4668 // If one of the operands is non-negative, then there's no
4669 // overflow.
4670 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4671 return OFK_Never;
4672 }
4673
4674 return OFK_Sometime;
4675}
4676
4678 unsigned Depth) const {
4679 APInt DemandedElts = getDemandAllEltsMask(Op);
4680 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4681}
4682
4684 const APInt &DemandedElts,
4685 bool ForSigned,
4686 unsigned Depth) const {
4687 EVT VT = Op.getValueType();
4688 unsigned BitWidth = VT.getScalarSizeInBits();
4689
4690 if (Depth >= MaxRecursionDepth)
4691 return ConstantRange::getFull(BitWidth);
4692
4693 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4694 return ConstantRange(C->getAPIntValue());
4695
4696 unsigned Opcode = Op.getOpcode();
4697 switch (Opcode) {
4698 case ISD::VSCALE: {
4700 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4701 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4702 }
4703 default:
4704 break;
4705 }
4706
4707 return ConstantRange::getFull(BitWidth);
4708}
4709
4712 unsigned Depth) const {
4713 APInt DemandedElts = getDemandAllEltsMask(Op);
4714 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4715 Depth);
4716}
4717
4719 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4720 unsigned Depth) const {
4721 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4723 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4726 return CR1.intersectWith(CR2, RangeType);
4727}
4728
4730 unsigned Depth) const {
4731 APInt DemandedElts = getDemandAllEltsMask(Val);
4732 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4733}
4734
4736 const APInt &DemandedElts,
4737 bool OrZero, unsigned Depth) const {
4738 if (Depth >= MaxRecursionDepth)
4739 return false; // Limit search depth.
4740
4741 EVT OpVT = Val.getValueType();
4742 unsigned BitWidth = OpVT.getScalarSizeInBits();
4743 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4744 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4745 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4746 assert(
4747 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4748 "Unexpected vector size");
4749
4750 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4751 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4752 return (OrZero && V.isZero()) || V.isPowerOf2();
4753 };
4754
4755 // Is the constant a known power of 2 or zero?
4756 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4757 return true;
4758
4759 switch (Val.getOpcode()) {
4760 case ISD::BUILD_VECTOR:
4761 // Are all operands of a build vector constant powers of two or zero?
4762 if (all_of(enumerate(Val->ops()), [&](auto P) {
4763 auto *C = dyn_cast<ConstantSDNode>(P.value());
4764 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4765 }))
4766 return true;
4767 break;
4768
4769 case ISD::SPLAT_VECTOR:
4770 // Is the operand of a splat vector a constant power of two?
4771 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4772 if (IsPowerOfTwoOrZero(C))
4773 return true;
4774 break;
4775
4777 SDValue InVec = Val.getOperand(0);
4778 SDValue EltNo = Val.getOperand(1);
4779 EVT VecVT = InVec.getValueType();
4780
4781 // Skip scalable vectors or implicit extensions.
4782 if (VecVT.isScalableVector() ||
4783 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4784 break;
4785
4786 // If we know the element index, just demand that vector element, else for
4787 // an unknown element index, ignore DemandedElts and demand them all.
4788 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4789 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4790 APInt DemandedSrcElts =
4791 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4792 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4793 : APInt::getAllOnes(NumSrcElts);
4794 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4795 }
4796
4797 case ISD::AND: {
4798 // Looking for `x & -x` pattern:
4799 // If x == 0:
4800 // x & -x -> 0
4801 // If x != 0:
4802 // x & -x -> non-zero pow2
4803 // so if we find the pattern return whether we know `x` is non-zero.
4804 SDValue X, Z;
4805 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4806 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4807 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4808 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4809 break;
4810 }
4811
4812 case ISD::SHL: {
4813 // A left-shift of a constant one will have exactly one bit set because
4814 // shifting the bit off the end is undefined.
4815 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4816 if (C && C->getAPIntValue() == 1)
4817 return true;
4818 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4819 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4820 Depth + 1);
4821 }
4822
4823 case ISD::SRL: {
4824 // A logical right-shift of a constant sign-bit will have exactly
4825 // one bit set.
4826 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4827 if (C && C->getAPIntValue().isSignMask())
4828 return true;
4829 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4830 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4831 Depth + 1);
4832 }
4833
4834 case ISD::TRUNCATE:
4835 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4836 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4837 Depth + 1);
4838
4839 case ISD::ROTL:
4840 case ISD::ROTR:
4841 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4842 Depth + 1);
4843 case ISD::BSWAP:
4844 case ISD::BITREVERSE:
4845 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4846 Depth + 1);
4847
4848 case ISD::SMIN:
4849 case ISD::SMAX:
4850 case ISD::UMIN:
4851 case ISD::UMAX:
4852 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4853 Depth + 1) &&
4854 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4855 Depth + 1);
4856
4857 case ISD::SELECT:
4858 case ISD::VSELECT:
4859 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4860 Depth + 1) &&
4861 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4862 Depth + 1);
4863
4864 case ISD::ZERO_EXTEND:
4865 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4866 Depth + 1);
4867
4868 case ISD::VSCALE:
4869 // vscale(power-of-two) is a power-of-two
4870 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4871 Depth + 1);
4872
4873 case ISD::VECTOR_SHUFFLE: {
4875 // Demanded elements with undef shuffle mask elements are unknown
4876 // - we cannot guarantee they are a power of two, so return false.
4877 APInt DemandedLHS, DemandedRHS;
4879 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4880 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4881 DemandedLHS, DemandedRHS))
4882 return false;
4883
4884 // All demanded elements from LHS must be known power of two.
4885 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4886 OrZero, Depth + 1))
4887 return false;
4888
4889 // All demanded elements from RHS must be known power of two.
4890 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4891 OrZero, Depth + 1))
4892 return false;
4893
4894 return true;
4895 }
4896 }
4897
4898 // More could be done here, though the above checks are enough
4899 // to handle some common cases.
4900 return false;
4901}
4902
4904 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4905 return C1->getValueAPF().getExactLog2Abs() >= 0;
4906
4907 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4908 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4909
4910 return false;
4911}
4912
4914 APInt DemandedElts = getDemandAllEltsMask(Op);
4915 return ComputeNumSignBits(Op, DemandedElts, Depth);
4916}
4917
4918unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4919 unsigned Depth) const {
4920 EVT VT = Op.getValueType();
4921 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4922 unsigned VTBits = VT.getScalarSizeInBits();
4923 unsigned NumElts = DemandedElts.getBitWidth();
4924 unsigned Tmp, Tmp2;
4925 unsigned FirstAnswer = 1;
4926
4927 assert((!VT.isScalableVector() || NumElts == 1) &&
4928 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4929
4930 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4931 const APInt &Val = C->getAPIntValue();
4932 return Val.getNumSignBits();
4933 }
4934
4935 if (Depth >= MaxRecursionDepth)
4936 return 1; // Limit search depth.
4937
4938 if (!DemandedElts)
4939 return 1; // No demanded elts, better to assume we don't know anything.
4940
4941 unsigned Opcode = Op.getOpcode();
4942 switch (Opcode) {
4943 default: break;
4944 case ISD::AssertSext:
4945 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4946 return VTBits-Tmp+1;
4947 case ISD::AssertZext:
4948 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4949 return VTBits-Tmp;
4950 case ISD::FREEZE:
4951 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4953 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4954 break;
4955 case ISD::MERGE_VALUES:
4956 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4957 Depth + 1);
4958 case ISD::SPLAT_VECTOR: {
4959 // Check if the sign bits of source go down as far as the truncated value.
4960 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4961 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4962 if (NumSrcSignBits > (NumSrcBits - VTBits))
4963 return NumSrcSignBits - (NumSrcBits - VTBits);
4964 break;
4965 }
4966 case ISD::BUILD_VECTOR:
4967 assert(!VT.isScalableVector());
4968 Tmp = VTBits;
4969 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4970 if (!DemandedElts[i])
4971 continue;
4972
4973 SDValue SrcOp = Op.getOperand(i);
4974 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4975 // for constant nodes to ensure we only look at the sign bits.
4977 APInt T = C->getAPIntValue().trunc(VTBits);
4978 Tmp2 = T.getNumSignBits();
4979 } else {
4980 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4981
4982 if (SrcOp.getValueSizeInBits() != VTBits) {
4983 assert(SrcOp.getValueSizeInBits() > VTBits &&
4984 "Expected BUILD_VECTOR implicit truncation");
4985 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4986 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4987 }
4988 }
4989 Tmp = std::min(Tmp, Tmp2);
4990 }
4991 return Tmp;
4992
4993 case ISD::VECTOR_COMPRESS: {
4994 SDValue Vec = Op.getOperand(0);
4995 SDValue PassThru = Op.getOperand(2);
4996 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4997 if (Tmp == 1)
4998 return 1;
4999 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
5000 Tmp = std::min(Tmp, Tmp2);
5001 return Tmp;
5002 }
5003
5004 case ISD::VECTOR_SHUFFLE: {
5005 // Collect the minimum number of sign bits that are shared by every vector
5006 // element referenced by the shuffle.
5007 APInt DemandedLHS, DemandedRHS;
5009 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5010 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5011 DemandedLHS, DemandedRHS))
5012 return 1;
5013
5014 Tmp = std::numeric_limits<unsigned>::max();
5015 if (!!DemandedLHS)
5016 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5017 if (!!DemandedRHS) {
5018 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5019 Tmp = std::min(Tmp, Tmp2);
5020 }
5021 // If we don't know anything, early out and try computeKnownBits fall-back.
5022 if (Tmp == 1)
5023 break;
5024 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5025 return Tmp;
5026 }
5027
5028 case ISD::BITCAST: {
5029 if (VT.isScalableVector())
5030 break;
5031 SDValue N0 = Op.getOperand(0);
5032 EVT SrcVT = N0.getValueType();
5033 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5034
5035 // Ignore bitcasts from unsupported types..
5036 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5037 break;
5038
5039 // Fast handling of 'identity' bitcasts.
5040 if (VTBits == SrcBits)
5041 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5042
5043 bool IsLE = getDataLayout().isLittleEndian();
5044
5045 // Bitcast 'large element' scalar/vector to 'small element' vector.
5046 if ((SrcBits % VTBits) == 0) {
5047 assert(VT.isVector() && "Expected bitcast to vector");
5048
5049 unsigned Scale = SrcBits / VTBits;
5050 APInt SrcDemandedElts =
5051 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5052
5053 // Fast case - sign splat can be simply split across the small elements.
5054 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5055 if (Tmp == SrcBits)
5056 return VTBits;
5057
5058 // Slow case - determine how far the sign extends into each sub-element.
5059 Tmp2 = VTBits;
5060 for (unsigned i = 0; i != NumElts; ++i)
5061 if (DemandedElts[i]) {
5062 unsigned SubOffset = i % Scale;
5063 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5064 SubOffset = SubOffset * VTBits;
5065 if (Tmp <= SubOffset)
5066 return 1;
5067 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5068 }
5069 return Tmp2;
5070 }
5071 break;
5072 }
5073
5075 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5076 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5077 return VTBits - Tmp + 1;
5078 case ISD::SIGN_EXTEND:
5079 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5080 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5082 // Max of the input and what this extends.
5083 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5084 Tmp = VTBits-Tmp+1;
5085 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5086 return std::max(Tmp, Tmp2);
5088 if (VT.isScalableVector())
5089 break;
5090 SDValue Src = Op.getOperand(0);
5091 EVT SrcVT = Src.getValueType();
5092 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5093 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5094 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5095 }
5096 case ISD::SRA:
5097 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5098 // SRA X, C -> adds C sign bits.
5099 if (std::optional<unsigned> ShAmt =
5100 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5101 Tmp = std::min(Tmp + *ShAmt, VTBits);
5102 return Tmp;
5103 case ISD::SHL:
5104 if (std::optional<ConstantRange> ShAmtRange =
5105 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5106 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5107 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5108 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5109 // shifted out, then we can compute the number of sign bits for the
5110 // operand being extended. A future improvement could be to pass along the
5111 // "shifted left by" information in the recursive calls to
5112 // ComputeKnownSignBits. Allowing us to handle this more generically.
5113 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5114 SDValue Ext = Op.getOperand(0);
5115 EVT ExtVT = Ext.getValueType();
5116 SDValue Extendee = Ext.getOperand(0);
5117 EVT ExtendeeVT = Extendee.getValueType();
5118 unsigned SizeDifference =
5119 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5120 if (SizeDifference <= MinShAmt) {
5121 Tmp = SizeDifference +
5122 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5123 if (MaxShAmt < Tmp)
5124 return Tmp - MaxShAmt;
5125 }
5126 }
5127 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5128 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5129 if (MaxShAmt < Tmp)
5130 return Tmp - MaxShAmt;
5131 }
5132 break;
5133 case ISD::AND:
5134 case ISD::OR:
5135 case ISD::XOR: // NOT is handled here.
5136 // Logical binary ops preserve the number of sign bits at the worst.
5137 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5138 if (Tmp != 1) {
5139 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5140 FirstAnswer = std::min(Tmp, Tmp2);
5141 // We computed what we know about the sign bits as our first
5142 // answer. Now proceed to the generic code that uses
5143 // computeKnownBits, and pick whichever answer is better.
5144 }
5145 break;
5146
5147 case ISD::SELECT:
5148 case ISD::VSELECT:
5149 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5150 if (Tmp == 1) return 1; // Early out.
5151 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5152 return std::min(Tmp, Tmp2);
5153 case ISD::SELECT_CC:
5154 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5155 if (Tmp == 1) return 1; // Early out.
5156 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5157 return std::min(Tmp, Tmp2);
5158
5159 case ISD::SMIN:
5160 case ISD::SMAX: {
5161 // If we have a clamp pattern, we know that the number of sign bits will be
5162 // the minimum of the clamp min/max range.
5163 bool IsMax = (Opcode == ISD::SMAX);
5164 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5165 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5166 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5167 CstHigh =
5168 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5169 if (CstLow && CstHigh) {
5170 if (!IsMax)
5171 std::swap(CstLow, CstHigh);
5172 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5173 Tmp = CstLow->getAPIntValue().getNumSignBits();
5174 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5175 return std::min(Tmp, Tmp2);
5176 }
5177 }
5178
5179 // Fallback - just get the minimum number of sign bits of the operands.
5180 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5181 if (Tmp == 1)
5182 return 1; // Early out.
5183 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5184 return std::min(Tmp, Tmp2);
5185 }
5186 case ISD::UMIN:
5187 case ISD::UMAX:
5188 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5189 if (Tmp == 1)
5190 return 1; // Early out.
5191 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5192 return std::min(Tmp, Tmp2);
5193 case ISD::SSUBO_CARRY:
5194 case ISD::USUBO_CARRY:
5195 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5196 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5197 return VTBits;
5198 [[fallthrough]];
5199 case ISD::SADDO:
5200 case ISD::UADDO:
5201 case ISD::SADDO_CARRY:
5202 case ISD::UADDO_CARRY:
5203 case ISD::SSUBO:
5204 case ISD::USUBO:
5205 case ISD::SMULO:
5206 case ISD::UMULO:
5207 if (Op.getResNo() != 1)
5208 break;
5209 // The boolean result conforms to getBooleanContents. Fall through.
5210 // If setcc returns 0/-1, all bits are sign bits.
5211 // We know that we have an integer-based boolean since these operations
5212 // are only available for integer.
5213 if (TLI->getBooleanContents(VT.isVector(), false) ==
5215 return VTBits;
5216 break;
5217 case ISD::SETCC:
5218 case ISD::SETCCCARRY:
5219 case ISD::STRICT_FSETCC:
5220 case ISD::STRICT_FSETCCS: {
5221 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5222 // If setcc returns 0/-1, all bits are sign bits.
5223 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5225 return VTBits;
5226 break;
5227 }
5228 case ISD::ROTL:
5229 case ISD::ROTR:
5230 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5231
5232 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5233 if (Tmp == VTBits)
5234 return VTBits;
5235
5236 if (ConstantSDNode *C =
5237 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5238 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5239
5240 // Handle rotate right by N like a rotate left by 32-N.
5241 if (Opcode == ISD::ROTR)
5242 RotAmt = (VTBits - RotAmt) % VTBits;
5243
5244 // If we aren't rotating out all of the known-in sign bits, return the
5245 // number that are left. This handles rotl(sext(x), 1) for example.
5246 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5247 }
5248 break;
5249 case ISD::ADD:
5250 case ISD::ADDC:
5251 // TODO: Move Operand 1 check before Operand 0 check
5252 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5253 if (Tmp == 1) return 1; // Early out.
5254
5255 // Special case decrementing a value (ADD X, -1):
5256 if (ConstantSDNode *CRHS =
5257 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5258 if (CRHS->isAllOnes()) {
5260 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5261
5262 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5263 // sign bits set.
5264 if ((Known.Zero | 1).isAllOnes())
5265 return VTBits;
5266
5267 // If we are subtracting one from a positive number, there is no carry
5268 // out of the result.
5269 if (Known.isNonNegative())
5270 return Tmp;
5271 }
5272
5273 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5274 if (Tmp2 == 1) return 1; // Early out.
5275
5276 // Add can have at most one carry bit. Thus we know that the output
5277 // is, at worst, one more bit than the inputs.
5278 return std::min(Tmp, Tmp2) - 1;
5279 case ISD::SUB:
5280 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5281 if (Tmp2 == 1) return 1; // Early out.
5282
5283 // Handle NEG.
5284 if (ConstantSDNode *CLHS =
5285 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5286 if (CLHS->isZero()) {
5288 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5289 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5290 // sign bits set.
5291 if ((Known.Zero | 1).isAllOnes())
5292 return VTBits;
5293
5294 // If the input is known to be positive (the sign bit is known clear),
5295 // the output of the NEG has the same number of sign bits as the input.
5296 if (Known.isNonNegative())
5297 return Tmp2;
5298
5299 // Otherwise, we treat this like a SUB.
5300 }
5301
5302 // Sub can have at most one carry bit. Thus we know that the output
5303 // is, at worst, one more bit than the inputs.
5304 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5305 if (Tmp == 1) return 1; // Early out.
5306 return std::min(Tmp, Tmp2) - 1;
5307 case ISD::MUL: {
5308 // The output of the Mul can be at most twice the valid bits in the inputs.
5309 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5310 if (SignBitsOp0 == 1)
5311 break;
5312 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5313 if (SignBitsOp1 == 1)
5314 break;
5315 unsigned OutValidBits =
5316 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5317 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5318 }
5319 case ISD::AVGCEILS:
5320 case ISD::AVGFLOORS:
5321 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5322 if (Tmp == 1)
5323 return 1; // Early out.
5324 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5325 return std::min(Tmp, Tmp2);
5326 case ISD::SREM:
5327 // The sign bit is the LHS's sign bit, except when the result of the
5328 // remainder is zero. The magnitude of the result should be less than or
5329 // equal to the magnitude of the LHS. Therefore, the result should have
5330 // at least as many sign bits as the left hand side.
5331 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5332 case ISD::TRUNCATE: {
5333 // Check if the sign bits of source go down as far as the truncated value.
5334 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5335 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5336 if (NumSrcSignBits > (NumSrcBits - VTBits))
5337 return NumSrcSignBits - (NumSrcBits - VTBits);
5338 break;
5339 }
5340 case ISD::EXTRACT_ELEMENT: {
5341 if (VT.isScalableVector())
5342 break;
5343 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5344 const int BitWidth = Op.getValueSizeInBits();
5345 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5346
5347 // Get reverse index (starting from 1), Op1 value indexes elements from
5348 // little end. Sign starts at big end.
5349 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5350
5351 // If the sign portion ends in our element the subtraction gives correct
5352 // result. Otherwise it gives either negative or > bitwidth result
5353 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5354 }
5356 if (VT.isScalableVector())
5357 break;
5358 // If we know the element index, split the demand between the
5359 // source vector and the inserted element, otherwise assume we need
5360 // the original demanded vector elements and the value.
5361 SDValue InVec = Op.getOperand(0);
5362 SDValue InVal = Op.getOperand(1);
5363 SDValue EltNo = Op.getOperand(2);
5364 bool DemandedVal = true;
5365 APInt DemandedVecElts = DemandedElts;
5366 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5367 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5368 unsigned EltIdx = CEltNo->getZExtValue();
5369 DemandedVal = !!DemandedElts[EltIdx];
5370 DemandedVecElts.clearBit(EltIdx);
5371 }
5372 Tmp = std::numeric_limits<unsigned>::max();
5373 if (DemandedVal) {
5374 // TODO - handle implicit truncation of inserted elements.
5375 if (InVal.getScalarValueSizeInBits() != VTBits)
5376 break;
5377 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5378 Tmp = std::min(Tmp, Tmp2);
5379 }
5380 if (!!DemandedVecElts) {
5381 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5382 Tmp = std::min(Tmp, Tmp2);
5383 }
5384 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5385 return Tmp;
5386 }
5388 SDValue InVec = Op.getOperand(0);
5389 SDValue EltNo = Op.getOperand(1);
5390 EVT VecVT = InVec.getValueType();
5391 // ComputeNumSignBits not yet implemented for scalable vectors.
5392 if (VecVT.isScalableVector())
5393 break;
5394 const unsigned BitWidth = Op.getValueSizeInBits();
5395 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5396 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5397
5398 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5399 // anything about sign bits. But if the sizes match we can derive knowledge
5400 // about sign bits from the vector operand.
5401 if (BitWidth != EltBitWidth)
5402 break;
5403
5404 // If we know the element index, just demand that vector element, else for
5405 // an unknown element index, ignore DemandedElts and demand them all.
5406 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5407 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5408 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5409 DemandedSrcElts =
5410 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5411
5412 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5413 }
5415 // Offset the demanded elts by the subvector index.
5416 SDValue Src = Op.getOperand(0);
5417
5418 APInt DemandedSrcElts;
5419 if (Src.getValueType().isScalableVector())
5420 DemandedSrcElts = APInt(1, 1);
5421 else {
5422 uint64_t Idx = Op.getConstantOperandVal(1);
5423 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5424 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5425 }
5426 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5427 }
5428 case ISD::CONCAT_VECTORS: {
5429 if (VT.isScalableVector())
5430 break;
5431 // Determine the minimum number of sign bits across all demanded
5432 // elts of the input vectors. Early out if the result is already 1.
5433 Tmp = std::numeric_limits<unsigned>::max();
5434 EVT SubVectorVT = Op.getOperand(0).getValueType();
5435 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5436 unsigned NumSubVectors = Op.getNumOperands();
5437 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5438 APInt DemandedSub =
5439 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5440 if (!DemandedSub)
5441 continue;
5442 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5443 Tmp = std::min(Tmp, Tmp2);
5444 }
5445 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5446 return Tmp;
5447 }
5448 case ISD::INSERT_SUBVECTOR: {
5449 if (VT.isScalableVector())
5450 break;
5451 // Demand any elements from the subvector and the remainder from the src its
5452 // inserted into.
5453 SDValue Src = Op.getOperand(0);
5454 SDValue Sub = Op.getOperand(1);
5455 uint64_t Idx = Op.getConstantOperandVal(2);
5456 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5457 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5458 APInt DemandedSrcElts = DemandedElts;
5459 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5460
5461 Tmp = std::numeric_limits<unsigned>::max();
5462 if (!!DemandedSubElts) {
5463 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5464 if (Tmp == 1)
5465 return 1; // early-out
5466 }
5467 if (!!DemandedSrcElts) {
5468 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5469 Tmp = std::min(Tmp, Tmp2);
5470 }
5471 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5472 return Tmp;
5473 }
5474 case ISD::LOAD: {
5475 // If we are looking at the loaded value of the SDNode.
5476 if (Op.getResNo() != 0)
5477 break;
5478
5480 if (const MDNode *Ranges = LD->getRanges()) {
5481 if (DemandedElts != 1)
5482 break;
5483
5485 if (VTBits > CR.getBitWidth()) {
5486 switch (LD->getExtensionType()) {
5487 case ISD::SEXTLOAD:
5488 CR = CR.signExtend(VTBits);
5489 break;
5490 case ISD::ZEXTLOAD:
5491 CR = CR.zeroExtend(VTBits);
5492 break;
5493 default:
5494 break;
5495 }
5496 }
5497
5498 if (VTBits != CR.getBitWidth())
5499 break;
5500 return std::min(CR.getSignedMin().getNumSignBits(),
5502 }
5503
5504 unsigned ExtType = LD->getExtensionType();
5505 switch (ExtType) {
5506 default:
5507 break;
5508 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5509 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5510 return VTBits - Tmp + 1;
5511 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5512 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5513 return VTBits - Tmp;
5514 case ISD::NON_EXTLOAD:
5515 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5516 // We only need to handle vectors - computeKnownBits should handle
5517 // scalar cases.
5518 Type *CstTy = Cst->getType();
5519 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5520 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5521 VTBits == CstTy->getScalarSizeInBits()) {
5522 Tmp = VTBits;
5523 for (unsigned i = 0; i != NumElts; ++i) {
5524 if (!DemandedElts[i])
5525 continue;
5526 if (Constant *Elt = Cst->getAggregateElement(i)) {
5527 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5528 const APInt &Value = CInt->getValue();
5529 Tmp = std::min(Tmp, Value.getNumSignBits());
5530 continue;
5531 }
5532 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5533 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5534 Tmp = std::min(Tmp, Value.getNumSignBits());
5535 continue;
5536 }
5537 }
5538 // Unknown type. Conservatively assume no bits match sign bit.
5539 return 1;
5540 }
5541 return Tmp;
5542 }
5543 }
5544 break;
5545 }
5546
5547 break;
5548 }
5551 case ISD::ATOMIC_SWAP:
5563 case ISD::ATOMIC_LOAD: {
5564 auto *AT = cast<AtomicSDNode>(Op);
5565 // If we are looking at the loaded value.
5566 if (Op.getResNo() == 0) {
5567 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5568 if (Tmp == VTBits)
5569 return 1; // early-out
5570
5571 // For atomic_load, prefer to use the extension type.
5572 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5573 switch (AT->getExtensionType()) {
5574 default:
5575 break;
5576 case ISD::SEXTLOAD:
5577 return VTBits - Tmp + 1;
5578 case ISD::ZEXTLOAD:
5579 return VTBits - Tmp;
5580 }
5581 }
5582
5583 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5584 return VTBits - Tmp + 1;
5585 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5586 return VTBits - Tmp;
5587 }
5588 break;
5589 }
5590 }
5591
5592 // Allow the target to implement this method for its nodes.
5593 if (Opcode >= ISD::BUILTIN_OP_END ||
5594 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5595 Opcode == ISD::INTRINSIC_W_CHAIN ||
5596 Opcode == ISD::INTRINSIC_VOID) {
5597 // TODO: This can probably be removed once target code is audited. This
5598 // is here purely to reduce patch size and review complexity.
5599 if (!VT.isScalableVector()) {
5600 unsigned NumBits =
5601 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5602 if (NumBits > 1)
5603 FirstAnswer = std::max(FirstAnswer, NumBits);
5604 }
5605 }
5606
5607 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5608 // use this information.
5609 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5610 return std::max(FirstAnswer, Known.countMinSignBits());
5611}
5612
5614 unsigned Depth) const {
5615 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5616 return Op.getScalarValueSizeInBits() - SignBits + 1;
5617}
5618
5620 const APInt &DemandedElts,
5621 unsigned Depth) const {
5622 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5623 return Op.getScalarValueSizeInBits() - SignBits + 1;
5624}
5625
5627 UndefPoisonKind Kind,
5628 unsigned Depth) const {
5629 // Early out for FREEZE.
5630 if (Op.getOpcode() == ISD::FREEZE)
5631 return true;
5632
5633 APInt DemandedElts = getDemandAllEltsMask(Op);
5634 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5635}
5636
5638 const APInt &DemandedElts,
5639 UndefPoisonKind Kind,
5640 unsigned Depth) const {
5641 unsigned Opcode = Op.getOpcode();
5642
5643 // Early out for FREEZE.
5644 if (Opcode == ISD::FREEZE)
5645 return true;
5646
5647 if (Depth >= MaxRecursionDepth)
5648 return false; // Limit search depth.
5649
5650 if (isIntOrFPConstant(Op))
5651 return true;
5652
5653 switch (Opcode) {
5654 case ISD::CONDCODE:
5655 case ISD::VALUETYPE:
5656 case ISD::FrameIndex:
5658 case ISD::CopyFromReg:
5659 return true;
5660
5661 case ISD::POISON:
5662 return !includesPoison(Kind);
5663
5664 case ISD::UNDEF:
5665 return !includesUndef(Kind);
5666
5667 case ISD::BITCAST: {
5668 SDValue Src = Op.getOperand(0);
5669 EVT SrcVT = Src.getValueType();
5670 EVT DstVT = Op.getValueType();
5671
5672 if (!SrcVT.isVector() || !DstVT.isVector())
5673 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5674
5675 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5676 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5677 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5678 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5679
5680 if (SrcEltBits == DstEltBits)
5681 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5682 Depth + 1);
5683
5684 if (SrcEltBits < DstEltBits) {
5685 if (DstEltBits % SrcEltBits != 0)
5686 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5687
5688 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5689 "Unexpected vector bitcast");
5690 APInt DemandedSrcElts =
5691 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5692 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5693 Depth + 1);
5694 }
5695
5696 if (SrcEltBits % DstEltBits != 0)
5697 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5698
5699 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5700 "Unexpected vector bitcast");
5701 APInt DemandedSrcElts =
5702 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5703 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5704 Depth + 1);
5705 }
5706
5707 case ISD::BUILD_VECTOR:
5708 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5709 // this shouldn't affect the result.
5710 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5711 if (!DemandedElts[i])
5712 continue;
5713 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5714 return false;
5715 }
5716 return true;
5717
5718 case ISD::CONCAT_VECTORS: {
5719 EVT VT = Op.getValueType();
5720 if (!VT.isFixedLengthVector())
5721 break;
5722
5723 EVT SubVT = Op.getOperand(0).getValueType();
5724 unsigned NumSubElts = SubVT.getVectorNumElements();
5725 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5726 APInt DemandedSubElts =
5727 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5728 if (!!DemandedSubElts &&
5729 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5730 Kind, Depth + 1))
5731 return false;
5732 }
5733 return true;
5734 }
5735
5737 SDValue Src = Op.getOperand(0);
5738 if (Src.getValueType().isScalableVector())
5739 break;
5740 uint64_t Idx = Op.getConstantOperandVal(1);
5741 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5742 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5743 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5744 Depth + 1);
5745 }
5746
5747 case ISD::INSERT_SUBVECTOR: {
5748 if (Op.getValueType().isScalableVector())
5749 break;
5750 SDValue Src = Op.getOperand(0);
5751 SDValue Sub = Op.getOperand(1);
5752 uint64_t Idx = Op.getConstantOperandVal(2);
5753 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5754 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5755 APInt DemandedSrcElts = DemandedElts;
5756 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5757
5758 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5759 Sub, DemandedSubElts, Kind, Depth + 1))
5760 return false;
5761 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5762 Src, DemandedSrcElts, Kind, Depth + 1))
5763 return false;
5764 return true;
5765 }
5766
5768 SDValue Src = Op.getOperand(0);
5769 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5770 EVT SrcVT = Src.getValueType();
5771 if (SrcVT.isFixedLengthVector() && IndexC &&
5772 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5773 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5774 IndexC->getZExtValue());
5775 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5776 Depth + 1);
5777 }
5778 break;
5779 }
5780
5782 SDValue InVec = Op.getOperand(0);
5783 SDValue InVal = Op.getOperand(1);
5784 SDValue EltNo = Op.getOperand(2);
5785 EVT VT = InVec.getValueType();
5786 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5787 if (IndexC && VT.isFixedLengthVector() &&
5788 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5789 if (DemandedElts[IndexC->getZExtValue()] &&
5790 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5791 return false;
5792 APInt InVecDemandedElts = DemandedElts;
5793 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5794 if (!!InVecDemandedElts &&
5796 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5797 InVecDemandedElts, Kind, Depth + 1))
5798 return false;
5799 return true;
5800 }
5801 break;
5802 }
5803
5805 // Check upper (known undef) elements.
5806 if (DemandedElts.ugt(1) && includesUndef(Kind))
5807 return false;
5808 // Check element zero.
5809 if (DemandedElts[0] &&
5810 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5811 return false;
5812 return true;
5813
5814 case ISD::SPLAT_VECTOR:
5815 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5816
5817 case ISD::SELECT: {
5818 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5819 /*ConsiderFlags*/ true, Depth) &&
5820 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5821 Depth + 1) &&
5822 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5823 Kind, Depth + 1) &&
5824 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5825 Kind, Depth + 1);
5826 }
5827
5828 case ISD::VECTOR_SHUFFLE: {
5829 APInt DemandedLHS, DemandedRHS;
5830 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5831 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5832 DemandedElts, DemandedLHS, DemandedRHS,
5833 /*AllowUndefElts=*/false))
5834 return false;
5835 if (!DemandedLHS.isZero() &&
5836 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5837 Depth + 1))
5838 return false;
5839 if (!DemandedRHS.isZero() &&
5840 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5841 Depth + 1))
5842 return false;
5843 return true;
5844 }
5845
5846 case ISD::SHL:
5847 case ISD::SRL:
5848 case ISD::SRA:
5849 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5850 // enough to check operand 0 if Op can't create undef/poison.
5851 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5852 /*ConsiderFlags*/ true, Depth) &&
5853 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5854 Kind, Depth + 1);
5855
5856 case ISD::BSWAP:
5857 case ISD::CTPOP:
5858 case ISD::BITREVERSE:
5859 case ISD::AND:
5860 case ISD::OR:
5861 case ISD::XOR:
5862 case ISD::ADD:
5863 case ISD::SUB:
5864 case ISD::MUL:
5865 case ISD::SADDSAT:
5866 case ISD::UADDSAT:
5867 case ISD::SSUBSAT:
5868 case ISD::USUBSAT:
5869 case ISD::SSHLSAT:
5870 case ISD::USHLSAT:
5871 case ISD::SMIN:
5872 case ISD::SMAX:
5873 case ISD::UMIN:
5874 case ISD::UMAX:
5875 case ISD::ZERO_EXTEND:
5876 case ISD::SIGN_EXTEND:
5877 case ISD::ANY_EXTEND:
5878 case ISD::TRUNCATE:
5879 case ISD::VSELECT: {
5880 // If Op can't create undef/poison and none of its operands are undef/poison
5881 // then Op is never undef/poison. A difference from the more common check
5882 // below, outside the switch, is that we handle elementwise operations for
5883 // which the DemandedElts mask is valid for all operands here.
5884 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5885 /*ConsiderFlags*/ true, Depth) &&
5886 all_of(Op->ops(), [&](SDValue V) {
5887 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5888 Depth + 1);
5889 });
5890 }
5891
5892 // TODO: Search for noundef attributes from library functions.
5893
5894 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5895
5896 default:
5897 // Allow the target to implement this method for its nodes.
5898 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5899 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5900 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5901 Op, DemandedElts, *this, Kind, Depth);
5902 break;
5903 }
5904
5905 // If Op can't create undef/poison and none of its operands are undef/poison
5906 // then Op is never undef/poison.
5907 // NOTE: TargetNodes can handle this in themselves in
5908 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5909 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5910 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5911 all_of(Op->ops(), [&](SDValue V) {
5912 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5913 });
5914}
5915
5917 bool ConsiderFlags,
5918 unsigned Depth) const {
5919 APInt DemandedElts = getDemandAllEltsMask(Op);
5920 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5921}
5922
5924 UndefPoisonKind Kind,
5925 bool ConsiderFlags,
5926 unsigned Depth) const {
5927 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5928 return true;
5929
5930 unsigned Opcode = Op.getOpcode();
5931 switch (Opcode) {
5932 case ISD::AssertSext:
5933 case ISD::AssertZext:
5934 case ISD::AssertAlign:
5936 // Assertion nodes can create poison if the assertion fails.
5937 return includesPoison(Kind);
5938
5939 case ISD::FREEZE:
5943 case ISD::SADDSAT:
5944 case ISD::UADDSAT:
5945 case ISD::SSUBSAT:
5946 case ISD::USUBSAT:
5947 case ISD::MULHU:
5948 case ISD::MULHS:
5949 case ISD::AVGFLOORS:
5950 case ISD::AVGFLOORU:
5951 case ISD::AVGCEILS:
5952 case ISD::AVGCEILU:
5953 case ISD::ABDU:
5954 case ISD::ABDS:
5955 case ISD::SMIN:
5956 case ISD::SMAX:
5957 case ISD::SCMP:
5958 case ISD::UMIN:
5959 case ISD::UMAX:
5960 case ISD::UCMP:
5961 case ISD::AND:
5962 case ISD::XOR:
5963 case ISD::ROTL:
5964 case ISD::ROTR:
5965 case ISD::FSHL:
5966 case ISD::FSHR:
5967 case ISD::BSWAP:
5968 case ISD::CTTZ:
5969 case ISD::CTLZ:
5970 case ISD::CTLS:
5971 case ISD::CTPOP:
5972 case ISD::BITREVERSE:
5973 case ISD::PARITY:
5974 case ISD::SIGN_EXTEND:
5975 case ISD::TRUNCATE:
5979 case ISD::BITCAST:
5980 case ISD::BUILD_VECTOR:
5981 case ISD::BUILD_PAIR:
5982 case ISD::SPLAT_VECTOR:
5983 case ISD::FABS:
5984 case ISD::FCEIL:
5985 case ISD::FFLOOR:
5986 case ISD::FTRUNC:
5987 case ISD::FRINT:
5988 case ISD::FNEARBYINT:
5989 case ISD::FROUND:
5990 case ISD::FROUNDEVEN:
5991 return false;
5992
5993 case ISD::ABS:
5994 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5995 // Different to Intrinsic::abs.
5996 return false;
5998 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
5999 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
6000
6001 case ISD::ADDC:
6002 case ISD::SUBC:
6003 case ISD::ADDE:
6004 case ISD::SUBE:
6005 case ISD::SADDO:
6006 case ISD::SSUBO:
6007 case ISD::SMULO:
6008 case ISD::SADDO_CARRY:
6009 case ISD::SSUBO_CARRY:
6010 case ISD::UADDO:
6011 case ISD::USUBO:
6012 case ISD::UMULO:
6013 case ISD::UADDO_CARRY:
6014 case ISD::USUBO_CARRY:
6015 // No poison on result or overflow flags.
6016 return false;
6017
6018 case ISD::SELECT_CC:
6019 case ISD::SETCC: {
6020 // Integer setcc cannot create undef or poison.
6021 if (Op.getOperand(0).getValueType().isInteger())
6022 return false;
6023
6024 // FP compares are more complicated. They can create poison for nan/infinity
6025 // based on options and flags. The options and flags also cause special
6026 // nonan condition codes to be used. Those condition codes may be preserved
6027 // even if the nonan flag is dropped somewhere.
6028 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6029 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6030 return (unsigned)CCCode & 0x10U;
6031 }
6032
6033 case ISD::OR:
6034 case ISD::ZERO_EXTEND:
6035 case ISD::SELECT:
6036 case ISD::VSELECT:
6037 case ISD::ADD:
6038 case ISD::SUB:
6039 case ISD::MUL:
6040 case ISD::FNEG:
6041 case ISD::FADD:
6042 case ISD::FSUB:
6043 case ISD::FMUL:
6044 case ISD::FDIV:
6045 case ISD::FREM:
6046 case ISD::FCOPYSIGN:
6047 case ISD::FMA:
6048 case ISD::FMAD:
6049 case ISD::FMULADD:
6050 case ISD::FP_EXTEND:
6051 case ISD::FMINNUM:
6052 case ISD::FMAXNUM:
6053 case ISD::FMINNUM_IEEE:
6054 case ISD::FMAXNUM_IEEE:
6055 case ISD::FMINIMUM:
6056 case ISD::FMAXIMUM:
6057 case ISD::FMINIMUMNUM:
6058 case ISD::FMAXIMUMNUM:
6064 // No poison except from flags (which is handled above)
6065 return false;
6066
6067 case ISD::SHL:
6068 case ISD::SRL:
6069 case ISD::SRA:
6070 // If the max shift amount isn't in range, then the shift can
6071 // create poison.
6072 return includesPoison(Kind) &&
6073 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6074
6077 // If the amount is zero then the result will be poison.
6078 // TODO: Add isKnownNeverZero DemandedElts handling.
6079 return includesPoison(Kind) &&
6080 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6081
6083 // Check if we demand any upper (undef) elements.
6084 return includesUndef(Kind) && DemandedElts.ugt(1);
6085
6088 // Ensure that the element index is in bounds.
6089 if (includesPoison(Kind)) {
6090 EVT VecVT = Op.getOperand(0).getValueType();
6091 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6092 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6093 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6094 }
6095 return false;
6096 }
6097
6098 case ISD::VECTOR_SHUFFLE: {
6099 // Check for any demanded shuffle element that is undef.
6100 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6101 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6102 if (Elt < 0 && DemandedElts[Idx])
6103 return true;
6104 return false;
6105 }
6106
6108 return false;
6109
6110 default:
6111 // Allow the target to implement this method for its nodes.
6112 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6113 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6114 return TLI->canCreateUndefOrPoisonForTargetNode(
6115 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6116 break;
6117 }
6118
6119 // Be conservative and return true.
6120 return true;
6121}
6122
6123bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6124 unsigned Opcode = Op.getOpcode();
6125 if (Opcode == ISD::OR)
6126 return Op->getFlags().hasDisjoint() ||
6127 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6128 if (Opcode == ISD::XOR)
6129 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6130 return false;
6131}
6132
6134 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6135 (Op.isAnyAdd() || isADDLike(Op));
6136}
6137
6139 FPClassTest InterestedClasses,
6140 unsigned Depth) const {
6141 APInt DemandedElts = getDemandAllEltsMask(Op);
6142 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6143}
6144
6146 const APInt &DemandedElts,
6147 FPClassTest InterestedClasses,
6148 unsigned Depth) const {
6150
6151 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6152 return KnownFPClass(CFP->getValueAPF());
6153
6154 if (Depth >= MaxRecursionDepth)
6155 return Known;
6156
6157 if (Op.getOpcode() == ISD::UNDEF)
6158 return Known;
6159
6160 EVT VT = Op.getValueType();
6161 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6162 assert((!VT.isFixedLengthVector() ||
6163 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6164 "Unexpected vector size");
6165
6166 if (!DemandedElts)
6167 return Known;
6168
6169 unsigned Opcode = Op.getOpcode();
6170 switch (Opcode) {
6171 case ISD::POISON: {
6172 Known.KnownFPClasses = fcNone;
6173 Known.SignBit = false;
6174 break;
6175 }
6176 case ISD::FNEG: {
6177 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6178 InterestedClasses, Depth + 1);
6179 Known.fneg();
6180 break;
6181 }
6182 case ISD::BUILD_VECTOR: {
6183 assert(!VT.isScalableVector());
6184 bool First = true;
6185 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6186 if (!DemandedElts[I])
6187 continue;
6188
6189 if (First) {
6190 Known =
6191 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6192 First = false;
6193 } else {
6194 Known |=
6195 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6196 }
6197
6198 if (Known.isUnknown())
6199 break;
6200 }
6201 break;
6202 }
6204 SDValue Src = Op.getOperand(0);
6205 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6206 EVT SrcVT = Src.getValueType();
6207 if (SrcVT.isFixedLengthVector() && CIdx) {
6208 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6209 APInt DemandedSrcElts = APInt::getOneBitSet(
6210 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6211 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6212 Depth + 1);
6213 } else {
6214 // Out of bounds index is poison.
6215 Known.KnownFPClasses = fcNone;
6216 }
6217 } else {
6218 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6219 }
6220 break;
6221 }
6222 case ISD::SPLAT_VECTOR: {
6223 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6224 break;
6225 }
6226 case ISD::BITCAST: {
6227 // FIXME: It should not be necessary to check for an elementwise bitcast.
6228 // If a bitcast is not elementwise between vector / scalar types,
6229 // computeKnownBits already splices the known bits of the source elements
6230 // appropriately so as to line up with the bits of the result's demanded
6231 // elements.
6232 EVT SrcVT = Op.getOperand(0).getValueType();
6233 if (VT.isScalableVector() || SrcVT.isScalableVector())
6234 break;
6235 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6236 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6237 if (VTNumElts != SrcVTNumElts)
6238 break;
6239
6240 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6242 break;
6243 }
6244 case ISD::FABS: {
6245 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6246 InterestedClasses, Depth + 1);
6247 Known.fabs();
6248 break;
6249 }
6250 case ISD::FCOPYSIGN: {
6251 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6252 InterestedClasses, Depth + 1);
6253 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6254 InterestedClasses, Depth + 1);
6255 Known.copysign(KnownSign);
6256 break;
6257 }
6258 case ISD::AssertNoFPClass: {
6259 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6260 InterestedClasses, Depth + 1);
6261 FPClassTest AssertedClasses =
6262 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6263 Known.KnownFPClasses &= ~AssertedClasses;
6264 break;
6265 }
6267 SDValue Src = Op.getOperand(0);
6268 EVT SrcVT = Src.getValueType();
6269 if (SrcVT.isFixedLengthVector()) {
6270 unsigned Idx = Op.getConstantOperandVal(1);
6271 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6272
6273 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6274 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6275 Depth + 1);
6276 } else {
6277 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6278 }
6279 break;
6280 }
6281 case ISD::INSERT_SUBVECTOR: {
6282 SDValue BaseVector = Op.getOperand(0);
6283 SDValue SubVector = Op.getOperand(1);
6284 EVT BaseVT = BaseVector.getValueType();
6285 if (BaseVT.isFixedLengthVector()) {
6286 unsigned Idx = Op.getConstantOperandVal(2);
6287 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6288 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6289
6290 APInt DemandedMask =
6291 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6292 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6293 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6294
6295 if (!DemandedSrcElts.isZero())
6296 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6297 InterestedClasses, Depth + 1);
6298 if (!DemandedSubElts.isZero()) {
6300 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6301 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6302 }
6303 } else {
6304 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6305 if (!Known.isUnknown())
6306 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6307 }
6308 break;
6309 }
6310 case ISD::SELECT:
6311 case ISD::VSELECT: {
6312 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6313 // IR-level ValueTracking.
6314 KnownFPClass KnownFalseClass = computeKnownFPClass(
6315 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6316 if (KnownFalseClass.isUnknown())
6317 break;
6318 KnownFPClass KnownTrueClass = computeKnownFPClass(
6319 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6320 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6321 break;
6322 }
6323 default:
6324 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6325 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6326 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6327 Depth);
6328 }
6329 break;
6330 }
6331
6332 return Known;
6333}
6334
6336 unsigned Depth) const {
6337 APInt DemandedElts = getDemandAllEltsMask(Op);
6338 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6339}
6340
6342 bool SNaN, unsigned Depth) const {
6343 assert(!DemandedElts.isZero() && "No demanded elements");
6344
6345 // If we're told that NaNs won't happen, assume they won't.
6346 if (Op->getFlags().hasNoNaNs())
6347 return true;
6348
6349 if (Depth >= MaxRecursionDepth)
6350 return false; // Limit search depth.
6351
6352 unsigned Opcode = Op.getOpcode();
6353 switch (Opcode) {
6354 case ISD::FADD:
6355 case ISD::FSUB:
6356 case ISD::FMUL:
6357 case ISD::FDIV:
6358 case ISD::FREM:
6359 case ISD::FSIN:
6360 case ISD::FCOS:
6361 case ISD::FTAN:
6362 case ISD::FASIN:
6363 case ISD::FACOS:
6364 case ISD::FATAN:
6365 case ISD::FATAN2:
6366 case ISD::FSINH:
6367 case ISD::FCOSH:
6368 case ISD::FTANH:
6369 case ISD::FMA:
6370 case ISD::FMULADD:
6371 case ISD::FMAD: {
6372 if (SNaN)
6373 return true;
6374 // TODO: Need isKnownNeverInfinity
6375 return false;
6376 }
6377 case ISD::FCANONICALIZE:
6378 case ISD::FEXP:
6379 case ISD::FEXP2:
6380 case ISD::FEXP10:
6381 case ISD::FTRUNC:
6382 case ISD::FFLOOR:
6383 case ISD::FCEIL:
6384 case ISD::FROUND:
6385 case ISD::FROUNDEVEN:
6386 case ISD::LROUND:
6387 case ISD::LLROUND:
6388 case ISD::FRINT:
6389 case ISD::LRINT:
6390 case ISD::LLRINT:
6391 case ISD::FNEARBYINT:
6392 case ISD::FLDEXP: {
6393 if (SNaN)
6394 return true;
6395 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6396 }
6397 case ISD::FABS:
6398 case ISD::FNEG:
6399 case ISD::FCOPYSIGN: {
6400 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6401 }
6402 case ISD::SELECT:
6403 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6404 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6405 case ISD::FP_EXTEND:
6406 case ISD::FP_ROUND: {
6407 if (SNaN)
6408 return true;
6409 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6410 }
6411 case ISD::SINT_TO_FP:
6412 case ISD::UINT_TO_FP:
6413 return true;
6414 case ISD::FSQRT: // Need is known positive
6415 case ISD::FLOG:
6416 case ISD::FLOG2:
6417 case ISD::FLOG10:
6418 case ISD::FPOWI:
6419 case ISD::FPOW: {
6420 if (SNaN)
6421 return true;
6422 // TODO: Refine on operand
6423 return false;
6424 }
6425 case ISD::FMINNUM:
6426 case ISD::FMAXNUM:
6427 case ISD::FMINIMUMNUM:
6428 case ISD::FMAXIMUMNUM: {
6429 // Only one needs to be known not-nan, since it will be returned if the
6430 // other ends up being one.
6431 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6432 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6433 }
6434 case ISD::FMINNUM_IEEE:
6435 case ISD::FMAXNUM_IEEE: {
6436 if (SNaN)
6437 return true;
6438 // This can return a NaN if either operand is an sNaN, or if both operands
6439 // are NaN.
6440 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6441 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6442 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6443 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6444 }
6445 case ISD::FMINIMUM:
6446 case ISD::FMAXIMUM: {
6447 // TODO: Does this quiet or return the origina NaN as-is?
6448 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6449 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6450 }
6452 SDValue Src = Op.getOperand(0);
6453 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6454 EVT SrcVT = Src.getValueType();
6455 if (SrcVT.isFixedLengthVector() && Idx &&
6456 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6457 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6458 Idx->getZExtValue());
6459 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6460 }
6461 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6462 }
6464 SDValue Src = Op.getOperand(0);
6465 if (Src.getValueType().isFixedLengthVector()) {
6466 unsigned Idx = Op.getConstantOperandVal(1);
6467 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6468 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6469 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6470 }
6471 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6472 }
6473 case ISD::INSERT_SUBVECTOR: {
6474 SDValue BaseVector = Op.getOperand(0);
6475 SDValue SubVector = Op.getOperand(1);
6476 EVT BaseVectorVT = BaseVector.getValueType();
6477 if (BaseVectorVT.isFixedLengthVector()) {
6478 unsigned Idx = Op.getConstantOperandVal(2);
6479 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6480 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6481
6482 // Clear/Extract the bits at the position where the subvector will be
6483 // inserted.
6484 APInt DemandedMask =
6485 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6486 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6487 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6488
6489 bool NeverNaN = true;
6490 if (!DemandedSrcElts.isZero())
6491 NeverNaN &=
6492 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6493 if (NeverNaN && !DemandedSubElts.isZero())
6494 NeverNaN &=
6495 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6496 return NeverNaN;
6497 }
6498 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6499 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6500 }
6501 case ISD::BUILD_VECTOR: {
6502 unsigned NumElts = Op.getNumOperands();
6503 for (unsigned I = 0; I != NumElts; ++I)
6504 if (DemandedElts[I] &&
6505 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6506 return false;
6507 return true;
6508 }
6509 case ISD::SPLAT_VECTOR:
6510 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6511 case ISD::AssertNoFPClass: {
6512 FPClassTest NoFPClass =
6513 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6514 if ((NoFPClass & fcNan) == fcNan)
6515 return true;
6516 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6517 return true;
6518 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6519 }
6520 default:
6521 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6522 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6523 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6524 Depth);
6525 }
6526 break;
6527 }
6528
6529 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6530 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6531 return Known.isKnownNever(NanMask);
6532}
6533
6535 APInt DemandedElts = getDemandAllEltsMask(Op);
6536 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6537}
6538
6540 const APInt &DemandedElts,
6541 unsigned Depth) const {
6542 assert(!DemandedElts.isZero() && "No demanded elements");
6543 EVT VT = Op.getValueType();
6545 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6546 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6547}
6548
6550 APInt DemandedElts = getDemandAllEltsMask(Op);
6551 return isKnownNeverZero(Op, DemandedElts, Depth);
6552}
6553
6555 unsigned Depth) const {
6556 if (Depth >= MaxRecursionDepth)
6557 return false; // Limit search depth.
6558
6559 EVT OpVT = Op.getValueType();
6560 unsigned BitWidth = OpVT.getScalarSizeInBits();
6561
6562 assert(!Op.getValueType().isFloatingPoint() &&
6563 "Floating point types unsupported - use isKnownNeverLogicalZero");
6564
6565 // If the value is a constant, we can obviously see if it is a zero or not.
6566 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6567 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6568 return !V.isZero();
6569 };
6570
6571 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6572 return true;
6573
6574 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6575 // some degree.
6576 switch (Op.getOpcode()) {
6577 default:
6578 break;
6579
6580 case ISD::BUILD_VECTOR:
6581 // Are all operands of a build vector constant non-zero?
6582 if (all_of(enumerate(Op->ops()), [&](auto P) {
6583 auto *C = dyn_cast<ConstantSDNode>(P.value());
6584 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6585 }))
6586 return true;
6587 break;
6588
6589 case ISD::SPLAT_VECTOR:
6590 // Is the operand of a splat vector a constant non-zero?
6591 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6592 if (IsNeverZero(C))
6593 return true;
6594 break;
6595
6597 SDValue InVec = Op.getOperand(0);
6598 SDValue EltNo = Op.getOperand(1);
6599 EVT VecVT = InVec.getValueType();
6600
6601 // Skip scalable vectors or implicit extensions.
6602 if (VecVT.isScalableVector() ||
6603 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6604 break;
6605
6606 // If we know the element index, just demand that vector element, else for
6607 // an unknown element index, ignore DemandedElts and demand them all.
6608 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6609 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6610 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6611 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6612 DemandedSrcElts =
6613 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6614
6615 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6616 }
6617
6618 case ISD::OR:
6619 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6620 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6621
6622 case ISD::VSELECT:
6623 case ISD::SELECT:
6624 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6625 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6626
6627 case ISD::SHL: {
6628 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6629 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6630 KnownBits ValKnown =
6631 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6632 // 1 << X is never zero.
6633 if (ValKnown.One[0])
6634 return true;
6635 // If max shift cnt of known ones is non-zero, result is non-zero.
6636 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6637 .getMaxValue();
6638 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6639 !ValKnown.One.shl(MaxCnt).isZero())
6640 return true;
6641 break;
6642 }
6643
6644 case ISD::VECTOR_SHUFFLE: {
6645 if (Op.getValueType().isScalableVector())
6646 return false;
6647
6648 unsigned NumElts = DemandedElts.getBitWidth();
6649
6650 // All demanded elements from LHS and RHS must be known non-zero.
6651 // Demanded elements with undef shuffle mask elements are unknown.
6652
6653 APInt DemandedLHS, DemandedRHS;
6654 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6655 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6656 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6657 DemandedLHS, DemandedRHS))
6658 return false;
6659
6660 return (!DemandedLHS ||
6661 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6662 (!DemandedRHS ||
6663 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6664 }
6665
6666 case ISD::UADDSAT:
6667 case ISD::UMAX:
6668 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6669 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6670
6671 case ISD::UMIN:
6672 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6673 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6674
6675 // For smin/smax: If either operand is known negative/positive
6676 // respectively we don't need the other to be known at all.
6677 case ISD::SMAX: {
6678 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6679 if (Op1.isStrictlyPositive())
6680 return true;
6681
6682 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6683 if (Op0.isStrictlyPositive())
6684 return true;
6685
6686 if (Op1.isNonZero() && Op0.isNonZero())
6687 return true;
6688
6689 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6690 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6691 }
6692 case ISD::SMIN: {
6693 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6694 if (Op1.isNegative())
6695 return true;
6696
6697 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6698 if (Op0.isNegative())
6699 return true;
6700
6701 if (Op1.isNonZero() && Op0.isNonZero())
6702 return true;
6703
6704 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6705 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6706 }
6707
6708 case ISD::ROTL:
6709 case ISD::ROTR:
6710 case ISD::BITREVERSE:
6711 case ISD::BSWAP:
6712 case ISD::CTPOP:
6713 case ISD::ABS:
6715 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6716
6717 case ISD::SRA:
6718 case ISD::SRL: {
6719 if (Op->getFlags().hasExact())
6720 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6721 KnownBits ValKnown =
6722 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6723 if (ValKnown.isNegative())
6724 return true;
6725 // If max shift cnt of known ones is non-zero, result is non-zero.
6726 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6727 .getMaxValue();
6728 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6729 !ValKnown.One.lshr(MaxCnt).isZero())
6730 return true;
6731 break;
6732 }
6733 case ISD::UDIV:
6734 case ISD::SDIV:
6735 // div exact can only produce a zero if the dividend is zero.
6736 // TODO: For udiv this is also true if Op1 u<= Op0
6737 if (Op->getFlags().hasExact())
6738 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6739 break;
6740
6741 case ISD::ADD:
6742 if (Op->getFlags().hasNoUnsignedWrap())
6743 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6744 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6745 return true;
6746 // TODO: There are a lot more cases we can prove for add.
6747 break;
6748
6749 case ISD::SUB: {
6750 if (isNullConstant(Op.getOperand(0)))
6751 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6752
6753 std::optional<bool> ne = KnownBits::ne(
6754 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6755 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6756 return ne && *ne;
6757 }
6758
6759 case ISD::MUL:
6760 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6761 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6762 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6763 return true;
6764 break;
6765
6766 case ISD::ZERO_EXTEND:
6767 case ISD::SIGN_EXTEND:
6768 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6769 case ISD::VSCALE: {
6771 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6772 ConstantRange CR =
6773 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6774 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6775 return true;
6776 break;
6777 }
6778 }
6779
6780 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6781}
6782
6784 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6785 return !C1->isNegative();
6786
6787 switch (Op.getOpcode()) {
6788 case ISD::FABS:
6789 case ISD::FEXP:
6790 case ISD::FEXP2:
6791 case ISD::FEXP10:
6792 return true;
6793 default:
6794 return false;
6795 }
6796
6797 llvm_unreachable("covered opcode switch");
6798}
6799
6801 assert(Use.getValueType().isFloatingPoint());
6802 const SDNode *User = Use.getUser();
6803 if (User->getFlags().hasNoSignedZeros())
6804 return true;
6805
6806 unsigned OperandNo = Use.getOperandNo();
6807 // Check if this use is insensitive to the sign of zero
6808 switch (User->getOpcode()) {
6809 case ISD::SETCC:
6810 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6811 case ISD::FABS:
6812 // fabs always produces +0.0.
6813 return true;
6814 case ISD::FCOPYSIGN:
6815 // copysign overwrites the sign bit of the first operand.
6816 return OperandNo == 0;
6817 case ISD::FADD:
6818 case ISD::FSUB: {
6819 // Arithmetic with non-zero constants fixes the uncertainty around the
6820 // sign bit.
6821 SDValue Other = User->getOperand(1 - OperandNo);
6823 }
6824 case ISD::FP_TO_SINT:
6825 case ISD::FP_TO_UINT:
6826 // fp-to-int conversions normalize signed zeros.
6827 return true;
6828 default:
6829 return false;
6830 }
6831}
6832
6834 if (Op->getFlags().hasNoSignedZeros())
6835 return true;
6836 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6837 // regression. Ideally, this should be implemented as a demanded-bits
6838 // optimization that stems from the users.
6839 if (Op->use_size() > 2)
6840 return false;
6841 return all_of(Op->uses(),
6842 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6843}
6844
6846 // Check the obvious case.
6847 if (A == B) return true;
6848
6849 // For negative and positive zero.
6852 if (CA->isZero() && CB->isZero()) return true;
6853
6854 // Otherwise they may not be equal.
6855 return false;
6856}
6857
6858// Only bits set in Mask must be negated, other bits may be arbitrary.
6860 if (isBitwiseNot(V, AllowUndefs))
6861 return V.getOperand(0);
6862
6863 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6864 // bits in the non-extended part.
6865 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6866 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6867 return SDValue();
6868 SDValue ExtArg = V.getOperand(0);
6869 if (ExtArg.getScalarValueSizeInBits() >=
6870 MaskC->getAPIntValue().getActiveBits() &&
6871 isBitwiseNot(ExtArg, AllowUndefs) &&
6872 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6873 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6874 return ExtArg.getOperand(0).getOperand(0);
6875 return SDValue();
6876}
6877
6879 // Match masked merge pattern (X & ~M) op (Y & M)
6880 // Including degenerate case (X & ~M) op M
6881 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6882 SDValue Other) {
6883 if (SDValue NotOperand =
6884 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6885 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6886 NotOperand->getOpcode() == ISD::TRUNCATE)
6887 NotOperand = NotOperand->getOperand(0);
6888
6889 if (Other == NotOperand)
6890 return true;
6891 if (Other->getOpcode() == ISD::AND)
6892 return NotOperand == Other->getOperand(0) ||
6893 NotOperand == Other->getOperand(1);
6894 }
6895 return false;
6896 };
6897
6898 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6899 A = A->getOperand(0);
6900
6901 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6902 B = B->getOperand(0);
6903
6904 if (A->getOpcode() == ISD::AND)
6905 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6906 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6907 return false;
6908}
6909
6910// FIXME: unify with llvm::haveNoCommonBitsSet.
6912 assert(A.getValueType() == B.getValueType() &&
6913 "Values must have the same type");
6916 return true;
6919}
6920
6921static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6922 SelectionDAG &DAG) {
6923 if (cast<ConstantSDNode>(Step)->isZero())
6924 return DAG.getConstant(0, DL, VT);
6925
6926 return SDValue();
6927}
6928
6931 SelectionDAG &DAG) {
6932 int NumOps = Ops.size();
6933 assert(NumOps != 0 && "Can't build an empty vector!");
6934 assert(!VT.isScalableVector() &&
6935 "BUILD_VECTOR cannot be used with scalable types");
6936 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6937 "Incorrect element count in BUILD_VECTOR!");
6938
6939 // BUILD_VECTOR of UNDEFs is UNDEF.
6940 bool AllPoison = true;
6941 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6942 AllPoison &= Op.getOpcode() == ISD::POISON;
6943 return Op.isUndef();
6944 }))
6945 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6946
6947 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6948 SDValue IdentitySrc;
6949 bool IsIdentity = true;
6950 for (int i = 0; i != NumOps; ++i) {
6951 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6952 Ops[i].getOperand(0).getValueType() != VT ||
6953 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6954 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6955 Ops[i].getConstantOperandAPInt(1) != i) {
6956 IsIdentity = false;
6957 break;
6958 }
6959 IdentitySrc = Ops[i].getOperand(0);
6960 }
6961 if (IsIdentity)
6962 return IdentitySrc;
6963
6964 return SDValue();
6965}
6966
6967/// Try to simplify vector concatenation to an input value, undef, or build
6968/// vector.
6971 SelectionDAG &DAG) {
6972 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6974 [Ops](SDValue Op) {
6975 return Ops[0].getValueType() == Op.getValueType();
6976 }) &&
6977 "Concatenation of vectors with inconsistent value types!");
6978 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6979 VT.getVectorElementCount() &&
6980 "Incorrect element count in vector concatenation!");
6981
6982 if (Ops.size() == 1)
6983 return Ops[0];
6984
6985 // Concat of UNDEFs is UNDEF.
6986 bool AllPoison = true;
6987 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6988 AllPoison &= Op.getOpcode() == ISD::POISON;
6989 return Op.isUndef();
6990 }))
6991 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6992
6993 // Scan the operands and look for extract operations from a single source
6994 // that correspond to insertion at the same location via this concatenation:
6995 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6996 SDValue IdentitySrc;
6997 bool IsIdentity = true;
6998 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6999 SDValue Op = Ops[i];
7000 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
7001 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
7002 Op.getOperand(0).getValueType() != VT ||
7003 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
7004 Op.getConstantOperandVal(1) != IdentityIndex) {
7005 IsIdentity = false;
7006 break;
7007 }
7008 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
7009 "Unexpected identity source vector for concat of extracts");
7010 IdentitySrc = Op.getOperand(0);
7011 }
7012 if (IsIdentity) {
7013 assert(IdentitySrc && "Failed to set source vector of extracts");
7014 return IdentitySrc;
7015 }
7016
7017 // The code below this point is only designed to work for fixed width
7018 // vectors, so we bail out for now.
7019 if (VT.isScalableVector())
7020 return SDValue();
7021
7022 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7023 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7024 // BUILD_VECTOR.
7025 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7026 EVT SVT = VT.getScalarType();
7028 for (SDValue Op : Ops) {
7029 EVT OpVT = Op.getValueType();
7030 if (Op.getOpcode() == ISD::POISON)
7031 Elts.append(OpVT.getVectorNumElements(), DAG.getPOISON(SVT));
7032 else if (Op.getOpcode() == ISD::UNDEF)
7033 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7034 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7035 Elts.append(Op->op_begin(), Op->op_end());
7036 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7037 OpVT.getVectorNumElements() == 1 &&
7038 isNullConstant(Op.getOperand(2)))
7039 Elts.push_back(Op.getOperand(1));
7040 else
7041 return SDValue();
7042 }
7043
7044 // BUILD_VECTOR requires all inputs to be of the same type, find the
7045 // maximum type and extend them all.
7046 for (SDValue Op : Elts)
7047 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7048
7049 if (SVT.bitsGT(VT.getScalarType())) {
7050 for (SDValue &Op : Elts) {
7051 if (Op.getOpcode() == ISD::POISON)
7052 Op = DAG.getPOISON(SVT);
7053 else if (Op.getOpcode() == ISD::UNDEF)
7054 Op = DAG.getUNDEF(SVT);
7055 else
7056 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7057 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7058 : DAG.getSExtOrTrunc(Op, DL, SVT);
7059 }
7060 }
7061
7062 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7063 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7064 return V;
7065}
7066
7067/// Gets or creates the specified node.
7068SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7069 SDVTList VTs = getVTList(VT);
7071 AddNodeIDNode(ID, Opcode, VTs, {});
7072 void *IP = nullptr;
7073 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
7074 return SDValue(E, 0);
7075
7076 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7077 CSEMap.InsertNode(N, IP);
7078
7079 InsertNode(N);
7080 SDValue V = SDValue(N, 0);
7081 NewSDValueDbgMsg(V, "Creating new node: ", this);
7082 return V;
7083}
7084
7085SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7086 SDValue N1) {
7087 SDNodeFlags Flags;
7088 if (Inserter)
7089 Flags = Inserter->getFlags();
7090 return getNode(Opcode, DL, VT, N1, Flags);
7091}
7092
7093SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7094 SDValue N1, const SDNodeFlags Flags) {
7095 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7096
7097 // Constant fold unary operations with a vector integer or float operand.
7098 switch (Opcode) {
7099 default:
7100 // FIXME: Entirely reasonable to perform folding of other unary
7101 // operations here as the need arises.
7102 break;
7103 case ISD::FNEG:
7104 case ISD::FABS:
7105 case ISD::FCEIL:
7106 case ISD::FTRUNC:
7107 case ISD::FFLOOR:
7108 case ISD::FP_EXTEND:
7109 case ISD::FP_TO_SINT:
7110 case ISD::FP_TO_UINT:
7111 case ISD::FP_TO_FP16:
7112 case ISD::FP_TO_BF16:
7113 case ISD::TRUNCATE:
7114 case ISD::ANY_EXTEND:
7115 case ISD::ZERO_EXTEND:
7116 case ISD::SIGN_EXTEND:
7117 case ISD::UINT_TO_FP:
7118 case ISD::SINT_TO_FP:
7119 case ISD::FP16_TO_FP:
7120 case ISD::BF16_TO_FP:
7121 case ISD::BITCAST:
7122 case ISD::ABS:
7124 case ISD::BITREVERSE:
7125 case ISD::BSWAP:
7126 case ISD::CTLZ:
7128 case ISD::CTTZ:
7130 case ISD::CTPOP:
7131 case ISD::CTLS:
7132 case ISD::VECREDUCE_ADD:
7133 case ISD::STEP_VECTOR: {
7134 SDValue Ops = {N1};
7135 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7136 return Fold;
7137 }
7138 }
7139
7140 unsigned OpOpcode = N1.getNode()->getOpcode();
7141 switch (Opcode) {
7142 case ISD::STEP_VECTOR:
7143 assert(VT.isScalableVector() &&
7144 "STEP_VECTOR can only be used with scalable types");
7145 assert(OpOpcode == ISD::TargetConstant &&
7146 VT.getVectorElementType() == N1.getValueType() &&
7147 "Unexpected step operand");
7148 break;
7149 case ISD::FREEZE:
7150 assert(VT == N1.getValueType() && "Unexpected VT!");
7152 return N1;
7153 break;
7154 case ISD::TokenFactor:
7155 case ISD::MERGE_VALUES:
7157 return N1; // Factor, merge or concat of one node? No need.
7158 case ISD::BUILD_VECTOR: {
7159 // Attempt to simplify BUILD_VECTOR.
7160 SDValue Ops[] = {N1};
7161 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7162 return V;
7163 break;
7164 }
7165 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7166 case ISD::FP_EXTEND:
7168 "Invalid FP cast!");
7169 if (N1.getValueType() == VT) return N1; // noop conversion.
7170 assert((!VT.isVector() || VT.getVectorElementCount() ==
7172 "Vector element count mismatch!");
7173 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7174 if (N1.isUndef())
7175 return getUNDEF(VT);
7176 break;
7177 case ISD::FP_TO_SINT:
7178 case ISD::FP_TO_UINT:
7179 if (N1.isUndef())
7180 return getUNDEF(VT);
7181 break;
7182 case ISD::SINT_TO_FP:
7183 case ISD::UINT_TO_FP:
7184 // [us]itofp(undef) = 0, because the result value is bounded.
7185 if (N1.isUndef())
7186 return getConstantFP(0.0, DL, VT);
7187 break;
7188 case ISD::SIGN_EXTEND:
7189 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7190 "Invalid SIGN_EXTEND!");
7191 assert(VT.isVector() == N1.getValueType().isVector() &&
7192 "SIGN_EXTEND result type type should be vector iff the operand "
7193 "type is vector!");
7194 if (N1.getValueType() == VT) return N1; // noop extension
7195 assert((!VT.isVector() || VT.getVectorElementCount() ==
7197 "Vector element count mismatch!");
7198 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7199 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7200 SDNodeFlags Flags;
7201 if (OpOpcode == ISD::ZERO_EXTEND)
7202 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7203 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7204 transferDbgValues(N1, NewVal);
7205 return NewVal;
7206 }
7207
7208 if (OpOpcode == ISD::POISON)
7209 return getPOISON(VT);
7210
7211 if (N1.isUndef())
7212 // sext(undef) = 0, because the top bits will all be the same.
7213 return getConstant(0, DL, VT);
7214
7215 // Skip unnecessary sext_inreg pattern:
7216 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7217 if (OpOpcode == ISD::TRUNCATE) {
7218 SDValue OpOp = N1.getOperand(0);
7219 if (OpOp.getValueType() == VT) {
7220 unsigned NumSignExtBits =
7222 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7223 transferDbgValues(N1, OpOp);
7224 return OpOp;
7225 }
7226 }
7227 }
7228 break;
7229 case ISD::ZERO_EXTEND:
7230 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7231 "Invalid ZERO_EXTEND!");
7232 assert(VT.isVector() == N1.getValueType().isVector() &&
7233 "ZERO_EXTEND result type type should be vector iff the operand "
7234 "type is vector!");
7235 if (N1.getValueType() == VT) return N1; // noop extension
7236 assert((!VT.isVector() || VT.getVectorElementCount() ==
7238 "Vector element count mismatch!");
7239 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7240 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7241 SDNodeFlags Flags;
7242 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7243 SDValue NewVal =
7244 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7245 transferDbgValues(N1, NewVal);
7246 return NewVal;
7247 }
7248
7249 if (OpOpcode == ISD::POISON)
7250 return getPOISON(VT);
7251
7252 if (N1.isUndef())
7253 // zext(undef) = 0, because the top bits will be zero.
7254 return getConstant(0, DL, VT);
7255
7256 // Skip unnecessary zext_inreg pattern:
7257 // (zext (trunc x)) -> x iff the upper bits are known zero.
7258 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7259 // use to recognise zext_inreg patterns.
7260 if (OpOpcode == ISD::TRUNCATE) {
7261 SDValue OpOp = N1.getOperand(0);
7262 if (OpOp.getValueType() == VT) {
7263 if (OpOp.getOpcode() != ISD::AND) {
7266 if (MaskedValueIsZero(OpOp, HiBits)) {
7267 transferDbgValues(N1, OpOp);
7268 return OpOp;
7269 }
7270 }
7271 }
7272 }
7273 break;
7274 case ISD::ANY_EXTEND:
7275 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7276 "Invalid ANY_EXTEND!");
7277 assert(VT.isVector() == N1.getValueType().isVector() &&
7278 "ANY_EXTEND result type type should be vector iff the operand "
7279 "type is vector!");
7280 if (N1.getValueType() == VT) return N1; // noop extension
7281 assert((!VT.isVector() || VT.getVectorElementCount() ==
7283 "Vector element count mismatch!");
7284 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7285
7286 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7287 OpOpcode == ISD::ANY_EXTEND) {
7288 SDNodeFlags Flags;
7289 if (OpOpcode == ISD::ZERO_EXTEND)
7290 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7291 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7292 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7293 }
7294 if (N1.isUndef())
7295 return getUNDEF(VT);
7296
7297 // (ext (trunc x)) -> x
7298 if (OpOpcode == ISD::TRUNCATE) {
7299 SDValue OpOp = N1.getOperand(0);
7300 if (OpOp.getValueType() == VT) {
7301 transferDbgValues(N1, OpOp);
7302 return OpOp;
7303 }
7304 }
7305 break;
7306 case ISD::TRUNCATE:
7307 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7308 "Invalid TRUNCATE!");
7309 assert(VT.isVector() == N1.getValueType().isVector() &&
7310 "TRUNCATE result type type should be vector iff the operand "
7311 "type is vector!");
7312 if (N1.getValueType() == VT) return N1; // noop truncate
7313 assert((!VT.isVector() || VT.getVectorElementCount() ==
7315 "Vector element count mismatch!");
7316 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7317 if (OpOpcode == ISD::TRUNCATE)
7318 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7319 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7320 OpOpcode == ISD::ANY_EXTEND) {
7321 // If the source is smaller than the dest, we still need an extend.
7323 VT.getScalarType())) {
7324 SDNodeFlags Flags;
7325 if (OpOpcode == ISD::ZERO_EXTEND)
7326 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7327 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7328 }
7329 if (N1.getOperand(0).getValueType().bitsGT(VT))
7330 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7331 return N1.getOperand(0);
7332 }
7333 if (N1.isUndef())
7334 return getUNDEF(VT);
7335 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7336 return getVScale(DL, VT,
7338 break;
7342 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7343 assert(N1.getValueType().bitsLE(VT) &&
7344 "The input must be the same size or smaller than the result.");
7347 "The destination vector type must have fewer lanes than the input.");
7348 break;
7349 case ISD::ABS:
7350 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7351 if (N1.isUndef())
7352 return getConstant(0, DL, VT);
7353 break;
7355 assert(VT.isInteger() && VT == N1.getValueType() &&
7356 "Invalid ABS_MIN_POISON!");
7357 if (N1.isUndef())
7358 return getConstant(0, DL, VT);
7359 break;
7360 case ISD::BSWAP:
7361 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7362 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7363 "BSWAP types must be a multiple of 16 bits!");
7364 if (N1.isUndef())
7365 return getUNDEF(VT);
7366 // bswap(bswap(X)) -> X.
7367 if (OpOpcode == ISD::BSWAP)
7368 return N1.getOperand(0);
7369 break;
7370 case ISD::BITREVERSE:
7371 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7372 if (N1.isUndef())
7373 return getUNDEF(VT);
7374 break;
7375 case ISD::BITCAST:
7377 "Cannot BITCAST between types of different sizes!");
7378 if (VT == N1.getValueType()) return N1; // noop conversion.
7379 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7380 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7381 if (N1.isUndef())
7382 return getUNDEF(VT);
7383 break;
7385 assert(VT.isVector() && !N1.getValueType().isVector() &&
7386 (VT.getVectorElementType() == N1.getValueType() ||
7388 N1.getValueType().isInteger() &&
7390 "Illegal SCALAR_TO_VECTOR node!");
7391 if (N1.isUndef())
7392 return getUNDEF(VT);
7393 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7394 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7396 N1.getConstantOperandVal(1) == 0 &&
7397 N1.getOperand(0).getValueType() == VT)
7398 return N1.getOperand(0);
7399 break;
7400 case ISD::FNEG:
7401 // Negation of an unknown bag of bits is still completely undefined.
7402 if (N1.isUndef())
7403 return getUNDEF(VT);
7404
7405 if (OpOpcode == ISD::FNEG) // --X -> X
7406 return N1.getOperand(0);
7407 break;
7408 case ISD::FABS:
7409 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7410 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7411 break;
7412 case ISD::VSCALE:
7413 assert(VT == N1.getValueType() && "Unexpected VT!");
7414 break;
7415 case ISD::CTPOP:
7416 if (N1.getValueType().getScalarType() == MVT::i1)
7417 return N1;
7418 break;
7419 case ISD::CTLZ:
7420 case ISD::CTTZ:
7421 if (N1.getValueType().getScalarType() == MVT::i1)
7422 return getNOT(DL, N1, N1.getValueType());
7423 break;
7424 case ISD::CTLS:
7425 if (N1.getValueType().getScalarType() == MVT::i1)
7426 return getConstant(0, DL, VT);
7427 break;
7428 case ISD::VECREDUCE_ADD:
7429 if (N1.getValueType().getScalarType() == MVT::i1)
7430 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7431 break;
7434 if (N1.getValueType().getScalarType() == MVT::i1)
7435 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7436 break;
7439 if (N1.getValueType().getScalarType() == MVT::i1)
7440 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7441 break;
7442 case ISD::SPLAT_VECTOR:
7443 assert(VT.isVector() && "Wrong return type!");
7444 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7445 // that for now.
7447 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7449 N1.getValueType().isInteger() &&
7451 "Wrong operand type!");
7452 break;
7453 }
7454
7455 SDNode *N;
7456 SDVTList VTs = getVTList(VT);
7457 SDValue Ops[] = {N1};
7458 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7460 AddNodeIDNode(ID, Opcode, VTs, Ops);
7461 void *IP = nullptr;
7462 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7463 E->intersectFlagsWith(Flags);
7464 return SDValue(E, 0);
7465 }
7466
7467 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7468 N->setFlags(Flags);
7469 createOperands(N, Ops);
7470 CSEMap.InsertNode(N, IP);
7471 } else {
7472 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7473 createOperands(N, Ops);
7474 }
7475
7476 InsertNode(N);
7477 SDValue V = SDValue(N, 0);
7478 NewSDValueDbgMsg(V, "Creating new node: ", this);
7479 return V;
7480}
7481
7482static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7483 const APInt &C2) {
7484 switch (Opcode) {
7485 case ISD::ADD: return C1 + C2;
7486 case ISD::SUB: return C1 - C2;
7487 case ISD::MUL: return C1 * C2;
7488 case ISD::AND: return C1 & C2;
7489 case ISD::OR: return C1 | C2;
7490 case ISD::XOR: return C1 ^ C2;
7491 case ISD::SHL: return C1 << C2;
7492 case ISD::SRL: return C1.lshr(C2);
7493 case ISD::SRA: return C1.ashr(C2);
7494 case ISD::ROTL: return C1.rotl(C2);
7495 case ISD::ROTR: return C1.rotr(C2);
7496 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7497 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7498 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7499 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7500 case ISD::SADDSAT: return C1.sadd_sat(C2);
7501 case ISD::UADDSAT: return C1.uadd_sat(C2);
7502 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7503 case ISD::USUBSAT: return C1.usub_sat(C2);
7504 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7505 case ISD::USHLSAT: return C1.ushl_sat(C2);
7506 case ISD::UDIV:
7507 if (!C2.getBoolValue())
7508 break;
7509 return C1.udiv(C2);
7510 case ISD::UREM:
7511 if (!C2.getBoolValue())
7512 break;
7513 return C1.urem(C2);
7514 case ISD::SDIV:
7515 if (!C2.getBoolValue())
7516 break;
7517 return C1.sdiv(C2);
7518 case ISD::SREM:
7519 if (!C2.getBoolValue())
7520 break;
7521 return C1.srem(C2);
7522 case ISD::AVGFLOORS:
7523 return APIntOps::avgFloorS(C1, C2);
7524 case ISD::AVGFLOORU:
7525 return APIntOps::avgFloorU(C1, C2);
7526 case ISD::AVGCEILS:
7527 return APIntOps::avgCeilS(C1, C2);
7528 case ISD::AVGCEILU:
7529 return APIntOps::avgCeilU(C1, C2);
7530 case ISD::ABDS:
7531 return APIntOps::abds(C1, C2);
7532 case ISD::ABDU:
7533 return APIntOps::abdu(C1, C2);
7534 case ISD::MULHS:
7535 return APIntOps::mulhs(C1, C2);
7536 case ISD::MULHU:
7537 return APIntOps::mulhu(C1, C2);
7538 case ISD::CLMUL:
7539 return APIntOps::clmul(C1, C2);
7540 case ISD::CLMULR:
7541 return APIntOps::clmulr(C1, C2);
7542 case ISD::CLMULH:
7543 return APIntOps::clmulh(C1, C2);
7544 case ISD::PEXT:
7545 return APIntOps::pext(C1, C2);
7546 case ISD::PDEP:
7547 return APIntOps::pdep(C1, C2);
7548 }
7549 return std::nullopt;
7550}
7551// Handle constant folding with UNDEF.
7552// TODO: Handle more cases.
7553static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7554 bool IsUndef1, const APInt &C2,
7555 bool IsUndef2) {
7556 if (!(IsUndef1 || IsUndef2))
7557 return FoldValue(Opcode, C1, C2);
7558
7559 // Fold and(x, undef) -> 0
7560 // Fold mul(x, undef) -> 0
7561 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7562 return APInt::getZero(C1.getBitWidth());
7563
7564 return std::nullopt;
7565}
7566
7568 const GlobalAddressSDNode *GA,
7569 const SDNode *N2) {
7570 if (GA->getOpcode() != ISD::GlobalAddress)
7571 return SDValue();
7572 if (!TLI->isOffsetFoldingLegal(GA))
7573 return SDValue();
7574 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7575 if (!C2)
7576 return SDValue();
7577 int64_t Offset = C2->getSExtValue();
7578 switch (Opcode) {
7579 case ISD::ADD:
7580 case ISD::PTRADD:
7581 break;
7582 case ISD::SUB: Offset = -uint64_t(Offset); break;
7583 default: return SDValue();
7584 }
7585 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7586 GA->getOffset() + uint64_t(Offset));
7587}
7588
7590 switch (Opcode) {
7591 case ISD::SDIV:
7592 case ISD::UDIV:
7593 case ISD::SREM:
7594 case ISD::UREM: {
7595 // If a divisor is zero/undef or any element of a divisor vector is
7596 // zero/undef, the whole op is undef.
7597 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7598 SDValue Divisor = Ops[1];
7599 if (Divisor.isUndef() || isNullConstant(Divisor))
7600 return true;
7601
7602 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7603 llvm::any_of(Divisor->op_values(),
7604 [](SDValue V) { return V.isUndef() ||
7605 isNullConstant(V); });
7606 // TODO: Handle signed overflow.
7607 }
7608 // TODO: Handle oversized shifts.
7609 default:
7610 return false;
7611 }
7612}
7613
7616 SDNodeFlags Flags) {
7617 // If the opcode is a target-specific ISD node, there's nothing we can
7618 // do here and the operand rules may not line up with the below, so
7619 // bail early.
7620 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7621 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7622 // foldCONCAT_VECTORS in getNode before this is called.
7623 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7624 return SDValue();
7625
7626 unsigned NumOps = Ops.size();
7627 if (NumOps == 0)
7628 return SDValue();
7629
7630 if (isUndef(Opcode, Ops))
7631 return getUNDEF(VT);
7632
7633 // Handle unary special cases.
7634 if (NumOps == 1) {
7635 SDValue N1 = Ops[0];
7636
7637 // Constant fold unary operations with an integer constant operand. Even
7638 // opaque constant will be folded, because the folding of unary operations
7639 // doesn't create new constants with different values. Nevertheless, the
7640 // opaque flag is preserved during folding to prevent future folding with
7641 // other constants.
7642 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7643 const APInt &Val = C->getAPIntValue();
7644 switch (Opcode) {
7645 case ISD::SIGN_EXTEND:
7646 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7647 C->isTargetOpcode(), C->isOpaque());
7648 case ISD::TRUNCATE:
7649 if (C->isOpaque())
7650 break;
7651 [[fallthrough]];
7652 case ISD::ZERO_EXTEND:
7653 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7654 C->isTargetOpcode(), C->isOpaque());
7655 case ISD::ANY_EXTEND:
7656 // Some targets like RISCV prefer to sign extend some types.
7657 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7658 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7659 C->isTargetOpcode(), C->isOpaque());
7660 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7661 C->isTargetOpcode(), C->isOpaque());
7662 case ISD::ABS:
7663 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7664 C->isOpaque());
7666 if (Val.isMinSignedValue())
7667 return getPOISON(VT);
7668 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7669 C->isOpaque());
7670 case ISD::BITREVERSE:
7671 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7672 C->isOpaque());
7673 case ISD::BSWAP:
7674 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7675 C->isOpaque());
7676 case ISD::CTPOP:
7677 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7678 C->isOpaque());
7679 case ISD::CTLZ:
7681 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7682 C->isOpaque());
7683 case ISD::CTTZ:
7685 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7686 C->isOpaque());
7687 case ISD::CTLS:
7688 // CTLS returns the number of extra sign bits so subtract one.
7689 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7690 C->isTargetOpcode(), C->isOpaque());
7691 case ISD::UINT_TO_FP:
7692 case ISD::SINT_TO_FP: {
7694 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7696 return getConstantFP(FPV, DL, VT);
7697 }
7698 case ISD::FP16_TO_FP:
7699 case ISD::BF16_TO_FP: {
7700 bool Ignored;
7701 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7702 : APFloat::BFloat(),
7703 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7704
7705 // This can return overflow, underflow, or inexact; we don't care.
7706 // FIXME need to be more flexible about rounding mode.
7708 &Ignored);
7709 return getConstantFP(FPV, DL, VT);
7710 }
7711 case ISD::STEP_VECTOR:
7712 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7713 return V;
7714 break;
7715 case ISD::BITCAST:
7716 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7717 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7718 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7719 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7720 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7721 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7722 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7723 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7724 break;
7725 }
7726 }
7727
7728 // Constant fold unary operations with a floating point constant operand.
7729 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7730 APFloat V = C->getValueAPF(); // make copy
7731 switch (Opcode) {
7732 case ISD::FNEG:
7733 V.changeSign();
7734 return getConstantFP(V, DL, VT);
7735 case ISD::FABS:
7736 V.clearSign();
7737 return getConstantFP(V, DL, VT);
7738 case ISD::FCEIL: {
7739 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7741 return getConstantFP(V, DL, VT);
7742 return SDValue();
7743 }
7744 case ISD::FTRUNC: {
7745 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7747 return getConstantFP(V, DL, VT);
7748 return SDValue();
7749 }
7750 case ISD::FFLOOR: {
7751 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7753 return getConstantFP(V, DL, VT);
7754 return SDValue();
7755 }
7756 case ISD::FP_EXTEND: {
7757 bool ignored;
7758 // This can return overflow, underflow, or inexact; we don't care.
7759 // FIXME need to be more flexible about rounding mode.
7760 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7761 &ignored);
7762 return getConstantFP(V, DL, VT);
7763 }
7764 case ISD::FP_TO_SINT:
7765 case ISD::FP_TO_UINT: {
7766 bool ignored;
7767 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7768 // FIXME need to be more flexible about rounding mode.
7770 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7771 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7772 break;
7773 return getConstant(IntVal, DL, VT);
7774 }
7775 case ISD::FP_TO_FP16:
7776 case ISD::FP_TO_BF16: {
7777 bool Ignored;
7778 // This can return overflow, underflow, or inexact; we don't care.
7779 // FIXME need to be more flexible about rounding mode.
7780 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7781 : APFloat::BFloat(),
7783 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7784 }
7785 case ISD::BITCAST:
7786 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7787 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7788 VT);
7789 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7790 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7791 VT);
7792 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7793 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7794 VT);
7795 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7796 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7797 break;
7798 }
7799 }
7800
7801 // Early-out if we failed to constant fold a bitcast.
7802 if (Opcode == ISD::BITCAST)
7803 return SDValue();
7804
7805 // Constant fold VECREDUCE_ADD with a BUILD_VECTOR of integer constants.
7807 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7808 APInt Acc = APInt::getZero(EltBits);
7809 for (SDValue Elt : N1->op_values()) {
7810 if (Elt.getOpcode() == ISD::POISON)
7811 return getPOISON(VT);
7812 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7813 return SDValue();
7814 Acc += cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7815 }
7816 EVT EltVT = N1.getValueType().getScalarType();
7817 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7818 }
7819 }
7820
7821 // Handle binops special cases.
7822 if (NumOps == 2) {
7823 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7824 return CFP;
7825
7826 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7827 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7828 if (C1->isOpaque() || C2->isOpaque())
7829 return SDValue();
7830
7831 std::optional<APInt> FoldAttempt =
7832 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7833 if (!FoldAttempt)
7834 return SDValue();
7835
7836 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7837 assert((!Folded || !VT.isVector()) &&
7838 "Can't fold vectors ops with scalar operands");
7839 return Folded;
7840 }
7841 }
7842
7843 // fold (add Sym, c) -> Sym+c
7845 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7846 if (TLI->isCommutativeBinOp(Opcode))
7848 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7849
7850 // fold (sext_in_reg c1) -> c2
7851 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7852 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7853
7854 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7855 unsigned FromBits = EVT.getScalarSizeInBits();
7856 Val <<= Val.getBitWidth() - FromBits;
7857 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7858 return getConstant(Val, DL, ConstantVT);
7859 };
7860
7861 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7862 const APInt &Val = C1->getAPIntValue();
7863 return SignExtendInReg(Val, VT);
7864 }
7865
7867 SmallVector<SDValue, 8> ScalarOps;
7868 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7869 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7870 SDValue Op = Ops[0].getOperand(I);
7871 if (Op.isUndef()) {
7872 ScalarOps.push_back(getUNDEF(OpVT));
7873 continue;
7874 }
7875 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7876 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7877 }
7878 return getBuildVector(VT, DL, ScalarOps);
7879 }
7880
7881 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7882 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7883 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7884 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7885 Ops[0].getOperand(0).getValueType()));
7886 }
7887 }
7888
7889 // Handle fshl/fshr special cases.
7890 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7891 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7892 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7893 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7894
7895 if (C1 && C2 && C3) {
7896 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7897 return SDValue();
7898 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7899 &V3 = C3->getAPIntValue();
7900
7901 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7902 : APIntOps::fshr(V1, V2, V3);
7903 return getConstant(FoldedVal, DL, VT);
7904 }
7905 }
7906
7907 // Handle fma/fmad special cases.
7908 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7909 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7910 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7911 Ops[2].getValueType() == VT && "FMA types must match!");
7915 if (C1 && C2 && C3) {
7916 APFloat V1 = C1->getValueAPF();
7917 const APFloat &V2 = C2->getValueAPF();
7918 const APFloat &V3 = C3->getValueAPF();
7919 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7920 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7922 } else
7923 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7924 return getConstantFP(V1, DL, VT);
7925 }
7926 }
7927
7928 // This is for vector folding only from here on.
7929 if (!VT.isVector())
7930 return SDValue();
7931
7932 ElementCount NumElts = VT.getVectorElementCount();
7933
7934 // See if we can fold through any bitcasted integer ops.
7935 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7936 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7937 (Ops[0].getOpcode() == ISD::BITCAST ||
7938 Ops[1].getOpcode() == ISD::BITCAST)) {
7941 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7942 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7943 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7944 N2.getValueType().isInteger()) {
7945 bool IsLE = getDataLayout().isLittleEndian();
7946 unsigned EltBits = VT.getScalarSizeInBits();
7947 SmallVector<APInt> RawBits1, RawBits2;
7948 BitVector UndefElts1, UndefElts2;
7949 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7950 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7951 SmallVector<APInt> RawBits;
7952 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7953 std::optional<APInt> Fold = FoldValueWithUndef(
7954 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7955 if (!Fold)
7956 break;
7957 RawBits.push_back(*Fold);
7958 }
7959 if (RawBits.size() == NumElts.getFixedValue()) {
7960 // We have constant folded, but we might need to cast this again back
7961 // to the original (possibly legalized) type.
7962 EVT BVVT, BVEltVT;
7963 if (N1.getValueType() == VT) {
7964 BVVT = N1.getValueType();
7965 BVEltVT = BV1->getOperand(0).getValueType();
7966 } else {
7967 BVVT = N2.getValueType();
7968 BVEltVT = BV2->getOperand(0).getValueType();
7969 }
7970 unsigned BVEltBits = BVEltVT.getSizeInBits();
7971 SmallVector<APInt> DstBits;
7972 BitVector DstUndefs;
7974 DstBits, RawBits, DstUndefs,
7975 BitVector(RawBits.size(), false));
7976 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
7977 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
7978 if (DstUndefs[I])
7979 continue;
7980 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
7981 }
7982 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
7983 }
7984 }
7985 }
7986 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
7987 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
7988 isa<ConstantSDNode>(N2)) {
7989 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
7990 {N1, N2}, Flags))
7991 return getBitcast(VT, Res);
7992 }
7993 }
7994
7995 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
7996 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
7997 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
7998 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
7999 APInt RHSVal;
8000 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8001 APInt NewStep = Opcode == ISD::MUL
8002 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8003 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8004 return getStepVector(DL, VT, NewStep);
8005 }
8006 }
8007
8008 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8009 return !Op.getValueType().isVector() ||
8010 Op.getValueType().getVectorElementCount() == NumElts;
8011 };
8012
8013 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8014 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8015 Op.getOpcode() == ISD::BUILD_VECTOR ||
8016 Op.getOpcode() == ISD::SPLAT_VECTOR;
8017 };
8018
8019 // All operands must be vector types with the same number of elements as
8020 // the result type and must be either UNDEF or a build/splat vector
8021 // or UNDEF scalars.
8022 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8023 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8024 return SDValue();
8025
8026 // If we are comparing vectors, then the result needs to be a i1 boolean that
8027 // is then extended back to the legal result type depending on how booleans
8028 // are represented.
8029 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8030 ISD::NodeType ExtendCode =
8031 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8032 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8034
8035 // Find legal integer scalar type for constant promotion and
8036 // ensure that its scalar size is at least as large as source.
8037 EVT LegalSVT = VT.getScalarType();
8038 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8039 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8040 if (LegalSVT.bitsLT(VT.getScalarType()))
8041 return SDValue();
8042 }
8043
8044 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8045 // only have one operand to check. For fixed-length vector types we may have
8046 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8047 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8048
8049 // Constant fold each scalar lane separately.
8050 SmallVector<SDValue, 4> ScalarResults;
8051 for (unsigned I = 0; I != NumVectorElts; I++) {
8052 SmallVector<SDValue, 4> ScalarOps;
8053 for (SDValue Op : Ops) {
8054 EVT InSVT = Op.getValueType().getScalarType();
8055 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8056 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8057 if (Op.isUndef())
8058 ScalarOps.push_back(getUNDEF(InSVT));
8059 else
8060 ScalarOps.push_back(Op);
8061 continue;
8062 }
8063
8064 SDValue ScalarOp =
8065 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8066 EVT ScalarVT = ScalarOp.getValueType();
8067
8068 // Build vector (integer) scalar operands may need implicit
8069 // truncation - do this before constant folding.
8070 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8071 // Don't create illegally-typed nodes unless they're constants or undef
8072 // - if we fail to constant fold we can't guarantee the (dead) nodes
8073 // we're creating will be cleaned up before being visited for
8074 // legalization.
8075 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8076 !isa<ConstantSDNode>(ScalarOp) &&
8077 TLI->getTypeAction(*getContext(), InSVT) !=
8079 return SDValue();
8080 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8081 }
8082
8083 ScalarOps.push_back(ScalarOp);
8084 }
8085
8086 // Constant fold the scalar operands.
8087 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8088
8089 // Scalar folding only succeeded if the result is a constant or UNDEF.
8090 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8091 ScalarResult.getOpcode() != ISD::ConstantFP)
8092 return SDValue();
8093
8094 // Legalize the (integer) scalar constant if necessary. We only do
8095 // this once we know the folding succeeded, since otherwise we would
8096 // get a node with illegal type which has a user.
8097 if (LegalSVT != SVT)
8098 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8099
8100 ScalarResults.push_back(ScalarResult);
8101 }
8102
8103 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8104 : getBuildVector(VT, DL, ScalarResults);
8105 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8106 return V;
8107}
8108
8111 // TODO: Add support for unary/ternary fp opcodes.
8112 if (Ops.size() != 2)
8113 return SDValue();
8114
8115 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8116 // should. That will require dealing with a potentially non-default
8117 // rounding mode, checking the "opStatus" return value from the APFloat
8118 // math calculations, and possibly other variations.
8119 SDValue N1 = Ops[0];
8120 SDValue N2 = Ops[1];
8121 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8122 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8123 if (N1CFP && N2CFP) {
8124 APFloat C1 = N1CFP->getValueAPF(); // make copy
8125 const APFloat &C2 = N2CFP->getValueAPF();
8126 switch (Opcode) {
8127 case ISD::FADD:
8129 return getConstantFP(C1, DL, VT);
8130 case ISD::FSUB:
8132 return getConstantFP(C1, DL, VT);
8133 case ISD::FMUL:
8135 return getConstantFP(C1, DL, VT);
8136 case ISD::FDIV:
8138 return getConstantFP(C1, DL, VT);
8139 case ISD::FREM:
8140 C1.mod(C2);
8141 return getConstantFP(C1, DL, VT);
8142 case ISD::FCOPYSIGN:
8143 C1.copySign(C2);
8144 return getConstantFP(C1, DL, VT);
8145 case ISD::FMINNUM:
8146 return getConstantFP(minnum(C1, C2), DL, VT);
8147 case ISD::FMAXNUM:
8148 return getConstantFP(maxnum(C1, C2), DL, VT);
8149 case ISD::FMINIMUM:
8150 return getConstantFP(minimum(C1, C2), DL, VT);
8151 case ISD::FMAXIMUM:
8152 return getConstantFP(maximum(C1, C2), DL, VT);
8153 case ISD::FMINIMUMNUM:
8154 return getConstantFP(minimumnum(C1, C2), DL, VT);
8155 case ISD::FMAXIMUMNUM:
8156 return getConstantFP(maximumnum(C1, C2), DL, VT);
8157 default: break;
8158 }
8159 }
8160 if (N1CFP && Opcode == ISD::FP_ROUND) {
8161 APFloat C1 = N1CFP->getValueAPF(); // make copy
8162 bool Unused;
8163 // This can return overflow, underflow, or inexact; we don't care.
8164 // FIXME need to be more flexible about rounding mode.
8166 &Unused);
8167 return getConstantFP(C1, DL, VT);
8168 }
8169
8170 switch (Opcode) {
8171 case ISD::FSUB:
8172 // -0.0 - undef --> undef (consistent with "fneg undef")
8173 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8174 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8175 return getUNDEF(VT);
8176 [[fallthrough]];
8177
8178 case ISD::FADD:
8179 case ISD::FMUL:
8180 case ISD::FDIV:
8181 case ISD::FREM:
8182 // If both operands are undef, the result is undef. If 1 operand is undef,
8183 // the result is NaN. This should match the behavior of the IR optimizer.
8184 if (N1.isUndef() && N2.isUndef())
8185 return getUNDEF(VT);
8186 if (N1.isUndef() || N2.isUndef())
8188 }
8189 return SDValue();
8190}
8191
8193 const SDLoc &DL, EVT DstEltVT) {
8194 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8195
8196 // If this is already the right type, we're done.
8197 if (SrcEltVT == DstEltVT)
8198 return SDValue(BV, 0);
8199
8200 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8201 unsigned DstBitSize = DstEltVT.getSizeInBits();
8202
8203 // If this is a conversion of N elements of one type to N elements of another
8204 // type, convert each element. This handles FP<->INT cases.
8205 if (SrcBitSize == DstBitSize) {
8207 for (SDValue Op : BV->op_values()) {
8208 // If the vector element type is not legal, the BUILD_VECTOR operands
8209 // are promoted and implicitly truncated. Make that explicit here.
8210 if (Op.getValueType() != SrcEltVT)
8211 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8212 Ops.push_back(getBitcast(DstEltVT, Op));
8213 }
8214 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8216 return getBuildVector(VT, DL, Ops);
8217 }
8218
8219 // Otherwise, we're growing or shrinking the elements. To avoid having to
8220 // handle annoying details of growing/shrinking FP values, we convert them to
8221 // int first.
8222 if (SrcEltVT.isFloatingPoint()) {
8223 // Convert the input float vector to a int vector where the elements are the
8224 // same sizes.
8225 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8226 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8228 DstEltVT);
8229 return SDValue();
8230 }
8231
8232 // Now we know the input is an integer vector. If the output is a FP type,
8233 // convert to integer first, then to FP of the right size.
8234 if (DstEltVT.isFloatingPoint()) {
8235 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8236 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8238 DstEltVT);
8239 return SDValue();
8240 }
8241
8242 // Okay, we know the src/dst types are both integers of differing types.
8243 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8244
8245 // Extract the constant raw bit data.
8246 BitVector UndefElements;
8247 SmallVector<APInt> RawBits;
8248 bool IsLE = getDataLayout().isLittleEndian();
8249 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8250 return SDValue();
8251
8253 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8254 if (UndefElements[I])
8255 Ops.push_back(getUNDEF(DstEltVT));
8256 else
8257 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8258 }
8259
8260 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8261 return getBuildVector(VT, DL, Ops);
8262}
8263
8265 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8266
8267 // There's no need to assert on a byte-aligned pointer. All pointers are at
8268 // least byte aligned.
8269 if (A == Align(1))
8270 return Val;
8271
8272 SDVTList VTs = getVTList(Val.getValueType());
8274 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
8275 ID.AddInteger(A.value());
8276
8277 void *IP = nullptr;
8278 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
8279 return SDValue(E, 0);
8280
8281 auto *N =
8282 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8283 createOperands(N, {Val});
8284
8285 CSEMap.InsertNode(N, IP);
8286 InsertNode(N);
8287
8288 SDValue V(N, 0);
8289 NewSDValueDbgMsg(V, "Creating new node: ", this);
8290 return V;
8291}
8292
8293SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8294 SDValue N1, SDValue N2) {
8295 SDNodeFlags Flags;
8296 if (Inserter)
8297 Flags = Inserter->getFlags();
8298 return getNode(Opcode, DL, VT, N1, N2, Flags);
8299}
8300
8302 SDValue &N2) const {
8303 if (!TLI->isCommutativeBinOp(Opcode))
8304 return;
8305
8306 // Canonicalize:
8307 // binop(const, nonconst) -> binop(nonconst, const)
8310 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8311 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8312 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8313 std::swap(N1, N2);
8314
8315 // Canonicalize:
8316 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8317 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8319 std::swap(N1, N2);
8320}
8321
8322SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8323 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8325 N2.getOpcode() != ISD::DELETED_NODE &&
8326 "Operand is DELETED_NODE!");
8327
8328 canonicalizeCommutativeBinop(Opcode, N1, N2);
8329
8330 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8331 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8332
8333 // Don't allow undefs in vector splats - we might be returning N2 when folding
8334 // to zero etc.
8335 ConstantSDNode *N2CV =
8336 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8337
8338 switch (Opcode) {
8339 default: break;
8340 case ISD::TokenFactor:
8341 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8342 N2.getValueType() == MVT::Other && "Invalid token factor!");
8343 // Fold trivial token factors.
8344 if (N1.getOpcode() == ISD::EntryToken) return N2;
8345 if (N2.getOpcode() == ISD::EntryToken) return N1;
8346 if (N1 == N2) return N1;
8347 break;
8348 case ISD::BUILD_VECTOR: {
8349 // Attempt to simplify BUILD_VECTOR.
8350 SDValue Ops[] = {N1, N2};
8351 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8352 return V;
8353 break;
8354 }
8355 case ISD::CONCAT_VECTORS: {
8356 SDValue Ops[] = {N1, N2};
8357 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8358 return V;
8359 break;
8360 }
8361 case ISD::AND:
8362 assert(VT.isInteger() && "This operator does not apply to FP types!");
8363 assert(N1.getValueType() == N2.getValueType() &&
8364 N1.getValueType() == VT && "Binary operator types must match!");
8365 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8366 // worth handling here.
8367 if (N2CV && N2CV->isZero())
8368 return N2;
8369 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8370 return N1;
8371 break;
8372 case ISD::OR:
8373 case ISD::XOR:
8374 case ISD::ADD:
8375 case ISD::PTRADD:
8376 case ISD::SUB:
8377 assert(VT.isInteger() && "This operator does not apply to FP types!");
8378 assert(N1.getValueType() == N2.getValueType() &&
8379 N1.getValueType() == VT && "Binary operator types must match!");
8380 // The equal operand types requirement is unnecessarily strong for PTRADD.
8381 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8382 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8383 // logic everywhere where PTRADDs may be folded or combined to properly
8384 // support them. If/when we introduce pointer types to the SDAG, we will
8385 // need to relax this constraint.
8386
8387 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8388 // it's worth handling here.
8389 if (N2CV && N2CV->isZero())
8390 return N1;
8391 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8392 VT.getScalarType() == MVT::i1)
8393 return getNode(ISD::XOR, DL, VT, N1, N2);
8394 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8395 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8396 N2.getOpcode() == ISD::VSCALE) {
8397 const APInt &C1 = N1->getConstantOperandAPInt(0);
8398 const APInt &C2 = N2->getConstantOperandAPInt(0);
8399 return getVScale(DL, VT, C1 + C2);
8400 }
8401 break;
8402 case ISD::MUL:
8403 assert(VT.isInteger() && "This operator does not apply to FP types!");
8404 assert(N1.getValueType() == N2.getValueType() &&
8405 N1.getValueType() == VT && "Binary operator types must match!");
8406 if (VT.getScalarType() == MVT::i1)
8407 return getNode(ISD::AND, DL, VT, N1, N2);
8408 if (N2CV && N2CV->isZero())
8409 return N2;
8410 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8411 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8412 const APInt &N2CImm = N2C->getAPIntValue();
8413 return getVScale(DL, VT, MulImm * N2CImm);
8414 }
8415 break;
8416 case ISD::UDIV:
8417 case ISD::UREM:
8418 case ISD::MULHU:
8419 case ISD::MULHS:
8420 case ISD::SDIV:
8421 case ISD::SREM:
8422 case ISD::SADDSAT:
8423 case ISD::SSUBSAT:
8424 case ISD::UADDSAT:
8425 case ISD::USUBSAT:
8426 assert(VT.isInteger() && "This operator does not apply to FP types!");
8427 assert(N1.getValueType() == N2.getValueType() &&
8428 N1.getValueType() == VT && "Binary operator types must match!");
8429 if (VT.getScalarType() == MVT::i1) {
8430 // fold (add_sat x, y) -> (or x, y) for bool types.
8431 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8432 return getNode(ISD::OR, DL, VT, N1, N2);
8433 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8434 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8435 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8436 }
8437 break;
8438 case ISD::SCMP:
8439 case ISD::UCMP:
8440 assert(N1.getValueType() == N2.getValueType() &&
8441 "Types of operands of UCMP/SCMP must match");
8442 assert(N1.getValueType().isVector() == VT.isVector() &&
8443 "Operands and return type of must both be scalars or vectors");
8444 if (VT.isVector())
8447 "Result and operands must have the same number of elements");
8448 break;
8449 case ISD::AVGFLOORS:
8450 case ISD::AVGFLOORU:
8451 case ISD::AVGCEILS:
8452 case ISD::AVGCEILU:
8453 assert(VT.isInteger() && "This operator does not apply to FP types!");
8454 assert(N1.getValueType() == N2.getValueType() &&
8455 N1.getValueType() == VT && "Binary operator types must match!");
8456 break;
8457 case ISD::ABDS:
8458 case ISD::ABDU:
8459 assert(VT.isInteger() && "This operator does not apply to FP types!");
8460 assert(N1.getValueType() == N2.getValueType() &&
8461 N1.getValueType() == VT && "Binary operator types must match!");
8462 if (VT.getScalarType() == MVT::i1)
8463 return getNode(ISD::XOR, DL, VT, N1, N2);
8464 break;
8465 case ISD::SMIN:
8466 case ISD::UMAX:
8467 assert(VT.isInteger() && "This operator does not apply to FP types!");
8468 assert(N1.getValueType() == N2.getValueType() &&
8469 N1.getValueType() == VT && "Binary operator types must match!");
8470 if (VT.getScalarType() == MVT::i1)
8471 return getNode(ISD::OR, DL, VT, N1, N2);
8472 break;
8473 case ISD::SMAX:
8474 case ISD::UMIN:
8475 assert(VT.isInteger() && "This operator does not apply to FP types!");
8476 assert(N1.getValueType() == N2.getValueType() &&
8477 N1.getValueType() == VT && "Binary operator types must match!");
8478 if (VT.getScalarType() == MVT::i1)
8479 return getNode(ISD::AND, DL, VT, N1, N2);
8480 break;
8481 case ISD::FADD:
8482 case ISD::FSUB:
8483 case ISD::FMUL:
8484 case ISD::FDIV:
8485 case ISD::FREM:
8486 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8487 assert(N1.getValueType() == N2.getValueType() &&
8488 N1.getValueType() == VT && "Binary operator types must match!");
8489 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8490 return V;
8491 break;
8492 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8493 assert(N1.getValueType() == VT &&
8496 "Invalid FCOPYSIGN!");
8497 break;
8498 case ISD::SHL:
8499 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8500 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8501 const APInt &ShiftImm = N2C->getAPIntValue();
8502 return getVScale(DL, VT, MulImm << ShiftImm);
8503 }
8504 [[fallthrough]];
8505 case ISD::SRA:
8506 case ISD::SRL:
8507 if (SDValue V = simplifyShift(N1, N2))
8508 return V;
8509 [[fallthrough]];
8510 case ISD::ROTL:
8511 case ISD::ROTR:
8512 case ISD::SSHLSAT:
8513 case ISD::USHLSAT:
8514 assert(VT == N1.getValueType() &&
8515 "Shift operators return type must be the same as their first arg");
8516 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8517 "Shifts only work on integers");
8518 assert((!VT.isVector() || VT == N2.getValueType()) &&
8519 "Vector shift amounts must be in the same as their first arg");
8520 // Verify that the shift amount VT is big enough to hold valid shift
8521 // amounts. This catches things like trying to shift an i1024 value by an
8522 // i8, which is easy to fall into in generic code that uses
8523 // TLI.getShiftAmount().
8526 "Invalid use of small shift amount with oversized value!");
8527
8528 // Always fold shifts of i1 values so the code generator doesn't need to
8529 // handle them. Since we know the size of the shift has to be less than the
8530 // size of the value, the shift/rotate count is guaranteed to be zero.
8531 if (VT == MVT::i1)
8532 return N1;
8533 if (N2CV && N2CV->isZero())
8534 return N1;
8535 break;
8536 case ISD::FP_ROUND:
8538 VT.bitsLE(N1.getValueType()) && N2C &&
8539 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8540 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8541 if (N1.getValueType() == VT) return N1; // noop conversion.
8542 break;
8543 case ISD::IS_FPCLASS: {
8545 "IS_FPCLASS is used for a non-floating type");
8546 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8547 // is.fpclass(poison, mask) -> poison
8548 if (N1.getOpcode() == ISD::POISON)
8549 return getPOISON(VT);
8550 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8551 // If all tests are made, it doesn't matter what the value is.
8552 if ((Mask & fcAllFlags) == fcAllFlags)
8553 return getBoolConstant(true, DL, VT, N1.getValueType());
8554 if ((Mask & fcAllFlags) == 0)
8555 return getBoolConstant(false, DL, VT, N1.getValueType());
8556 break;
8557 }
8558 case ISD::AssertNoFPClass: {
8560 "AssertNoFPClass is used for a non-floating type");
8561 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8562 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8563 assert(llvm::to_underlying(NoFPClass) <=
8565 "FPClassTest value too large");
8566 (void)NoFPClass;
8567 break;
8568 }
8569 case ISD::AssertSext:
8570 case ISD::AssertZext: {
8571 EVT EVT = cast<VTSDNode>(N2)->getVT();
8572 assert(VT == N1.getValueType() && "Not an inreg extend!");
8573 assert(VT.isInteger() && EVT.isInteger() &&
8574 "Cannot *_EXTEND_INREG FP types");
8575 assert(!EVT.isVector() &&
8576 "AssertSExt/AssertZExt type should be the vector element type "
8577 "rather than the vector type!");
8578 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8579 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8580 break;
8581 }
8583 EVT EVT = cast<VTSDNode>(N2)->getVT();
8584 assert(VT == N1.getValueType() && "Not an inreg extend!");
8585 assert(VT.isInteger() && EVT.isInteger() &&
8586 "Cannot *_EXTEND_INREG FP types");
8587 assert(EVT.isVector() == VT.isVector() &&
8588 "SIGN_EXTEND_INREG type should be vector iff the operand "
8589 "type is vector!");
8590 assert((!EVT.isVector() ||
8592 "Vector element counts must match in SIGN_EXTEND_INREG");
8593 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8594 if (EVT == VT) return N1; // Not actually extending
8595 break;
8596 }
8598 case ISD::FP_TO_UINT_SAT: {
8599 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8600 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8601 assert(N1.getValueType().isVector() == VT.isVector() &&
8602 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8603 "vector!");
8604 assert((!VT.isVector() || VT.getVectorElementCount() ==
8606 "Vector element counts must match in FP_TO_*INT_SAT");
8607 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8608 "Type to saturate to must be a scalar.");
8609 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8610 "Not extending!");
8611 break;
8612 }
8615 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8616 element type of the vector.");
8617
8618 // Extract from an undefined value or using an undefined index is undefined.
8619 if (N1.isUndef() || N2.isUndef())
8620 return getUNDEF(VT);
8621
8622 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8623 // vectors. For scalable vectors we will provide appropriate support for
8624 // dealing with arbitrary indices.
8625 if (N2C && N1.getValueType().isFixedLengthVector() &&
8626 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8627 return getPOISON(VT);
8628
8629 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8630 // expanding copies of large vectors from registers. This only works for
8631 // fixed length vectors, since we need to know the exact number of
8632 // elements.
8633 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8635 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8636 return getExtractVectorElt(DL, VT,
8637 N1.getOperand(N2C->getZExtValue() / Factor),
8638 N2C->getZExtValue() % Factor);
8639 }
8640
8641 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8642 // lowering is expanding large vector constants.
8643 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8644 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8647 "BUILD_VECTOR used for scalable vectors");
8648 unsigned Index =
8649 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8650 SDValue Elt = N1.getOperand(Index);
8651
8652 if (VT != Elt.getValueType())
8653 // If the vector element type is not legal, the BUILD_VECTOR operands
8654 // are promoted and implicitly truncated, and the result implicitly
8655 // extended. Make that explicit here.
8656 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8657
8658 return Elt;
8659 }
8660
8661 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8662 // operations are lowered to scalars.
8663 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8664 // If the indices are the same, return the inserted element else
8665 // if the indices are known different, extract the element from
8666 // the original vector.
8667 SDValue N1Op2 = N1.getOperand(2);
8669
8670 if (N1Op2C && N2C) {
8671 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8672 if (VT == N1.getOperand(1).getValueType())
8673 return N1.getOperand(1);
8674 if (VT.isFloatingPoint()) {
8676 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8677 }
8678 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8679 }
8680 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8681 }
8682 }
8683
8684 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8685 // when vector types are scalarized and v1iX is legal.
8686 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8687 // Here we are completely ignoring the extract element index (N2),
8688 // which is fine for fixed width vectors, since any index other than 0
8689 // is undefined anyway. However, this cannot be ignored for scalable
8690 // vectors - in theory we could support this, but we don't want to do this
8691 // without a profitability check.
8692 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8694 N1.getValueType().getVectorNumElements() == 1) {
8695 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8696 N1.getOperand(1));
8697 }
8698 break;
8700 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8701 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8702 (N1.getValueType().isInteger() == VT.isInteger()) &&
8703 N1.getValueType() != VT &&
8704 "Wrong types for EXTRACT_ELEMENT!");
8705
8706 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8707 // 64-bit integers into 32-bit parts. Instead of building the extract of
8708 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8709 if (N1.getOpcode() == ISD::BUILD_PAIR)
8710 return N1.getOperand(N2C->getZExtValue());
8711
8712 // EXTRACT_ELEMENT of a constant int is also very common.
8713 if (N1C) {
8714 unsigned ElementSize = VT.getSizeInBits();
8715 unsigned Shift = ElementSize * N2C->getZExtValue();
8716 const APInt &Val = N1C->getAPIntValue();
8717 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8718 }
8719 break;
8721 EVT N1VT = N1.getValueType();
8722 assert(VT.isVector() && N1VT.isVector() &&
8723 "Extract subvector VTs must be vectors!");
8725 "Extract subvector VTs must have the same element type!");
8726 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8727 "Cannot extract a scalable vector from a fixed length vector!");
8728 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8730 "Extract subvector must be from larger vector to smaller vector!");
8731 assert(N2C && "Extract subvector index must be a constant");
8732 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8733 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8734 N1VT.getVectorMinNumElements()) &&
8735 "Extract subvector overflow!");
8736 assert(N2C->getAPIntValue().getBitWidth() ==
8737 TLI->getVectorIdxWidth(getDataLayout()) &&
8738 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8739 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8740 "Extract index is not a multiple of the output vector length");
8741
8742 // Trivial extraction.
8743 if (VT == N1VT)
8744 return N1;
8745
8746 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8747 if (N1.isUndef())
8748 return getUNDEF(VT);
8749
8750 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8751 // the concat have the same type as the extract.
8752 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8753 VT == N1.getOperand(0).getValueType()) {
8754 unsigned Factor = VT.getVectorMinNumElements();
8755 return N1.getOperand(N2C->getZExtValue() / Factor);
8756 }
8757
8758 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8759 // during shuffle legalization.
8760 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8761 VT == N1.getOperand(1).getValueType())
8762 return N1.getOperand(1);
8763 break;
8764 }
8765 }
8766
8767 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8768 switch (Opcode) {
8769 case ISD::XOR:
8770 case ISD::ADD:
8771 case ISD::PTRADD:
8772 case ISD::SUB:
8774 case ISD::UDIV:
8775 case ISD::SDIV:
8776 case ISD::UREM:
8777 case ISD::SREM:
8778 case ISD::MUL:
8779 case ISD::AND:
8780 case ISD::SSUBSAT:
8781 case ISD::USUBSAT:
8782 case ISD::UMIN:
8783 case ISD::OR:
8784 case ISD::SADDSAT:
8785 case ISD::UADDSAT:
8786 case ISD::UMAX:
8787 case ISD::SMAX:
8788 case ISD::SMIN:
8789 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8790 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8791 }
8792 }
8793
8794 // Canonicalize an UNDEF to the RHS, even over a constant.
8795 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8796 if (TLI->isCommutativeBinOp(Opcode)) {
8797 std::swap(N1, N2);
8798 } else {
8799 switch (Opcode) {
8800 case ISD::PTRADD:
8801 case ISD::SUB:
8802 // fold op(undef, non_undef_arg2) -> undef.
8803 return N1;
8805 case ISD::UDIV:
8806 case ISD::SDIV:
8807 case ISD::UREM:
8808 case ISD::SREM:
8809 case ISD::SSUBSAT:
8810 case ISD::USUBSAT:
8811 // fold op(undef, non_undef_arg2) -> 0.
8812 return getConstant(0, DL, VT);
8813 }
8814 }
8815 }
8816
8817 // Fold a bunch of operators when the RHS is undef.
8818 if (N2.getOpcode() == ISD::UNDEF) {
8819 switch (Opcode) {
8820 case ISD::XOR:
8821 if (N1.getOpcode() == ISD::UNDEF)
8822 // Handle undef ^ undef -> 0 special case. This is a common
8823 // idiom (misuse).
8824 return getConstant(0, DL, VT);
8825 [[fallthrough]];
8826 case ISD::ADD:
8827 case ISD::PTRADD:
8828 case ISD::SUB:
8829 // fold op(arg1, undef) -> undef.
8830 return N2;
8831 case ISD::UDIV:
8832 case ISD::SDIV:
8833 case ISD::UREM:
8834 case ISD::SREM:
8835 // fold op(arg1, undef) -> poison.
8836 return getPOISON(VT);
8837 case ISD::MUL:
8838 case ISD::AND:
8839 case ISD::SSUBSAT:
8840 case ISD::USUBSAT:
8841 case ISD::UMIN:
8842 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8843 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8844 case ISD::OR:
8845 case ISD::SADDSAT:
8846 case ISD::UADDSAT:
8847 case ISD::UMAX:
8848 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8849 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8850 case ISD::SMAX:
8851 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8852 return N1.getOpcode() == ISD::UNDEF
8853 ? N2
8854 : getConstant(
8856 VT);
8857 case ISD::SMIN:
8858 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8859 return N1.getOpcode() == ISD::UNDEF
8860 ? N2
8861 : getConstant(
8863 VT);
8864 }
8865 }
8866
8867 // Perform trivial constant folding.
8868 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8869 return SV;
8870
8871 // Memoize this node if possible.
8872 SDNode *N;
8873 SDVTList VTs = getVTList(VT);
8874 SDValue Ops[] = {N1, N2};
8875 if (VT != MVT::Glue) {
8877 AddNodeIDNode(ID, Opcode, VTs, Ops);
8878 void *IP = nullptr;
8879 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8880 E->intersectFlagsWith(Flags);
8881 return SDValue(E, 0);
8882 }
8883
8884 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8885 N->setFlags(Flags);
8886 createOperands(N, Ops);
8887 CSEMap.InsertNode(N, IP);
8888 } else {
8889 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8890 createOperands(N, Ops);
8891 }
8892
8893 InsertNode(N);
8894 SDValue V = SDValue(N, 0);
8895 NewSDValueDbgMsg(V, "Creating new node: ", this);
8896 return V;
8897}
8898
8899SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8900 SDValue N1, SDValue N2, SDValue N3) {
8901 SDNodeFlags Flags;
8902 if (Inserter)
8903 Flags = Inserter->getFlags();
8904 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8905}
8906
8907SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8908 SDValue N1, SDValue N2, SDValue N3,
8909 const SDNodeFlags Flags) {
8911 N2.getOpcode() != ISD::DELETED_NODE &&
8912 N3.getOpcode() != ISD::DELETED_NODE &&
8913 "Operand is DELETED_NODE!");
8914 // Perform various simplifications.
8915 switch (Opcode) {
8916 case ISD::BUILD_VECTOR: {
8917 // Attempt to simplify BUILD_VECTOR.
8918 SDValue Ops[] = {N1, N2, N3};
8919 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8920 return V;
8921 break;
8922 }
8923 case ISD::CONCAT_VECTORS: {
8924 SDValue Ops[] = {N1, N2, N3};
8925 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8926 return V;
8927 break;
8928 }
8929 case ISD::SETCC: {
8930 assert(VT.isInteger() && "SETCC result type must be an integer!");
8931 assert(N1.getValueType() == N2.getValueType() &&
8932 "SETCC operands must have the same type!");
8933 assert(VT.isVector() == N1.getValueType().isVector() &&
8934 "SETCC type should be vector iff the operand type is vector!");
8935 assert((!VT.isVector() || VT.getVectorElementCount() ==
8937 "SETCC vector element counts must match!");
8938 // Use FoldSetCC to simplify SETCC's.
8939 if (SDValue V =
8940 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8941 return V;
8942 break;
8943 }
8944 case ISD::SELECT:
8945 case ISD::VSELECT:
8946 if (SDValue V = simplifySelect(N1, N2, N3))
8947 return V;
8948 break;
8950 llvm_unreachable("should use getVectorShuffle constructor!");
8952 if (isNullConstant(N3))
8953 return N1;
8954 break;
8956 if (isNullConstant(N3))
8957 return N2;
8958 break;
8960 assert(VT.isVector() && VT == N1.getValueType() &&
8961 "INSERT_VECTOR_ELT vector type mismatch");
8963 "INSERT_VECTOR_ELT scalar fp/int mismatch");
8964 assert((!VT.isFloatingPoint() ||
8965 VT.getVectorElementType() == N2.getValueType()) &&
8966 "INSERT_VECTOR_ELT fp scalar type mismatch");
8967 assert((!VT.isInteger() ||
8969 "INSERT_VECTOR_ELT int scalar size mismatch");
8970
8971 auto *N3C = dyn_cast<ConstantSDNode>(N3);
8972 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
8973 // for scalable vectors where we will generate appropriate code to
8974 // deal with out-of-bounds cases correctly.
8975 if (N3C && VT.isFixedLengthVector() &&
8976 N3C->getZExtValue() >= VT.getVectorNumElements())
8977 return getUNDEF(VT);
8978
8979 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
8980 if (N3.isUndef())
8981 return getUNDEF(VT);
8982
8983 // If inserting poison, just use the input vector.
8984 if (N2.getOpcode() == ISD::POISON)
8985 return N1;
8986
8987 // Inserting undef into undef/poison is still undef.
8988 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8989 return getUNDEF(VT);
8990
8991 // If the inserted element is an UNDEF, just use the input vector.
8992 // But not if skipping the insert could make the result more poisonous.
8993 if (N2.isUndef()) {
8994 if (N3C && VT.isFixedLengthVector()) {
8995 APInt EltMask =
8996 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
8997 if (isGuaranteedNotToBePoison(N1, EltMask))
8998 return N1;
8999 } else if (isGuaranteedNotToBePoison(N1))
9000 return N1;
9001 }
9002 break;
9003 }
9004 case ISD::INSERT_SUBVECTOR: {
9005 // If inserting poison, just use the input vector,
9006 if (N2.getOpcode() == ISD::POISON)
9007 return N1;
9008
9009 // Inserting undef into undef/poison is still undef.
9010 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9011 return getUNDEF(VT);
9012
9013 EVT N2VT = N2.getValueType();
9014 assert(VT == N1.getValueType() &&
9015 "Dest and insert subvector source types must match!");
9016 assert(VT.isVector() && N2VT.isVector() &&
9017 "Insert subvector VTs must be vectors!");
9019 "Insert subvector VTs must have the same element type!");
9020 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9021 "Cannot insert a scalable vector into a fixed length vector!");
9022 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9024 "Insert subvector must be from smaller vector to larger vector!");
9026 "Insert subvector index must be constant");
9027 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9028 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9030 "Insert subvector overflow!");
9032 TLI->getVectorIdxWidth(getDataLayout()) &&
9033 "Constant index for INSERT_SUBVECTOR has an invalid size");
9034
9035 // Trivial insertion.
9036 if (VT == N2VT)
9037 return N2;
9038
9039 // If this is an insert of an extracted vector into an undef/poison vector,
9040 // we can just use the input to the extract. But not if skipping the
9041 // extract+insert could make the result more poisonous.
9042 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9043 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9044 if (N1.getOpcode() == ISD::POISON)
9045 return N2.getOperand(0);
9046 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9047 unsigned LoBit = N3->getAsZExtVal();
9048 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9049 APInt EltMask =
9050 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9051 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9052 return N2.getOperand(0);
9053 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9054 return N2.getOperand(0);
9055 }
9056
9057 // If the inserted subvector is UNDEF, just use the input vector.
9058 // But not if skipping the insert could make the result more poisonous.
9059 if (N2.isUndef()) {
9060 if (VT.isFixedLengthVector()) {
9061 unsigned LoBit = N3->getAsZExtVal();
9062 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9063 APInt EltMask =
9064 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9065 if (isGuaranteedNotToBePoison(N1, EltMask))
9066 return N1;
9067 } else if (isGuaranteedNotToBePoison(N1))
9068 return N1;
9069 }
9070 break;
9071 }
9072 case ISD::BITCAST:
9073 // Fold bit_convert nodes from a type to themselves.
9074 if (N1.getValueType() == VT)
9075 return N1;
9076 break;
9077 case ISD::VP_TRUNCATE:
9078 case ISD::VP_SIGN_EXTEND:
9079 case ISD::VP_ZERO_EXTEND:
9080 // Don't create noop casts.
9081 if (N1.getValueType() == VT)
9082 return N1;
9083 break;
9084 case ISD::VECTOR_COMPRESS: {
9085 [[maybe_unused]] EVT VecVT = N1.getValueType();
9086 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9087 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9088 assert(VT == VecVT && "Vector and result type don't match.");
9089 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9090 "All inputs must be vectors.");
9091 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9093 "Vector and mask must have same number of elements.");
9094
9095 if (N1.isUndef() || N2.isUndef())
9096 return N3;
9097
9098 break;
9099 }
9104 [[maybe_unused]] EVT AccVT = N1.getValueType();
9105 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9106 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9107 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9108 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9109 "node to have the same type!");
9110 assert(VT.isVector() && VT == AccVT &&
9111 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9112 "the same type as its result!");
9114 AccVT.getVectorElementCount()) &&
9115 "Expected the element count of the second and third operands of the "
9116 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9117 "element count of the first operand and the result!");
9119 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9120 "node to have an element type which is the same as or smaller than "
9121 "the element type of the first operand and result!");
9122 break;
9123 }
9124 }
9125
9126 // Perform trivial constant folding for arithmetic operators.
9127 switch (Opcode) {
9128 case ISD::FMA:
9129 case ISD::FMAD:
9130 case ISD::SETCC:
9131 case ISD::FSHL:
9132 case ISD::FSHR:
9133 if (SDValue SV =
9134 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9135 return SV;
9136 break;
9137 }
9138
9139 // Memoize node if it doesn't produce a glue result.
9140 SDNode *N;
9141 SDVTList VTs = getVTList(VT);
9142 SDValue Ops[] = {N1, N2, N3};
9143 if (VT != MVT::Glue) {
9145 AddNodeIDNode(ID, Opcode, VTs, Ops);
9146 void *IP = nullptr;
9147 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9148 E->intersectFlagsWith(Flags);
9149 return SDValue(E, 0);
9150 }
9151
9152 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9153 N->setFlags(Flags);
9154 createOperands(N, Ops);
9155 CSEMap.InsertNode(N, IP);
9156 } else {
9157 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9158 createOperands(N, Ops);
9159 }
9160
9161 InsertNode(N);
9162 SDValue V = SDValue(N, 0);
9163 NewSDValueDbgMsg(V, "Creating new node: ", this);
9164 return V;
9165}
9166
9167SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9168 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9169 const SDNodeFlags Flags) {
9170 SDValue Ops[] = { N1, N2, N3, N4 };
9171 return getNode(Opcode, DL, VT, Ops, Flags);
9172}
9173
9174SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9175 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9176 SDNodeFlags Flags;
9177 if (Inserter)
9178 Flags = Inserter->getFlags();
9179 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9180}
9181
9182SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9183 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9184 SDValue N5, const SDNodeFlags Flags) {
9185 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9186 return getNode(Opcode, DL, VT, Ops, Flags);
9187}
9188
9189SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9190 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9191 SDValue N5) {
9192 SDNodeFlags Flags;
9193 if (Inserter)
9194 Flags = Inserter->getFlags();
9195 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9196}
9197
9198/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9199/// the incoming stack arguments to be loaded from the stack.
9201 SmallVector<SDValue, 8> ArgChains;
9202
9203 // Include the original chain at the beginning of the list. When this is
9204 // used by target LowerCall hooks, this helps legalize find the
9205 // CALLSEQ_BEGIN node.
9206 ArgChains.push_back(Chain);
9207
9208 // Add a chain value for each stack argument.
9209 for (SDNode *U : getEntryNode().getNode()->users())
9210 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9211 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9212 if (FI->getIndex() < 0)
9213 ArgChains.push_back(SDValue(L, 1));
9214
9215 // Build a tokenfactor for all the chains.
9216 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9217}
9218
9219/// getMemsetValue - Vectorized representation of the memset value
9220/// operand.
9222 const SDLoc &dl) {
9223 assert(!Value.isUndef());
9224
9225 unsigned NumBits = VT.getScalarSizeInBits();
9227 assert(C->getAPIntValue().getBitWidth() == 8);
9228 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9229 if (VT.isInteger()) {
9230 bool IsOpaque = VT.getSizeInBits() > 64 ||
9231 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9232 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9233 }
9234 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9235 }
9236
9237 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9238 EVT IntVT = VT.getScalarType();
9239 if (!IntVT.isInteger())
9240 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9241
9242 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9243 if (NumBits > 8) {
9244 // Use a multiplication with 0x010101... to extend the input to the
9245 // required length.
9246 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9247 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9248 DAG.getConstant(Magic, dl, IntVT));
9249 }
9250
9251 if (VT != Value.getValueType() && !VT.isInteger())
9252 Value = DAG.getBitcast(VT.getScalarType(), Value);
9253 if (VT != Value.getValueType())
9254 Value = DAG.getSplatBuildVector(VT, dl, Value);
9255
9256 return Value;
9257}
9258
9259/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9260/// used when a memcpy is turned into a memset when the source is a constant
9261/// string ptr.
9263 const TargetLowering &TLI,
9264 const ConstantDataArraySlice &Slice) {
9265 // Handle vector with all elements zero.
9266 if (Slice.Array == nullptr) {
9267 if (VT.isInteger())
9268 return DAG.getConstant(0, dl, VT);
9269 return DAG.getNode(ISD::BITCAST, dl, VT,
9270 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9271 }
9272
9273 assert(!VT.isVector() && "Can't handle vector type here!");
9274 unsigned NumVTBits = VT.getSizeInBits();
9275 unsigned NumVTBytes = NumVTBits / 8;
9276 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9277
9278 APInt Val(NumVTBits, 0);
9279 if (DAG.getDataLayout().isLittleEndian()) {
9280 for (unsigned i = 0; i != NumBytes; ++i)
9281 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9282 } else {
9283 for (unsigned i = 0; i != NumBytes; ++i)
9284 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9285 }
9286
9287 // If the "cost" of materializing the integer immediate is less than the cost
9288 // of a load, then it is cost effective to turn the load into the immediate.
9289 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9290 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9291 return DAG.getConstant(Val, dl, VT);
9292 return SDValue();
9293}
9294
9296 const SDLoc &DL,
9297 const SDNodeFlags Flags) {
9298 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9299 return getMemBasePlusOffset(Base, Index, DL, Flags);
9300}
9301
9303 const SDLoc &DL,
9304 const SDNodeFlags Flags) {
9305 assert(Offset.getValueType().isInteger());
9306 EVT BasePtrVT = Ptr.getValueType();
9307 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9308 BasePtrVT))
9309 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9310 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9311 SDNodeFlags AddFlags = Flags;
9312 AddFlags.setInBounds(false);
9313 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9314}
9315
9316/// Returns true if memcpy source is constant data.
9318 uint64_t SrcDelta = 0;
9319 GlobalAddressSDNode *G = nullptr;
9320 if (Src.getOpcode() == ISD::GlobalAddress)
9322 else if (Src->isAnyAdd() &&
9323 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9324 Src.getOperand(1).getOpcode() == ISD::Constant) {
9325 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9326 SrcDelta = Src.getConstantOperandVal(1);
9327 }
9328 if (!G)
9329 return false;
9330
9331 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9332 SrcDelta + G->getOffset());
9333}
9334
9336 SelectionDAG &DAG) {
9337 // On Darwin, -Os means optimize for size without hurting performance, so
9338 // only really optimize for size when -Oz (MinSize) is used.
9340 return MF.getFunction().hasMinSize();
9341 return DAG.shouldOptForSize();
9342}
9343
9345 SmallVector<SDValue, 32> &OutChains, unsigned From,
9346 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9347 SmallVector<SDValue, 16> &OutStoreChains) {
9348 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9349 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9350 SmallVector<SDValue, 16> GluedLoadChains;
9351 for (unsigned i = From; i < To; ++i) {
9352 OutChains.push_back(OutLoadChains[i]);
9353 GluedLoadChains.push_back(OutLoadChains[i]);
9354 }
9355
9356 // Chain for all loads.
9357 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9358 GluedLoadChains);
9359
9360 for (unsigned i = From; i < To; ++i) {
9361 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9362 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9363 ST->getBasePtr(), ST->getMemoryVT(),
9364 ST->getMemOperand());
9365 OutChains.push_back(NewStore);
9366 }
9367}
9368
9369static SDValue
9371 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9372 Align SrcAlign, bool isVol, bool AlwaysInline,
9373 MachinePointerInfo DstPtrInfo,
9374 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9375 BatchAAResults *BatchAA) {
9376 // Turn a memcpy of undef to nop.
9377 // FIXME: We need to honor volatile even is Src is undef.
9378 if (Src.isUndef())
9379 return Chain;
9380
9381 // Expand memcpy to a series of load and store ops if the size operand falls
9382 // below a certain threshold.
9383 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9384 // rather than maybe a humongous number of loads and stores.
9385 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9386 const DataLayout &DL = DAG.getDataLayout();
9387 LLVMContext &C = *DAG.getContext();
9388 std::vector<EVT> MemOps;
9389 bool DstAlignCanChange = false;
9391 MachineFrameInfo &MFI = MF.getFrameInfo();
9392 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9394 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9395 DstAlignCanChange = true;
9396 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9398 // If marked as volatile, perform a copy even when marked as constant.
9399 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9400 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9401 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9402 const MemOp Op = isZeroConstant
9403 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9404 /*IsZeroMemset*/ true, isVol)
9405 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9406 SrcAlign, isVol, CopyFromConstant);
9407 if (!TLI.findOptimalMemOpLowering(
9408 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9409 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9410 return SDValue();
9411
9412 if (DstAlignCanChange) {
9413 Type *Ty = MemOps[0].getTypeForEVT(C);
9414 Align NewDstAlign = DL.getABITypeAlign(Ty);
9415
9416 // Don't promote to an alignment that would require dynamic stack
9417 // realignment which may conflict with optimizations such as tail call
9418 // optimization.
9420 if (!TRI->hasStackRealignment(MF))
9421 if (MaybeAlign StackAlign = DL.getStackAlignment())
9422 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9423
9424 if (NewDstAlign > DstAlign) {
9425 // Give the stack frame object a larger alignment if needed.
9426 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9427 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9428 DstAlign = NewDstAlign;
9429 }
9430 }
9431
9432 // Prepare AAInfo for loads/stores after lowering this memcpy.
9433 AAMDNodes NewAAInfo = AAInfo;
9434 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9435
9436 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9437 bool isConstant =
9438 BatchAA && SrcVal &&
9439 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9440
9441 MachineMemOperand::Flags MMOFlags =
9443 SmallVector<SDValue, 16> OutLoadChains;
9444 SmallVector<SDValue, 16> OutStoreChains;
9445 SmallVector<SDValue, 32> OutChains;
9446 unsigned NumMemOps = MemOps.size();
9447 uint64_t SrcOff = 0, DstOff = 0;
9448 for (unsigned i = 0; i != NumMemOps; ++i) {
9449 EVT VT = MemOps[i];
9450 unsigned VTSize = VT.getSizeInBits() / 8;
9451 SDValue Value, Store;
9452
9453 if (VTSize > Size) {
9454 // Issuing an unaligned load / store pair that overlaps with the previous
9455 // pair. Adjust the offset accordingly.
9456 assert(i == NumMemOps-1 && i != 0);
9457 SrcOff -= VTSize - Size;
9458 DstOff -= VTSize - Size;
9459 }
9460
9461 if (CopyFromConstant &&
9462 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9463 // It's unlikely a store of a vector immediate can be done in a single
9464 // instruction. It would require a load from a constantpool first.
9465 // We only handle zero vectors here.
9466 // FIXME: Handle other cases where store of vector immediate is done in
9467 // a single instruction.
9468 ConstantDataArraySlice SubSlice;
9469 if (SrcOff < Slice.Length) {
9470 SubSlice = Slice;
9471 SubSlice.move(SrcOff);
9472 } else {
9473 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9474 SubSlice.Array = nullptr;
9475 SubSlice.Offset = 0;
9476 SubSlice.Length = VTSize;
9477 }
9478 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9479 if (Value.getNode()) {
9480 Store = DAG.getStore(
9481 Chain, dl, Value,
9482 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9483 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags, NewAAInfo);
9484 OutChains.push_back(Store);
9485 }
9486 }
9487
9488 if (!Store.getNode()) {
9489 // The type might not be legal for the target. This should only happen
9490 // if the type is smaller than a legal type, as on PPC, so the right
9491 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9492 // to Load/Store if NVT==VT.
9493 // FIXME does the case above also need this?
9494 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9495 assert(NVT.bitsGE(VT));
9496
9497 bool isDereferenceable =
9498 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9499 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9500 if (isDereferenceable)
9502 if (isConstant)
9503 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9504
9505 Value = DAG.getExtLoad(
9506 ISD::EXTLOAD, dl, NVT, Chain,
9507 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9508 SrcPtrInfo.getWithOffset(SrcOff), VT,
9509 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9510 OutLoadChains.push_back(Value.getValue(1));
9511
9512 Store = DAG.getTruncStore(
9513 Chain, dl, Value,
9514 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9515 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags, NewAAInfo);
9516 OutStoreChains.push_back(Store);
9517 }
9518 SrcOff += VTSize;
9519 DstOff += VTSize;
9520 Size -= VTSize;
9521 }
9522
9523 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9525 unsigned NumLdStInMemcpy = OutStoreChains.size();
9526
9527 if (NumLdStInMemcpy) {
9528 // It may be that memcpy might be converted to memset if it's memcpy
9529 // of constants. In such a case, we won't have loads and stores, but
9530 // just stores. In the absence of loads, there is nothing to gang up.
9531 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9532 // If target does not care, just leave as it.
9533 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9534 OutChains.push_back(OutLoadChains[i]);
9535 OutChains.push_back(OutStoreChains[i]);
9536 }
9537 } else {
9538 // Ld/St less than/equal limit set by target.
9539 if (NumLdStInMemcpy <= GluedLdStLimit) {
9540 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9541 NumLdStInMemcpy, OutLoadChains,
9542 OutStoreChains);
9543 } else {
9544 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9545 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9546 unsigned GlueIter = 0;
9547
9548 // Residual ld/st.
9549 if (RemainingLdStInMemcpy) {
9551 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9552 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9553 }
9554
9555 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9556 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9557 GlueIter - GluedLdStLimit;
9558 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9559 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9560 OutLoadChains, OutStoreChains);
9561 GlueIter += GluedLdStLimit;
9562 }
9563 }
9564 }
9565 }
9566 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9567}
9568
9570 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9571 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9572 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9573 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9574 // Turn a memmove of undef to nop.
9575 // FIXME: We need to honor volatile even is Src is undef.
9576 if (Src.isUndef())
9577 return Chain;
9578
9579 // Expand memmove to a series of load and store ops if the size operand falls
9580 // below a certain threshold.
9581 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9582 const DataLayout &DL = DAG.getDataLayout();
9583 LLVMContext &C = *DAG.getContext();
9584 std::vector<EVT> MemOps;
9585 bool DstAlignCanChange = false;
9587 MachineFrameInfo &MFI = MF.getFrameInfo();
9588 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9590 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9591 DstAlignCanChange = true;
9592 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9593 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9594 if (!TLI.findOptimalMemOpLowering(
9595 C, MemOps, Limit,
9596 MemOp::Copy(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9597 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9598 MF.getFunction().getAttributes(), nullptr))
9599 return SDValue();
9600
9601 if (DstAlignCanChange) {
9602 Type *Ty = MemOps[0].getTypeForEVT(C);
9603 Align NewDstAlign = DL.getABITypeAlign(Ty);
9604
9605 // Don't promote to an alignment that would require dynamic stack
9606 // realignment which may conflict with optimizations such as tail call
9607 // optimization.
9609 if (!TRI->hasStackRealignment(MF))
9610 if (MaybeAlign StackAlign = DL.getStackAlignment())
9611 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9612
9613 if (NewDstAlign > DstAlign) {
9614 // Give the stack frame object a larger alignment if needed.
9615 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9616 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9617 DstAlign = NewDstAlign;
9618 }
9619 }
9620
9621 // Prepare AAInfo for loads/stores after lowering this memmove.
9622 AAMDNodes NewAAInfo = AAInfo;
9623 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9624
9625 MachineMemOperand::Flags MMOFlags =
9627 uint64_t SrcOff = 0;
9628 SmallVector<SDValue, 8> LoadValues;
9629 SmallVector<SDValue, 8> LoadChains;
9630 SmallVector<SDValue, 8> OutChains;
9631 unsigned NumMemOps = MemOps.size();
9632 for (unsigned i = 0; i < NumMemOps; i++) {
9633 EVT VT = MemOps[i];
9634 unsigned VTSize = VT.getSizeInBits() / 8;
9635 SDValue Value;
9636 bool IsOverlapping = false;
9637
9638 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9639 // Issuing an unaligned load / store pair that overlaps with the previous
9640 // pair. Adjust the offset accordingly.
9641 SrcOff = Size - VTSize;
9642 IsOverlapping = true;
9643 }
9644
9645 // Calculate the actual alignment at the current offset. The alignment at
9646 // SrcOff may be lower than the base alignment, especially when using
9647 // overlapping loads.
9648 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9649 if (IsOverlapping) {
9650 // Verify that the target allows misaligned memory accesses at the
9651 // adjusted offset when using overlapping loads.
9652 unsigned Fast;
9653 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9654 SrcAlignAtOffset, MMOFlags,
9655 &Fast) ||
9656 !Fast) {
9657 // This should have been caught by findOptimalMemOpLowering, but verify
9658 // here for safety.
9659 return SDValue();
9660 }
9661 }
9662
9663 bool isDereferenceable =
9664 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9665 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9666 if (isDereferenceable)
9668 Value =
9669 DAG.getLoad(VT, dl, Chain,
9670 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9671 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9672 SrcMMOFlags, NewAAInfo);
9673 LoadValues.push_back(Value);
9674 LoadChains.push_back(Value.getValue(1));
9675 SrcOff += VTSize;
9676 }
9677 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9678 OutChains.clear();
9679 uint64_t DstOff = 0;
9680 for (unsigned i = 0; i < NumMemOps; i++) {
9681 EVT VT = MemOps[i];
9682 unsigned VTSize = VT.getSizeInBits() / 8;
9683 SDValue Store;
9684 bool IsOverlapping = false;
9685
9686 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9687 // Issuing an unaligned load / store pair that overlaps with the previous
9688 // pair. Adjust the offset accordingly.
9689 DstOff = Size - VTSize;
9690 IsOverlapping = true;
9691 }
9692
9693 // Calculate the actual alignment at the current offset. The alignment at
9694 // DstOff may be lower than the base alignment, especially when using
9695 // overlapping stores.
9696 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9697 if (IsOverlapping) {
9698 // Verify that the target allows misaligned memory accesses at the
9699 // adjusted offset when using overlapping stores.
9700 unsigned Fast;
9701 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9702 DstAlignAtOffset, MMOFlags,
9703 &Fast) ||
9704 !Fast) {
9705 // This should have been caught by findOptimalMemOpLowering, but verify
9706 // here for safety.
9707 return SDValue();
9708 }
9709 }
9710 Store = DAG.getStore(
9711 Chain, dl, LoadValues[i],
9712 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9713 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9714 NewAAInfo);
9715 OutChains.push_back(Store);
9716 DstOff += VTSize;
9717 }
9718
9719 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9720}
9721
9722/// Lower the call to 'memset' intrinsic function into a series of store
9723/// operations.
9724///
9725/// \param DAG Selection DAG where lowered code is placed.
9726/// \param dl Link to corresponding IR location.
9727/// \param Chain Control flow dependency.
9728/// \param Dst Pointer to destination memory location.
9729/// \param Src Value of byte to write into the memory.
9730/// \param Size Number of bytes to write.
9731/// \param Alignment Alignment of the destination in bytes.
9732/// \param isVol True if destination is volatile.
9733/// \param AlwaysInline Makes sure no function call is generated.
9734/// \param DstPtrInfo IR information on the memory pointer.
9735/// \returns New head in the control flow, if lowering was successful, empty
9736/// SDValue otherwise.
9737///
9738/// The function tries to replace 'llvm.memset' intrinsic with several store
9739/// operations and value calculation code. This is usually profitable for small
9740/// memory size or when the semantic requires inlining.
9742 SDValue Chain, SDValue Dst, SDValue Src,
9743 uint64_t Size, Align Alignment, bool isVol,
9744 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9745 const AAMDNodes &AAInfo) {
9746 // Turn a memset of undef to nop.
9747 // FIXME: We need to honor volatile even is Src is undef.
9748 if (Src.isUndef())
9749 return Chain;
9750
9751 // Expand memset to a series of load/store ops if the size operand
9752 // falls below a certain threshold.
9753 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9754 std::vector<EVT> MemOps;
9755 bool DstAlignCanChange = false;
9756 LLVMContext &C = *DAG.getContext();
9758 MachineFrameInfo &MFI = MF.getFrameInfo();
9759 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9761 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9762 DstAlignCanChange = true;
9763 bool IsZeroVal = isNullConstant(Src);
9764 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9765
9766 EVT LargestVT;
9767 if (!TLI.findOptimalMemOpLowering(
9768 C, MemOps, Limit,
9769 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9770 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9771 &LargestVT))
9772 return SDValue();
9773
9774 if (DstAlignCanChange) {
9775 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9776 const DataLayout &DL = DAG.getDataLayout();
9777 Align NewAlign = DL.getABITypeAlign(Ty);
9778
9779 // Don't promote to an alignment that would require dynamic stack
9780 // realignment which may conflict with optimizations such as tail call
9781 // optimization.
9783 if (!TRI->hasStackRealignment(MF))
9784 if (MaybeAlign StackAlign = DL.getStackAlignment())
9785 NewAlign = std::min(NewAlign, *StackAlign);
9786
9787 if (NewAlign > Alignment) {
9788 // Give the stack frame object a larger alignment if needed.
9789 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9790 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9791 Alignment = NewAlign;
9792 }
9793 }
9794
9795 SmallVector<SDValue, 8> OutChains;
9796 uint64_t DstOff = 0;
9797 unsigned NumMemOps = MemOps.size();
9798
9799 // Find the largest store and generate the bit pattern for it.
9800 // If target didn't set LargestVT, compute it from MemOps.
9801 if (!LargestVT.isSimple()) {
9802 LargestVT = MemOps[0];
9803 for (unsigned i = 1; i < NumMemOps; i++)
9804 if (MemOps[i].bitsGT(LargestVT))
9805 LargestVT = MemOps[i];
9806 }
9807 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9808
9809 // Prepare AAInfo for loads/stores after lowering this memset.
9810 AAMDNodes NewAAInfo = AAInfo;
9811 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9812
9813 for (unsigned i = 0; i < NumMemOps; i++) {
9814 EVT VT = MemOps[i];
9815 unsigned VTSize = VT.getSizeInBits() / 8;
9816 // The target should specify store types that exactly cover the memset size
9817 // (with the last store potentially being oversized for overlapping stores).
9818 assert(Size > 0 && "Target specified more stores than needed in "
9819 "findOptimalMemOpLowering");
9820 if (VTSize > Size) {
9821 // Issuing an unaligned load / store pair that overlaps with the previous
9822 // pair. Adjust the offset accordingly.
9823 assert(i == NumMemOps-1 && i != 0);
9824 DstOff -= VTSize - Size;
9825 }
9826
9827 // If this store is smaller than the largest store see whether we can get
9828 // the smaller value for free with a truncate or extract vector element and
9829 // then store.
9830 SDValue Value = MemSetValue;
9831 if (VT.bitsLT(LargestVT)) {
9832 unsigned Index;
9833 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9834 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9835 if (!LargestVT.isVector() && !VT.isVector() &&
9836 TLI.isTruncateFree(LargestVT, VT))
9837 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9838 else if (LargestVT.isVector() && !VT.isVector() &&
9840 LargestVT.getTypeForEVT(*DAG.getContext()),
9841 VT.getSizeInBits(), Index) &&
9842 TLI.isTypeLegal(SVT) &&
9843 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9844 // Target which can combine store(extractelement VectorTy, Idx) can get
9845 // the smaller value for free.
9846 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9847 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9848 } else
9849 Value = getMemsetValue(Src, VT, DAG, dl);
9850 }
9851 assert(Value.getValueType() == VT && "Value with wrong type.");
9852 SDValue Store = DAG.getStore(
9853 Chain, dl, Value,
9854 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9855 DstPtrInfo.getWithOffset(DstOff), Alignment,
9857 NewAAInfo);
9858 OutChains.push_back(Store);
9859 DstOff += VT.getSizeInBits() / 8;
9860 // For oversized overlapping stores, only subtract the remaining bytes.
9861 // For normal stores, subtract the full store size.
9862 if (VTSize > Size) {
9863 Size = 0;
9864 } else {
9865 Size -= VTSize;
9866 }
9867 }
9868
9869 // After processing all stores, Size should be exactly 0. Any remaining bytes
9870 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9871 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9872 "stores that exactly cover the memset size");
9873
9874 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9875}
9876
9878 unsigned AS) {
9879 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9880 // pointer operands can be losslessly bitcasted to pointers of address space 0
9881 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9882 report_fatal_error("cannot lower memory intrinsic in address space " +
9883 Twine(AS));
9884 }
9885}
9886
9888 const SelectionDAG *SelDAG,
9889 bool AllowReturnsFirstArg) {
9890 if (!CI || !CI->isTailCall())
9891 return false;
9892 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9893 // helper symbol we lower to.
9894 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9895 AllowReturnsFirstArg &&
9897}
9898
9899static std::pair<SDValue, SDValue>
9902 const CallInst *CI, RTLIB::Libcall Call,
9903 SelectionDAG *DAG, const TargetLowering *TLI) {
9904 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9905
9906 if (LCImpl == RTLIB::Unsupported)
9907 return {};
9908
9910 bool IsTailCall =
9911 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9912 SDValue Callee =
9913 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9914
9915 CLI.setDebugLoc(dl)
9916 .setChain(Chain)
9918 CI->getType(), Callee, std::move(Args))
9919 .setTailCall(IsTailCall);
9920
9921 return TLI->LowerCallTo(CLI);
9922}
9923
9924std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9925 const SDLoc &dl, SDValue S1,
9926 SDValue S2,
9927 const CallInst *CI) {
9929 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9930 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9931 RTLIB::STRCMP, this, TLI);
9932}
9933
9934std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9935 const SDLoc &dl, SDValue S1,
9936 SDValue S2,
9937 const CallInst *CI) {
9939 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9940 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9941 RTLIB::STRSTR, this, TLI);
9942}
9943
9944std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9945 const SDLoc &dl,
9946 SDValue Dst, SDValue Src,
9948 const CallInst *CI) {
9950
9952 {Dst, PT},
9953 {Src, PT},
9956 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9957 RTLIB::MEMCCPY, this, TLI);
9958}
9959
9960std::pair<SDValue, SDValue>
9962 SDValue Mem1, SDValue Size, const CallInst *CI) {
9965 {Mem0, PT},
9966 {Mem1, PT},
9968 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9969 RTLIB::MEMCMP, this, TLI);
9970}
9971
9972std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
9973 const SDLoc &dl,
9974 SDValue Dst, SDValue Src,
9975 const CallInst *CI) {
9977 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
9978 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9979 RTLIB::STRCPY, this, TLI);
9980}
9981
9982std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
9983 const SDLoc &dl,
9984 SDValue Src,
9985 const CallInst *CI) {
9986 // Emit a library call.
9989 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9990 RTLIB::STRLEN, this, TLI);
9991}
9992
9994 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
9995 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
9996 const CallInst *CI, std::optional<bool> OverrideTailCall,
9997 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
9998 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
9999 // Check to see if we should lower the memcpy to loads and stores first.
10000 // For cases within the target-specified limits, this is the best choice.
10002 if (ConstantSize) {
10003 // Memcpy with size zero? Just return the original chain.
10004 if (ConstantSize->isZero())
10005 return Chain;
10006
10008 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10009 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
10010 if (Result.getNode())
10011 return Result;
10012 }
10013
10014 // Then check to see if we should lower the memcpy with target-specific
10015 // code. If the target chooses to do this, this is the next best.
10016 if (TSI) {
10017 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10018 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10019 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10020 if (Result.getNode())
10021 return Result;
10022 }
10023
10024 // If we really need inline code and the target declined to provide it,
10025 // use a (potentially long) sequence of loads and stores.
10026 if (AlwaysInline) {
10027 assert(ConstantSize && "AlwaysInline requires a constant size!");
10029 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10030 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
10031 }
10032
10035
10036 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10037 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10038 // respect volatile, so they may do things like read or write memory
10039 // beyond the given memory regions. But fixing this isn't easy, and most
10040 // people don't care.
10041
10042 // Emit a library call.
10045 Args.emplace_back(Dst, PtrTy);
10046 Args.emplace_back(Src, PtrTy);
10047 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10048 // FIXME: pass in SDLoc
10050 bool IsTailCall = false;
10051 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10052
10053 if (OverrideTailCall.has_value()) {
10054 IsTailCall = *OverrideTailCall;
10055 } else {
10056 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10057 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10058 }
10059
10060 CLI.setDebugLoc(dl)
10061 .setChain(Chain)
10062 .setLibCallee(
10063 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10064 Dst.getValueType().getTypeForEVT(*getContext()),
10065 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10066 std::move(Args))
10068 .setTailCall(IsTailCall);
10069
10070 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10071 return CallResult.second;
10072}
10073
10075 SDValue Dst, SDValue Src, SDValue Size,
10076 Type *SizeTy, unsigned ElemSz,
10077 bool isTailCall,
10078 MachinePointerInfo DstPtrInfo,
10079 MachinePointerInfo SrcPtrInfo) {
10080 // Emit a library call.
10083 Args.emplace_back(Dst, ArgTy);
10084 Args.emplace_back(Src, ArgTy);
10085 Args.emplace_back(Size, SizeTy);
10086
10087 RTLIB::Libcall LibraryCall =
10089 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10090 if (LibcallImpl == RTLIB::Unsupported)
10091 report_fatal_error("Unsupported element size");
10092
10094 CLI.setDebugLoc(dl)
10095 .setChain(Chain)
10096 .setLibCallee(
10097 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10099 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10100 std::move(Args))
10102 .setTailCall(isTailCall);
10103
10104 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10105 return CallResult.second;
10106}
10107
10109 SDValue Src, SDValue Size, Align DstAlign,
10110 Align SrcAlign, bool isVol, const CallInst *CI,
10111 std::optional<bool> OverrideTailCall,
10112 MachinePointerInfo DstPtrInfo,
10113 MachinePointerInfo SrcPtrInfo,
10114 const AAMDNodes &AAInfo,
10115 BatchAAResults *BatchAA) {
10116 // Check to see if we should lower the memmove to loads and stores first.
10117 // For cases within the target-specified limits, this is the best choice.
10119 if (ConstantSize) {
10120 // Memmove with size zero? Just return the original chain.
10121 if (ConstantSize->isZero())
10122 return Chain;
10123
10125 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10126 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10127 if (Result.getNode())
10128 return Result;
10129 }
10130
10131 // Then check to see if we should lower the memmove with target-specific
10132 // code. If the target chooses to do this, this is the next best.
10133 if (TSI) {
10134 SDValue Result = TSI->EmitTargetCodeForMemmove(
10135 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10136 SrcPtrInfo);
10137 if (Result.getNode())
10138 return Result;
10139 }
10140
10143
10144 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10145 // not be safe. See memcpy above for more details.
10146
10147 // Emit a library call.
10150 Args.emplace_back(Dst, PtrTy);
10151 Args.emplace_back(Src, PtrTy);
10152 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10153 // FIXME: pass in SDLoc
10155
10156 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10157
10158 bool IsTailCall = false;
10159 if (OverrideTailCall.has_value()) {
10160 IsTailCall = *OverrideTailCall;
10161 } else {
10162 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10163 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10164 }
10165
10166 CLI.setDebugLoc(dl)
10167 .setChain(Chain)
10168 .setLibCallee(
10169 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10170 Dst.getValueType().getTypeForEVT(*getContext()),
10171 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10172 std::move(Args))
10174 .setTailCall(IsTailCall);
10175
10176 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10177 return CallResult.second;
10178}
10179
10181 SDValue Dst, SDValue Src, SDValue Size,
10182 Type *SizeTy, unsigned ElemSz,
10183 bool isTailCall,
10184 MachinePointerInfo DstPtrInfo,
10185 MachinePointerInfo SrcPtrInfo) {
10186 // Emit a library call.
10189 Args.emplace_back(Dst, IntPtrTy);
10190 Args.emplace_back(Src, IntPtrTy);
10191 Args.emplace_back(Size, SizeTy);
10192
10193 RTLIB::Libcall LibraryCall =
10195 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10196 if (LibcallImpl == RTLIB::Unsupported)
10197 report_fatal_error("Unsupported element size");
10198
10200 CLI.setDebugLoc(dl)
10201 .setChain(Chain)
10202 .setLibCallee(
10203 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10205 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10206 std::move(Args))
10208 .setTailCall(isTailCall);
10209
10210 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10211 return CallResult.second;
10212}
10213
10215 SDValue Src, SDValue Size, Align Alignment,
10216 bool isVol, bool AlwaysInline,
10217 const CallInst *CI,
10218 MachinePointerInfo DstPtrInfo,
10219 const AAMDNodes &AAInfo) {
10220 // Check to see if we should lower the memset to stores first.
10221 // For cases within the target-specified limits, this is the best choice.
10223 if (ConstantSize) {
10224 // Memset with size zero? Just return the original chain.
10225 if (ConstantSize->isZero())
10226 return Chain;
10227
10228 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10229 ConstantSize->getZExtValue(), Alignment,
10230 isVol, false, DstPtrInfo, AAInfo);
10231
10232 if (Result.getNode())
10233 return Result;
10234 }
10235
10236 // Then check to see if we should lower the memset with target-specific
10237 // code. If the target chooses to do this, this is the next best.
10238 if (TSI) {
10239 SDValue Result = TSI->EmitTargetCodeForMemset(
10240 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10241 if (Result.getNode())
10242 return Result;
10243 }
10244
10245 // If we really need inline code and the target declined to provide it,
10246 // use a (potentially long) sequence of loads and stores.
10247 if (AlwaysInline) {
10248 assert(ConstantSize && "AlwaysInline requires a constant size!");
10249 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10250 ConstantSize->getZExtValue(), Alignment,
10251 isVol, true, DstPtrInfo, AAInfo);
10252 assert(Result &&
10253 "getMemsetStores must return a valid sequence when AlwaysInline");
10254 return Result;
10255 }
10256
10258
10259 // Emit a library call.
10260 auto &Ctx = *getContext();
10261 const auto& DL = getDataLayout();
10262
10264 // FIXME: pass in SDLoc
10265 CLI.setDebugLoc(dl).setChain(Chain);
10266
10267 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10268 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10269
10270 // If zeroing out and bzero is present, use it.
10271 if (UseBZero) {
10273 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10274 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10275 CLI.setLibCallee(
10276 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10277 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10278 } else {
10279 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10280
10282 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10283 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10284 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10285 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10286 Dst.getValueType().getTypeForEVT(Ctx),
10287 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10288 std::move(Args));
10289 }
10290
10291 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10292 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10293
10294 // If we're going to use bzero, make sure not to tail call unless the
10295 // subsequent return doesn't need a value, as bzero doesn't return the first
10296 // arg unlike memset.
10297 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10298 bool IsTailCall =
10299 CI && CI->isTailCall() &&
10300 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
10301 CLI.setDiscardResult().setTailCall(IsTailCall);
10302
10303 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10304 return CallResult.second;
10305}
10306
10309 Type *SizeTy, unsigned ElemSz,
10310 bool isTailCall,
10311 MachinePointerInfo DstPtrInfo) {
10312 // Emit a library call.
10314 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10315 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10316 Args.emplace_back(Size, SizeTy);
10317
10318 RTLIB::Libcall LibraryCall =
10320 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10321 if (LibcallImpl == RTLIB::Unsupported)
10322 report_fatal_error("Unsupported element size");
10323
10325 CLI.setDebugLoc(dl)
10326 .setChain(Chain)
10327 .setLibCallee(
10328 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10330 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10331 std::move(Args))
10333 .setTailCall(isTailCall);
10334
10335 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10336 return CallResult.second;
10337}
10338
10339SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10341 MachineMemOperand *MMO,
10342 ISD::LoadExtType ExtType) {
10344 AddNodeIDNode(ID, Opcode, VTList, Ops);
10345 ID.AddInteger(MemVT.getRawBits());
10346 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10347 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10348 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10349 ID.AddInteger(MMO->getFlags());
10350 void* IP = nullptr;
10351 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10352 E->refineAlignment(MMO);
10353 E->refineRanges(MMO);
10354 return SDValue(E, 0);
10355 }
10356
10357 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10358 VTList, MemVT, MMO, ExtType);
10359 createOperands(N, Ops);
10360
10361 CSEMap.InsertNode(N, IP);
10362 InsertNode(N);
10363 SDValue V(N, 0);
10364 NewSDValueDbgMsg(V, "Creating new node: ", this);
10365 return V;
10366}
10367
10369 EVT MemVT, SDVTList VTs, SDValue Chain,
10370 SDValue Ptr, SDValue Cmp, SDValue Swp,
10371 MachineMemOperand *MMO) {
10372 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10374 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10375
10376 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10377 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10378}
10379
10380SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10381 SDValue Chain, SDValue Ptr, SDValue Val,
10382 MachineMemOperand *MMO) {
10383 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10384 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10385 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10386 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10387 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10388 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10389 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10390 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10391 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10392 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10393 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10394 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10395 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10396 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10397 Opcode == ISD::ATOMIC_STORE) &&
10398 "Invalid Atomic Op");
10399
10400 EVT VT = Val.getValueType();
10401
10402 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10403 getVTList(VT, MVT::Other);
10404 SDValue Ops[] = {Chain, Ptr, Val};
10405 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10406}
10407
10409 EVT MemVT, EVT VT, SDValue Chain,
10410 SDValue Ptr, MachineMemOperand *MMO) {
10411 SDVTList VTs = getVTList(VT, MVT::Other);
10412 SDValue Ops[] = {Chain, Ptr};
10413 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10414}
10415
10416/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10418 if (Ops.size() == 1)
10419 return Ops[0];
10420
10422 VTs.reserve(Ops.size());
10423 for (const SDValue &Op : Ops)
10424 VTs.push_back(Op.getValueType());
10425 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10426}
10427
10429 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10430 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10432 const AAMDNodes &AAInfo) {
10433 if (Size.hasValue() && !Size.getValue())
10435
10437 MachineMemOperand *MMO =
10438 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10439
10440 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10441}
10442
10444 SDVTList VTList,
10445 ArrayRef<SDValue> Ops, EVT MemVT,
10446 MachineMemOperand *MMO) {
10447 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10448}
10449
10451 SDVTList VTList,
10452 ArrayRef<SDValue> Ops, EVT MemVT,
10454 assert(!MMOs.empty() && "Must have at least one MMO");
10455 assert(
10456 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10457 Opcode == ISD::PREFETCH ||
10458 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10459 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10460 "Opcode is not a memory-accessing opcode!");
10461
10463 if (MMOs.size() == 1) {
10464 MemRefs = MMOs[0];
10465 } else {
10466 // Allocate: [size_t count][MMO*][MMO*]...
10467 size_t AllocSize =
10468 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10469 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10470 size_t *CountPtr = static_cast<size_t *>(Buffer);
10471 *CountPtr = MMOs.size();
10472 MachineMemOperand **Array =
10473 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10474 llvm::copy(MMOs, Array);
10475 MemRefs = Array;
10476 }
10477
10478 // Memoize the node unless it returns a glue result.
10480 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10482 AddNodeIDNode(ID, Opcode, VTList, Ops);
10483 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10484 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10485 ID.AddInteger(MemVT.getRawBits());
10486 for (const MachineMemOperand *MMO : MMOs) {
10487 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10488 ID.AddInteger(MMO->getFlags());
10489 }
10490 void *IP = nullptr;
10491 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10492 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10493 return SDValue(E, 0);
10494 }
10495
10496 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10497 VTList, MemVT, MemRefs);
10498 createOperands(N, Ops);
10499 CSEMap.InsertNode(N, IP);
10500 } else {
10501 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10502 VTList, MemVT, MemRefs);
10503 createOperands(N, Ops);
10504 }
10505 InsertNode(N);
10506 SDValue V(N, 0);
10507 NewSDValueDbgMsg(V, "Creating new node: ", this);
10508 return V;
10509}
10510
10512 SDValue Chain, int FrameIndex) {
10513 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10514 const auto VTs = getVTList(MVT::Other);
10515 SDValue Ops[2] = {
10516 Chain,
10517 getFrameIndex(FrameIndex,
10518 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10519 true)};
10520
10522 AddNodeIDNode(ID, Opcode, VTs, Ops);
10523 ID.AddInteger(FrameIndex);
10524 void *IP = nullptr;
10525 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10526 return SDValue(E, 0);
10527
10528 LifetimeSDNode *N =
10529 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10530 createOperands(N, Ops);
10531 CSEMap.InsertNode(N, IP);
10532 InsertNode(N);
10533 SDValue V(N, 0);
10534 NewSDValueDbgMsg(V, "Creating new node: ", this);
10535 return V;
10536}
10537
10539 uint64_t Guid, uint64_t Index,
10540 uint32_t Attr) {
10541 const unsigned Opcode = ISD::PSEUDO_PROBE;
10542 const auto VTs = getVTList(MVT::Other);
10543 SDValue Ops[] = {Chain};
10545 AddNodeIDNode(ID, Opcode, VTs, Ops);
10546 ID.AddInteger(Guid);
10547 ID.AddInteger(Index);
10548 void *IP = nullptr;
10549 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10550 return SDValue(E, 0);
10551
10552 auto *N = newSDNode<PseudoProbeSDNode>(
10553 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10554 createOperands(N, Ops);
10555 CSEMap.InsertNode(N, IP);
10556 InsertNode(N);
10557 SDValue V(N, 0);
10558 NewSDValueDbgMsg(V, "Creating new node: ", this);
10559 return V;
10560}
10561
10562/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10563/// MachinePointerInfo record from it. This is particularly useful because the
10564/// code generator has many cases where it doesn't bother passing in a
10565/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10567 SelectionDAG &DAG, SDValue Ptr,
10568 int64_t Offset = 0) {
10569 // If this is FI+Offset, we can model it.
10570 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10572 FI->getIndex(), Offset);
10573
10574 // If this is (FI+Offset1)+Offset2, we can model it.
10575 if (Ptr.getOpcode() != ISD::ADD ||
10578 return Info;
10579
10580 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10582 DAG.getMachineFunction(), FI,
10583 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10584}
10585
10586/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10587/// MachinePointerInfo record from it. This is particularly useful because the
10588/// code generator has many cases where it doesn't bother passing in a
10589/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10591 SelectionDAG &DAG, SDValue Ptr,
10592 SDValue OffsetOp) {
10593 // If the 'Offset' value isn't a constant, we can't handle this.
10595 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10596 if (OffsetOp.isUndef())
10597 return InferPointerInfo(Info, DAG, Ptr);
10598 return Info;
10599}
10600
10602 EVT VT, const SDLoc &dl, SDValue Chain,
10603 SDValue Ptr, SDValue Offset,
10604 MachinePointerInfo PtrInfo, EVT MemVT,
10605 Align Alignment,
10606 MachineMemOperand::Flags MMOFlags,
10607 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10608 assert(Chain.getValueType() == MVT::Other &&
10609 "Invalid chain type");
10610
10611 MMOFlags |= MachineMemOperand::MOLoad;
10612 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10613 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10614 // clients.
10615 if (PtrInfo.V.isNull())
10616 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10617
10618 TypeSize Size = MemVT.getStoreSize();
10620 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10621 Alignment, AAInfo, Ranges);
10622 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10623}
10624
10626 EVT VT, const SDLoc &dl, SDValue Chain,
10627 SDValue Ptr, SDValue Offset, EVT MemVT,
10628 MachineMemOperand *MMO) {
10629 if (VT == MemVT) {
10630 ExtType = ISD::NON_EXTLOAD;
10631 } else if (ExtType == ISD::NON_EXTLOAD) {
10632 assert(VT == MemVT && "Non-extending load from different memory type!");
10633 } else {
10634 // Extending load.
10635 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10636 "Should only be an extending load, not truncating!");
10637 assert(VT.isInteger() == MemVT.isInteger() &&
10638 "Cannot convert from FP to Int or Int -> FP!");
10639 assert(VT.isVector() == MemVT.isVector() &&
10640 "Cannot use an ext load to convert to or from a vector!");
10641 assert((!VT.isVector() ||
10643 "Cannot use an ext load to change the number of vector elements!");
10644 }
10645
10646 assert((!MMO->getRanges() ||
10648 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10649 MemVT.isInteger())) &&
10650 "Range metadata and load type must match!");
10651
10652 bool Indexed = AM != ISD::UNINDEXED;
10653 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10654
10655 SDVTList VTs = Indexed ?
10656 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10657 SDValue Ops[] = { Chain, Ptr, Offset };
10659 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10660 ID.AddInteger(MemVT.getRawBits());
10661 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10662 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10663 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10664 ID.AddInteger(MMO->getFlags());
10665 void *IP = nullptr;
10666 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10667 E->refineAlignment(MMO);
10668 E->refineRanges(MMO);
10669 return SDValue(E, 0);
10670 }
10671 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10672 ExtType, MemVT, MMO);
10673 createOperands(N, Ops);
10674
10675 CSEMap.InsertNode(N, IP);
10676 InsertNode(N);
10677 SDValue V(N, 0);
10678 NewSDValueDbgMsg(V, "Creating new node: ", this);
10679 return V;
10680}
10681
10683 SDValue Ptr, MachinePointerInfo PtrInfo,
10684 MaybeAlign Alignment,
10685 MachineMemOperand::Flags MMOFlags,
10686 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10688 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10689 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10690}
10691
10693 SDValue Ptr, MachineMemOperand *MMO) {
10695 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10696 VT, MMO);
10697}
10698
10700 EVT VT, SDValue Chain, SDValue Ptr,
10701 MachinePointerInfo PtrInfo, EVT MemVT,
10702 MaybeAlign Alignment,
10703 MachineMemOperand::Flags MMOFlags,
10704 const AAMDNodes &AAInfo) {
10706 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10707 MemVT, Alignment, MMOFlags, AAInfo);
10708}
10709
10711 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10712 MachineMemOperand *MMO) {
10714 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10715 MemVT, MMO);
10716}
10717
10721 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10722 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10723 // Don't propagate the invariant or dereferenceable flags.
10724 auto MMOFlags =
10725 LD->getMemOperand()->getFlags() &
10727 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10728 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10729 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10730}
10731
10733 SDValue Ptr, MachinePointerInfo PtrInfo,
10734 Align Alignment,
10735 MachineMemOperand::Flags MMOFlags,
10736 const AAMDNodes &AAInfo) {
10737 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10738
10739 MMOFlags |= MachineMemOperand::MOStore;
10740 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10741
10742 if (PtrInfo.V.isNull())
10743 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10744
10747 MachineMemOperand *MMO =
10748 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10749 return getStore(Chain, dl, Val, Ptr, MMO);
10750}
10751
10753 SDValue Ptr, MachineMemOperand *MMO) {
10755 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10757}
10758
10760 SDValue Ptr, SDValue Offset, EVT SVT,
10762 bool IsTruncating) {
10763 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10764 EVT VT = Val.getValueType();
10765 if (VT == SVT) {
10766 IsTruncating = false;
10767 } else if (!IsTruncating) {
10768 assert(VT == SVT && "No-truncating store from different memory type!");
10769 } else {
10771 "Should only be a truncating store, not extending!");
10772 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10773 assert(VT.isVector() == SVT.isVector() &&
10774 "Cannot use trunc store to convert to or from a vector!");
10775 assert((!VT.isVector() ||
10777 "Cannot use trunc store to change the number of vector elements!");
10778 }
10779
10780 bool Indexed = AM != ISD::UNINDEXED;
10781 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10782 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10783 : getVTList(MVT::Other);
10784 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10787 ID.AddInteger(SVT.getRawBits());
10788 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10789 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10790 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10791 ID.AddInteger(MMO->getFlags());
10792 void *IP = nullptr;
10793 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10794 cast<StoreSDNode>(E)->refineAlignment(MMO);
10795 return SDValue(E, 0);
10796 }
10797 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10798 IsTruncating, SVT, MMO);
10799 createOperands(N, Ops);
10800
10801 CSEMap.InsertNode(N, IP);
10802 InsertNode(N);
10803 SDValue V(N, 0);
10804 NewSDValueDbgMsg(V, "Creating new node: ", this);
10805 return V;
10806}
10807
10809 SDValue Ptr, MachinePointerInfo PtrInfo,
10810 EVT SVT, Align Alignment,
10811 MachineMemOperand::Flags MMOFlags,
10812 const AAMDNodes &AAInfo) {
10813 assert(Chain.getValueType() == MVT::Other &&
10814 "Invalid chain type");
10815
10816 MMOFlags |= MachineMemOperand::MOStore;
10817 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10818
10819 if (PtrInfo.V.isNull())
10820 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10821
10823 MachineMemOperand *MMO = MF.getMachineMemOperand(
10824 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10825 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10826}
10827
10829 SDValue Ptr, EVT SVT,
10830 MachineMemOperand *MMO) {
10832 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10833}
10834
10838 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10839 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10840 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10841 ST->getMemoryVT(), ST->getMemOperand(), AM,
10842 ST->isTruncatingStore());
10843}
10844
10846 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10847 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10848 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10849 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10850 const MDNode *Ranges, bool IsExpanding) {
10851 MMOFlags |= MachineMemOperand::MOLoad;
10852 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10853 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10854 // clients.
10855 if (PtrInfo.V.isNull())
10856 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10857
10858 TypeSize Size = MemVT.getStoreSize();
10860 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10861 Alignment, AAInfo, Ranges);
10862 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10863 MMO, IsExpanding);
10864}
10865
10867 ISD::LoadExtType ExtType, EVT VT,
10868 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10869 SDValue Offset, SDValue Mask, SDValue EVL,
10870 EVT MemVT, MachineMemOperand *MMO,
10871 bool IsExpanding) {
10872 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10873 assert(Mask.getValueType().getVectorElementCount() ==
10874 VT.getVectorElementCount() &&
10875 "Vector width mismatch between mask and data");
10876
10877 bool Indexed = AM != ISD::UNINDEXED;
10878 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10879
10880 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10881 : getVTList(VT, MVT::Other);
10882 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10884 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10885 ID.AddInteger(MemVT.getRawBits());
10886 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10887 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10888 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10889 ID.AddInteger(MMO->getFlags());
10890 void *IP = nullptr;
10891 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10892 E->refineAlignment(MMO);
10893 E->refineRanges(MMO);
10894 return SDValue(E, 0);
10895 }
10896 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10897 ExtType, IsExpanding, MemVT, MMO);
10898 createOperands(N, Ops);
10899
10900 CSEMap.InsertNode(N, IP);
10901 InsertNode(N);
10902 SDValue V(N, 0);
10903 NewSDValueDbgMsg(V, "Creating new node: ", this);
10904 return V;
10905}
10906
10908 SDValue Ptr, SDValue Mask, SDValue EVL,
10909 MachinePointerInfo PtrInfo,
10910 MaybeAlign Alignment,
10911 MachineMemOperand::Flags MMOFlags,
10912 const AAMDNodes &AAInfo, const MDNode *Ranges,
10913 bool IsExpanding) {
10915 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10916 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10917 IsExpanding);
10918}
10919
10921 SDValue Ptr, SDValue Mask, SDValue EVL,
10922 MachineMemOperand *MMO, bool IsExpanding) {
10924 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10925 Mask, EVL, VT, MMO, IsExpanding);
10926}
10927
10929 EVT VT, SDValue Chain, SDValue Ptr,
10930 SDValue Mask, SDValue EVL,
10931 MachinePointerInfo PtrInfo, EVT MemVT,
10932 MaybeAlign Alignment,
10933 MachineMemOperand::Flags MMOFlags,
10934 const AAMDNodes &AAInfo, bool IsExpanding) {
10936 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10937 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10938 IsExpanding);
10939}
10940
10942 EVT VT, SDValue Chain, SDValue Ptr,
10943 SDValue Mask, SDValue EVL, EVT MemVT,
10944 MachineMemOperand *MMO, bool IsExpanding) {
10946 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10947 EVL, MemVT, MMO, IsExpanding);
10948}
10949
10953 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10954 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10955 // Don't propagate the invariant or dereferenceable flags.
10956 auto MMOFlags =
10957 LD->getMemOperand()->getFlags() &
10959 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10960 LD->getChain(), Base, Offset, LD->getMask(),
10961 LD->getVectorLength(), LD->getPointerInfo(),
10962 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
10963 nullptr, LD->isExpandingLoad());
10964}
10965
10967 SDValue Ptr, SDValue Offset, SDValue Mask,
10968 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
10969 ISD::MemIndexedMode AM, bool IsTruncating,
10970 bool IsCompressing) {
10971 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10972 assert(Mask.getValueType().getVectorElementCount() ==
10974 "Vector width mismatch between mask and data");
10975
10976 bool Indexed = AM != ISD::UNINDEXED;
10977 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10978 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10979 : getVTList(MVT::Other);
10980 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
10982 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10983 ID.AddInteger(MemVT.getRawBits());
10984 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10985 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10986 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10987 ID.AddInteger(MMO->getFlags());
10988 void *IP = nullptr;
10989 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10990 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10991 return SDValue(E, 0);
10992 }
10993 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10994 IsTruncating, IsCompressing, MemVT, MMO);
10995 createOperands(N, Ops);
10996
10997 CSEMap.InsertNode(N, IP);
10998 InsertNode(N);
10999 SDValue V(N, 0);
11000 NewSDValueDbgMsg(V, "Creating new node: ", this);
11001 return V;
11002}
11003
11005 SDValue Val, SDValue Ptr, SDValue Mask,
11006 SDValue EVL, MachinePointerInfo PtrInfo,
11007 EVT SVT, Align Alignment,
11008 MachineMemOperand::Flags MMOFlags,
11009 const AAMDNodes &AAInfo,
11010 bool IsCompressing) {
11011 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11012
11013 MMOFlags |= MachineMemOperand::MOStore;
11014 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11015
11016 if (PtrInfo.V.isNull())
11017 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11018
11020 MachineMemOperand *MMO = MF.getMachineMemOperand(
11021 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11022 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11023 IsCompressing);
11024}
11025
11027 SDValue Val, SDValue Ptr, SDValue Mask,
11028 SDValue EVL, EVT SVT,
11029 MachineMemOperand *MMO,
11030 bool IsCompressing) {
11031 EVT VT = Val.getValueType();
11032
11033 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11034 if (VT == SVT)
11035 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
11036 EVL, VT, MMO, ISD::UNINDEXED,
11037 /*IsTruncating*/ false, IsCompressing);
11038
11040 "Should only be a truncating store, not extending!");
11041 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11042 assert(VT.isVector() == SVT.isVector() &&
11043 "Cannot use trunc store to convert to or from a vector!");
11044 assert((!VT.isVector() ||
11046 "Cannot use trunc store to change the number of vector elements!");
11047
11048 SDVTList VTs = getVTList(MVT::Other);
11050 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11052 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11053 ID.AddInteger(SVT.getRawBits());
11054 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11055 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11056 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11057 ID.AddInteger(MMO->getFlags());
11058 void *IP = nullptr;
11059 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11060 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11061 return SDValue(E, 0);
11062 }
11063 auto *N =
11064 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11065 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11066 createOperands(N, Ops);
11067
11068 CSEMap.InsertNode(N, IP);
11069 InsertNode(N);
11070 SDValue V(N, 0);
11071 NewSDValueDbgMsg(V, "Creating new node: ", this);
11072 return V;
11073}
11074
11078 auto *ST = cast<VPStoreSDNode>(OrigStore);
11079 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
11080 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
11081 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
11082 Offset, ST->getMask(), ST->getVectorLength()};
11084 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11085 ID.AddInteger(ST->getMemoryVT().getRawBits());
11086 ID.AddInteger(ST->getRawSubclassData());
11087 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
11088 ID.AddInteger(ST->getMemOperand()->getFlags());
11089 void *IP = nullptr;
11090 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11091 return SDValue(E, 0);
11092
11093 auto *N = newSDNode<VPStoreSDNode>(
11094 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
11095 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
11096 createOperands(N, Ops);
11097
11098 CSEMap.InsertNode(N, IP);
11099 InsertNode(N);
11100 SDValue V(N, 0);
11101 NewSDValueDbgMsg(V, "Creating new node: ", this);
11102 return V;
11103}
11104
11106 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11107 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11108 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11109 bool Indexed = AM != ISD::UNINDEXED;
11110 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
11111
11112 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11113 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11114 : getVTList(VT, MVT::Other);
11116 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11117 ID.AddInteger(VT.getRawBits());
11118 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11119 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11120 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11121
11122 void *IP = nullptr;
11123 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11124 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11125 return SDValue(E, 0);
11126 }
11127
11128 auto *N =
11129 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11130 ExtType, IsExpanding, MemVT, MMO);
11131 createOperands(N, Ops);
11132 CSEMap.InsertNode(N, IP);
11133 InsertNode(N);
11134 SDValue V(N, 0);
11135 NewSDValueDbgMsg(V, "Creating new node: ", this);
11136 return V;
11137}
11138
11140 SDValue Ptr, SDValue Stride,
11141 SDValue Mask, SDValue EVL,
11142 MachineMemOperand *MMO,
11143 bool IsExpanding) {
11145 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11146 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11147}
11148
11150 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11151 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11152 MachineMemOperand *MMO, bool IsExpanding) {
11154 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11155 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11156}
11157
11159 SDValue Val, SDValue Ptr,
11160 SDValue Offset, SDValue Stride,
11161 SDValue Mask, SDValue EVL, EVT MemVT,
11162 MachineMemOperand *MMO,
11164 bool IsTruncating, bool IsCompressing) {
11165 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11166 bool Indexed = AM != ISD::UNINDEXED;
11167 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11168 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11169 : getVTList(MVT::Other);
11170 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11172 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11173 ID.AddInteger(MemVT.getRawBits());
11174 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11175 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11176 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11177 void *IP = nullptr;
11178 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11179 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11180 return SDValue(E, 0);
11181 }
11182 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11183 VTs, AM, IsTruncating,
11184 IsCompressing, MemVT, MMO);
11185 createOperands(N, Ops);
11186
11187 CSEMap.InsertNode(N, IP);
11188 InsertNode(N);
11189 SDValue V(N, 0);
11190 NewSDValueDbgMsg(V, "Creating new node: ", this);
11191 return V;
11192}
11193
11195 SDValue Val, SDValue Ptr,
11196 SDValue Stride, SDValue Mask,
11197 SDValue EVL, EVT SVT,
11198 MachineMemOperand *MMO,
11199 bool IsCompressing) {
11200 EVT VT = Val.getValueType();
11201
11202 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11203 if (VT == SVT)
11204 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
11205 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
11206 /*IsTruncating*/ false, IsCompressing);
11207
11209 "Should only be a truncating store, not extending!");
11210 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11211 assert(VT.isVector() == SVT.isVector() &&
11212 "Cannot use trunc store to convert to or from a vector!");
11213 assert((!VT.isVector() ||
11215 "Cannot use trunc store to change the number of vector elements!");
11216
11217 SDVTList VTs = getVTList(MVT::Other);
11219 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
11221 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11222 ID.AddInteger(SVT.getRawBits());
11223 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11224 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11225 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11226 void *IP = nullptr;
11227 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11228 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11229 return SDValue(E, 0);
11230 }
11231 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11232 VTs, ISD::UNINDEXED, true,
11233 IsCompressing, SVT, MMO);
11234 createOperands(N, Ops);
11235
11236 CSEMap.InsertNode(N, IP);
11237 InsertNode(N);
11238 SDValue V(N, 0);
11239 NewSDValueDbgMsg(V, "Creating new node: ", this);
11240 return V;
11241}
11242
11245 ISD::MemIndexType IndexType) {
11246 assert(Ops.size() == 6 && "Incompatible number of operands");
11247
11249 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
11250 ID.AddInteger(VT.getRawBits());
11251 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11252 dl.getIROrder(), VTs, VT, MMO, IndexType));
11253 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11254 ID.AddInteger(MMO->getFlags());
11255 void *IP = nullptr;
11256 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11257 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11258 return SDValue(E, 0);
11259 }
11260
11261 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11262 VT, MMO, IndexType);
11263 createOperands(N, Ops);
11264
11265 assert(N->getMask().getValueType().getVectorElementCount() ==
11266 N->getValueType(0).getVectorElementCount() &&
11267 "Vector width mismatch between mask and data");
11268 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11269 N->getValueType(0).getVectorElementCount().isScalable() &&
11270 "Scalable flags of index and data do not match");
11272 N->getIndex().getValueType().getVectorElementCount(),
11273 N->getValueType(0).getVectorElementCount()) &&
11274 "Vector width mismatch between index and data");
11275 assert(isa<ConstantSDNode>(N->getScale()) &&
11276 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11277 "Scale should be a constant power of 2");
11278
11279 CSEMap.InsertNode(N, IP);
11280 InsertNode(N);
11281 SDValue V(N, 0);
11282 NewSDValueDbgMsg(V, "Creating new node: ", this);
11283 return V;
11284}
11285
11288 MachineMemOperand *MMO,
11289 ISD::MemIndexType IndexType) {
11290 assert(Ops.size() == 7 && "Incompatible number of operands");
11291
11293 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
11294 ID.AddInteger(VT.getRawBits());
11295 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11296 dl.getIROrder(), VTs, VT, MMO, IndexType));
11297 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11298 ID.AddInteger(MMO->getFlags());
11299 void *IP = nullptr;
11300 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11301 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11302 return SDValue(E, 0);
11303 }
11304 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11305 VT, MMO, IndexType);
11306 createOperands(N, Ops);
11307
11308 assert(N->getMask().getValueType().getVectorElementCount() ==
11309 N->getValue().getValueType().getVectorElementCount() &&
11310 "Vector width mismatch between mask and data");
11311 assert(
11312 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11313 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11314 "Scalable flags of index and data do not match");
11316 N->getIndex().getValueType().getVectorElementCount(),
11317 N->getValue().getValueType().getVectorElementCount()) &&
11318 "Vector width mismatch between index and data");
11319 assert(isa<ConstantSDNode>(N->getScale()) &&
11320 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11321 "Scale should be a constant power of 2");
11322
11323 CSEMap.InsertNode(N, IP);
11324 InsertNode(N);
11325 SDValue V(N, 0);
11326 NewSDValueDbgMsg(V, "Creating new node: ", this);
11327 return V;
11328}
11329
11332 SDValue PassThru, EVT MemVT,
11333 MachineMemOperand *MMO,
11335 ISD::LoadExtType ExtTy, bool isExpanding) {
11336 bool Indexed = AM != ISD::UNINDEXED;
11337 assert((Indexed || Offset.isUndef()) &&
11338 "Unindexed masked load with an offset!");
11339 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11340 : getVTList(VT, MVT::Other);
11341 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11344 ID.AddInteger(MemVT.getRawBits());
11345 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11346 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11347 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11348 ID.AddInteger(MMO->getFlags());
11349 void *IP = nullptr;
11350 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11351 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11352 return SDValue(E, 0);
11353 }
11354 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11355 AM, ExtTy, isExpanding, MemVT, MMO);
11356 createOperands(N, Ops);
11357
11358 CSEMap.InsertNode(N, IP);
11359 InsertNode(N);
11360 SDValue V(N, 0);
11361 NewSDValueDbgMsg(V, "Creating new node: ", this);
11362 return V;
11363}
11364
11369 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
11370 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11371 Offset, LD->getMask(), LD->getPassThru(),
11372 LD->getMemoryVT(), LD->getMemOperand(), AM,
11373 LD->getExtensionType(), LD->isExpandingLoad());
11374}
11375
11378 SDValue Mask, EVT MemVT,
11379 MachineMemOperand *MMO,
11380 ISD::MemIndexedMode AM, bool IsTruncating,
11381 bool IsCompressing) {
11382 assert(Chain.getValueType() == MVT::Other &&
11383 "Invalid chain type");
11384 bool Indexed = AM != ISD::UNINDEXED;
11385 assert((Indexed || Offset.isUndef()) &&
11386 "Unindexed masked store with an offset!");
11387 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11388 : getVTList(MVT::Other);
11389 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11392 ID.AddInteger(MemVT.getRawBits());
11393 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11394 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11395 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11396 ID.AddInteger(MMO->getFlags());
11397 void *IP = nullptr;
11398 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11399 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11400 return SDValue(E, 0);
11401 }
11402 auto *N =
11403 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11404 IsTruncating, IsCompressing, MemVT, MMO);
11405 createOperands(N, Ops);
11406
11407 CSEMap.InsertNode(N, IP);
11408 InsertNode(N);
11409 SDValue V(N, 0);
11410 NewSDValueDbgMsg(V, "Creating new node: ", this);
11411 return V;
11412}
11413
11418 assert(ST->getOffset().isUndef() &&
11419 "Masked store is already a indexed store!");
11420 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11421 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11422 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11423}
11424
11427 MachineMemOperand *MMO,
11428 ISD::MemIndexType IndexType,
11429 ISD::LoadExtType ExtTy) {
11430 assert(Ops.size() == 6 && "Incompatible number of operands");
11431
11434 ID.AddInteger(MemVT.getRawBits());
11435 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11436 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11437 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11438 ID.AddInteger(MMO->getFlags());
11439 void *IP = nullptr;
11440 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11441 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11442 return SDValue(E, 0);
11443 }
11444
11445 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11446 VTs, MemVT, MMO, IndexType, ExtTy);
11447 createOperands(N, Ops);
11448
11449 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11450 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11451 assert(N->getMask().getValueType().getVectorElementCount() ==
11452 N->getValueType(0).getVectorElementCount() &&
11453 "Vector width mismatch between mask and data");
11454 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11455 N->getValueType(0).getVectorElementCount().isScalable() &&
11456 "Scalable flags of index and data do not match");
11458 N->getIndex().getValueType().getVectorElementCount(),
11459 N->getValueType(0).getVectorElementCount()) &&
11460 "Vector width mismatch between index and data");
11461 assert(isa<ConstantSDNode>(N->getScale()) &&
11462 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11463 "Scale should be a constant power of 2");
11464
11465 CSEMap.InsertNode(N, IP);
11466 InsertNode(N);
11467 SDValue V(N, 0);
11468 NewSDValueDbgMsg(V, "Creating new node: ", this);
11469 return V;
11470}
11471
11474 MachineMemOperand *MMO,
11475 ISD::MemIndexType IndexType,
11476 bool IsTrunc) {
11477 assert(Ops.size() == 6 && "Incompatible number of operands");
11478
11481 ID.AddInteger(MemVT.getRawBits());
11482 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11483 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11484 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11485 ID.AddInteger(MMO->getFlags());
11486 void *IP = nullptr;
11487 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11488 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11489 return SDValue(E, 0);
11490 }
11491
11492 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11493 VTs, MemVT, MMO, IndexType, IsTrunc);
11494 createOperands(N, Ops);
11495
11496 assert(N->getMask().getValueType().getVectorElementCount() ==
11497 N->getValue().getValueType().getVectorElementCount() &&
11498 "Vector width mismatch between mask and data");
11499 assert(
11500 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11501 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11502 "Scalable flags of index and data do not match");
11504 N->getIndex().getValueType().getVectorElementCount(),
11505 N->getValue().getValueType().getVectorElementCount()) &&
11506 "Vector width mismatch between index and data");
11507 assert(isa<ConstantSDNode>(N->getScale()) &&
11508 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11509 "Scale should be a constant power of 2");
11510
11511 CSEMap.InsertNode(N, IP);
11512 InsertNode(N);
11513 SDValue V(N, 0);
11514 NewSDValueDbgMsg(V, "Creating new node: ", this);
11515 return V;
11516}
11517
11519 const SDLoc &dl, ArrayRef<SDValue> Ops,
11520 MachineMemOperand *MMO,
11521 ISD::MemIndexType IndexType) {
11522 assert(Ops.size() == 7 && "Incompatible number of operands");
11523
11526 ID.AddInteger(MemVT.getRawBits());
11527 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11528 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11529 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11530 ID.AddInteger(MMO->getFlags());
11531 void *IP = nullptr;
11532 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11533 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11534 return SDValue(E, 0);
11535 }
11536
11537 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11538 VTs, MemVT, MMO, IndexType);
11539 createOperands(N, Ops);
11540
11541 assert(N->getMask().getValueType().getVectorElementCount() ==
11542 N->getIndex().getValueType().getVectorElementCount() &&
11543 "Vector width mismatch between mask and data");
11544 assert(isa<ConstantSDNode>(N->getScale()) &&
11545 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11546 "Scale should be a constant power of 2");
11547 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11548
11549 CSEMap.InsertNode(N, IP);
11550 InsertNode(N);
11551 SDValue V(N, 0);
11552 NewSDValueDbgMsg(V, "Creating new node: ", this);
11553 return V;
11554}
11555
11557 SDValue Ptr, SDValue Mask, SDValue EVL,
11558 MachineMemOperand *MMO) {
11559 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11560 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11562 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11563 ID.AddInteger(VT.getRawBits());
11564 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11565 VTs, VT, MMO));
11566 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11567 ID.AddInteger(MMO->getFlags());
11568 void *IP = nullptr;
11569 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11570 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11571 return SDValue(E, 0);
11572 }
11573 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11574 VT, MMO);
11575 createOperands(N, Ops);
11576
11577 CSEMap.InsertNode(N, IP);
11578 InsertNode(N);
11579 SDValue V(N, 0);
11580 NewSDValueDbgMsg(V, "Creating new node: ", this);
11581 return V;
11582}
11583
11585 EVT MemVT, MachineMemOperand *MMO) {
11586 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11587 SDVTList VTs = getVTList(MVT::Other);
11588 SDValue Ops[] = {Chain, Ptr};
11591 ID.AddInteger(MemVT.getRawBits());
11592 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11593 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11594 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11595 ID.AddInteger(MMO->getFlags());
11596 void *IP = nullptr;
11597 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11598 return SDValue(E, 0);
11599
11600 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11601 dl.getDebugLoc(), VTs, MemVT, MMO);
11602 createOperands(N, Ops);
11603
11604 CSEMap.InsertNode(N, IP);
11605 InsertNode(N);
11606 SDValue V(N, 0);
11607 NewSDValueDbgMsg(V, "Creating new node: ", this);
11608 return V;
11609}
11610
11612 EVT MemVT, MachineMemOperand *MMO) {
11613 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11614 SDVTList VTs = getVTList(MVT::Other);
11615 SDValue Ops[] = {Chain, Ptr};
11618 ID.AddInteger(MemVT.getRawBits());
11619 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11620 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11621 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11622 ID.AddInteger(MMO->getFlags());
11623 void *IP = nullptr;
11624 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11625 return SDValue(E, 0);
11626
11627 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11628 dl.getDebugLoc(), VTs, MemVT, MMO);
11629 createOperands(N, Ops);
11630
11631 CSEMap.InsertNode(N, IP);
11632 InsertNode(N);
11633 SDValue V(N, 0);
11634 NewSDValueDbgMsg(V, "Creating new node: ", this);
11635 return V;
11636}
11637
11639 // select undef, T, F --> T (if T is a constant), otherwise F
11640 // select, ?, undef, F --> F
11641 // select, ?, T, undef --> T
11642 if (Cond.isUndef())
11643 return isConstantValueOfAnyType(T) ? T : F;
11644 if (T.isUndef())
11646 if (F.isUndef())
11648
11649 // select true, T, F --> T
11650 // select false, T, F --> F
11651 if (auto C = isBoolConstant(Cond))
11652 return *C ? T : F;
11653
11654 // select ?, T, T --> T
11655 if (T == F)
11656 return T;
11657
11658 return SDValue();
11659}
11660
11662 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11663 if (X.isUndef())
11664 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11665 // shift X, undef --> undef (because it may shift by the bitwidth)
11666 if (Y.isUndef())
11667 return getUNDEF(X.getValueType());
11668
11669 // shift 0, Y --> 0
11670 // shift X, 0 --> X
11672 return X;
11673
11674 // shift X, C >= bitwidth(X) --> undef
11675 // All vector elements must be too big (or undef) to avoid partial undefs.
11676 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11677 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11678 };
11679 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11680 return getUNDEF(X.getValueType());
11681
11682 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11683 if (X.getValueType().getScalarType() == MVT::i1)
11684 return X;
11685
11686 return SDValue();
11687}
11688
11690 SDNodeFlags Flags) {
11691 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11692 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11693 // operation is poison. That result can be relaxed to undef.
11694 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11695 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11696 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11697 (YC && YC->getValueAPF().isNaN());
11698 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11699 (YC && YC->getValueAPF().isInfinity());
11700
11701 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11702 return getUNDEF(X.getValueType());
11703
11704 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11705 return getUNDEF(X.getValueType());
11706
11707 if (!YC)
11708 return SDValue();
11709
11710 // X + -0.0 --> X
11711 if (Opcode == ISD::FADD)
11712 if (YC->getValueAPF().isNegZero())
11713 return X;
11714
11715 // X - +0.0 --> X
11716 if (Opcode == ISD::FSUB)
11717 if (YC->getValueAPF().isPosZero())
11718 return X;
11719
11720 // X * 1.0 --> X
11721 // X / 1.0 --> X
11722 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11723 if (YC->getValueAPF().isOne())
11724 return X;
11725
11726 // X * 0.0 --> 0.0
11727 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11728 if (YC->getValueAPF().isZero())
11729 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11730
11731 return SDValue();
11732}
11733
11735 SDValue Ptr, SDValue SV, unsigned Align) {
11736 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11737 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11738}
11739
11740SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11742 switch (Ops.size()) {
11743 case 0: return getNode(Opcode, DL, VT);
11744 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11745 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11746 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11747 default: break;
11748 }
11749
11750 // Copy from an SDUse array into an SDValue array for use with
11751 // the regular getNode logic.
11753 return getNode(Opcode, DL, VT, NewOps);
11754}
11755
11756SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11758 SDNodeFlags Flags;
11759 if (Inserter)
11760 Flags = Inserter->getFlags();
11761 return getNode(Opcode, DL, VT, Ops, Flags);
11762}
11763
11764SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11765 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11766 unsigned NumOps = Ops.size();
11767 switch (NumOps) {
11768 case 0: return getNode(Opcode, DL, VT);
11769 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11770 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11771 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11772 default: break;
11773 }
11774
11775#ifndef NDEBUG
11776 for (const auto &Op : Ops)
11777 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11778 "Operand is DELETED_NODE!");
11779#endif
11780
11781 switch (Opcode) {
11782 default: break;
11783 case ISD::BUILD_VECTOR:
11784 // Attempt to simplify BUILD_VECTOR.
11785 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11786 return V;
11787 break;
11789 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11790 return V;
11791 break;
11792 case ISD::SELECT_CC:
11793 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11794 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11795 "LHS and RHS of condition must have same type!");
11796 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11797 "True and False arms of SelectCC must have same type!");
11798 assert(Ops[2].getValueType() == VT &&
11799 "select_cc node must be of same type as true and false value!");
11800 assert((!Ops[0].getValueType().isVector() ||
11801 Ops[0].getValueType().getVectorElementCount() ==
11802 VT.getVectorElementCount()) &&
11803 "Expected select_cc with vector result to have the same sized "
11804 "comparison type!");
11805 break;
11806 case ISD::BR_CC:
11807 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11808 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11809 "LHS/RHS of comparison should match types!");
11810 break;
11811 case ISD::VP_ADD:
11812 case ISD::VP_SUB:
11813 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11814 if (VT.getScalarType() == MVT::i1)
11815 Opcode = ISD::VP_XOR;
11816 break;
11817 case ISD::VP_MUL:
11818 // If it is VP_MUL mask operation then turn it to VP_AND
11819 if (VT.getScalarType() == MVT::i1)
11820 Opcode = ISD::VP_AND;
11821 break;
11822 case ISD::VP_REDUCE_MUL:
11823 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11824 if (VT == MVT::i1)
11825 Opcode = ISD::VP_REDUCE_AND;
11826 break;
11827 case ISD::VP_REDUCE_ADD:
11828 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11829 if (VT == MVT::i1)
11830 Opcode = ISD::VP_REDUCE_XOR;
11831 break;
11832 case ISD::VP_REDUCE_SMAX:
11833 case ISD::VP_REDUCE_UMIN:
11834 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11835 // VP_REDUCE_AND.
11836 if (VT == MVT::i1)
11837 Opcode = ISD::VP_REDUCE_AND;
11838 break;
11839 case ISD::VP_REDUCE_SMIN:
11840 case ISD::VP_REDUCE_UMAX:
11841 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11842 // VP_REDUCE_OR.
11843 if (VT == MVT::i1)
11844 Opcode = ISD::VP_REDUCE_OR;
11845 break;
11846 }
11847
11848 // Memoize nodes.
11849 SDNode *N;
11850 SDVTList VTs = getVTList(VT);
11851
11852 if (VT != MVT::Glue) {
11854 AddNodeIDNode(ID, Opcode, VTs, Ops);
11855 void *IP = nullptr;
11856
11857 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11858 E->intersectFlagsWith(Flags);
11859 return SDValue(E, 0);
11860 }
11861
11862 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11863 createOperands(N, Ops);
11864
11865 CSEMap.InsertNode(N, IP);
11866 } else {
11867 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11868 createOperands(N, Ops);
11869 }
11870
11871 N->setFlags(Flags);
11872 InsertNode(N);
11873 SDValue V(N, 0);
11874 NewSDValueDbgMsg(V, "Creating new node: ", this);
11875 return V;
11876}
11877
11878SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11879 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11880 SDNodeFlags Flags;
11881 if (Inserter)
11882 Flags = Inserter->getFlags();
11883 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11884}
11885
11886SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11888 const SDNodeFlags Flags) {
11889 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11890}
11891
11892SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11894 SDNodeFlags Flags;
11895 if (Inserter)
11896 Flags = Inserter->getFlags();
11897 return getNode(Opcode, DL, VTList, Ops, Flags);
11898}
11899
11900SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11901 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11902 if (VTList.NumVTs == 1)
11903 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11904
11905#ifndef NDEBUG
11906 for (const auto &Op : Ops)
11907 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11908 "Operand is DELETED_NODE!");
11909#endif
11910
11911 switch (Opcode) {
11912 case ISD::SADDO:
11913 case ISD::UADDO:
11914 case ISD::SSUBO:
11915 case ISD::USUBO: {
11916 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11917 "Invalid add/sub overflow op!");
11918 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11919 Ops[0].getValueType() == Ops[1].getValueType() &&
11920 Ops[0].getValueType() == VTList.VTs[0] &&
11921 "Binary operator types must match!");
11922 SDValue N1 = Ops[0], N2 = Ops[1];
11923 canonicalizeCommutativeBinop(Opcode, N1, N2);
11924
11925 // (X +- 0) -> X with zero-overflow.
11926 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11927 /*AllowTruncation*/ true);
11928 if (N2CV && N2CV->isZero()) {
11929 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11930 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11931 }
11932
11933 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11934 VTList.VTs[1].getScalarType() == MVT::i1) {
11935 SDValue F1 = getFreeze(N1);
11936 SDValue F2 = getFreeze(N2);
11937 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11938 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11939 return getNode(ISD::MERGE_VALUES, DL, VTList,
11940 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11941 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11942 Flags);
11943 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11944 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11945 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11946 return getNode(ISD::MERGE_VALUES, DL, VTList,
11947 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11948 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11949 Flags);
11950 }
11951 }
11952 break;
11953 }
11954 case ISD::SADDO_CARRY:
11955 case ISD::UADDO_CARRY:
11956 case ISD::SSUBO_CARRY:
11957 case ISD::USUBO_CARRY:
11958 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11959 "Invalid add/sub overflow op!");
11960 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11961 Ops[0].getValueType() == Ops[1].getValueType() &&
11962 Ops[0].getValueType() == VTList.VTs[0] &&
11963 Ops[2].getValueType() == VTList.VTs[1] &&
11964 "Binary operator types must match!");
11965 break;
11966 case ISD::SMUL_LOHI:
11967 case ISD::UMUL_LOHI: {
11968 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
11969 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
11970 VTList.VTs[0] == Ops[0].getValueType() &&
11971 VTList.VTs[0] == Ops[1].getValueType() &&
11972 "Binary operator types must match!");
11973 // Constant fold.
11976 if (LHS && RHS) {
11977 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
11978 unsigned OutWidth = Width * 2;
11979 APInt Val = LHS->getAPIntValue();
11980 APInt Mul = RHS->getAPIntValue();
11981 if (Opcode == ISD::SMUL_LOHI) {
11982 Val = Val.sext(OutWidth);
11983 Mul = Mul.sext(OutWidth);
11984 } else {
11985 Val = Val.zext(OutWidth);
11986 Mul = Mul.zext(OutWidth);
11987 }
11988 Val *= Mul;
11989
11990 SDValue Hi =
11991 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
11992 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
11993 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
11994 }
11995 break;
11996 }
11997 case ISD::FFREXP: {
11998 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
11999 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12000 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12001
12003 int FrexpExp;
12004 APFloat FrexpMant =
12005 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12006 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12007 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12008 DL, VTList.VTs[1]);
12009 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12010 }
12011
12012 break;
12013 }
12015 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12016 "Invalid STRICT_FP_EXTEND!");
12017 assert(VTList.VTs[0].isFloatingPoint() &&
12018 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12019 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12020 "STRICT_FP_EXTEND result type should be vector iff the operand "
12021 "type is vector!");
12022 assert((!VTList.VTs[0].isVector() ||
12023 VTList.VTs[0].getVectorElementCount() ==
12024 Ops[1].getValueType().getVectorElementCount()) &&
12025 "Vector element count mismatch!");
12026 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12027 "Invalid fpext node, dst <= src!");
12028 break;
12030 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12031 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12032 "STRICT_FP_ROUND result type should be vector iff the operand "
12033 "type is vector!");
12034 assert((!VTList.VTs[0].isVector() ||
12035 VTList.VTs[0].getVectorElementCount() ==
12036 Ops[1].getValueType().getVectorElementCount()) &&
12037 "Vector element count mismatch!");
12038 assert(VTList.VTs[0].isFloatingPoint() &&
12039 Ops[1].getValueType().isFloatingPoint() &&
12040 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12041 Ops[2].getOpcode() == ISD::TargetConstant &&
12042 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12043 "Invalid STRICT_FP_ROUND!");
12044 break;
12045 }
12046
12047 // Memoize the node unless it returns a glue result.
12048 SDNode *N;
12049 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12051 AddNodeIDNode(ID, Opcode, VTList, Ops);
12052 void *IP = nullptr;
12053 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12054 E->intersectFlagsWith(Flags);
12055 return SDValue(E, 0);
12056 }
12057
12058 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12059 createOperands(N, Ops);
12060 CSEMap.InsertNode(N, IP);
12061 } else {
12062 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12063 createOperands(N, Ops);
12064 }
12065
12066 N->setFlags(Flags);
12067 InsertNode(N);
12068 SDValue V(N, 0);
12069 NewSDValueDbgMsg(V, "Creating new node: ", this);
12070 return V;
12071}
12072
12073SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12074 SDVTList VTList) {
12075 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12076}
12077
12078SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12079 SDValue N1) {
12080 SDValue Ops[] = { N1 };
12081 return getNode(Opcode, DL, VTList, Ops);
12082}
12083
12084SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12085 SDValue N1, SDValue N2) {
12086 SDValue Ops[] = { N1, N2 };
12087 return getNode(Opcode, DL, VTList, Ops);
12088}
12089
12090SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12091 SDValue N1, SDValue N2, SDValue N3) {
12092 SDValue Ops[] = { N1, N2, N3 };
12093 return getNode(Opcode, DL, VTList, Ops);
12094}
12095
12096SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12097 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12098 SDValue Ops[] = { N1, N2, N3, N4 };
12099 return getNode(Opcode, DL, VTList, Ops);
12100}
12101
12102SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12103 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12104 SDValue N5) {
12105 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12106 return getNode(Opcode, DL, VTList, Ops);
12107}
12108
12110 if (!VT.isExtended())
12111 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12112
12113 return makeVTList(&(*EVTs.insert(VT).first), 1);
12114}
12115
12118 ID.AddInteger(2U);
12119 ID.AddInteger(VT1.getRawBits());
12120 ID.AddInteger(VT2.getRawBits());
12121
12122 void *IP = nullptr;
12123 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12124 if (!Result) {
12125 EVT *Array = Allocator.Allocate<EVT>(2);
12126 Array[0] = VT1;
12127 Array[1] = VT2;
12128 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
12129 VTListMap.InsertNode(Result, IP);
12130 }
12131 return Result->getSDVTList();
12132}
12133
12136 ID.AddInteger(3U);
12137 ID.AddInteger(VT1.getRawBits());
12138 ID.AddInteger(VT2.getRawBits());
12139 ID.AddInteger(VT3.getRawBits());
12140
12141 void *IP = nullptr;
12142 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12143 if (!Result) {
12144 EVT *Array = Allocator.Allocate<EVT>(3);
12145 Array[0] = VT1;
12146 Array[1] = VT2;
12147 Array[2] = VT3;
12148 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
12149 VTListMap.InsertNode(Result, IP);
12150 }
12151 return Result->getSDVTList();
12152}
12153
12156 ID.AddInteger(4U);
12157 ID.AddInteger(VT1.getRawBits());
12158 ID.AddInteger(VT2.getRawBits());
12159 ID.AddInteger(VT3.getRawBits());
12160 ID.AddInteger(VT4.getRawBits());
12161
12162 void *IP = nullptr;
12163 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12164 if (!Result) {
12165 EVT *Array = Allocator.Allocate<EVT>(4);
12166 Array[0] = VT1;
12167 Array[1] = VT2;
12168 Array[2] = VT3;
12169 Array[3] = VT4;
12170 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
12171 VTListMap.InsertNode(Result, IP);
12172 }
12173 return Result->getSDVTList();
12174}
12175
12177 unsigned NumVTs = VTs.size();
12179 ID.AddInteger(NumVTs);
12180 for (unsigned index = 0; index < NumVTs; index++) {
12181 ID.AddInteger(VTs[index].getRawBits());
12182 }
12183
12184 void *IP = nullptr;
12185 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12186 if (!Result) {
12187 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
12188 llvm::copy(VTs, Array);
12189 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
12190 VTListMap.InsertNode(Result, IP);
12191 }
12192 return Result->getSDVTList();
12193}
12194
12195
12196/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12197/// specified operands. If the resultant node already exists in the DAG,
12198/// this does not modify the specified node, instead it returns the node that
12199/// already exists. If the resultant node does not exist in the DAG, the
12200/// input node is returned. As a degenerate case, if you specify the same
12201/// input operands as the node already has, the input node is returned.
12203 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12204
12205 // Check to see if there is no change.
12206 if (Op == N->getOperand(0)) return N;
12207
12208 // See if the modified node already exists.
12209 void *InsertPos = nullptr;
12210 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
12211 return Existing;
12212
12213 // Nope it doesn't. Remove the node from its current place in the maps.
12214 if (InsertPos)
12215 if (!RemoveNodeFromCSEMaps(N))
12216 InsertPos = nullptr;
12217
12218 // Now we update the operands.
12219 N->OperandList[0].set(Op);
12220
12222 // If this gets put into a CSE map, add it.
12223 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12224 return N;
12225}
12226
12228 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12229
12230 // Check to see if there is no change.
12231 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12232 return N; // No operands changed, just return the input node.
12233
12234 // See if the modified node already exists.
12235 void *InsertPos = nullptr;
12236 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
12237 return Existing;
12238
12239 // Nope it doesn't. Remove the node from its current place in the maps.
12240 if (InsertPos)
12241 if (!RemoveNodeFromCSEMaps(N))
12242 InsertPos = nullptr;
12243
12244 // Now we update the operands.
12245 if (N->OperandList[0] != Op1)
12246 N->OperandList[0].set(Op1);
12247 if (N->OperandList[1] != Op2)
12248 N->OperandList[1].set(Op2);
12249
12251 // If this gets put into a CSE map, add it.
12252 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12253 return N;
12254}
12255
12258 SDValue Ops[] = { Op1, Op2, Op3 };
12259 return UpdateNodeOperands(N, Ops);
12260}
12261
12264 SDValue Op3, SDValue Op4) {
12265 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12266 return UpdateNodeOperands(N, Ops);
12267}
12268
12271 SDValue Op3, SDValue Op4, SDValue Op5) {
12272 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12273 return UpdateNodeOperands(N, Ops);
12274}
12275
12278 unsigned NumOps = Ops.size();
12279 assert(N->getNumOperands() == NumOps &&
12280 "Update with wrong number of operands");
12281
12282 // If no operands changed just return the input node.
12283 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12284 return N;
12285
12286 // See if the modified node already exists.
12287 void *InsertPos = nullptr;
12288 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
12289 return Existing;
12290
12291 // Nope it doesn't. Remove the node from its current place in the maps.
12292 if (InsertPos)
12293 if (!RemoveNodeFromCSEMaps(N))
12294 InsertPos = nullptr;
12295
12296 // Now we update the operands.
12297 for (unsigned i = 0; i != NumOps; ++i)
12298 if (N->OperandList[i] != Ops[i])
12299 N->OperandList[i].set(Ops[i]);
12300
12302 // If this gets put into a CSE map, add it.
12303 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12304 return N;
12305}
12306
12307/// DropOperands - Release the operands and set this node to have
12308/// zero operands.
12310 // Unlike the code in MorphNodeTo that does this, we don't need to
12311 // watch for dead nodes here.
12312 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12313 SDUse &Use = *I++;
12314 Use.set(SDValue());
12315 }
12316}
12317
12319 ArrayRef<MachineMemOperand *> NewMemRefs) {
12320 if (NewMemRefs.empty()) {
12321 N->clearMemRefs();
12322 return;
12323 }
12324
12325 // Check if we can avoid allocating by storing a single reference directly.
12326 if (NewMemRefs.size() == 1) {
12327 N->MemRefs = NewMemRefs[0];
12328 N->NumMemRefs = 1;
12329 return;
12330 }
12331
12332 MachineMemOperand **MemRefsBuffer =
12333 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12334 llvm::copy(NewMemRefs, MemRefsBuffer);
12335 N->MemRefs = MemRefsBuffer;
12336 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12337}
12338
12339/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12340/// machine opcode.
12341///
12343 EVT VT) {
12344 SDVTList VTs = getVTList(VT);
12345 return SelectNodeTo(N, MachineOpc, VTs, {});
12346}
12347
12349 EVT VT, SDValue Op1) {
12350 SDVTList VTs = getVTList(VT);
12351 SDValue Ops[] = { Op1 };
12352 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12353}
12354
12356 EVT VT, SDValue Op1,
12357 SDValue Op2) {
12358 SDVTList VTs = getVTList(VT);
12359 SDValue Ops[] = { Op1, Op2 };
12360 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12361}
12362
12364 EVT VT, SDValue Op1,
12365 SDValue Op2, SDValue Op3) {
12366 SDVTList VTs = getVTList(VT);
12367 SDValue Ops[] = { Op1, Op2, Op3 };
12368 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12369}
12370
12373 SDVTList VTs = getVTList(VT);
12374 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12375}
12376
12378 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12379 SDVTList VTs = getVTList(VT1, VT2);
12380 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12381}
12382
12384 EVT VT1, EVT VT2) {
12385 SDVTList VTs = getVTList(VT1, VT2);
12386 return SelectNodeTo(N, MachineOpc, VTs, {});
12387}
12388
12390 EVT VT1, EVT VT2, EVT VT3,
12392 SDVTList VTs = getVTList(VT1, VT2, VT3);
12393 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12394}
12395
12397 EVT VT1, EVT VT2,
12398 SDValue Op1, SDValue Op2) {
12399 SDVTList VTs = getVTList(VT1, VT2);
12400 SDValue Ops[] = { Op1, Op2 };
12401 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12402}
12403
12406 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12407 // Reset the NodeID to -1.
12408 New->setNodeId(-1);
12409 if (New != N) {
12410 ReplaceAllUsesWith(N, New);
12412 }
12413 return New;
12414}
12415
12416/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12417/// the line number information on the merged node since it is not possible to
12418/// preserve the information that operation is associated with multiple lines.
12419/// This will make the debugger working better at -O0, were there is a higher
12420/// probability having other instructions associated with that line.
12421///
12422/// For IROrder, we keep the smaller of the two
12423SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12424 DebugLoc NLoc = N->getDebugLoc();
12425 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12426 N->setDebugLoc(DebugLoc());
12427 }
12428 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12429 N->setIROrder(Order);
12430 return N;
12431}
12432
12433/// MorphNodeTo - This *mutates* the specified node to have the specified
12434/// return type, opcode, and operands.
12435///
12436/// Note that MorphNodeTo returns the resultant node. If there is already a
12437/// node of the specified opcode and operands, it returns that node instead of
12438/// the current one. Note that the SDLoc need not be the same.
12439///
12440/// Using MorphNodeTo is faster than creating a new node and swapping it in
12441/// with ReplaceAllUsesWith both because it often avoids allocating a new
12442/// node, and because it doesn't require CSE recalculation for any of
12443/// the node's users.
12444///
12445/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12446/// As a consequence it isn't appropriate to use from within the DAG combiner or
12447/// the legalizer which maintain worklists that would need to be updated when
12448/// deleting things.
12451 // If an identical node already exists, use it.
12452 void *IP = nullptr;
12453 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12455 AddNodeIDNode(ID, Opc, VTs, Ops);
12456 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
12457 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12458 }
12459
12460 if (!RemoveNodeFromCSEMaps(N))
12461 IP = nullptr;
12462
12463 // Start the morphing.
12464 N->NodeType = Opc;
12465 N->ValueList = VTs.VTs;
12466 N->NumValues = VTs.NumVTs;
12467
12468 // Clear the operands list, updating used nodes to remove this from their
12469 // use list. Keep track of any operands that become dead as a result.
12470 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12471 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12472 SDUse &Use = *I++;
12473 SDNode *Used = Use.getNode();
12474 Use.set(SDValue());
12475 if (Used->use_empty())
12476 DeadNodeSet.insert(Used);
12477 }
12478
12479 // For MachineNode, initialize the memory references information.
12481 MN->clearMemRefs();
12482
12483 // Swap for an appropriately sized array from the recycler.
12484 removeOperands(N);
12485 createOperands(N, Ops);
12486
12487 // Delete any nodes that are still dead after adding the uses for the
12488 // new operands.
12489 if (!DeadNodeSet.empty()) {
12490 SmallVector<SDNode *, 16> DeadNodes;
12491 for (SDNode *N : DeadNodeSet)
12492 if (N->use_empty())
12493 DeadNodes.push_back(N);
12494 RemoveDeadNodes(DeadNodes);
12495 }
12496
12497 if (IP)
12498 CSEMap.InsertNode(N, IP); // Memoize the new node.
12499 return N;
12500}
12501
12503 unsigned OrigOpc = Node->getOpcode();
12504 unsigned NewOpc;
12505 switch (OrigOpc) {
12506 default:
12507 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12508#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12509 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12510#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12511 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12512#include "llvm/IR/ConstrainedOps.def"
12513 }
12514
12515 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12516
12517 // We're taking this node out of the chain, so we need to re-link things.
12518 SDValue InputChain = Node->getOperand(0);
12519 SDValue OutputChain = SDValue(Node, 1);
12520 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12521
12523 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12524 Ops.push_back(Node->getOperand(i));
12525
12526 SDVTList VTs = getVTList(Node->getValueType(0));
12527 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12528
12529 // MorphNodeTo can operate in two ways: if an existing node with the
12530 // specified operands exists, it can just return it. Otherwise, it
12531 // updates the node in place to have the requested operands.
12532 if (Res == Node) {
12533 // If we updated the node in place, reset the node ID. To the isel,
12534 // this should be just like a newly allocated machine node.
12535 Res->setNodeId(-1);
12536 } else {
12539 }
12540
12541 return Res;
12542}
12543
12544/// getMachineNode - These are used for target selectors to create a new node
12545/// with specified return type(s), MachineInstr opcode, and operands.
12546///
12547/// Note that getMachineNode returns the resultant node. If there is already a
12548/// node of the specified opcode and operands, it returns that node instead of
12549/// the current one.
12551 EVT VT) {
12552 SDVTList VTs = getVTList(VT);
12553 return getMachineNode(Opcode, dl, VTs, {});
12554}
12555
12557 EVT VT, SDValue Op1) {
12558 SDVTList VTs = getVTList(VT);
12559 SDValue Ops[] = { Op1 };
12560 return getMachineNode(Opcode, dl, VTs, Ops);
12561}
12562
12564 EVT VT, SDValue Op1, SDValue Op2) {
12565 SDVTList VTs = getVTList(VT);
12566 SDValue Ops[] = { Op1, Op2 };
12567 return getMachineNode(Opcode, dl, VTs, Ops);
12568}
12569
12571 EVT VT, SDValue Op1, SDValue Op2,
12572 SDValue Op3) {
12573 SDVTList VTs = getVTList(VT);
12574 SDValue Ops[] = { Op1, Op2, Op3 };
12575 return getMachineNode(Opcode, dl, VTs, Ops);
12576}
12577
12580 SDVTList VTs = getVTList(VT);
12581 return getMachineNode(Opcode, dl, VTs, Ops);
12582}
12583
12585 EVT VT1, EVT VT2, SDValue Op1,
12586 SDValue Op2) {
12587 SDVTList VTs = getVTList(VT1, VT2);
12588 SDValue Ops[] = { Op1, Op2 };
12589 return getMachineNode(Opcode, dl, VTs, Ops);
12590}
12591
12593 EVT VT1, EVT VT2, SDValue Op1,
12594 SDValue Op2, SDValue Op3) {
12595 SDVTList VTs = getVTList(VT1, VT2);
12596 SDValue Ops[] = { Op1, Op2, Op3 };
12597 return getMachineNode(Opcode, dl, VTs, Ops);
12598}
12599
12601 EVT VT1, EVT VT2,
12603 SDVTList VTs = getVTList(VT1, VT2);
12604 return getMachineNode(Opcode, dl, VTs, Ops);
12605}
12606
12608 EVT VT1, EVT VT2, EVT VT3,
12609 SDValue Op1, SDValue Op2) {
12610 SDVTList VTs = getVTList(VT1, VT2, VT3);
12611 SDValue Ops[] = { Op1, Op2 };
12612 return getMachineNode(Opcode, dl, VTs, Ops);
12613}
12614
12616 EVT VT1, EVT VT2, EVT VT3,
12617 SDValue Op1, SDValue Op2,
12618 SDValue Op3) {
12619 SDVTList VTs = getVTList(VT1, VT2, VT3);
12620 SDValue Ops[] = { Op1, Op2, Op3 };
12621 return getMachineNode(Opcode, dl, VTs, Ops);
12622}
12623
12625 EVT VT1, EVT VT2, EVT VT3,
12627 SDVTList VTs = getVTList(VT1, VT2, VT3);
12628 return getMachineNode(Opcode, dl, VTs, Ops);
12629}
12630
12632 ArrayRef<EVT> ResultTys,
12634 SDVTList VTs = getVTList(ResultTys);
12635 return getMachineNode(Opcode, dl, VTs, Ops);
12636}
12637
12639 SDVTList VTs,
12641 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12643 void *IP = nullptr;
12644
12645 if (DoCSE) {
12647 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12648 IP = nullptr;
12649 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12650 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12651 }
12652 }
12653
12654 // Allocate a new MachineSDNode.
12655 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12656 createOperands(N, Ops);
12657
12658 if (DoCSE)
12659 CSEMap.InsertNode(N, IP);
12660
12661 InsertNode(N);
12662 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12663 return N;
12664}
12665
12666/// getTargetExtractSubreg - A convenience function for creating
12667/// TargetOpcode::EXTRACT_SUBREG nodes.
12669 SDValue Operand) {
12670 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12671 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12672 VT, Operand, SRIdxVal);
12673 return SDValue(Subreg, 0);
12674}
12675
12676/// getTargetInsertSubreg - A convenience function for creating
12677/// TargetOpcode::INSERT_SUBREG nodes.
12679 SDValue Operand, SDValue Subreg) {
12680 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12681 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12682 VT, Operand, Subreg, SRIdxVal);
12683 return SDValue(Result, 0);
12684}
12685
12686/// getNodeIfExists - Get the specified node if it's already available, or
12687/// else return NULL.
12690 bool AllowCommute) {
12691 SDNodeFlags Flags;
12692 if (Inserter)
12693 Flags = Inserter->getFlags();
12694 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12695}
12696
12699 const SDNodeFlags Flags,
12700 bool AllowCommute) {
12701 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12702 return nullptr;
12703
12704 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12706 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12707 void *IP = nullptr;
12708 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12709 E->intersectFlagsWith(Flags);
12710 return E;
12711 }
12712 return nullptr;
12713 };
12714
12715 if (SDNode *Existing = Lookup(Ops))
12716 return Existing;
12717
12718 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12719 return Lookup({Ops[1], Ops[0]});
12720
12721 return nullptr;
12722}
12723
12724/// doesNodeExist - Check if a node exists without modifying its flags.
12725bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12727 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12729 AddNodeIDNode(ID, Opcode, VTList, Ops);
12730 void *IP = nullptr;
12731 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12732 return true;
12733 }
12734 return false;
12735}
12736
12737/// getDbgValue - Creates a SDDbgValue node.
12738///
12739/// SDNode
12741 SDNode *N, unsigned R, bool IsIndirect,
12742 const DebugLoc &DL, unsigned O) {
12743 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12744 "Expected inlined-at fields to agree");
12745 return new (DbgInfo->getAlloc())
12746 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12747 {}, IsIndirect, DL, O,
12748 /*IsVariadic=*/false);
12749}
12750
12751/// Constant
12753 DIExpression *Expr,
12754 const Value *C,
12755 const DebugLoc &DL, unsigned O) {
12756 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12757 "Expected inlined-at fields to agree");
12758 return new (DbgInfo->getAlloc())
12759 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12760 /*IsIndirect=*/false, DL, O,
12761 /*IsVariadic=*/false);
12762}
12763
12764/// FrameIndex
12766 DIExpression *Expr, unsigned FI,
12767 bool IsIndirect,
12768 const DebugLoc &DL,
12769 unsigned O) {
12770 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12771 "Expected inlined-at fields to agree");
12772 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12773}
12774
12775/// FrameIndex with dependencies
12777 DIExpression *Expr, unsigned FI,
12778 ArrayRef<SDNode *> Dependencies,
12779 bool IsIndirect,
12780 const DebugLoc &DL,
12781 unsigned O) {
12782 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12783 "Expected inlined-at fields to agree");
12784 return new (DbgInfo->getAlloc())
12785 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12786 Dependencies, IsIndirect, DL, O,
12787 /*IsVariadic=*/false);
12788}
12789
12790/// VReg
12792 Register VReg, bool IsIndirect,
12793 const DebugLoc &DL, unsigned O) {
12794 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12795 "Expected inlined-at fields to agree");
12796 return new (DbgInfo->getAlloc())
12797 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12798 {}, IsIndirect, DL, O,
12799 /*IsVariadic=*/false);
12800}
12801
12804 ArrayRef<SDNode *> Dependencies,
12805 bool IsIndirect, const DebugLoc &DL,
12806 unsigned O, bool IsVariadic) {
12807 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12808 "Expected inlined-at fields to agree");
12809 return new (DbgInfo->getAlloc())
12810 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12811 DL, O, IsVariadic);
12812}
12813
12815 unsigned OffsetInBits, unsigned SizeInBits,
12816 bool InvalidateDbg) {
12817 SDNode *FromNode = From.getNode();
12818 SDNode *ToNode = To.getNode();
12819 assert(FromNode && ToNode && "Can't modify dbg values");
12820
12821 // PR35338
12822 // TODO: assert(From != To && "Redundant dbg value transfer");
12823 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12824 if (From == To || FromNode == ToNode)
12825 return;
12826
12827 if (!FromNode->getHasDebugValue())
12828 return;
12829
12830 SDDbgOperand FromLocOp =
12831 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12833
12835 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12836 if (Dbg->isInvalidated())
12837 continue;
12838
12839 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12840
12841 // Create a new location ops vector that is equal to the old vector, but
12842 // with each instance of FromLocOp replaced with ToLocOp.
12843 bool Changed = false;
12844 auto NewLocOps = Dbg->copyLocationOps();
12845 std::replace_if(
12846 NewLocOps.begin(), NewLocOps.end(),
12847 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12848 bool Match = Op == FromLocOp;
12849 Changed |= Match;
12850 return Match;
12851 },
12852 ToLocOp);
12853 // Ignore this SDDbgValue if we didn't find a matching location.
12854 if (!Changed)
12855 continue;
12856
12857 DIVariable *Var = Dbg->getVariable();
12858 auto *Expr = Dbg->getExpression();
12859 // If a fragment is requested, update the expression.
12860 if (SizeInBits) {
12861 // When splitting a larger (e.g., sign-extended) value whose
12862 // lower bits are described with an SDDbgValue, do not attempt
12863 // to transfer the SDDbgValue to the upper bits.
12864 if (auto FI = Expr->getFragmentInfo())
12865 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12866 continue;
12867 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12868 SizeInBits);
12869 if (!Fragment)
12870 continue;
12871 Expr = *Fragment;
12872 }
12873
12874 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12875 // Clone the SDDbgValue and move it to To.
12876 SDDbgValue *Clone = getDbgValueList(
12877 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12878 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12879 Dbg->isVariadic());
12880 ClonedDVs.push_back(Clone);
12881
12882 if (InvalidateDbg) {
12883 // Invalidate value and indicate the SDDbgValue should not be emitted.
12884 Dbg->setIsInvalidated();
12885 Dbg->setIsEmitted();
12886 }
12887 }
12888
12889 for (SDDbgValue *Dbg : ClonedDVs) {
12890 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12891 "Transferred DbgValues should depend on the new SDNode");
12892 AddDbgValue(Dbg, false);
12893 }
12894}
12895
12897 if (!N.getHasDebugValue())
12898 return;
12899
12900 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12901 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12902 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12903 return SDDbgOperand::fromNode(Node, ResNo);
12904 };
12905
12907 for (auto *DV : GetDbgValues(&N)) {
12908 if (DV->isInvalidated())
12909 continue;
12910 switch (N.getOpcode()) {
12911 default:
12912 break;
12913 case ISD::ADD: {
12914 SDValue N0 = N.getOperand(0);
12915 SDValue N1 = N.getOperand(1);
12916 if (!isa<ConstantSDNode>(N0)) {
12917 bool RHSConstant = isa<ConstantSDNode>(N1);
12919 if (RHSConstant)
12920 Offset = N.getConstantOperandVal(1);
12921 // We are not allowed to turn indirect debug values variadic, so
12922 // don't salvage those.
12923 if (!RHSConstant && DV->isIndirect())
12924 continue;
12925
12926 // Rewrite an ADD constant node into a DIExpression. Since we are
12927 // performing arithmetic to compute the variable's *value* in the
12928 // DIExpression, we need to mark the expression with a
12929 // DW_OP_stack_value.
12930 auto *DIExpr = DV->getExpression();
12931 auto NewLocOps = DV->copyLocationOps();
12932 bool Changed = false;
12933 size_t OrigLocOpsSize = NewLocOps.size();
12934 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12935 // We're not given a ResNo to compare against because the whole
12936 // node is going away. We know that any ISD::ADD only has one
12937 // result, so we can assume any node match is using the result.
12938 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12939 NewLocOps[i].getSDNode() != &N)
12940 continue;
12941 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12942 if (RHSConstant) {
12945 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12946 } else {
12947 // Convert to a variadic expression (if not already).
12948 // convertToVariadicExpression() returns a const pointer, so we use
12949 // a temporary const variable here.
12950 const auto *TmpDIExpr =
12954 ExprOps.push_back(NewLocOps.size());
12955 ExprOps.push_back(dwarf::DW_OP_plus);
12956 SDDbgOperand RHS =
12958 NewLocOps.push_back(RHS);
12959 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12960 }
12961 Changed = true;
12962 }
12963 (void)Changed;
12964 assert(Changed && "Salvage target doesn't use N");
12965
12966 bool IsVariadic =
12967 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12968
12969 auto AdditionalDependencies = DV->getAdditionalDependencies();
12970 SDDbgValue *Clone = getDbgValueList(
12971 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12972 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12973 ClonedDVs.push_back(Clone);
12974 DV->setIsInvalidated();
12975 DV->setIsEmitted();
12976 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12977 N0.getNode()->dumprFull(this);
12978 dbgs() << " into " << *DIExpr << '\n');
12979 }
12980 break;
12981 }
12982 case ISD::TRUNCATE: {
12983 SDValue N0 = N.getOperand(0);
12984 TypeSize FromSize = N0.getValueSizeInBits();
12985 TypeSize ToSize = N.getValueSizeInBits(0);
12986
12987 DIExpression *DbgExpression = DV->getExpression();
12988 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12989 auto NewLocOps = DV->copyLocationOps();
12990 bool Changed = false;
12991 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12992 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12993 NewLocOps[i].getSDNode() != &N)
12994 continue;
12995
12996 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12997 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
12998 Changed = true;
12999 }
13000 assert(Changed && "Salvage target doesn't use N");
13001 (void)Changed;
13002
13003 SDDbgValue *Clone =
13004 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13005 DV->getAdditionalDependencies(), DV->isIndirect(),
13006 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13007
13008 ClonedDVs.push_back(Clone);
13009 DV->setIsInvalidated();
13010 DV->setIsEmitted();
13011 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13012 dbgs() << " into " << *DbgExpression << '\n');
13013 break;
13014 }
13015 }
13016 }
13017
13018 for (SDDbgValue *Dbg : ClonedDVs) {
13019 assert((!Dbg->getSDNodes().empty() ||
13020 llvm::any_of(Dbg->getLocationOps(),
13021 [&](const SDDbgOperand &Op) {
13022 return Op.getKind() == SDDbgOperand::FRAMEIX;
13023 })) &&
13024 "Salvaged DbgValue should depend on a new SDNode");
13025 AddDbgValue(Dbg, false);
13026 }
13027}
13028
13029/// Creates a SDDbgLabel node.
13031 const DebugLoc &DL, unsigned O) {
13032 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13033 "Expected inlined-at fields to agree");
13034 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13035}
13036
13037namespace {
13038
13039/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13040/// pointed to by a use iterator is deleted, increment the use iterator
13041/// so that it doesn't dangle.
13042///
13043class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13046
13047 void NodeDeleted(SDNode *N, SDNode *E) override {
13048 // Increment the iterator as needed.
13049 while (UI != UE && N == UI->getUser())
13050 ++UI;
13051 }
13052
13053public:
13054 RAUWUpdateListener(SelectionDAG &d,
13057 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13058};
13059
13060} // end anonymous namespace
13061
13062/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13063/// This can cause recursive merging of nodes in the DAG.
13064///
13065/// This version assumes From has a single result value.
13066///
13068 SDNode *From = FromN.getNode();
13069 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13070 "Cannot replace with this method!");
13071 assert(From != To.getNode() && "Cannot replace uses of with self");
13072
13073 // Preserve Debug Values
13074 transferDbgValues(FromN, To);
13075 // Preserve extra info.
13076 copyExtraInfo(From, To.getNode());
13077
13078 // Iterate over all the existing uses of From. New uses will be added
13079 // to the beginning of the use list, which we avoid visiting.
13080 // This specifically avoids visiting uses of From that arise while the
13081 // replacement is happening, because any such uses would be the result
13082 // of CSE: If an existing node looks like From after one of its operands
13083 // is replaced by To, we don't want to replace of all its users with To
13084 // too. See PR3018 for more info.
13085 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13086 RAUWUpdateListener Listener(*this, UI, UE);
13087 while (UI != UE) {
13088 SDNode *User = UI->getUser();
13089
13090 // This node is about to morph, remove its old self from the CSE maps.
13091 RemoveNodeFromCSEMaps(User);
13092
13093 // A user can appear in a use list multiple times, and when this
13094 // happens the uses are usually next to each other in the list.
13095 // To help reduce the number of CSE recomputations, process all
13096 // the uses of this user that we can find this way.
13097 do {
13098 SDUse &Use = *UI;
13099 ++UI;
13100 Use.set(To);
13101 if (To->isDivergent() != From->isDivergent())
13103 } while (UI != UE && UI->getUser() == User);
13104 // Now that we have modified User, add it back to the CSE maps. If it
13105 // already exists there, recursively merge the results together.
13106 AddModifiedNodeToCSEMaps(User);
13107 }
13108
13109 // If we just RAUW'd the root, take note.
13110 if (FromN == getRoot())
13111 setRoot(To);
13112}
13113
13114/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13115/// This can cause recursive merging of nodes in the DAG.
13116///
13117/// This version assumes that for each value of From, there is a
13118/// corresponding value in To in the same position with the same type.
13119///
13121#ifndef NDEBUG
13122 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13123 assert((!From->hasAnyUseOfValue(i) ||
13124 From->getValueType(i) == To->getValueType(i)) &&
13125 "Cannot use this version of ReplaceAllUsesWith!");
13126#endif
13127
13128 // Handle the trivial case.
13129 if (From == To)
13130 return;
13131
13132 // Preserve Debug Info. Only do this if there's a use.
13133 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13134 if (From->hasAnyUseOfValue(i)) {
13135 assert((i < To->getNumValues()) && "Invalid To location");
13136 transferDbgValues(SDValue(From, i), SDValue(To, i));
13137 }
13138 // Preserve extra info.
13139 copyExtraInfo(From, To);
13140
13141 // Iterate over just the existing users of From. See the comments in
13142 // the ReplaceAllUsesWith above.
13143 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13144 RAUWUpdateListener Listener(*this, UI, UE);
13145 while (UI != UE) {
13146 SDNode *User = UI->getUser();
13147
13148 // This node is about to morph, remove its old self from the CSE maps.
13149 RemoveNodeFromCSEMaps(User);
13150
13151 // A user can appear in a use list multiple times, and when this
13152 // happens the uses are usually next to each other in the list.
13153 // To help reduce the number of CSE recomputations, process all
13154 // the uses of this user that we can find this way.
13155 do {
13156 SDUse &Use = *UI;
13157 ++UI;
13158 Use.setNode(To);
13159 if (To->isDivergent() != From->isDivergent())
13161 } while (UI != UE && UI->getUser() == User);
13162
13163 // Now that we have modified User, add it back to the CSE maps. If it
13164 // already exists there, recursively merge the results together.
13165 AddModifiedNodeToCSEMaps(User);
13166 }
13167
13168 // If we just RAUW'd the root, take note.
13169 if (From == getRoot().getNode())
13170 setRoot(SDValue(To, getRoot().getResNo()));
13171}
13172
13173/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13174/// This can cause recursive merging of nodes in the DAG.
13175///
13176/// This version can replace From with any result values. To must match the
13177/// number and types of values returned by From.
13179 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13180 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13181
13182 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13183 // Preserve Debug Info.
13184 transferDbgValues(SDValue(From, i), To[i]);
13185 // Preserve extra info.
13186 copyExtraInfo(From, To[i].getNode());
13187 }
13188
13189 // Iterate over just the existing users of From. See the comments in
13190 // the ReplaceAllUsesWith above.
13191 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13192 RAUWUpdateListener Listener(*this, UI, UE);
13193 while (UI != UE) {
13194 SDNode *User = UI->getUser();
13195
13196 // This node is about to morph, remove its old self from the CSE maps.
13197 RemoveNodeFromCSEMaps(User);
13198
13199 // A user can appear in a use list multiple times, and when this happens the
13200 // uses are usually next to each other in the list. To help reduce the
13201 // number of CSE and divergence recomputations, process all the uses of this
13202 // user that we can find this way.
13203 bool To_IsDivergent = false;
13204 do {
13205 SDUse &Use = *UI;
13206 const SDValue &ToOp = To[Use.getResNo()];
13207 ++UI;
13208 Use.set(ToOp);
13209 if (ToOp.getValueType() != MVT::Other)
13210 To_IsDivergent |= ToOp->isDivergent();
13211 } while (UI != UE && UI->getUser() == User);
13212
13213 if (To_IsDivergent != From->isDivergent())
13215
13216 // Now that we have modified User, add it back to the CSE maps. If it
13217 // already exists there, recursively merge the results together.
13218 AddModifiedNodeToCSEMaps(User);
13219 }
13220
13221 // If we just RAUW'd the root, take note.
13222 if (From == getRoot().getNode())
13223 setRoot(SDValue(To[getRoot().getResNo()]));
13224}
13225
13226/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13227/// uses of other values produced by From.getNode() alone. The Deleted
13228/// vector is handled the same way as for ReplaceAllUsesWith.
13230 // Handle the really simple, really trivial case efficiently.
13231 if (From == To) return;
13232
13233 // Handle the simple, trivial, case efficiently.
13234 if (From.getNode()->getNumValues() == 1) {
13235 ReplaceAllUsesWith(From, To);
13236 return;
13237 }
13238
13239 // Preserve Debug Info.
13240 transferDbgValues(From, To);
13241 copyExtraInfo(From.getNode(), To.getNode());
13242
13243 // Iterate over just the existing users of From. See the comments in
13244 // the ReplaceAllUsesWith above.
13245 SDNode::use_iterator UI = From.getNode()->use_begin(),
13246 UE = From.getNode()->use_end();
13247 RAUWUpdateListener Listener(*this, UI, UE);
13248 while (UI != UE) {
13249 SDNode *User = UI->getUser();
13250 bool UserRemovedFromCSEMaps = false;
13251
13252 // A user can appear in a use list multiple times, and when this
13253 // happens the uses are usually next to each other in the list.
13254 // To help reduce the number of CSE recomputations, process all
13255 // the uses of this user that we can find this way.
13256 do {
13257 SDUse &Use = *UI;
13258
13259 // Skip uses of different values from the same node.
13260 if (Use.getResNo() != From.getResNo()) {
13261 ++UI;
13262 continue;
13263 }
13264
13265 // If this node hasn't been modified yet, it's still in the CSE maps,
13266 // so remove its old self from the CSE maps.
13267 if (!UserRemovedFromCSEMaps) {
13268 RemoveNodeFromCSEMaps(User);
13269 UserRemovedFromCSEMaps = true;
13270 }
13271
13272 ++UI;
13273 Use.set(To);
13274 if (To->isDivergent() != From->isDivergent())
13276 } while (UI != UE && UI->getUser() == User);
13277 // We are iterating over all uses of the From node, so if a use
13278 // doesn't use the specific value, no changes are made.
13279 if (!UserRemovedFromCSEMaps)
13280 continue;
13281
13282 // Now that we have modified User, add it back to the CSE maps. If it
13283 // already exists there, recursively merge the results together.
13284 AddModifiedNodeToCSEMaps(User);
13285 }
13286
13287 // If we just RAUW'd the root, take note.
13288 if (From == getRoot())
13289 setRoot(To);
13290}
13291
13292namespace {
13293
13294/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13295/// to record information about a use.
13296struct UseMemo {
13297 SDNode *User;
13298 unsigned Index;
13299 SDUse *Use;
13300};
13301
13302/// operator< - Sort Memos by User.
13303bool operator<(const UseMemo &L, const UseMemo &R) {
13304 return (intptr_t)L.User < (intptr_t)R.User;
13305}
13306
13307/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13308/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13309/// the node already has been taken care of recursively.
13310class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13311 SmallVectorImpl<UseMemo> &Uses;
13312
13313 void NodeDeleted(SDNode *N, SDNode *E) override {
13314 for (UseMemo &Memo : Uses)
13315 if (Memo.User == N)
13316 Memo.User = nullptr;
13317 }
13318
13319public:
13320 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13321 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13322};
13323
13324} // end anonymous namespace
13325
13326/// Return true if a glue output should propagate divergence information.
13328 switch (Node->getOpcode()) {
13329 case ISD::CopyFromReg:
13330 case ISD::CopyToReg:
13331 return false;
13332 default:
13333 return true;
13334 }
13335
13336 llvm_unreachable("covered opcode switch");
13337}
13338
13340 if (TLI->isSDNodeAlwaysUniform(N)) {
13341 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13342 "Conflicting divergence information!");
13343 return false;
13344 }
13345 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13346 return true;
13347 for (const auto &Op : N->ops()) {
13348 EVT VT = Op.getValueType();
13349
13350 // Skip Chain. It does not carry divergence.
13351 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13352 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13353 return true;
13354 }
13355 return false;
13356}
13357
13359 SmallVector<SDNode *, 16> Worklist(1, N);
13360 do {
13361 N = Worklist.pop_back_val();
13362 bool IsDivergent = calculateDivergence(N);
13363 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13364 N->SDNodeBits.IsDivergent = IsDivergent;
13365 llvm::append_range(Worklist, N->users());
13366 }
13367 } while (!Worklist.empty());
13368}
13369
13370void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13372 Order.reserve(AllNodes.size());
13373 for (auto &N : allnodes()) {
13374 unsigned NOps = N.getNumOperands();
13375 Degree[&N] = NOps;
13376 if (0 == NOps)
13377 Order.push_back(&N);
13378 }
13379 for (size_t I = 0; I != Order.size(); ++I) {
13380 SDNode *N = Order[I];
13381 for (auto *U : N->users()) {
13382 unsigned &UnsortedOps = Degree[U];
13383 if (0 == --UnsortedOps)
13384 Order.push_back(U);
13385 }
13386 }
13387}
13388
13389#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13390void SelectionDAG::VerifyDAGDivergence() {
13391 std::vector<SDNode *> TopoOrder;
13392 CreateTopologicalOrder(TopoOrder);
13393 for (auto *N : TopoOrder) {
13394 assert(calculateDivergence(N) == N->isDivergent() &&
13395 "Divergence bit inconsistency detected");
13396 }
13397}
13398#endif
13399
13400/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13401/// uses of other values produced by From.getNode() alone. The same value
13402/// may appear in both the From and To list. The Deleted vector is
13403/// handled the same way as for ReplaceAllUsesWith.
13405 const SDValue *To,
13406 unsigned Num){
13407 // Handle the simple, trivial case efficiently.
13408 if (Num == 1)
13409 return ReplaceAllUsesOfValueWith(*From, *To);
13410
13411 transferDbgValues(*From, *To);
13412 copyExtraInfo(From->getNode(), To->getNode());
13413
13414 // Read up all the uses and make records of them. This helps
13415 // processing new uses that are introduced during the
13416 // replacement process.
13418 for (unsigned i = 0; i != Num; ++i) {
13419 unsigned FromResNo = From[i].getResNo();
13420 SDNode *FromNode = From[i].getNode();
13421 for (SDUse &Use : FromNode->uses()) {
13422 if (Use.getResNo() == FromResNo) {
13423 UseMemo Memo = {Use.getUser(), i, &Use};
13424 Uses.push_back(Memo);
13425 }
13426 }
13427 }
13428
13429 // Sort the uses, so that all the uses from a given User are together.
13431 RAUOVWUpdateListener Listener(*this, Uses);
13432
13433 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13434 UseIndex != UseIndexEnd; ) {
13435 // We know that this user uses some value of From. If it is the right
13436 // value, update it.
13437 SDNode *User = Uses[UseIndex].User;
13438 // If the node has been deleted by recursive CSE updates when updating
13439 // another node, then just skip this entry.
13440 if (User == nullptr) {
13441 ++UseIndex;
13442 continue;
13443 }
13444
13445 // This node is about to morph, remove its old self from the CSE maps.
13446 RemoveNodeFromCSEMaps(User);
13447
13448 // The Uses array is sorted, so all the uses for a given User
13449 // are next to each other in the list.
13450 // To help reduce the number of CSE recomputations, process all
13451 // the uses of this user that we can find this way.
13452 do {
13453 unsigned i = Uses[UseIndex].Index;
13454 SDUse &Use = *Uses[UseIndex].Use;
13455 ++UseIndex;
13456
13457 Use.set(To[i]);
13458 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13459
13460 // Now that we have modified User, add it back to the CSE maps. If it
13461 // already exists there, recursively merge the results together.
13462 AddModifiedNodeToCSEMaps(User);
13463 }
13464}
13465
13466/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13467/// based on their topological order. It returns the maximum id and a vector
13468/// of the SDNodes* in assigned order by reference.
13470 unsigned DAGSize = 0;
13471
13472 // SortedPos tracks the progress of the algorithm. Nodes before it are
13473 // sorted, nodes after it are unsorted. When the algorithm completes
13474 // it is at the end of the list.
13475 allnodes_iterator SortedPos = allnodes_begin();
13476
13477 // Visit all the nodes. Move nodes with no operands to the front of
13478 // the list immediately. Annotate nodes that do have operands with their
13479 // operand count. Before we do this, the Node Id fields of the nodes
13480 // may contain arbitrary values. After, the Node Id fields for nodes
13481 // before SortedPos will contain the topological sort index, and the
13482 // Node Id fields for nodes At SortedPos and after will contain the
13483 // count of outstanding operands.
13485 checkForCycles(&N, this);
13486 unsigned Degree = N.getNumOperands();
13487 if (Degree == 0) {
13488 // A node with no uses, add it to the result array immediately.
13489 N.setNodeId(DAGSize++);
13490 allnodes_iterator Q(&N);
13491 if (Q != SortedPos)
13492 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13493 assert(SortedPos != AllNodes.end() && "Overran node list");
13494 ++SortedPos;
13495 } else {
13496 // Temporarily use the Node Id as scratch space for the degree count.
13497 N.setNodeId(Degree);
13498 }
13499 }
13500
13501 // Visit all the nodes. As we iterate, move nodes into sorted order,
13502 // such that by the time the end is reached all nodes will be sorted.
13503 for (SDNode &Node : allnodes()) {
13504 SDNode *N = &Node;
13505 checkForCycles(N, this);
13506 // N is in sorted position, so all its uses have one less operand
13507 // that needs to be sorted.
13508 for (SDNode *P : N->users()) {
13509 unsigned Degree = P->getNodeId();
13510 assert(Degree != 0 && "Invalid node degree");
13511 --Degree;
13512 if (Degree == 0) {
13513 // All of P's operands are sorted, so P may sorted now.
13514 P->setNodeId(DAGSize++);
13515 if (P->getIterator() != SortedPos)
13516 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13517 assert(SortedPos != AllNodes.end() && "Overran node list");
13518 ++SortedPos;
13519 } else {
13520 // Update P's outstanding operand count.
13521 P->setNodeId(Degree);
13522 }
13523 }
13524 if (Node.getIterator() == SortedPos) {
13525#ifndef NDEBUG
13527 SDNode *S = &*++I;
13528 dbgs() << "Overran sorted position:\n";
13529 S->dumprFull(this); dbgs() << "\n";
13530 dbgs() << "Checking if this is due to cycles\n";
13531 checkForCycles(this, true);
13532#endif
13533 llvm_unreachable(nullptr);
13534 }
13535 }
13536
13537 assert(SortedPos == AllNodes.end() &&
13538 "Topological sort incomplete!");
13539 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13540 "First node in topological sort is not the entry token!");
13541 assert(AllNodes.front().getNodeId() == 0 &&
13542 "First node in topological sort has non-zero id!");
13543 assert(AllNodes.front().getNumOperands() == 0 &&
13544 "First node in topological sort has operands!");
13545 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13546 "Last node in topologic sort has unexpected id!");
13547 assert(AllNodes.back().use_empty() &&
13548 "Last node in topologic sort has users!");
13549 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13550 return DAGSize;
13551}
13552
13554 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13555 SortedNodes.clear();
13556 // Node -> remaining number of outstanding operands.
13557 DenseMap<const SDNode *, unsigned> RemainingOperands;
13558
13559 // Put nodes without any operands into SortedNodes first.
13560 for (const SDNode &N : allnodes()) {
13561 checkForCycles(&N, this);
13562 unsigned NumOperands = N.getNumOperands();
13563 if (NumOperands == 0)
13564 SortedNodes.push_back(&N);
13565 else
13566 // Record their total number of outstanding operands.
13567 RemainingOperands[&N] = NumOperands;
13568 }
13569
13570 // A node is pushed into SortedNodes when all of its operands (predecessors in
13571 // the graph) are also in SortedNodes.
13572 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13573 const SDNode *N = SortedNodes[i];
13574 for (const SDNode *U : N->users()) {
13575 // HandleSDNode is never part of a DAG and therefore has no entry in
13576 // RemainingOperands.
13577 if (U->getOpcode() == ISD::HANDLENODE)
13578 continue;
13579 unsigned &NumRemOperands = RemainingOperands[U];
13580 assert(NumRemOperands && "Invalid number of remaining operands");
13581 --NumRemOperands;
13582 if (!NumRemOperands)
13583 SortedNodes.push_back(U);
13584 }
13585 }
13586
13587 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13588 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13589 "First node in topological sort is not the entry token");
13590 assert(SortedNodes.front()->getNumOperands() == 0 &&
13591 "First node in topological sort has operands");
13592}
13593
13594/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13595/// value is produced by SD.
13596void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13597 for (SDNode *SD : DB->getSDNodes()) {
13598 if (!SD)
13599 continue;
13600 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13601 SD->setHasDebugValue(true);
13602 }
13603 DbgInfo->add(DB, isParameter);
13604}
13605
13606void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13607
13609 SDValue NewMemOpChain) {
13610 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13611 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13612 // The new memory operation must have the same position as the old load in
13613 // terms of memory dependency. Create a TokenFactor for the old load and new
13614 // memory operation and update uses of the old load's output chain to use that
13615 // TokenFactor.
13616 if (OldChain == NewMemOpChain || OldChain.use_empty())
13617 return NewMemOpChain;
13618
13619 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13620 OldChain, NewMemOpChain);
13621 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13622 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13623 return TokenFactor;
13624}
13625
13627 SDValue NewMemOp) {
13628 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13629 SDValue OldChain = SDValue(OldLoad, 1);
13630 SDValue NewMemOpChain = NewMemOp.getValue(1);
13631 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13632}
13633
13635 Function **OutFunction) {
13636 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13637
13638 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13639 auto *Module = MF->getFunction().getParent();
13640 auto *Function = Module->getFunction(Symbol);
13641
13642 if (OutFunction != nullptr)
13643 *OutFunction = Function;
13644
13645 if (Function != nullptr) {
13646 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13647 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13648 }
13649
13650 std::string ErrorStr;
13651 raw_string_ostream ErrorFormatter(ErrorStr);
13652 ErrorFormatter << "Undefined external symbol ";
13653 ErrorFormatter << '"' << Symbol << '"';
13654 report_fatal_error(Twine(ErrorStr));
13655}
13656
13657//===----------------------------------------------------------------------===//
13658// SDNode Class
13659//===----------------------------------------------------------------------===//
13660
13663 return Const != nullptr && Const->isZero();
13664}
13665
13667 return V.isUndef() || isNullConstant(V);
13668}
13669
13672 return Const != nullptr && Const->isZero() && !Const->isNegative();
13673}
13674
13677 return Const != nullptr && Const->isAllOnes();
13678}
13679
13682 return Const != nullptr && Const->isOne();
13683}
13684
13687 return Const != nullptr && Const->isMinSignedValue();
13688}
13689
13691 SDValue V, unsigned OperandNo,
13692 unsigned Depth) const {
13693 APInt DemandedElts = getDemandAllEltsMask(V);
13694 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13695}
13696
13698 SDValue V, const APInt &DemandedElts,
13699 unsigned OperandNo, unsigned Depth) const {
13700 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13701 // TODO: Target-specific opcodes could be added.
13702 if (V.getValueType().isInteger()) {
13703 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13704 if (Known.isConstant()) {
13705 const APInt &Const = Known.getConstant();
13706 switch (Opcode) {
13707 case ISD::ADD:
13708 case ISD::OR:
13709 case ISD::XOR:
13710 case ISD::UMAX:
13711 return Const.isZero();
13712 case ISD::MUL:
13713 return Const.isOne();
13714 case ISD::AND:
13715 case ISD::UMIN:
13716 return Const.isAllOnes();
13717 case ISD::SMAX:
13718 return Const.isMinSignedValue();
13719 case ISD::SMIN:
13720 return Const.isMaxSignedValue();
13721 case ISD::SUB:
13722 case ISD::SHL:
13723 case ISD::SRA:
13724 case ISD::SRL:
13725 return OperandNo == 1 && Const.isZero();
13726 case ISD::UDIV:
13727 case ISD::SDIV:
13728 return OperandNo == 1 && Const.isOne();
13729 }
13730 }
13731 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13732 switch (Opcode) {
13733 case ISD::FADD:
13734 return ConstFP->isZero() &&
13735 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13736 case ISD::FSUB:
13737 return OperandNo == 1 && ConstFP->isZero() &&
13738 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13739 case ISD::FMUL:
13740 return ConstFP->isOne();
13741 case ISD::FDIV:
13742 return OperandNo == 1 && ConstFP->isOne();
13743 case ISD::FMINNUM:
13744 case ISD::FMAXNUM: {
13745 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13746 EVT VT = V.getValueType();
13747 const fltSemantics &Semantics = VT.getFltSemantics();
13748 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13749 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13750 : APFloat::getLargest(Semantics);
13751 if (Opcode == ISD::FMAXNUM)
13752 NeutralAF.changeSign();
13753
13754 return ConstFP->isExactlyValue(NeutralAF);
13755 }
13756 }
13757 }
13758 return false;
13759}
13760
13762 while (V.getOpcode() == ISD::BITCAST)
13763 V = V.getOperand(0);
13764 return V;
13765}
13766
13768 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13769 V = V.getOperand(0);
13770 return V;
13771}
13772
13774 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13775 V = V.getOperand(0);
13776 return V;
13777}
13778
13780 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13781 SDValue InVec = V.getOperand(0);
13782 SDValue EltNo = V.getOperand(2);
13783 EVT VT = InVec.getValueType();
13784 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13785 if (IndexC && VT.isFixedLengthVector() &&
13786 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13787 !DemandedElts[IndexC->getZExtValue()]) {
13788 V = InVec;
13789 continue;
13790 }
13791 break;
13792 }
13793 return V;
13794}
13795
13797 while (V.getOpcode() == ISD::TRUNCATE)
13798 V = V.getOperand(0);
13799 return V;
13800}
13801
13802bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13803 if (V.getOpcode() != ISD::XOR)
13804 return false;
13805 V = peekThroughBitcasts(V.getOperand(1));
13806 unsigned NumBits = V.getScalarValueSizeInBits();
13807 ConstantSDNode *C =
13808 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13809 return C && (C->getAPIntValue().countr_one() >= NumBits);
13810}
13811
13813 bool AllowTruncation) {
13814 APInt DemandedElts = getDemandAllEltsMask(N);
13815 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13816}
13817
13819 bool AllowUndefs,
13820 bool AllowTruncation) {
13822 return CN;
13823
13824 // SplatVectors can truncate their operands. Ignore that case here unless
13825 // AllowTruncation is set.
13826 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13827 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13828 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13829 EVT CVT = CN->getValueType(0);
13830 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13831 if (AllowTruncation || CVT == VecEltVT)
13832 return CN;
13833 }
13834 }
13835
13837 BitVector UndefElements;
13838 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13839
13840 // BuildVectors can truncate their operands. Ignore that case here unless
13841 // AllowTruncation is set.
13842 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13843 if (CN && (UndefElements.none() || AllowUndefs)) {
13844 EVT CVT = CN->getValueType(0);
13845 EVT NSVT = N.getValueType().getScalarType();
13846 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13847 if (AllowTruncation || (CVT == NSVT))
13848 return CN;
13849 }
13850 }
13851
13852 return nullptr;
13853}
13854
13856 APInt DemandedElts = getDemandAllEltsMask(N);
13857 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13858}
13859
13861 const APInt &DemandedElts,
13862 bool AllowUndefs) {
13864 return CN;
13865
13867 BitVector UndefElements;
13868 ConstantFPSDNode *CN =
13869 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13870 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13871 if (CN && (UndefElements.none() || AllowUndefs))
13872 return CN;
13873 }
13874
13875 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13876 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13877 return CN;
13878
13879 return nullptr;
13880}
13881
13882bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13883 // TODO: may want to use peekThroughBitcast() here.
13884 ConstantSDNode *C =
13885 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13886 return C && C->isZero();
13887}
13888
13889bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13890 ConstantSDNode *C =
13891 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13892 return C && C->isOne();
13893}
13894
13895bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13896 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13897 return C && C->isOne();
13898}
13899
13900bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13902 unsigned BitWidth = N.getScalarValueSizeInBits();
13903 ConstantSDNode *C =
13904 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13905 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13906}
13907
13908bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13909 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13910 return C && APInt::isSameValue(C->getAPIntValue(),
13911 APInt(C->getAPIntValue().getBitWidth(), 1));
13912}
13913
13914bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13916 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13917 return C && C->isZero();
13918}
13919
13920bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13921 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13922 return C && C->isZero();
13923}
13924
13928
13930 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13932 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13933 bool IsVolatile = false;
13934 bool IsNonTemporal = false;
13935 bool IsDereferenceable = true;
13936 bool IsInvariant = true;
13937 for (const MachineMemOperand *MMO : memoperands()) {
13938 IsVolatile |= MMO->isVolatile();
13939 IsNonTemporal |= MMO->isNonTemporal();
13940 IsDereferenceable &= MMO->isDereferenceable();
13941 IsInvariant &= MMO->isInvariant();
13942 }
13943 MemSDNodeBits.IsVolatile = IsVolatile;
13944 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13945 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13946 MemSDNodeBits.IsInvariant = IsInvariant;
13947
13948 // For the single-MMO case, we check here that the size of the memory operand
13949 // fits within the size of the MMO. This is because the MMO might indicate
13950 // only a possible address range instead of specifying the affected memory
13951 // addresses precisely.
13954 getMemOperand()->getSize().getValue())) &&
13955 "Size mismatch!");
13956}
13957
13958/// Profile - Gather unique data for the node.
13959///
13961 AddNodeIDNode(ID, this);
13962}
13963
13964namespace {
13965
13966 struct EVTArray {
13967 std::vector<EVT> VTs;
13968
13969 EVTArray() {
13970 VTs.reserve(MVT::VALUETYPE_SIZE);
13971 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13972 VTs.push_back(MVT((MVT::SimpleValueType)i));
13973 }
13974 };
13975
13976} // end anonymous namespace
13977
13978/// getValueTypeList - Return a pointer to the specified value type.
13979///
13980const EVT *SDNode::getValueTypeList(MVT VT) {
13981 static EVTArray SimpleVTArray;
13982
13983 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13984 return &SimpleVTArray.VTs[VT.SimpleTy];
13985}
13986
13987/// hasAnyUseOfValue - Return true if there are any use of the indicated
13988/// value. This method ignores uses of other values defined by this operation.
13989bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13990 assert(Value < getNumValues() && "Bad value!");
13991
13992 for (SDUse &U : uses())
13993 if (U.getResNo() == Value)
13994 return true;
13995
13996 return false;
13997}
13998
13999/// isOnlyUserOf - Return true if this node is the only use of N.
14000bool SDNode::isOnlyUserOf(const SDNode *N) const {
14001 bool Seen = false;
14002 for (const SDNode *User : N->users()) {
14003 if (User == this)
14004 Seen = true;
14005 else
14006 return false;
14007 }
14008
14009 return Seen;
14010}
14011
14012/// Return true if the only users of N are contained in Nodes.
14014 bool Seen = false;
14015 for (const SDNode *User : N->users()) {
14016 if (llvm::is_contained(Nodes, User))
14017 Seen = true;
14018 else
14019 return false;
14020 }
14021
14022 return Seen;
14023}
14024
14025/// Return true if the referenced return value is an operand of N.
14026bool SDValue::isOperandOf(const SDNode *N) const {
14027 return is_contained(N->op_values(), *this);
14028}
14029
14030bool SDNode::isOperandOf(const SDNode *N) const {
14031 return any_of(N->op_values(),
14032 [this](SDValue Op) { return this == Op.getNode(); });
14033}
14034
14035/// reachesChainWithoutSideEffects - Return true if this operand (which must
14036/// be a chain) reaches the specified operand without crossing any
14037/// side-effecting instructions on any chain path. In practice, this looks
14038/// through token factors and non-volatile loads. In order to remain efficient,
14039/// this only looks a couple of nodes in, it does not do an exhaustive search.
14040///
14041/// Note that we only need to examine chains when we're searching for
14042/// side-effects; SelectionDAG requires that all side-effects are represented
14043/// by chains, even if another operand would force a specific ordering. This
14044/// constraint is necessary to allow transformations like splitting loads.
14046 unsigned Depth) const {
14047 if (*this == Dest) return true;
14048
14049 // Don't search too deeply, we just want to be able to see through
14050 // TokenFactor's etc.
14051 if (Depth == 0) return false;
14052
14053 // If this is a token factor, all inputs to the TF happen in parallel.
14054 if (getOpcode() == ISD::TokenFactor) {
14055 // First, try a shallow search.
14056 if (is_contained((*this)->ops(), Dest)) {
14057 // We found the chain we want as an operand of this TokenFactor.
14058 // Essentially, we reach the chain without side-effects if we could
14059 // serialize the TokenFactor into a simple chain of operations with
14060 // Dest as the last operation. This is automatically true if the
14061 // chain has one use: there are no other ordering constraints.
14062 // If the chain has more than one use, we give up: some other
14063 // use of Dest might force a side-effect between Dest and the current
14064 // node.
14065 if (Dest.hasOneUse())
14066 return true;
14067 }
14068 // Next, try a deep search: check whether every operand of the TokenFactor
14069 // reaches Dest.
14070 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14071 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14072 });
14073 }
14074
14075 // Loads don't have side effects, look through them.
14076 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14077 if (Ld->isUnordered())
14078 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14079 }
14080 return false;
14081}
14082
14083bool SDNode::hasPredecessor(const SDNode *N) const {
14086 Worklist.push_back(this);
14087 return hasPredecessorHelper(N, Visited, Worklist);
14088}
14089
14091 this->Flags &= Flags;
14092}
14093
14094SDValue
14096 ArrayRef<ISD::NodeType> CandidateBinOps,
14097 bool AllowPartials) {
14098 // The pattern must end in an extract from index 0.
14099 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14100 !isNullConstant(Extract->getOperand(1)))
14101 return SDValue();
14102
14103 // Match against one of the candidate binary ops.
14104 SDValue Op = Extract->getOperand(0);
14105 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14106 return Op.getOpcode() == unsigned(BinOp);
14107 }))
14108 return SDValue();
14109
14110 // Floating-point reductions may require relaxed constraints on the final step
14111 // of the reduction because they may reorder intermediate operations.
14112 unsigned CandidateBinOp = Op.getOpcode();
14113 if (Op.getValueType().isFloatingPoint()) {
14114 SDNodeFlags Flags = Op->getFlags();
14115 switch (CandidateBinOp) {
14116 case ISD::FADD:
14117 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14118 return SDValue();
14119 break;
14120 default:
14121 llvm_unreachable("Unhandled FP opcode for binop reduction");
14122 }
14123 }
14124
14125 // Matching failed - attempt to see if we did enough stages that a partial
14126 // reduction from a subvector is possible.
14127 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14128 if (!AllowPartials || !Op)
14129 return SDValue();
14130 EVT OpVT = Op.getValueType();
14131 EVT OpSVT = OpVT.getScalarType();
14132 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14133 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
14134 return SDValue();
14135 BinOp = (ISD::NodeType)CandidateBinOp;
14136 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14137 };
14138
14139 // At each stage, we're looking for something that looks like:
14140 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14141 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14142 // i32 undef, i32 undef, i32 undef, i32 undef>
14143 // %a = binop <8 x i32> %op, %s
14144 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14145 // we expect something like:
14146 // <4,5,6,7,u,u,u,u>
14147 // <2,3,u,u,u,u,u,u>
14148 // <1,u,u,u,u,u,u,u>
14149 // While a partial reduction match would be:
14150 // <2,3,u,u,u,u,u,u>
14151 // <1,u,u,u,u,u,u,u>
14152 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14153 SDValue PrevOp;
14154 for (unsigned i = 0; i < Stages; ++i) {
14155 unsigned MaskEnd = (1 << i);
14156
14157 if (Op.getOpcode() != CandidateBinOp)
14158 return PartialReduction(PrevOp, MaskEnd);
14159
14160 SDValue Op0 = Op.getOperand(0);
14161 SDValue Op1 = Op.getOperand(1);
14162
14164 if (Shuffle) {
14165 Op = Op1;
14166 } else {
14167 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14168 Op = Op0;
14169 }
14170
14171 // The first operand of the shuffle should be the same as the other operand
14172 // of the binop.
14173 if (!Shuffle || Shuffle->getOperand(0) != Op)
14174 return PartialReduction(PrevOp, MaskEnd);
14175
14176 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14177 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14178 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14179 return PartialReduction(PrevOp, MaskEnd);
14180
14181 PrevOp = Op;
14182 }
14183
14184 // Handle subvector reductions, which tend to appear after the shuffle
14185 // reduction stages.
14186 while (Op.getOpcode() == CandidateBinOp) {
14187 unsigned NumElts = Op.getValueType().getVectorNumElements();
14188 SDValue Op0 = Op.getOperand(0);
14189 SDValue Op1 = Op.getOperand(1);
14190 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14192 Op0.getOperand(0) != Op1.getOperand(0))
14193 break;
14194 SDValue Src = Op0.getOperand(0);
14195 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14196 if (NumSrcElts != (2 * NumElts))
14197 break;
14198 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14199 Op1.getConstantOperandAPInt(1) == NumElts) &&
14200 !(Op1.getConstantOperandAPInt(1) == 0 &&
14201 Op0.getConstantOperandAPInt(1) == NumElts))
14202 break;
14203 Op = Src;
14204 }
14205
14206 BinOp = (ISD::NodeType)CandidateBinOp;
14207 return Op;
14208}
14209
14211 EVT VT = N->getValueType(0);
14212 EVT EltVT = VT.getVectorElementType();
14213 unsigned NE = VT.getVectorNumElements();
14214
14215 SDLoc dl(N);
14216
14217 // If ResNE is 0, fully unroll the vector op.
14218 if (ResNE == 0)
14219 ResNE = NE;
14220 else if (NE > ResNE)
14221 NE = ResNE;
14222
14223 if (N->getNumValues() == 2) {
14224 SmallVector<SDValue, 8> Scalars0, Scalars1;
14225 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14226 EVT VT1 = N->getValueType(1);
14227 EVT EltVT1 = VT1.getVectorElementType();
14228
14229 unsigned i;
14230 for (i = 0; i != NE; ++i) {
14231 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14232 SDValue Operand = N->getOperand(j);
14233 EVT OperandVT = Operand.getValueType();
14234
14235 // A vector operand; extract a single element.
14236 EVT OperandEltVT = OperandVT.getVectorElementType();
14237 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14238 }
14239
14240 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14241 Scalars0.push_back(EltOp);
14242 Scalars1.push_back(EltOp.getValue(1));
14243 }
14244
14245 for (; i < ResNE; ++i) {
14246 Scalars0.push_back(getUNDEF(EltVT));
14247 Scalars1.push_back(getUNDEF(EltVT1));
14248 }
14249
14250 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14251 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
14252 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
14253 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
14254 return getMergeValues({Vec0, Vec1}, dl);
14255 }
14256
14257 assert(N->getNumValues() == 1 &&
14258 "Can't unroll a vector with multiple results!");
14259
14261 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14262
14263 unsigned i;
14264 for (i= 0; i != NE; ++i) {
14265 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14266 SDValue Operand = N->getOperand(j);
14267 EVT OperandVT = Operand.getValueType();
14268 if (OperandVT.isVector()) {
14269 // A vector operand; extract a single element.
14270 EVT OperandEltVT = OperandVT.getVectorElementType();
14271 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14272 } else {
14273 // A scalar operand; just use it as is.
14274 Operands[j] = Operand;
14275 }
14276 }
14277
14278 switch (N->getOpcode()) {
14279 default: {
14280 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14281 N->getFlags()));
14282 break;
14283 }
14284 case ISD::VSELECT:
14285 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
14286 break;
14287 case ISD::SHL:
14288 case ISD::SRA:
14289 case ISD::SRL:
14290 case ISD::ROTL:
14291 case ISD::ROTR:
14292 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14293 getShiftAmountOperand(Operands[0].getValueType(),
14294 Operands[1])));
14295 break;
14297 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14298 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14299 Operands[0],
14300 getValueType(ExtVT)));
14301 break;
14302 }
14303 case ISD::ADDRSPACECAST: {
14304 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14305 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
14306 ASC->getSrcAddressSpace(),
14307 ASC->getDestAddressSpace()));
14308 break;
14309 }
14310 }
14311 }
14312
14313 for (; i < ResNE; ++i)
14314 Scalars.push_back(getUNDEF(EltVT));
14315
14316 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14317 return getBuildVector(VecVT, dl, Scalars);
14318}
14319
14320std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14321 SDNode *N, unsigned ResNE) {
14322 unsigned Opcode = N->getOpcode();
14323 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14324 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14325 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14326 "Expected an overflow opcode");
14327
14328 EVT ResVT = N->getValueType(0);
14329 EVT OvVT = N->getValueType(1);
14330 EVT ResEltVT = ResVT.getVectorElementType();
14331 EVT OvEltVT = OvVT.getVectorElementType();
14332 SDLoc dl(N);
14333
14334 // If ResNE is 0, fully unroll the vector op.
14335 unsigned NE = ResVT.getVectorNumElements();
14336 if (ResNE == 0)
14337 ResNE = NE;
14338 else if (NE > ResNE)
14339 NE = ResNE;
14340
14341 SmallVector<SDValue, 8> LHSScalars;
14342 SmallVector<SDValue, 8> RHSScalars;
14343 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14344 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14345
14346 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14347 SDVTList VTs = getVTList(ResEltVT, SVT);
14348 SmallVector<SDValue, 8> ResScalars;
14349 SmallVector<SDValue, 8> OvScalars;
14350 for (unsigned i = 0; i < NE; ++i) {
14351 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14352 SDValue Ov =
14353 getSelect(dl, OvEltVT, Res.getValue(1),
14354 getBoolConstant(true, dl, OvEltVT, ResVT),
14355 getConstant(0, dl, OvEltVT));
14356
14357 ResScalars.push_back(Res);
14358 OvScalars.push_back(Ov);
14359 }
14360
14361 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14362 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14363
14364 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14365 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14366 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14367 getBuildVector(NewOvVT, dl, OvScalars));
14368}
14369
14372 unsigned Bytes,
14373 int Dist) const {
14374 if (LD->isVolatile() || Base->isVolatile())
14375 return false;
14376 // TODO: probably too restrictive for atomics, revisit
14377 if (!LD->isSimple())
14378 return false;
14379 if (LD->isIndexed() || Base->isIndexed())
14380 return false;
14381 if (LD->getChain() != Base->getChain())
14382 return false;
14383 EVT VT = LD->getMemoryVT();
14384 if (VT.getSizeInBits() / 8 != Bytes)
14385 return false;
14386
14387 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
14388 auto LocDecomp = BaseIndexOffset::match(LD, *this);
14389
14390 int64_t Offset = 0;
14391 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
14392 return (Dist * (int64_t)Bytes == Offset);
14393 return false;
14394}
14395
14396/// InferPtrAlignment - Infer alignment of a load / store address. Return
14397/// std::nullopt if it cannot be inferred.
14399 // If this is a GlobalAddress + cst, return the alignment.
14400 const GlobalValue *GV = nullptr;
14401 int64_t GVOffset = 0;
14402 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14403 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14404 KnownBits Known(PtrWidth);
14406 unsigned AlignBits = Known.countMinTrailingZeros();
14407 if (AlignBits)
14408 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14409 }
14410
14411 // If this is a direct reference to a stack slot, use information about the
14412 // stack slot's alignment.
14413 int FrameIdx = INT_MIN;
14414 int64_t FrameOffset = 0;
14416 FrameIdx = FI->getIndex();
14417 } else if (isBaseWithConstantOffset(Ptr) &&
14419 // Handle FI+Cst
14420 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14421 FrameOffset = Ptr.getConstantOperandVal(1);
14422 }
14423
14424 if (FrameIdx != INT_MIN) {
14426 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14427 }
14428
14429 return std::nullopt;
14430}
14431
14432/// Split the scalar node with EXTRACT_ELEMENT using the provided
14433/// VTs and return the low/high part.
14434std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14435 const SDLoc &DL,
14436 const EVT &LoVT,
14437 const EVT &HiVT) {
14438 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14439 "Split node must be a scalar type");
14440 SDValue Lo =
14442 SDValue Hi =
14444 return std::make_pair(Lo, Hi);
14445}
14446
14447/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14448/// which is split (or expanded) into two not necessarily identical pieces.
14449std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14450 // Currently all types are split in half.
14451 EVT LoVT, HiVT;
14452 if (!VT.isVector())
14453 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14454 else
14455 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14456
14457 return std::make_pair(LoVT, HiVT);
14458}
14459
14460/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14461/// type, dependent on an enveloping VT that has been split into two identical
14462/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14463std::pair<EVT, EVT>
14465 bool *HiIsEmpty) const {
14466 EVT EltTp = VT.getVectorElementType();
14467 // Examples:
14468 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14469 // custom VL=9 with enveloping VL=8/8 yields 8/1
14470 // custom VL=10 with enveloping VL=8/8 yields 8/2
14471 // etc.
14472 ElementCount VTNumElts = VT.getVectorElementCount();
14473 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14474 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14475 "Mixing fixed width and scalable vectors when enveloping a type");
14476 EVT LoVT, HiVT;
14477 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14478 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14479 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14480 *HiIsEmpty = false;
14481 } else {
14482 // Flag that hi type has zero storage size, but return split envelop type
14483 // (this would be easier if vector types with zero elements were allowed).
14484 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14485 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14486 *HiIsEmpty = true;
14487 }
14488 return std::make_pair(LoVT, HiVT);
14489}
14490
14491/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14492/// low/high part.
14493std::pair<SDValue, SDValue>
14494SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14495 const EVT &HiVT) {
14496 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14497 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14498 "Splitting vector with an invalid mixture of fixed and scalable "
14499 "vector types");
14501 N.getValueType().getVectorMinNumElements() &&
14502 "More vector elements requested than available!");
14503 SDValue Lo, Hi;
14504 Lo = getExtractSubvector(DL, LoVT, N, 0);
14505 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14506 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14507 // IDX with the runtime scaling factor of the result vector type. For
14508 // fixed-width result vectors, that runtime scaling factor is 1.
14510 return std::make_pair(Lo, Hi);
14511}
14512
14513std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14514 const SDLoc &DL) {
14515 // Split the vector length parameter.
14516 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14517 EVT VT = N.getValueType();
14519 "Expecting the mask to be an evenly-sized vector");
14520 SDValue HalfNumElts = getElementCount(
14522 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14523 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14524 return std::make_pair(Lo, Hi);
14525}
14526
14527/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14529 EVT VT = N.getValueType();
14532 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14533}
14534
14537 unsigned Start, unsigned Count,
14538 EVT EltVT) {
14539 EVT VT = Op.getValueType();
14540 if (Count == 0)
14542 if (EltVT == EVT())
14543 EltVT = VT.getVectorElementType();
14544 SDLoc SL(Op);
14545 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14546 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14547 }
14548}
14549
14550// getAddressSpace - Return the address space this GlobalAddress belongs to.
14552 return getGlobal()->getType()->getAddressSpace();
14553}
14554
14557 return Val.MachineCPVal->getType();
14558 return Val.ConstVal->getType();
14559}
14560
14561bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14562 unsigned &SplatBitSize,
14563 bool &HasAnyUndefs,
14564 unsigned MinSplatBits,
14565 bool IsBigEndian) const {
14566 EVT VT = getValueType(0);
14567 assert(VT.isVector() && "Expected a vector type");
14568 unsigned VecWidth = VT.getSizeInBits();
14569 if (MinSplatBits > VecWidth)
14570 return false;
14571
14572 // FIXME: The widths are based on this node's type, but build vectors can
14573 // truncate their operands.
14574 SplatValue = APInt(VecWidth, 0);
14575 SplatUndef = APInt(VecWidth, 0);
14576
14577 // Get the bits. Bits with undefined values (when the corresponding element
14578 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14579 // in SplatValue. If any of the values are not constant, give up and return
14580 // false.
14581 unsigned int NumOps = getNumOperands();
14582 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14583 unsigned EltWidth = VT.getScalarSizeInBits();
14584
14585 for (unsigned j = 0; j < NumOps; ++j) {
14586 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14587 SDValue OpVal = getOperand(i);
14588 unsigned BitPos = j * EltWidth;
14589
14590 if (OpVal.isUndef())
14591 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14592 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14593 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14594 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14595 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14596 else
14597 return false;
14598 }
14599
14600 // The build_vector is all constants or undefs. Find the smallest element
14601 // size that splats the vector.
14602 HasAnyUndefs = (SplatUndef != 0);
14603
14604 // FIXME: This does not work for vectors with elements less than 8 bits.
14605 while (VecWidth > 8) {
14606 // If we can't split in half, stop here.
14607 if (VecWidth & 1)
14608 break;
14609
14610 unsigned HalfSize = VecWidth / 2;
14611 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14612 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14613 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14614 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14615
14616 // If the two halves do not match (ignoring undef bits), stop here.
14617 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14618 MinSplatBits > HalfSize)
14619 break;
14620
14621 SplatValue = HighValue | LowValue;
14622 SplatUndef = HighUndef & LowUndef;
14623
14624 VecWidth = HalfSize;
14625 }
14626
14627 // FIXME: The loop above only tries to split in halves. But if the input
14628 // vector for example is <3 x i16> it wouldn't be able to detect a
14629 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14630 // optimizations. I guess that back in the days when this helper was created
14631 // vectors normally was power-of-2 sized.
14632
14633 SplatBitSize = VecWidth;
14634 return true;
14635}
14636
14638 BitVector *UndefElements) const {
14639 unsigned NumOps = getNumOperands();
14640 if (UndefElements) {
14641 UndefElements->clear();
14642 UndefElements->resize(NumOps);
14643 }
14644 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14645 if (!DemandedElts)
14646 return SDValue();
14647 SDValue Splatted;
14648 for (unsigned i = 0; i != NumOps; ++i) {
14649 if (!DemandedElts[i])
14650 continue;
14651 SDValue Op = getOperand(i);
14652 if (Op.isUndef()) {
14653 if (UndefElements)
14654 (*UndefElements)[i] = true;
14655 } else if (!Splatted) {
14656 Splatted = Op;
14657 } else if (Splatted != Op) {
14658 return SDValue();
14659 }
14660 }
14661
14662 if (!Splatted) {
14663 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14664 assert(getOperand(FirstDemandedIdx).isUndef() &&
14665 "Can only have a splat without a constant for all undefs.");
14666 return getOperand(FirstDemandedIdx);
14667 }
14668
14669 return Splatted;
14670}
14671
14673 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14674 return getSplatValue(DemandedElts, UndefElements);
14675}
14676
14678 SmallVectorImpl<SDValue> &Sequence,
14679 BitVector *UndefElements) const {
14680 unsigned NumOps = getNumOperands();
14681 Sequence.clear();
14682 if (UndefElements) {
14683 UndefElements->clear();
14684 UndefElements->resize(NumOps);
14685 }
14686 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14687 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14688 return false;
14689
14690 // Set the undefs even if we don't find a sequence (like getSplatValue).
14691 if (UndefElements)
14692 for (unsigned I = 0; I != NumOps; ++I)
14693 if (DemandedElts[I] && getOperand(I).isUndef())
14694 (*UndefElements)[I] = true;
14695
14696 // Iteratively widen the sequence length looking for repetitions.
14697 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14698 Sequence.append(SeqLen, SDValue());
14699 for (unsigned I = 0; I != NumOps; ++I) {
14700 if (!DemandedElts[I])
14701 continue;
14702 SDValue &SeqOp = Sequence[I % SeqLen];
14704 if (Op.isUndef()) {
14705 if (!SeqOp)
14706 SeqOp = Op;
14707 continue;
14708 }
14709 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14710 Sequence.clear();
14711 break;
14712 }
14713 SeqOp = Op;
14714 }
14715 if (!Sequence.empty())
14716 return true;
14717 }
14718
14719 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14720 return false;
14721}
14722
14724 BitVector *UndefElements) const {
14725 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14726 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14727}
14728
14731 BitVector *UndefElements) const {
14733 getSplatValue(DemandedElts, UndefElements));
14734}
14735
14738 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14739}
14740
14743 BitVector *UndefElements) const {
14745 getSplatValue(DemandedElts, UndefElements));
14746}
14747
14752
14753int32_t
14755 uint32_t BitWidth) const {
14756 if (ConstantFPSDNode *CN =
14758 bool IsExact;
14759 APSInt IntVal(BitWidth);
14760 const APFloat &APF = CN->getValueAPF();
14761 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14762 APFloat::opOK ||
14763 !IsExact)
14764 return -1;
14765
14766 return IntVal.exactLogBase2();
14767 }
14768 return -1;
14769}
14770
14772 bool IsLittleEndian, unsigned DstEltSizeInBits,
14773 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14774 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14775 if (!isConstant())
14776 return false;
14777
14778 unsigned NumSrcOps = getNumOperands();
14779 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14780 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14781 "Invalid bitcast scale");
14782
14783 // Extract raw src bits.
14784 SmallVector<APInt> SrcBitElements(NumSrcOps,
14785 APInt::getZero(SrcEltSizeInBits));
14786 BitVector SrcUndeElements(NumSrcOps, false);
14787
14788 for (unsigned I = 0; I != NumSrcOps; ++I) {
14790 if (Op.isUndef()) {
14791 SrcUndeElements.set(I);
14792 continue;
14793 }
14794 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14795 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14796 assert((CInt || CFP) && "Unknown constant");
14797 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14798 : CFP->getValueAPF().bitcastToAPInt();
14799 }
14800
14801 // Recast to dst width.
14802 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14803 SrcBitElements, UndefElements, SrcUndeElements);
14804 return true;
14805}
14806
14807void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14808 unsigned DstEltSizeInBits,
14809 SmallVectorImpl<APInt> &DstBitElements,
14810 ArrayRef<APInt> SrcBitElements,
14811 BitVector &DstUndefElements,
14812 const BitVector &SrcUndefElements) {
14813 unsigned NumSrcOps = SrcBitElements.size();
14814 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14815 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14816 "Invalid bitcast scale");
14817 assert(NumSrcOps == SrcUndefElements.size() &&
14818 "Vector size mismatch");
14819
14820 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14821 DstUndefElements.clear();
14822 DstUndefElements.resize(NumDstOps, false);
14823 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14824
14825 // Concatenate src elements constant bits together into dst element.
14826 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14827 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14828 for (unsigned I = 0; I != NumDstOps; ++I) {
14829 DstUndefElements.set(I);
14830 APInt &DstBits = DstBitElements[I];
14831 for (unsigned J = 0; J != Scale; ++J) {
14832 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14833 if (SrcUndefElements[Idx])
14834 continue;
14835 DstUndefElements.reset(I);
14836 const APInt &SrcBits = SrcBitElements[Idx];
14837 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14838 "Illegal constant bitwidths");
14839 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14840 }
14841 }
14842 return;
14843 }
14844
14845 // Split src element constant bits into dst elements.
14846 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14847 for (unsigned I = 0; I != NumSrcOps; ++I) {
14848 if (SrcUndefElements[I]) {
14849 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14850 continue;
14851 }
14852 const APInt &SrcBits = SrcBitElements[I];
14853 for (unsigned J = 0; J != Scale; ++J) {
14854 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14855 APInt &DstBits = DstBitElements[Idx];
14856 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14857 }
14858 }
14859}
14860
14862 for (const SDValue &Op : op_values()) {
14863 unsigned Opc = Op.getOpcode();
14864 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14865 return false;
14866 }
14867 return true;
14868}
14869
14870std::optional<std::pair<APInt, APInt>>
14872 unsigned NumOps = getNumOperands();
14873 if (NumOps < 2)
14874 return std::nullopt;
14875
14876 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14877 APInt Start, Stride;
14878 int FirstIdx = -1, SecondIdx = -1;
14879
14880 // Find the first two non-undef constant elements to determine Start and
14881 // Stride, then verify all remaining elements match the sequence.
14882 for (unsigned I = 0; I < NumOps; ++I) {
14884 if (Op->isUndef())
14885 continue;
14886 if (!isa<ConstantSDNode>(Op))
14887 return std::nullopt;
14888
14889 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14890 if (FirstIdx < 0) {
14891 FirstIdx = I;
14892 Start = Val;
14893 } else if (SecondIdx < 0) {
14894 SecondIdx = I;
14895 // Compute stride using modular arithmetic. Simple division would handle
14896 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14897 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14898 // Note that modular arithmetic is agnostic to signed/unsigned.
14899 unsigned IdxDiff = I - FirstIdx;
14900 APInt ValDiff = Val - Start;
14901
14902 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14903 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14904 if (ValDiff.countr_zero() < CommonPow2Bits)
14905 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14906 IdxDiff >>= CommonPow2Bits;
14907 ValDiff.lshrInPlace(CommonPow2Bits);
14908
14909 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14910 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14911 // one, but we could try all candidates to handle more cases.
14912 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14913 if (Stride.isZero())
14914 return std::nullopt;
14915
14916 // Step 3: Adjust Start based on the first defined element's index.
14917 Start -= Stride * FirstIdx;
14918 } else {
14919 // Verify this element matches the sequence.
14920 if (Val != Start + Stride * I)
14921 return std::nullopt;
14922 }
14923 }
14924
14925 // Need at least two defined elements.
14926 if (SecondIdx < 0)
14927 return std::nullopt;
14928
14929 return std::make_pair(Start, Stride);
14930}
14931
14933 // Find the first non-undef value in the shuffle mask.
14934 unsigned i, e;
14935 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14936 /* search */;
14937
14938 // If all elements are undefined, this shuffle can be considered a splat
14939 // (although it should eventually get simplified away completely).
14940 if (i == e)
14941 return true;
14942
14943 // Make sure all remaining elements are either undef or the same as the first
14944 // non-undef value.
14945 for (int Idx = Mask[i]; i != e; ++i)
14946 if (Mask[i] >= 0 && Mask[i] != Idx)
14947 return false;
14948 return true;
14949}
14950
14951// Returns true if it is a constant integer BuildVector or constant integer,
14952// possibly hidden by a bitcast.
14954 SDValue N, bool AllowOpaques) const {
14956
14957 if (auto *C = dyn_cast<ConstantSDNode>(N))
14958 return AllowOpaques || !C->isOpaque();
14959
14961 return true;
14962
14963 // Treat a GlobalAddress supporting constant offset folding as a
14964 // constant integer.
14965 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14966 if (GA->getOpcode() == ISD::GlobalAddress &&
14967 TLI->isOffsetFoldingLegal(GA))
14968 return true;
14969
14970 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14971 isa<ConstantSDNode>(N.getOperand(0)))
14972 return true;
14973 return false;
14974}
14975
14976// Returns true if it is a constant float BuildVector or constant float.
14979 return true;
14980
14982 return true;
14983
14984 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14985 isa<ConstantFPSDNode>(N.getOperand(0)))
14986 return true;
14987
14988 return false;
14989}
14990
14991std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
14992 ConstantSDNode *Const =
14993 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
14994 if (!Const)
14995 return std::nullopt;
14996
14997 EVT VT = N->getValueType(0);
14998 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
14999 switch (TLI->getBooleanContents(N.getValueType())) {
15001 if (CVal.isOne())
15002 return true;
15003 if (CVal.isZero())
15004 return false;
15005 return std::nullopt;
15007 if (CVal.isAllOnes())
15008 return true;
15009 if (CVal.isZero())
15010 return false;
15011 return std::nullopt;
15013 return CVal[0];
15014 }
15015 llvm_unreachable("Unknown BooleanContent enum");
15016}
15017
15018void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15019 assert(!Node->OperandList && "Node already has operands");
15021 "too many operands to fit into SDNode");
15022 SDUse *Ops = OperandRecycler.allocate(
15023 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15024
15025 bool IsDivergent = false;
15026 for (unsigned I = 0; I != Vals.size(); ++I) {
15027 Ops[I].setUser(Node);
15028 Ops[I].setInitial(Vals[I]);
15029 EVT VT = Ops[I].getValueType();
15030
15031 // Skip Chain. It does not carry divergence.
15032 if (VT != MVT::Other &&
15033 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15034 Ops[I].getNode()->isDivergent()) {
15035 IsDivergent = true;
15036 }
15037 }
15038 Node->NumOperands = Vals.size();
15039 Node->OperandList = Ops;
15040 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15041 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15042 Node->SDNodeBits.IsDivergent = IsDivergent;
15043 }
15044 checkForCycles(Node);
15045}
15046
15049 size_t Limit = SDNode::getMaxNumOperands();
15050 while (Vals.size() > Limit) {
15051 unsigned SliceIdx = Vals.size() - Limit;
15052 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15053 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15054 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15055 Vals.emplace_back(NewTF);
15056 }
15057 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15058}
15059
15061 EVT VT, SDNodeFlags Flags) {
15062 switch (Opcode) {
15063 default:
15064 return SDValue();
15065 case ISD::ADD:
15066 case ISD::OR:
15067 case ISD::XOR:
15068 case ISD::UMAX:
15069 return getConstant(0, DL, VT);
15070 case ISD::MUL:
15071 return getConstant(1, DL, VT);
15072 case ISD::AND:
15073 case ISD::UMIN:
15074 return getAllOnesConstant(DL, VT);
15075 case ISD::SMAX:
15077 case ISD::SMIN:
15079 case ISD::FADD:
15080 // If flags allow, prefer positive zero since it's generally cheaper
15081 // to materialize on most targets.
15082 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15083 case ISD::FMUL:
15084 return getConstantFP(1.0, DL, VT);
15085 case ISD::FMINNUM:
15086 case ISD::FMAXNUM: {
15087 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
15088 const fltSemantics &Semantics = VT.getFltSemantics();
15089 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15090 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15091 APFloat::getLargest(Semantics);
15092 if (Opcode == ISD::FMAXNUM)
15093 NeutralAF.changeSign();
15094
15095 return getConstantFP(NeutralAF, DL, VT);
15096 }
15097 case ISD::FMINIMUM:
15098 case ISD::FMAXIMUM: {
15099 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15100 const fltSemantics &Semantics = VT.getFltSemantics();
15101 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15102 : APFloat::getLargest(Semantics);
15103 if (Opcode == ISD::FMAXIMUM)
15104 NeutralAF.changeSign();
15105
15106 return getConstantFP(NeutralAF, DL, VT);
15107 }
15108
15109 }
15110}
15111
15113 SDValue Acc, SDValue LHS,
15114 SDValue RHS) {
15115 EVT AccVT = Acc.getValueType();
15116 if (AccVT.isFloatingPoint()) {
15117 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15118 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15119 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15120 }
15122 "Unexpected opcode");
15123 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15124 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15125 return getNegative(MLA, DL, AccVT);
15126}
15127
15128/// Helper used to make a call to a library function that has one argument of
15129/// pointer type.
15130///
15131/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15132/// used to get or set floating-point state. They have one argument of pointer
15133/// type, which points to the memory region containing bits of the
15134/// floating-point state. The value returned by such function is ignored in the
15135/// created call.
15136///
15137/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15138/// \param Ptr Pointer used to save/load state.
15139/// \param InChain Ingoing token chain.
15140/// \returns Outgoing chain token.
15142 SDValue InChain,
15143 const SDLoc &DLoc) {
15144 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15146 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15147 RTLIB::LibcallImpl LibcallImpl =
15148 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15149 if (LibcallImpl == RTLIB::Unsupported)
15150 reportFatalUsageError("emitting call to unsupported libcall");
15151
15152 SDValue Callee =
15153 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15155 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15156 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15157 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15158 return TLI->LowerCallTo(CLI).second;
15159}
15160
15162 assert(From && To && "Invalid SDNode; empty source SDValue?");
15163 auto I = SDEI.find(From);
15164 if (I == SDEI.end())
15165 return;
15166
15167 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15168 // the iterator, hence the need to make a copy to prevent a use-after-free.
15169 NodeExtraInfo NEI = I->second;
15170 if (LLVM_LIKELY(!NEI.PCSections)) {
15171 // No deep copy required for the types of extra info set.
15172 //
15173 // FIXME: Investigate if other types of extra info also need deep copy. This
15174 // depends on the types of nodes they can be attached to: if some extra info
15175 // is only ever attached to nodes where a replacement To node is always the
15176 // node where later use and propagation of the extra info has the intended
15177 // semantics, no deep copy is required.
15178 SDEI[To] = std::move(NEI);
15179 return;
15180 }
15181
15182 const SDNode *EntrySDN = getEntryNode().getNode();
15183
15184 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15185 // through the replacement of From with To. Otherwise, replacements of a node
15186 // (From) with more complex nodes (To and its operands) may result in lost
15187 // extra info where the root node (To) is insignificant in further propagating
15188 // and using extra info when further lowering to MIR.
15189 //
15190 // In the first step pre-populate the visited set with the nodes reachable
15191 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15192 // DAG that is not new and should be left untouched.
15193 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15194 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15195 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15196 if (MaxDepth == 0) {
15197 // Remember this node in case we need to increase MaxDepth and continue
15198 // populating FromReach from this node.
15199 Leafs.emplace_back(N);
15200 return;
15201 }
15202 if (!FromReach.insert(N).second)
15203 return;
15204 for (const SDValue &Op : N->op_values())
15205 Self(Self, Op.getNode(), MaxDepth - 1);
15206 };
15207
15208 // Copy extra info to To and all its transitive operands (that are new).
15210 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15211 if (FromReach.contains(N))
15212 return true;
15213 if (!Visited.insert(N).second)
15214 return true;
15215 if (EntrySDN == N)
15216 return false;
15217 for (const SDValue &Op : N->op_values()) {
15218 if (N == To && Op.getNode() == EntrySDN) {
15219 // Special case: New node's operand is the entry node; just need to
15220 // copy extra info to new node.
15221 break;
15222 }
15223 if (!Self(Self, Op.getNode()))
15224 return false;
15225 }
15226 // Copy only if entry node was not reached.
15227 SDEI[N] = std::move(NEI);
15228 return true;
15229 };
15230
15231 // We first try with a lower MaxDepth, assuming that the path to common
15232 // operands between From and To is relatively short. This significantly
15233 // improves performance in the common case. The initial MaxDepth is big
15234 // enough to avoid retry in the common case; the last MaxDepth is large
15235 // enough to avoid having to use the fallback below (and protects from
15236 // potential stack exhaustion from recursion).
15237 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15238 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15239 // StartFrom is the previous (or initial) set of leafs reachable at the
15240 // previous maximum depth.
15242 std::swap(StartFrom, Leafs);
15243 for (const SDNode *N : StartFrom)
15244 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15245 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15246 return;
15247 // This should happen very rarely (reached the entry node).
15248 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15249 assert(!Leafs.empty());
15250 }
15251
15252 // This should not happen - but if it did, that means the subgraph reachable
15253 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15254 // could not visit all reachable common operands. Consequently, we were able
15255 // to reach the entry node.
15256 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15257 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15258 // Best-effort fallback if assertions disabled.
15259 SDEI[To] = std::move(NEI);
15260}
15261
15262#ifndef NDEBUG
15263static void checkForCyclesHelper(const SDNode *N,
15266 const llvm::SelectionDAG *DAG) {
15267 // If this node has already been checked, don't check it again.
15268 if (Checked.count(N))
15269 return;
15270
15271 // If a node has already been visited on this depth-first walk, reject it as
15272 // a cycle.
15273 if (!Visited.insert(N).second) {
15274 errs() << "Detected cycle in SelectionDAG\n";
15275 dbgs() << "Offending node:\n";
15276 N->dumprFull(DAG); dbgs() << "\n";
15277 abort();
15278 }
15279
15280 for (const SDValue &Op : N->op_values())
15281 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15282
15283 Checked.insert(N);
15284 Visited.erase(N);
15285}
15286#endif
15287
15289 const llvm::SelectionDAG *DAG,
15290 bool force) {
15291#ifndef NDEBUG
15292 bool check = force;
15293#ifdef EXPENSIVE_CHECKS
15294 check = true;
15295#endif // EXPENSIVE_CHECKS
15296 if (check) {
15297 assert(N && "Checking nonexistent SDNode");
15300 checkForCyclesHelper(N, visited, checked, DAG);
15301 }
15302#endif // !NDEBUG
15303}
15304
15305void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15306 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15307}
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
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
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:603
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:337
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static MaybeAlign getAlign(Value *Ptr)
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static constexpr Value * getValue(Ty &ValueOrUse)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
static bool isConstantSplatVector(SDValue N, APInt &SplatValue, unsigned MinSizeInBits)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
const char * Msg
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF, SelectionDAG &DAG)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static 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 getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
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"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:297
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:335
static constexpr roundingMode rmTowardZero
Definition APFloat.h:349
static const fltSemantics & BFloat()
Definition APFloat.h:296
static const fltSemantics & IEEEquad()
Definition APFloat.h:299
static const fltSemantics & IEEEdouble()
Definition APFloat.h:298
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:348
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:345
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:347
static const fltSemantics & IEEEhalf()
Definition APFloat.h:295
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:361
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1206
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1294
void copySign(const APFloat &RHS)
Definition APFloat.h:1388
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5920
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1276
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1267
bool isFinite() const
Definition APFloat.h:1570
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1433
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1285
bool isZero() const
Definition APFloat.h:1561
LLVM_READONLY bool isOne() const
Definition APFloat.h:1643
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1224
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1418
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1184
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1312
bool isPosZero() const
Definition APFloat.h:1576
bool isNegZero() const
Definition APFloat.h:1577
void changeSign()
Definition APFloat.h:1383
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1195
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2006
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2090
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
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:1431
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1695
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1076
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1537
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1355
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2061
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:1191
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:1692
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1120
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:1670
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1197
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:790
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:1175
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1653
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1623
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:652
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:2121
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2135
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1084
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:1184
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:398
unsigned logBase2() const
Definition APInt.h:1786
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2071
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1300
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1771
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:1159
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1028
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1392
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:768
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1266
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:1442
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:483
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1246
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:1230
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2080
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
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()
Reset all bits in the bitvector.
Definition BitVector.h:409
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
bool none() const
Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1088
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static LLVM_ABI void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:126
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
const char * getSymbol() const
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:208
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:685
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:328
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.
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
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
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
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 bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
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, in exactly one operand.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue 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 bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue 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 ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI 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 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,...
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue getIdentityElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) identity element for the given opcode, if it exists.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
LLVM_ABI std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
allnodes_const_iterator allnodes_begin() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getPartialReduceMLS(unsigned Opc, const SDLoc &DL, SDValue Acc, SDValue LHS, SDValue RHS)
Get an expression that implements a partial multiply-subtract reduction.
LLVM_ABI SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
LLVM_ABI SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(SDValue Op, bool ForSigned, unsigned Depth=0) const
Combine constant ranges from computeConstantRange() and computeKnownBits().
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
LLVM_ABI SDValue 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 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 void dump() const
Dump the textual format of this DAG.
LLVM_ABI bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
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 KnownFPClass computeKnownFPClass(SDValue Op, FPClassTest InterestedClasses, unsigned Depth=0) const
Determine floating-point class information about Op.
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue 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.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue 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 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)
DenormalMode getDenormalMode(EVT VT) const
Return the current function's default denormal handling kind for the given floating point type.
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp, ArrayRef< ISD::NodeType > CandidateBinOps, bool AllowPartials=false)
Match a binop + shuffle pyramid that represents a horizontal reduction over the elements of a vector ...
LLVM_ABI bool isADDLike(SDValue Op, bool NoWrap=false) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
LLVM_ABI SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
LLVM_ABI void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits=0, unsigned SizeInBits=0, bool InvalidateDbg=true)
Transfer debug values from one node to another, while optionally generating fragment expressions for ...
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
ilist< SDNode >::iterator allnodes_iterator
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
int getMaskElt(unsigned Idx) const
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
static LLVM_ABI bool isSplatMask(ArrayRef< int > Mask)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
virtual bool shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
BooleanContent
Enum that describes how the target represents true/false values.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
std::vector< ArgListEntry > ArgListTy
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
Primary interface to the complete machine description for the target machine.
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:720
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:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
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:232
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:36
LLVM_ABI void set(Value *Val)
Definition Value.h:874
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:255
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.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:3232
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3162
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3149
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3139
LLVM_ABI APInt pext(const APInt &Val, const APInt &Mask)
Perform a "compress" operation, also known as pext or bext.
Definition APInt.cpp:3242
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3213
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3154
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:3222
LLVM_ABI APInt pdep(const APInt &Val, const APInt &Mask)
Perform an "expand" operation, also known as pdep or bdep.
Definition APInt.cpp:3252
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2299
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3204
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:3040
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3237
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2304
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3134
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3144
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
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ 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:829
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:513
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:540
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:602
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:524
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:749
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:920
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:530
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:717
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:667
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:883
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:837
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:693
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:802
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:706
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:651
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:616
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:821
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:655
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:909
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:898
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:785
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:502
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:507
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:737
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:683
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:701
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:931
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:955
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:843
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:881
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:885
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isBitwiseLogicOp(unsigned Opcode)
Whether this is bitwise logic opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
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)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
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:383
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:573
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
LLVM_ABI ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1572
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1783
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:633
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1554
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:1695
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1738
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:1769
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:209
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h: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
bool includesPoison(UndefPoisonKind Kind)
Returns true if Kind includes the Poison bit.
Definition UndefPoison.h:27
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool includesUndef(UndefPoisonKind Kind)
Returns true if Kind includes the Undef bit.
Definition UndefPoison.h:33
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1719
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
IntPtrTy
Definition InstrProf.h:82
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
constexpr unsigned BitWidth
LLVM_ABI bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h: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:1756
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1796
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h: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:862
#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:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:543
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:176
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits pdep(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pdep(Val, Mask).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
static LLVM_ABI KnownBits pext(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pext(Val, Mask).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static 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)