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:
3011 case ISD::TRUNCATE:
3012 case ISD::SIGN_EXTEND:
3013 case ISD::ZERO_EXTEND:
3014 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3015 default:
3016 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3017 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3018 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3019 Depth);
3020 break;
3021 }
3022
3023 // We don't support other cases than those above for scalable vectors at
3024 // the moment.
3025 if (VT.isScalableVector())
3026 return false;
3027
3028 unsigned NumElts = VT.getVectorNumElements();
3029 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3030 UndefElts = APInt::getZero(NumElts);
3031
3032 switch (Opcode) {
3033 case ISD::BUILD_VECTOR: {
3034 SDValue Scl;
3035 for (unsigned i = 0; i != NumElts; ++i) {
3036 SDValue Op = V.getOperand(i);
3037 if (Op.isUndef()) {
3038 UndefElts.setBit(i);
3039 continue;
3040 }
3041 if (!DemandedElts[i])
3042 continue;
3043 if (Scl && Scl != Op)
3044 return false;
3045 Scl = Op;
3046 }
3047 return true;
3048 }
3049 case ISD::VECTOR_SHUFFLE: {
3050 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3051 APInt DemandedLHS = APInt::getZero(NumElts);
3052 APInt DemandedRHS = APInt::getZero(NumElts);
3053 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3054 for (int i = 0; i != (int)NumElts; ++i) {
3055 int M = Mask[i];
3056 if (M < 0) {
3057 UndefElts.setBit(i);
3058 continue;
3059 }
3060 if (!DemandedElts[i])
3061 continue;
3062 if (M < (int)NumElts)
3063 DemandedLHS.setBit(M);
3064 else
3065 DemandedRHS.setBit(M - NumElts);
3066 }
3067
3068 // If we aren't demanding either op, assume there's no splat.
3069 // If we are demanding both ops, assume there's no splat.
3070 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3071 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3072 return false;
3073
3074 // See if the demanded elts of the source op is a splat or we only demand
3075 // one element, which should always be a splat.
3076 // TODO: Handle source ops splats with undefs.
3077 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3078 APInt SrcUndefs;
3079 return (SrcElts.popcount() == 1) ||
3080 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3081 (SrcElts & SrcUndefs).isZero());
3082 };
3083 if (!DemandedLHS.isZero())
3084 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3085 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3086 }
3088 // Offset the demanded elts by the subvector index.
3089 SDValue Src = V.getOperand(0);
3090 // We don't support scalable vectors at the moment.
3091 if (Src.getValueType().isScalableVector())
3092 return false;
3093 uint64_t Idx = V.getConstantOperandVal(1);
3094 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3095 APInt UndefSrcElts;
3096 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3097 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3098 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3099 return true;
3100 }
3101 break;
3102 }
3106 // Widen the demanded elts by the src element count.
3107 SDValue Src = V.getOperand(0);
3108 // We don't support scalable vectors at the moment.
3109 if (Src.getValueType().isScalableVector())
3110 return false;
3111 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3112 APInt UndefSrcElts;
3113 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3114 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3115 UndefElts = UndefSrcElts.trunc(NumElts);
3116 return true;
3117 }
3118 break;
3119 }
3120 case ISD::BITCAST: {
3121 SDValue Src = V.getOperand(0);
3122 EVT SrcVT = Src.getValueType();
3123 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3124 unsigned BitWidth = VT.getScalarSizeInBits();
3125
3126 // Ignore bitcasts from unsupported types.
3127 // TODO: Add fp support?
3128 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3129 break;
3130
3131 // Bitcast 'small element' vector to 'large element' vector.
3132 if ((BitWidth % SrcBitWidth) == 0) {
3133 // See if each sub element is a splat.
3134 unsigned Scale = BitWidth / SrcBitWidth;
3135 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3136 APInt ScaledDemandedElts =
3137 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3138 for (unsigned I = 0; I != Scale; ++I) {
3139 APInt SubUndefElts;
3140 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3141 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3142 SubDemandedElts &= ScaledDemandedElts;
3143 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3144 return false;
3145 // TODO: Add support for merging sub undef elements.
3146 if (!SubUndefElts.isZero())
3147 return false;
3148 }
3149 return true;
3150 }
3151 break;
3152 }
3153 }
3154
3155 return false;
3156}
3157
3158/// Helper wrapper to main isSplatValue function.
3159bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3160 EVT VT = V.getValueType();
3161 assert(VT.isVector() && "Vector type expected");
3162
3163 APInt UndefElts;
3164 // Since the number of lanes in a scalable vector is unknown at compile time,
3165 // we track one bit which is implicitly broadcast to all lanes. This means
3166 // that all lanes in a scalable vector are considered demanded.
3167 APInt DemandedElts
3169 return isSplatValue(V, DemandedElts, UndefElts) &&
3170 (AllowUndefs || !UndefElts);
3171}
3172
3175
3176 EVT VT = V.getValueType();
3177 unsigned Opcode = V.getOpcode();
3178 switch (Opcode) {
3179 default: {
3180 APInt UndefElts;
3181 // Since the number of lanes in a scalable vector is unknown at compile time,
3182 // we track one bit which is implicitly broadcast to all lanes. This means
3183 // that all lanes in a scalable vector are considered demanded.
3184 APInt DemandedElts
3186
3187 if (isSplatValue(V, DemandedElts, UndefElts)) {
3188 if (VT.isScalableVector()) {
3189 // DemandedElts and UndefElts are ignored for scalable vectors, since
3190 // the only supported cases are SPLAT_VECTOR nodes.
3191 SplatIdx = 0;
3192 } else {
3193 // Handle case where all demanded elements are UNDEF.
3194 if (DemandedElts.isSubsetOf(UndefElts)) {
3195 SplatIdx = 0;
3196 return getUNDEF(VT);
3197 }
3198 SplatIdx = (UndefElts & DemandedElts).countr_one();
3199 }
3200 return V;
3201 }
3202 break;
3203 }
3204 case ISD::SPLAT_VECTOR:
3205 SplatIdx = 0;
3206 return V;
3207 case ISD::VECTOR_SHUFFLE: {
3208 assert(!VT.isScalableVector());
3209 // Check if this is a shuffle node doing a splat.
3210 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3211 // getTargetVShiftNode currently struggles without the splat source.
3212 auto *SVN = cast<ShuffleVectorSDNode>(V);
3213 if (!SVN->isSplat())
3214 break;
3215 int Idx = SVN->getSplatIndex();
3216 int NumElts = V.getValueType().getVectorNumElements();
3217 SplatIdx = Idx % NumElts;
3218 return V.getOperand(Idx / NumElts);
3219 }
3220 }
3221
3222 return SDValue();
3223}
3224
3226 int SplatIdx;
3227 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3228 EVT SVT = SrcVector.getValueType().getScalarType();
3229 EVT LegalSVT = SVT;
3230 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3231 if (!SVT.isInteger())
3232 return SDValue();
3233 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3234 if (LegalSVT.bitsLT(SVT))
3235 return SDValue();
3236 }
3237 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3238 }
3239 return SDValue();
3240}
3241
3242std::optional<ConstantRange>
3244 unsigned Depth) const {
3245 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3246 V.getOpcode() == ISD::SRA) &&
3247 "Unknown shift node");
3248 // Shifting more than the bitwidth is not valid.
3249 unsigned BitWidth = V.getScalarValueSizeInBits();
3250
3251 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3252 const APInt &ShAmt = Cst->getAPIntValue();
3253 if (ShAmt.uge(BitWidth))
3254 return std::nullopt;
3255 return ConstantRange(ShAmt);
3256 }
3257
3258 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3259 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3260 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3261 if (!DemandedElts[i])
3262 continue;
3263 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3264 if (!SA) {
3265 MinAmt = MaxAmt = nullptr;
3266 break;
3267 }
3268 const APInt &ShAmt = SA->getAPIntValue();
3269 if (ShAmt.uge(BitWidth))
3270 return std::nullopt;
3271 if (!MinAmt || MinAmt->ugt(ShAmt))
3272 MinAmt = &ShAmt;
3273 if (!MaxAmt || MaxAmt->ult(ShAmt))
3274 MaxAmt = &ShAmt;
3275 }
3276 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3277 "Failed to find matching min/max shift amounts");
3278 if (MinAmt && MaxAmt)
3279 return ConstantRange(*MinAmt, *MaxAmt + 1);
3280 }
3281
3282 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3283 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3284 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3285 if (KnownAmt.getMaxValue().ult(BitWidth))
3286 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3287
3288 return std::nullopt;
3289}
3290
3291std::optional<unsigned>
3293 unsigned Depth) const {
3294 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3295 V.getOpcode() == ISD::SRA) &&
3296 "Unknown shift node");
3297 if (std::optional<ConstantRange> AmtRange =
3298 getValidShiftAmountRange(V, DemandedElts, Depth))
3299 if (const APInt *ShAmt = AmtRange->getSingleElement())
3300 return ShAmt->getZExtValue();
3301 return std::nullopt;
3302}
3303
3304std::optional<unsigned>
3306 APInt DemandedElts = getDemandAllEltsMask(V);
3307 return getValidShiftAmount(V, DemandedElts, Depth);
3308}
3309
3310std::optional<unsigned>
3312 unsigned Depth) const {
3313 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3314 V.getOpcode() == ISD::SRA) &&
3315 "Unknown shift node");
3316 if (std::optional<ConstantRange> AmtRange =
3317 getValidShiftAmountRange(V, DemandedElts, Depth))
3318 return AmtRange->getUnsignedMin().getZExtValue();
3319 return std::nullopt;
3320}
3321
3322std::optional<unsigned>
3324 APInt DemandedElts = getDemandAllEltsMask(V);
3325 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3326}
3327
3328std::optional<unsigned>
3330 unsigned Depth) const {
3331 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3332 V.getOpcode() == ISD::SRA) &&
3333 "Unknown shift node");
3334 if (std::optional<ConstantRange> AmtRange =
3335 getValidShiftAmountRange(V, DemandedElts, Depth))
3336 return AmtRange->getUnsignedMax().getZExtValue();
3337 return std::nullopt;
3338}
3339
3340std::optional<unsigned>
3342 APInt DemandedElts = getDemandAllEltsMask(V);
3343 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3344}
3345
3346/// Determine which bits of Op are known to be either zero or one and return
3347/// them in Known. For vectors, the known bits are those that are shared by
3348/// every vector element.
3350 APInt DemandedElts = getDemandAllEltsMask(Op);
3351 return computeKnownBits(Op, DemandedElts, Depth);
3352}
3353
3354/// Determine which bits of Op are known to be either zero or one and return
3355/// them in Known. The DemandedElts argument allows us to only collect the known
3356/// bits that are shared by the requested vector elements.
3358 unsigned Depth) const {
3359 unsigned BitWidth = Op.getScalarValueSizeInBits();
3360
3361 KnownBits Known(BitWidth); // Don't know anything.
3362
3363 if (auto OptAPInt = Op->bitcastToAPInt()) {
3364 // We know all of the bits for a constant!
3365 return KnownBits::makeConstant(*std::move(OptAPInt));
3366 }
3367
3368 if (Depth >= MaxRecursionDepth)
3369 return Known; // Limit search depth.
3370
3371 KnownBits Known2;
3372 unsigned NumElts = DemandedElts.getBitWidth();
3373 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3374 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3375 assert((!Op.getValueType().isFixedLengthVector() ||
3376 NumElts == Op.getValueType().getVectorNumElements()) &&
3377 "Unexpected vector size");
3378
3379 if (!DemandedElts)
3380 return Known; // No demanded elts, better to assume we don't know anything.
3381
3382 unsigned Opcode = Op.getOpcode();
3383 switch (Opcode) {
3384 case ISD::MERGE_VALUES:
3385 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3386 Depth + 1);
3387 case ISD::SPLAT_VECTOR: {
3388 SDValue SrcOp = Op.getOperand(0);
3389 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3390 "Expected SPLAT_VECTOR implicit truncation");
3391 // Implicitly truncate the bits to match the official semantics of
3392 // SPLAT_VECTOR.
3393 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
3394 break;
3395 }
3397 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3398 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3399 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3400 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3401 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3402 }
3403 break;
3404 }
3405 case ISD::STEP_VECTOR: {
3406 const APInt &Step = Op.getConstantOperandAPInt(0);
3407
3408 if (Step.isPowerOf2())
3409 Known.Zero.setLowBits(Step.logBase2());
3410
3412
3413 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3414 break;
3415 const APInt MinNumElts =
3416 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3417
3418 bool Overflow;
3419 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3421 .umul_ov(MinNumElts, Overflow);
3422 if (Overflow)
3423 break;
3424
3425 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3426 if (Overflow)
3427 break;
3428
3429 Known.Zero.setHighBits(MaxValue.countl_zero());
3430 break;
3431 }
3432 case ISD::BUILD_VECTOR:
3433 assert(!Op.getValueType().isScalableVector());
3434 // Collect the known bits that are shared by every demanded vector element.
3435 Known.setAllConflict();
3436 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3437 if (!DemandedElts[i])
3438 continue;
3439
3440 SDValue SrcOp = Op.getOperand(i);
3441 Known2 = computeKnownBits(SrcOp, Depth + 1);
3442
3443 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3444 if (SrcOp.getValueSizeInBits() != BitWidth) {
3445 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3446 "Expected BUILD_VECTOR implicit truncation");
3447 Known2 = Known2.trunc(BitWidth);
3448 }
3449
3450 // Known bits are the values that are shared by every demanded element.
3451 Known = Known.intersectWith(Known2);
3452
3453 // If we don't know any bits, early out.
3454 if (Known.isUnknown())
3455 break;
3456 }
3457 break;
3458 case ISD::VECTOR_COMPRESS: {
3459 SDValue Vec = Op.getOperand(0);
3460 SDValue PassThru = Op.getOperand(2);
3461 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3462 // If we don't know any bits, early out.
3463 if (Known.isUnknown())
3464 break;
3465 Known2 = computeKnownBits(Vec, Depth + 1);
3466 Known = Known.intersectWith(Known2);
3467 break;
3468 }
3469 case ISD::VECTOR_SHUFFLE: {
3470 assert(!Op.getValueType().isScalableVector());
3471 // Collect the known bits that are shared by every vector element referenced
3472 // by the shuffle.
3473 APInt DemandedLHS, DemandedRHS;
3475 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3476 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3477 DemandedLHS, DemandedRHS))
3478 break;
3479
3480 // Known bits are the values that are shared by every demanded element.
3481 Known.setAllConflict();
3482 if (!!DemandedLHS) {
3483 SDValue LHS = Op.getOperand(0);
3484 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3485 Known = Known.intersectWith(Known2);
3486 }
3487 // If we don't know any bits, early out.
3488 if (Known.isUnknown())
3489 break;
3490 if (!!DemandedRHS) {
3491 SDValue RHS = Op.getOperand(1);
3492 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3493 Known = Known.intersectWith(Known2);
3494 }
3495 break;
3496 }
3497 case ISD::VSCALE: {
3499 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3500 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
3501 break;
3502 }
3503 case ISD::CONCAT_VECTORS: {
3504 if (Op.getValueType().isScalableVector())
3505 break;
3506 // Split DemandedElts and test each of the demanded subvectors.
3507 Known.setAllConflict();
3508 EVT SubVectorVT = Op.getOperand(0).getValueType();
3509 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3510 unsigned NumSubVectors = Op.getNumOperands();
3511 for (unsigned i = 0; i != NumSubVectors; ++i) {
3512 APInt DemandedSub =
3513 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3514 if (!!DemandedSub) {
3515 SDValue Sub = Op.getOperand(i);
3516 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3517 Known = Known.intersectWith(Known2);
3518 }
3519 // If we don't know any bits, early out.
3520 if (Known.isUnknown())
3521 break;
3522 }
3523 break;
3524 }
3525 case ISD::INSERT_SUBVECTOR: {
3526 if (Op.getValueType().isScalableVector())
3527 break;
3528 // Demand any elements from the subvector and the remainder from the src its
3529 // inserted into.
3530 SDValue Src = Op.getOperand(0);
3531 SDValue Sub = Op.getOperand(1);
3532 uint64_t Idx = Op.getConstantOperandVal(2);
3533 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3534 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3535 APInt DemandedSrcElts = DemandedElts;
3536 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3537
3538 Known.setAllConflict();
3539 if (!!DemandedSubElts) {
3540 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3541 if (Known.isUnknown())
3542 break; // early-out.
3543 }
3544 if (!!DemandedSrcElts) {
3545 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3546 Known = Known.intersectWith(Known2);
3547 }
3548 break;
3549 }
3551 // Offset the demanded elts by the subvector index.
3552 SDValue Src = Op.getOperand(0);
3553
3554 APInt DemandedSrcElts;
3555 if (Src.getValueType().isScalableVector())
3556 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3557 else {
3558 uint64_t Idx = Op.getConstantOperandVal(1);
3559 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3560 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3561 }
3562 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3563 break;
3564 }
3565 case ISD::SCALAR_TO_VECTOR: {
3566 if (Op.getValueType().isScalableVector())
3567 break;
3568 // We know about scalar_to_vector as much as we know about it source,
3569 // which becomes the first element of otherwise unknown vector.
3570 if (DemandedElts != 1)
3571 break;
3572
3573 SDValue N0 = Op.getOperand(0);
3574 Known = computeKnownBits(N0, Depth + 1);
3575 if (N0.getValueSizeInBits() != BitWidth)
3576 Known = Known.trunc(BitWidth);
3577
3578 break;
3579 }
3580 case ISD::BITCAST: {
3581 if (Op.getValueType().isScalableVector())
3582 break;
3583
3584 SDValue N0 = Op.getOperand(0);
3585 EVT SubVT = N0.getValueType();
3586 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3587
3588 // Ignore bitcasts from unsupported types.
3589 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3590 break;
3591
3592 // Fast handling of 'identity' bitcasts.
3593 if (BitWidth == SubBitWidth) {
3594 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3595 break;
3596 }
3597
3598 bool IsLE = getDataLayout().isLittleEndian();
3599
3600 // Bitcast 'small element' vector to 'large element' scalar/vector.
3601 if ((BitWidth % SubBitWidth) == 0) {
3602 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3603
3604 // Collect known bits for the (larger) output by collecting the known
3605 // bits from each set of sub elements and shift these into place.
3606 // We need to separately call computeKnownBits for each set of
3607 // sub elements as the knownbits for each is likely to be different.
3608 unsigned SubScale = BitWidth / SubBitWidth;
3609 APInt SubDemandedElts(NumElts * SubScale, 0);
3610 for (unsigned i = 0; i != NumElts; ++i)
3611 if (DemandedElts[i])
3612 SubDemandedElts.setBit(i * SubScale);
3613
3614 for (unsigned i = 0; i != SubScale; ++i) {
3615 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3616 Depth + 1);
3617 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3618 Known.insertBits(Known2, SubBitWidth * Shifts);
3619 }
3620 }
3621
3622 // Bitcast 'large element' scalar/vector to 'small element' vector.
3623 if ((SubBitWidth % BitWidth) == 0) {
3624 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3625
3626 // Collect known bits for the (smaller) output by collecting the known
3627 // bits from the overlapping larger input elements and extracting the
3628 // sub sections we actually care about.
3629 unsigned SubScale = SubBitWidth / BitWidth;
3630 APInt SubDemandedElts =
3631 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3632 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3633
3634 Known.setAllConflict();
3635 for (unsigned i = 0; i != NumElts; ++i)
3636 if (DemandedElts[i]) {
3637 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3638 unsigned Offset = (Shifts % SubScale) * BitWidth;
3639 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3640 // If we don't know any bits, early out.
3641 if (Known.isUnknown())
3642 break;
3643 }
3644 }
3645 break;
3646 }
3647 case ISD::AND:
3648 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3649 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3650
3651 Known &= Known2;
3652 break;
3653 case ISD::OR:
3654 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3655 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3656
3657 Known |= Known2;
3658 break;
3659 case ISD::XOR:
3660 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3661 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3662
3663 Known ^= Known2;
3664 break;
3665 case ISD::MUL: {
3666 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3667 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3668 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3669 // TODO: SelfMultiply can be poison, but not undef.
3670 if (SelfMultiply)
3671 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3672 Op.getOperand(0), DemandedElts, UndefPoisonKind::UndefOrPoison,
3673 Depth + 1);
3674 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3675
3676 // If the multiplication is known not to overflow, the product of a number
3677 // with itself is non-negative. Only do this if we didn't already computed
3678 // the opposite value for the sign bit.
3679 if (Op->getFlags().hasNoSignedWrap() &&
3680 Op.getOperand(0) == Op.getOperand(1) &&
3681 !Known.isNegative())
3682 Known.makeNonNegative();
3683 break;
3684 }
3685 case ISD::MULHU: {
3686 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3687 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3688 Known = KnownBits::mulhu(Known, Known2);
3689 break;
3690 }
3691 case ISD::MULHS: {
3692 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3693 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3694 Known = KnownBits::mulhs(Known, Known2);
3695 break;
3696 }
3697 case ISD::ABDU: {
3698 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3699 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3700 Known = KnownBits::abdu(Known, Known2);
3701 break;
3702 }
3703 case ISD::ABDS: {
3704 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3705 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3706 Known = KnownBits::abds(Known, Known2);
3707 unsigned SignBits1 =
3708 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3709 if (SignBits1 == 1)
3710 break;
3711 unsigned SignBits0 =
3712 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3713 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3714 break;
3715 }
3716 case ISD::UMUL_LOHI: {
3717 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3718 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3719 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3720 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3721 if (Op.getResNo() == 0)
3722 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3723 else
3724 Known = KnownBits::mulhu(Known, Known2);
3725 break;
3726 }
3727 case ISD::SMUL_LOHI: {
3728 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3729 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3730 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3731 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3732 if (Op.getResNo() == 0)
3733 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3734 else
3735 Known = KnownBits::mulhs(Known, Known2);
3736 break;
3737 }
3738 case ISD::AVGFLOORU: {
3739 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3740 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3741 Known = KnownBits::avgFloorU(Known, Known2);
3742 break;
3743 }
3744 case ISD::AVGCEILU: {
3745 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3746 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3747 Known = KnownBits::avgCeilU(Known, Known2);
3748 break;
3749 }
3750 case ISD::AVGFLOORS: {
3751 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3752 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3753 Known = KnownBits::avgFloorS(Known, Known2);
3754 break;
3755 }
3756 case ISD::AVGCEILS: {
3757 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3758 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3759 Known = KnownBits::avgCeilS(Known, Known2);
3760 break;
3761 }
3762 case ISD::SELECT:
3763 case ISD::VSELECT:
3764 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3765 // If we don't know any bits, early out.
3766 if (Known.isUnknown())
3767 break;
3768 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3769
3770 // Only known if known in both the LHS and RHS.
3771 Known = Known.intersectWith(Known2);
3772 break;
3773 case ISD::SELECT_CC:
3774 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3775 // If we don't know any bits, early out.
3776 if (Known.isUnknown())
3777 break;
3778 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3779
3780 // Only known if known in both the LHS and RHS.
3781 Known = Known.intersectWith(Known2);
3782 break;
3783 case ISD::SMULO:
3784 case ISD::UMULO:
3785 if (Op.getResNo() != 1)
3786 break;
3787 // The boolean result conforms to getBooleanContents.
3788 // If we know the result of a setcc has the top bits zero, use this info.
3789 // We know that we have an integer-based boolean since these operations
3790 // are only available for integer.
3791 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3793 BitWidth > 1)
3794 Known.Zero.setBitsFrom(1);
3795 break;
3796 case ISD::SETCC:
3797 case ISD::SETCCCARRY:
3798 case ISD::STRICT_FSETCC:
3799 case ISD::STRICT_FSETCCS: {
3800 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3801 // If we know the result of a setcc has the top bits zero, use this info.
3802 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3804 BitWidth > 1)
3805 Known.Zero.setBitsFrom(1);
3806 break;
3807 }
3808 case ISD::SHL: {
3809 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3810 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3811
3812 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3813 bool NSW = Op->getFlags().hasNoSignedWrap();
3814
3815 bool ShAmtNonZero = Known2.isNonZero();
3816
3817 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3818
3819 // Minimum shift low bits are known zero.
3820 if (std::optional<unsigned> ShMinAmt =
3821 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3822 Known.Zero.setLowBits(*ShMinAmt);
3823 break;
3824 }
3825 case ISD::SRL:
3826 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3827 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3828 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3829 Op->getFlags().hasExact());
3830
3831 // Minimum shift high bits are known zero.
3832 if (std::optional<unsigned> ShMinAmt =
3833 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3834 Known.Zero.setHighBits(*ShMinAmt);
3835 break;
3836 case ISD::SRA:
3837 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3838 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3839 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3840 Op->getFlags().hasExact());
3841 break;
3842 case ISD::ROTL:
3843 case ISD::ROTR:
3844 if (ConstantSDNode *C =
3845 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3846 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3847
3848 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3849
3850 // Canonicalize to ROTR.
3851 if (Opcode == ISD::ROTL && Amt != 0)
3852 Amt = BitWidth - Amt;
3853
3854 Known.Zero = Known.Zero.rotr(Amt);
3855 Known.One = Known.One.rotr(Amt);
3856 }
3857 break;
3858 case ISD::FSHL:
3859 case ISD::FSHR:
3860 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3861 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3862
3863 // For fshl, 0-shift returns the 1st arg.
3864 // For fshr, 0-shift returns the 2nd arg.
3865 if (Amt == 0) {
3866 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3867 DemandedElts, Depth + 1);
3868 break;
3869 }
3870
3871 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3872 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3873 const APInt ShAmt(BitWidth, Amt);
3874 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3875 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3876 Known = Opcode == ISD::FSHL ? KnownBits::fshl(Known, Known2, ShAmt)
3877 : KnownBits::fshr(Known, Known2, ShAmt);
3878 }
3879 break;
3880 case ISD::SHL_PARTS:
3881 case ISD::SRA_PARTS:
3882 case ISD::SRL_PARTS: {
3883 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3884
3885 // Collect lo/hi source values and concatenate.
3886 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3887 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3888 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3889 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3890 Known = Known2.concat(Known);
3891
3892 // Collect shift amount.
3893 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3894
3895 if (Opcode == ISD::SHL_PARTS)
3896 Known = KnownBits::shl(Known, Known2);
3897 else if (Opcode == ISD::SRA_PARTS)
3898 Known = KnownBits::ashr(Known, Known2);
3899 else // if (Opcode == ISD::SRL_PARTS)
3900 Known = KnownBits::lshr(Known, Known2);
3901
3902 // TODO: Minimum shift low/high bits are known zero.
3903
3904 if (Op.getResNo() == 0)
3905 Known = Known.extractBits(LoBits, 0);
3906 else
3907 Known = Known.extractBits(HiBits, LoBits);
3908 break;
3909 }
3911 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3912 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3913 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3914 break;
3915 }
3916 case ISD::CTTZ:
3917 case ISD::CTTZ_ZERO_POISON: {
3918 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3919 // If we have a known 1, its position is our upper bound.
3920 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3921 unsigned LowBits = llvm::bit_width(PossibleTZ);
3922 Known.Zero.setBitsFrom(LowBits);
3923 break;
3924 }
3925 case ISD::CTLZ:
3926 case ISD::CTLZ_ZERO_POISON: {
3927 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3928 // If we have a known 1, its position is our upper bound.
3929 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3930 unsigned LowBits = llvm::bit_width(PossibleLZ);
3931 Known.Zero.setBitsFrom(LowBits);
3932 break;
3933 }
3934 case ISD::CTLS: {
3935 unsigned MinRedundantSignBits =
3936 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3937 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3939 Known = Range.toKnownBits();
3940 break;
3941 }
3942 case ISD::CTPOP: {
3943 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3944 // If we know some of the bits are zero, they can't be one.
3945 unsigned PossibleOnes = Known2.countMaxPopulation();
3946 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3947 break;
3948 }
3949 case ISD::PARITY: {
3950 // Parity returns 0 everywhere but the LSB.
3951 Known.Zero.setBitsFrom(1);
3952 break;
3953 }
3954 case ISD::CLMUL: {
3955 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3956 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3957 Known = KnownBits::clmul(Known, Known2);
3958 break;
3959 }
3960 case ISD::MGATHER:
3961 case ISD::MLOAD: {
3962 ISD::LoadExtType ETy =
3963 (Opcode == ISD::MGATHER)
3964 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3965 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3966 if (ETy == ISD::ZEXTLOAD) {
3967 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3968 KnownBits Known0(MemVT.getScalarSizeInBits());
3969 return Known0.zext(BitWidth);
3970 }
3971 break;
3972 }
3973 case ISD::LOAD: {
3975 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3976 if (ISD::isNON_EXTLoad(LD) && Cst) {
3977 // Determine any common known bits from the loaded constant pool value.
3978 Type *CstTy = Cst->getType();
3979 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3980 !Op.getValueType().isScalableVector()) {
3981 // If its a vector splat, then we can (quickly) reuse the scalar path.
3982 // NOTE: We assume all elements match and none are UNDEF.
3983 if (CstTy->isVectorTy()) {
3984 if (const Constant *Splat = Cst->getSplatValue()) {
3985 Cst = Splat;
3986 CstTy = Cst->getType();
3987 }
3988 }
3989 // TODO - do we need to handle different bitwidths?
3990 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3991 // Iterate across all vector elements finding common known bits.
3992 Known.setAllConflict();
3993 for (unsigned i = 0; i != NumElts; ++i) {
3994 if (!DemandedElts[i])
3995 continue;
3996 if (Constant *Elt = Cst->getAggregateElement(i)) {
3997 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
3998 const APInt &Value = CInt->getValue();
3999 Known.One &= Value;
4000 Known.Zero &= ~Value;
4001 continue;
4002 }
4003 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4004 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4005 Known.One &= Value;
4006 Known.Zero &= ~Value;
4007 continue;
4008 }
4009 }
4010 Known.One.clearAllBits();
4011 Known.Zero.clearAllBits();
4012 break;
4013 }
4014 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4015 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4016 Known = KnownBits::makeConstant(CInt->getValue());
4017 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4018 Known =
4019 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4020 }
4021 }
4022 }
4023 } else if (Op.getResNo() == 0) {
4024 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4025 KnownBits KnownScalarMemory(ScalarMemorySize);
4026 if (const MDNode *MD = LD->getRanges())
4027 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4028
4029 // Extend the Known bits from memory to the size of the scalar result.
4030 if (ISD::isZEXTLoad(Op.getNode()))
4031 Known = KnownScalarMemory.zext(BitWidth);
4032 else if (ISD::isSEXTLoad(Op.getNode()))
4033 Known = KnownScalarMemory.sext(BitWidth);
4034 else if (ISD::isEXTLoad(Op.getNode()))
4035 Known = KnownScalarMemory.anyext(BitWidth);
4036 else
4037 Known = KnownScalarMemory;
4038 assert(Known.getBitWidth() == BitWidth);
4039 return Known;
4040 }
4041 break;
4042 }
4044 if (Op.getValueType().isScalableVector())
4045 break;
4046 EVT InVT = Op.getOperand(0).getValueType();
4047 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4048 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4049 Known = Known.zext(BitWidth);
4050 break;
4051 }
4052 case ISD::ZERO_EXTEND: {
4053 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4054 Known = Known.zext(BitWidth);
4055 break;
4056 }
4058 if (Op.getValueType().isScalableVector())
4059 break;
4060 EVT InVT = Op.getOperand(0).getValueType();
4061 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4062 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4063 // If the sign bit is known to be zero or one, then sext will extend
4064 // it to the top bits, else it will just zext.
4065 Known = Known.sext(BitWidth);
4066 break;
4067 }
4068 case ISD::SIGN_EXTEND: {
4069 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4070 // If the sign bit is known to be zero or one, then sext will extend
4071 // it to the top bits, else it will just zext.
4072 Known = Known.sext(BitWidth);
4073 break;
4074 }
4076 if (Op.getValueType().isScalableVector())
4077 break;
4078 EVT InVT = Op.getOperand(0).getValueType();
4079 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4080 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4081 Known = Known.anyext(BitWidth);
4082 break;
4083 }
4084 case ISD::ANY_EXTEND: {
4085 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4086 Known = Known.anyext(BitWidth);
4087 break;
4088 }
4089 case ISD::TRUNCATE: {
4090 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4091 Known = Known.trunc(BitWidth);
4092 break;
4093 }
4094 case ISD::TRUNCATE_SSAT_S: {
4095 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4096 Known = Known.truncSSat(BitWidth);
4097 break;
4098 }
4099 case ISD::TRUNCATE_SSAT_U: {
4100 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4101 Known = Known.truncSSatU(BitWidth);
4102 break;
4103 }
4104 case ISD::TRUNCATE_USAT_U: {
4105 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4106 Known = Known.truncUSat(BitWidth);
4107 break;
4108 }
4109 case ISD::AssertZext: {
4110 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4112 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4113 Known.Zero |= (~InMask);
4114 Known.One &= (~Known.Zero);
4115 break;
4116 }
4117 case ISD::AssertAlign: {
4118 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4119 assert(LogOfAlign != 0);
4120
4121 // TODO: Should use maximum with source
4122 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4123 // well as clearing one bits.
4124 Known.Zero.setLowBits(LogOfAlign);
4125 Known.One.clearLowBits(LogOfAlign);
4126 break;
4127 }
4128 case ISD::AssertNoFPClass: {
4129 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4130
4131 FPClassTest NoFPClass =
4132 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4133 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4134 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4135 // Cannot be negative.
4136 Known.makeNonNegative();
4137 }
4138
4139 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4140 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4141 // Cannot be positive.
4142 Known.makeNegative();
4143 }
4144
4145 break;
4146 }
4147 case ISD::FABS:
4148 // fabs clears the sign bit
4149 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4150 Known.makeNonNegative();
4151 break;
4152 case ISD::FGETSIGN:
4153 // All bits are zero except the low bit.
4154 Known.Zero.setBitsFrom(1);
4155 break;
4156 case ISD::ADD: {
4157 SDNodeFlags Flags = Op.getNode()->getFlags();
4158 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4159 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4160 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4162 Op.getOperand(0), DemandedElts,
4164 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4165 Flags.hasNoUnsignedWrap(), SelfAdd);
4166 break;
4167 }
4168 case ISD::SUB: {
4169 SDNodeFlags Flags = Op.getNode()->getFlags();
4170 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4171 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4172 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4173 Flags.hasNoUnsignedWrap());
4174 break;
4175 }
4176 case ISD::USUBO:
4177 case ISD::SSUBO:
4178 case ISD::USUBO_CARRY:
4179 case ISD::SSUBO_CARRY:
4180 if (Op.getResNo() == 1) {
4181 // If we know the result of a setcc has the top bits zero, use this info.
4182 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4184 BitWidth > 1)
4185 Known.Zero.setBitsFrom(1);
4186 break;
4187 }
4188 [[fallthrough]];
4189 case ISD::SUBC: {
4190 assert(Op.getResNo() == 0 &&
4191 "We only compute knownbits for the difference here.");
4192
4193 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4194 KnownBits Borrow(1);
4195 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4196 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4197 // Borrow has bit width 1
4198 Borrow = Borrow.trunc(1);
4199 } else {
4200 Borrow.setAllZero();
4201 }
4202
4203 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4204 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4205 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4206 break;
4207 }
4208 case ISD::UADDO:
4209 case ISD::SADDO:
4210 case ISD::UADDO_CARRY:
4211 case ISD::SADDO_CARRY:
4212 if (Op.getResNo() == 1) {
4213 // If we know the result of a setcc has the top bits zero, use this info.
4214 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4216 BitWidth > 1)
4217 Known.Zero.setBitsFrom(1);
4218 break;
4219 }
4220 [[fallthrough]];
4221 case ISD::ADDC:
4222 case ISD::ADDE: {
4223 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4224
4225 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4226 KnownBits Carry(1);
4227 if (Opcode == ISD::ADDE)
4228 // Can't track carry from glue, set carry to unknown.
4229 Carry.resetAll();
4230 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4231 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4232 // Carry has bit width 1
4233 Carry = Carry.trunc(1);
4234 } else {
4235 Carry.setAllZero();
4236 }
4237
4238 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4239 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4240 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4241 break;
4242 }
4243 case ISD::UDIV: {
4244 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4245 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4246 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4247 break;
4248 }
4249 case ISD::SDIV: {
4250 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4251 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4252 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4253 break;
4254 }
4255 case ISD::SREM: {
4256 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4257 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4258 Known = KnownBits::srem(Known, Known2);
4259 break;
4260 }
4261 case ISD::UREM: {
4262 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4263 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4264 Known = KnownBits::urem(Known, Known2);
4265 break;
4266 }
4267 case ISD::EXTRACT_ELEMENT: {
4268 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4269 const unsigned Index = Op.getConstantOperandVal(1);
4270 const unsigned EltBitWidth = Op.getValueSizeInBits();
4271
4272 // Remove low part of known bits mask
4273 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4274 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4275
4276 // Remove high part of known bit mask
4277 Known = Known.trunc(EltBitWidth);
4278 break;
4279 }
4281 SDValue InVec = Op.getOperand(0);
4282 SDValue EltNo = Op.getOperand(1);
4283 EVT VecVT = InVec.getValueType();
4284 // computeKnownBits not yet implemented for scalable vectors.
4285 if (VecVT.isScalableVector())
4286 break;
4287 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4288 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4289
4290 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4291 // anything about the extended bits.
4292 if (BitWidth > EltBitWidth)
4293 Known = Known.trunc(EltBitWidth);
4294
4295 // If we know the element index, just demand that vector element, else for
4296 // an unknown element index, ignore DemandedElts and demand them all.
4297 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4298 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4299 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4300 DemandedSrcElts =
4301 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4302
4303 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4304 if (BitWidth > EltBitWidth)
4305 Known = Known.anyext(BitWidth);
4306 break;
4307 }
4309 if (Op.getValueType().isScalableVector())
4310 break;
4311
4312 // If we know the element index, split the demand between the
4313 // source vector and the inserted element, otherwise assume we need
4314 // the original demanded vector elements and the value.
4315 SDValue InVec = Op.getOperand(0);
4316 SDValue InVal = Op.getOperand(1);
4317 SDValue EltNo = Op.getOperand(2);
4318 bool DemandedVal = true;
4319 APInt DemandedVecElts = DemandedElts;
4320 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4321 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4322 unsigned EltIdx = CEltNo->getZExtValue();
4323 DemandedVal = !!DemandedElts[EltIdx];
4324 DemandedVecElts.clearBit(EltIdx);
4325 }
4326 Known.setAllConflict();
4327 if (DemandedVal) {
4328 Known2 = computeKnownBits(InVal, Depth + 1);
4329 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4330 }
4331 if (!!DemandedVecElts) {
4332 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4333 Known = Known.intersectWith(Known2);
4334 }
4335 break;
4336 }
4337 case ISD::BITREVERSE: {
4338 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4339 Known = Known2.reverseBits();
4340 break;
4341 }
4342 case ISD::BSWAP: {
4343 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4344 Known = Known2.byteSwap();
4345 break;
4346 }
4347 case ISD::ABS: {
4348 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4349 Known = Known2.abs();
4350 Known.Zero.setHighBits(
4351 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4352 break;
4353 }
4354 case ISD::USUBSAT: {
4355 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4356 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4357 Known = KnownBits::usub_sat(Known, Known2);
4358 break;
4359 }
4360 case ISD::UMIN: {
4361 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4362 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4363 Known = KnownBits::umin(Known, Known2);
4364 break;
4365 }
4366 case ISD::UMAX: {
4367 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4368 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4369 Known = KnownBits::umax(Known, Known2);
4370 break;
4371 }
4372 case ISD::SMIN:
4373 case ISD::SMAX: {
4374 // If we have a clamp pattern, we know that the number of sign bits will be
4375 // the minimum of the clamp min/max range.
4376 bool IsMax = (Opcode == ISD::SMAX);
4377 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4378 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4379 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4380 CstHigh =
4381 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4382 if (CstLow && CstHigh) {
4383 if (!IsMax)
4384 std::swap(CstLow, CstHigh);
4385
4386 const APInt &ValueLow = CstLow->getAPIntValue();
4387 const APInt &ValueHigh = CstHigh->getAPIntValue();
4388 if (ValueLow.sle(ValueHigh)) {
4389 unsigned LowSignBits = ValueLow.getNumSignBits();
4390 unsigned HighSignBits = ValueHigh.getNumSignBits();
4391 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4392 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4393 Known.One.setHighBits(MinSignBits);
4394 break;
4395 }
4396 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4397 Known.Zero.setHighBits(MinSignBits);
4398 break;
4399 }
4400 }
4401 }
4402
4403 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4404 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4405 if (IsMax)
4406 Known = KnownBits::smax(Known, Known2);
4407 else
4408 Known = KnownBits::smin(Known, Known2);
4409
4410 // For SMAX, if CstLow is non-negative we know the result will be
4411 // non-negative and thus all sign bits are 0.
4412 // TODO: There's an equivalent of this for smin with negative constant for
4413 // known ones.
4414 if (IsMax && CstLow) {
4415 const APInt &ValueLow = CstLow->getAPIntValue();
4416 if (ValueLow.isNonNegative()) {
4417 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4418 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4419 }
4420 }
4421
4422 break;
4423 }
4424 case ISD::UINT_TO_FP: {
4425 Known.makeNonNegative();
4426 break;
4427 }
4428 case ISD::SINT_TO_FP: {
4429 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4430 if (Known2.isNonNegative())
4431 Known.makeNonNegative();
4432 else if (Known2.isNegative())
4433 Known.makeNegative();
4434 break;
4435 }
4436 case ISD::FP_TO_UINT_SAT: {
4437 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4438 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4440 break;
4441 }
4442 case ISD::ATOMIC_LOAD: {
4443 // If we are looking at the loaded value.
4444 if (Op.getResNo() == 0) {
4445 auto *AT = cast<AtomicSDNode>(Op);
4446 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4447 KnownBits KnownScalarMemory(ScalarMemorySize);
4448 if (const MDNode *MD = AT->getRanges())
4449 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4450
4451 switch (AT->getExtensionType()) {
4452 case ISD::ZEXTLOAD:
4453 Known = KnownScalarMemory.zext(BitWidth);
4454 break;
4455 case ISD::SEXTLOAD:
4456 Known = KnownScalarMemory.sext(BitWidth);
4457 break;
4458 case ISD::EXTLOAD:
4459 switch (TLI->getExtendForAtomicOps()) {
4460 case ISD::ZERO_EXTEND:
4461 Known = KnownScalarMemory.zext(BitWidth);
4462 break;
4463 case ISD::SIGN_EXTEND:
4464 Known = KnownScalarMemory.sext(BitWidth);
4465 break;
4466 default:
4467 Known = KnownScalarMemory.anyext(BitWidth);
4468 break;
4469 }
4470 break;
4471 case ISD::NON_EXTLOAD:
4472 Known = KnownScalarMemory;
4473 break;
4474 }
4475 assert(Known.getBitWidth() == BitWidth);
4476 }
4477 break;
4478 }
4480 if (Op.getResNo() == 1) {
4481 // The boolean result conforms to getBooleanContents.
4482 // If we know the result of a setcc has the top bits zero, use this info.
4483 // We know that we have an integer-based boolean since these operations
4484 // are only available for integer.
4485 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4487 BitWidth > 1)
4488 Known.Zero.setBitsFrom(1);
4489 break;
4490 }
4491 [[fallthrough]];
4493 case ISD::ATOMIC_SWAP:
4504 case ISD::ATOMIC_LOAD_UMAX: {
4505 // If we are looking at the loaded value.
4506 if (Op.getResNo() == 0) {
4507 auto *AT = cast<AtomicSDNode>(Op);
4508 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4509
4510 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4511 Known.Zero.setBitsFrom(MemBits);
4512 }
4513 break;
4514 }
4515 case ISD::FrameIndex:
4517 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4518 Known, getMachineFunction());
4519 break;
4520
4521 default:
4522 if (Opcode < ISD::BUILTIN_OP_END)
4523 break;
4524 [[fallthrough]];
4528 // TODO: Probably okay to remove after audit; here to reduce change size
4529 // in initial enablement patch for scalable vectors
4530 if (Op.getValueType().isScalableVector())
4531 break;
4532
4533 // Allow the target to implement this method for its nodes.
4534 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4535 break;
4536 }
4537
4538 return Known;
4539}
4540
4541/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4554
4557 // X + 0 never overflow
4558 if (isNullConstant(N1))
4559 return OFK_Never;
4560
4561 // If both operands each have at least two sign bits, the addition
4562 // cannot overflow.
4563 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4564 return OFK_Never;
4565
4566 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4567 return OFK_Sometime;
4568}
4569
4572 // X + 0 never overflow
4573 if (isNullConstant(N1))
4574 return OFK_Never;
4575
4576 // mulhi + 1 never overflow
4577 KnownBits N1Known = computeKnownBits(N1);
4578 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4579 N1Known.getMaxValue().ult(2))
4580 return OFK_Never;
4581
4582 KnownBits N0Known = computeKnownBits(N0);
4583 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4584 N0Known.getMaxValue().ult(2))
4585 return OFK_Never;
4586
4587 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4588 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4589 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4590 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4591}
4592
4595 // X - 0 never overflow
4596 if (isNullConstant(N1))
4597 return OFK_Never;
4598
4599 // If both operands each have at least two sign bits, the subtraction
4600 // cannot overflow.
4601 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4602 return OFK_Never;
4603
4604 KnownBits N0Known = computeKnownBits(N0);
4605 KnownBits N1Known = computeKnownBits(N1);
4606 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4607 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4608 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4609}
4610
4613 // X - 0 never overflow
4614 if (isNullConstant(N1))
4615 return OFK_Never;
4616
4617 ConstantRange N0Range =
4618 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4619 ConstantRange N1Range =
4620 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4621 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4622}
4623
4626 // X * 0 and X * 1 never overflow.
4627 if (isNullConstant(N1) || isOneConstant(N1))
4628 return OFK_Never;
4629
4632 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4633}
4634
4637 // X * 0 and X * 1 never overflow.
4638 if (isNullConstant(N1) || isOneConstant(N1))
4639 return OFK_Never;
4640
4641 // Get the size of the result.
4642 unsigned BitWidth = N0.getScalarValueSizeInBits();
4643
4644 // Sum of the sign bits.
4645 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4646
4647 // If we have enough sign bits, then there's no overflow.
4648 if (SignBits > BitWidth + 1)
4649 return OFK_Never;
4650
4651 if (SignBits == BitWidth + 1) {
4652 // The overflow occurs when the true multiplication of the
4653 // the operands is the minimum negative number.
4654 KnownBits N0Known = computeKnownBits(N0);
4655 KnownBits N1Known = computeKnownBits(N1);
4656 // If one of the operands is non-negative, then there's no
4657 // overflow.
4658 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4659 return OFK_Never;
4660 }
4661
4662 return OFK_Sometime;
4663}
4664
4666 unsigned Depth) const {
4667 APInt DemandedElts = getDemandAllEltsMask(Op);
4668 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4669}
4670
4672 const APInt &DemandedElts,
4673 bool ForSigned,
4674 unsigned Depth) const {
4675 EVT VT = Op.getValueType();
4676 unsigned BitWidth = VT.getScalarSizeInBits();
4677
4678 if (Depth >= MaxRecursionDepth)
4679 return ConstantRange::getFull(BitWidth);
4680
4681 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4682 return ConstantRange(C->getAPIntValue());
4683
4684 unsigned Opcode = Op.getOpcode();
4685 switch (Opcode) {
4686 case ISD::VSCALE: {
4688 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4689 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4690 }
4691 default:
4692 break;
4693 }
4694
4695 return ConstantRange::getFull(BitWidth);
4696}
4697
4700 unsigned Depth) const {
4701 APInt DemandedElts = getDemandAllEltsMask(Op);
4702 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4703 Depth);
4704}
4705
4707 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4708 unsigned Depth) const {
4709 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4710 ConstantRange CR1 = ConstantRange::fromKnownBits(Known, ForSigned);
4711 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4714 return CR1.intersectWith(CR2, RangeType);
4715}
4716
4718 unsigned Depth) const {
4719 APInt DemandedElts = getDemandAllEltsMask(Val);
4720 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4721}
4722
4724 const APInt &DemandedElts,
4725 bool OrZero, unsigned Depth) const {
4726 if (Depth >= MaxRecursionDepth)
4727 return false; // Limit search depth.
4728
4729 EVT OpVT = Val.getValueType();
4730 unsigned BitWidth = OpVT.getScalarSizeInBits();
4731 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4732 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4733 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4734 assert(
4735 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4736 "Unexpected vector size");
4737
4738 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4739 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4740 return (OrZero && V.isZero()) || V.isPowerOf2();
4741 };
4742
4743 // Is the constant a known power of 2 or zero?
4744 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4745 return true;
4746
4747 switch (Val.getOpcode()) {
4748 case ISD::BUILD_VECTOR:
4749 // Are all operands of a build vector constant powers of two or zero?
4750 if (all_of(enumerate(Val->ops()), [&](auto P) {
4751 auto *C = dyn_cast<ConstantSDNode>(P.value());
4752 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4753 }))
4754 return true;
4755 break;
4756
4757 case ISD::SPLAT_VECTOR:
4758 // Is the operand of a splat vector a constant power of two?
4759 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4760 if (IsPowerOfTwoOrZero(C))
4761 return true;
4762 break;
4763
4765 SDValue InVec = Val.getOperand(0);
4766 SDValue EltNo = Val.getOperand(1);
4767 EVT VecVT = InVec.getValueType();
4768
4769 // Skip scalable vectors or implicit extensions.
4770 if (VecVT.isScalableVector() ||
4771 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4772 break;
4773
4774 // If we know the element index, just demand that vector element, else for
4775 // an unknown element index, ignore DemandedElts and demand them all.
4776 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4777 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4778 APInt DemandedSrcElts =
4779 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4780 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4781 : APInt::getAllOnes(NumSrcElts);
4782 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4783 }
4784
4785 case ISD::AND: {
4786 // Looking for `x & -x` pattern:
4787 // If x == 0:
4788 // x & -x -> 0
4789 // If x != 0:
4790 // x & -x -> non-zero pow2
4791 // so if we find the pattern return whether we know `x` is non-zero.
4792 SDValue X, Z;
4793 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4794 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4795 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4796 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4797 break;
4798 }
4799
4800 case ISD::SHL: {
4801 // A left-shift of a constant one will have exactly one bit set because
4802 // shifting the bit off the end is undefined.
4803 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4804 if (C && C->getAPIntValue() == 1)
4805 return true;
4806 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4807 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4808 Depth + 1);
4809 }
4810
4811 case ISD::SRL: {
4812 // A logical right-shift of a constant sign-bit will have exactly
4813 // one bit set.
4814 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4815 if (C && C->getAPIntValue().isSignMask())
4816 return true;
4817 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4818 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4819 Depth + 1);
4820 }
4821
4822 case ISD::TRUNCATE:
4823 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4824 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4825 Depth + 1);
4826
4827 case ISD::ROTL:
4828 case ISD::ROTR:
4829 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4830 Depth + 1);
4831 case ISD::BSWAP:
4832 case ISD::BITREVERSE:
4833 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4834 Depth + 1);
4835
4836 case ISD::SMIN:
4837 case ISD::SMAX:
4838 case ISD::UMIN:
4839 case ISD::UMAX:
4840 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4841 Depth + 1) &&
4842 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4843 Depth + 1);
4844
4845 case ISD::SELECT:
4846 case ISD::VSELECT:
4847 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4848 Depth + 1) &&
4849 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4850 Depth + 1);
4851
4852 case ISD::ZERO_EXTEND:
4853 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4854 Depth + 1);
4855
4856 case ISD::VSCALE:
4857 // vscale(power-of-two) is a power-of-two
4858 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4859 Depth + 1);
4860
4861 case ISD::VECTOR_SHUFFLE: {
4863 // Demanded elements with undef shuffle mask elements are unknown
4864 // - we cannot guarantee they are a power of two, so return false.
4865 APInt DemandedLHS, DemandedRHS;
4867 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4868 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4869 DemandedLHS, DemandedRHS))
4870 return false;
4871
4872 // All demanded elements from LHS must be known power of two.
4873 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4874 OrZero, Depth + 1))
4875 return false;
4876
4877 // All demanded elements from RHS must be known power of two.
4878 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4879 OrZero, Depth + 1))
4880 return false;
4881
4882 return true;
4883 }
4884 }
4885
4886 // More could be done here, though the above checks are enough
4887 // to handle some common cases.
4888 return false;
4889}
4890
4892 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4893 return C1->getValueAPF().getExactLog2Abs() >= 0;
4894
4895 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4896 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4897
4898 return false;
4899}
4900
4902 APInt DemandedElts = getDemandAllEltsMask(Op);
4903 return ComputeNumSignBits(Op, DemandedElts, Depth);
4904}
4905
4906unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4907 unsigned Depth) const {
4908 EVT VT = Op.getValueType();
4909 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4910 unsigned VTBits = VT.getScalarSizeInBits();
4911 unsigned NumElts = DemandedElts.getBitWidth();
4912 unsigned Tmp, Tmp2;
4913 unsigned FirstAnswer = 1;
4914
4915 assert((!VT.isScalableVector() || NumElts == 1) &&
4916 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4917
4918 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4919 const APInt &Val = C->getAPIntValue();
4920 return Val.getNumSignBits();
4921 }
4922
4923 if (Depth >= MaxRecursionDepth)
4924 return 1; // Limit search depth.
4925
4926 if (!DemandedElts)
4927 return 1; // No demanded elts, better to assume we don't know anything.
4928
4929 unsigned Opcode = Op.getOpcode();
4930 switch (Opcode) {
4931 default: break;
4932 case ISD::AssertSext:
4933 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4934 return VTBits-Tmp+1;
4935 case ISD::AssertZext:
4936 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4937 return VTBits-Tmp;
4938 case ISD::FREEZE:
4939 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4941 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4942 break;
4943 case ISD::MERGE_VALUES:
4944 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4945 Depth + 1);
4946 case ISD::SPLAT_VECTOR: {
4947 // Check if the sign bits of source go down as far as the truncated value.
4948 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4949 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4950 if (NumSrcSignBits > (NumSrcBits - VTBits))
4951 return NumSrcSignBits - (NumSrcBits - VTBits);
4952 break;
4953 }
4954 case ISD::BUILD_VECTOR:
4955 assert(!VT.isScalableVector());
4956 Tmp = VTBits;
4957 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4958 if (!DemandedElts[i])
4959 continue;
4960
4961 SDValue SrcOp = Op.getOperand(i);
4962 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4963 // for constant nodes to ensure we only look at the sign bits.
4965 APInt T = C->getAPIntValue().trunc(VTBits);
4966 Tmp2 = T.getNumSignBits();
4967 } else {
4968 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4969
4970 if (SrcOp.getValueSizeInBits() != VTBits) {
4971 assert(SrcOp.getValueSizeInBits() > VTBits &&
4972 "Expected BUILD_VECTOR implicit truncation");
4973 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4974 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4975 }
4976 }
4977 Tmp = std::min(Tmp, Tmp2);
4978 }
4979 return Tmp;
4980
4981 case ISD::VECTOR_COMPRESS: {
4982 SDValue Vec = Op.getOperand(0);
4983 SDValue PassThru = Op.getOperand(2);
4984 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4985 if (Tmp == 1)
4986 return 1;
4987 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
4988 Tmp = std::min(Tmp, Tmp2);
4989 return Tmp;
4990 }
4991
4992 case ISD::VECTOR_SHUFFLE: {
4993 // Collect the minimum number of sign bits that are shared by every vector
4994 // element referenced by the shuffle.
4995 APInt DemandedLHS, DemandedRHS;
4997 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4998 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4999 DemandedLHS, DemandedRHS))
5000 return 1;
5001
5002 Tmp = std::numeric_limits<unsigned>::max();
5003 if (!!DemandedLHS)
5004 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5005 if (!!DemandedRHS) {
5006 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5007 Tmp = std::min(Tmp, Tmp2);
5008 }
5009 // If we don't know anything, early out and try computeKnownBits fall-back.
5010 if (Tmp == 1)
5011 break;
5012 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5013 return Tmp;
5014 }
5015
5016 case ISD::BITCAST: {
5017 if (VT.isScalableVector())
5018 break;
5019 SDValue N0 = Op.getOperand(0);
5020 EVT SrcVT = N0.getValueType();
5021 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5022
5023 // Ignore bitcasts from unsupported types..
5024 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5025 break;
5026
5027 // Fast handling of 'identity' bitcasts.
5028 if (VTBits == SrcBits)
5029 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5030
5031 bool IsLE = getDataLayout().isLittleEndian();
5032
5033 // Bitcast 'large element' scalar/vector to 'small element' vector.
5034 if ((SrcBits % VTBits) == 0) {
5035 assert(VT.isVector() && "Expected bitcast to vector");
5036
5037 unsigned Scale = SrcBits / VTBits;
5038 APInt SrcDemandedElts =
5039 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5040
5041 // Fast case - sign splat can be simply split across the small elements.
5042 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5043 if (Tmp == SrcBits)
5044 return VTBits;
5045
5046 // Slow case - determine how far the sign extends into each sub-element.
5047 Tmp2 = VTBits;
5048 for (unsigned i = 0; i != NumElts; ++i)
5049 if (DemandedElts[i]) {
5050 unsigned SubOffset = i % Scale;
5051 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5052 SubOffset = SubOffset * VTBits;
5053 if (Tmp <= SubOffset)
5054 return 1;
5055 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5056 }
5057 return Tmp2;
5058 }
5059 break;
5060 }
5061
5063 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5064 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5065 return VTBits - Tmp + 1;
5066 case ISD::SIGN_EXTEND:
5067 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5068 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5070 // Max of the input and what this extends.
5071 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5072 Tmp = VTBits-Tmp+1;
5073 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5074 return std::max(Tmp, Tmp2);
5076 if (VT.isScalableVector())
5077 break;
5078 SDValue Src = Op.getOperand(0);
5079 EVT SrcVT = Src.getValueType();
5080 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5081 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5082 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5083 }
5084 case ISD::SRA:
5085 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5086 // SRA X, C -> adds C sign bits.
5087 if (std::optional<unsigned> ShAmt =
5088 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5089 Tmp = std::min(Tmp + *ShAmt, VTBits);
5090 return Tmp;
5091 case ISD::SHL:
5092 if (std::optional<ConstantRange> ShAmtRange =
5093 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5094 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5095 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5096 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5097 // shifted out, then we can compute the number of sign bits for the
5098 // operand being extended. A future improvement could be to pass along the
5099 // "shifted left by" information in the recursive calls to
5100 // ComputeKnownSignBits. Allowing us to handle this more generically.
5101 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5102 SDValue Ext = Op.getOperand(0);
5103 EVT ExtVT = Ext.getValueType();
5104 SDValue Extendee = Ext.getOperand(0);
5105 EVT ExtendeeVT = Extendee.getValueType();
5106 unsigned SizeDifference =
5107 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5108 if (SizeDifference <= MinShAmt) {
5109 Tmp = SizeDifference +
5110 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5111 if (MaxShAmt < Tmp)
5112 return Tmp - MaxShAmt;
5113 }
5114 }
5115 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5116 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5117 if (MaxShAmt < Tmp)
5118 return Tmp - MaxShAmt;
5119 }
5120 break;
5121 case ISD::AND:
5122 case ISD::OR:
5123 case ISD::XOR: // NOT is handled here.
5124 // Logical binary ops preserve the number of sign bits at the worst.
5125 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5126 if (Tmp != 1) {
5127 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5128 FirstAnswer = std::min(Tmp, Tmp2);
5129 // We computed what we know about the sign bits as our first
5130 // answer. Now proceed to the generic code that uses
5131 // computeKnownBits, and pick whichever answer is better.
5132 }
5133 break;
5134
5135 case ISD::SELECT:
5136 case ISD::VSELECT:
5137 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5138 if (Tmp == 1) return 1; // Early out.
5139 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5140 return std::min(Tmp, Tmp2);
5141 case ISD::SELECT_CC:
5142 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5143 if (Tmp == 1) return 1; // Early out.
5144 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5145 return std::min(Tmp, Tmp2);
5146
5147 case ISD::SMIN:
5148 case ISD::SMAX: {
5149 // If we have a clamp pattern, we know that the number of sign bits will be
5150 // the minimum of the clamp min/max range.
5151 bool IsMax = (Opcode == ISD::SMAX);
5152 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5153 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5154 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5155 CstHigh =
5156 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5157 if (CstLow && CstHigh) {
5158 if (!IsMax)
5159 std::swap(CstLow, CstHigh);
5160 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5161 Tmp = CstLow->getAPIntValue().getNumSignBits();
5162 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5163 return std::min(Tmp, Tmp2);
5164 }
5165 }
5166
5167 // Fallback - just get the minimum number of sign bits of the operands.
5168 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5169 if (Tmp == 1)
5170 return 1; // Early out.
5171 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5172 return std::min(Tmp, Tmp2);
5173 }
5174 case ISD::UMIN:
5175 case ISD::UMAX:
5176 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5177 if (Tmp == 1)
5178 return 1; // Early out.
5179 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5180 return std::min(Tmp, Tmp2);
5181 case ISD::SSUBO_CARRY:
5182 case ISD::USUBO_CARRY:
5183 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5184 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5185 return VTBits;
5186 [[fallthrough]];
5187 case ISD::SADDO:
5188 case ISD::UADDO:
5189 case ISD::SADDO_CARRY:
5190 case ISD::UADDO_CARRY:
5191 case ISD::SSUBO:
5192 case ISD::USUBO:
5193 case ISD::SMULO:
5194 case ISD::UMULO:
5195 if (Op.getResNo() != 1)
5196 break;
5197 // The boolean result conforms to getBooleanContents. Fall through.
5198 // If setcc returns 0/-1, all bits are sign bits.
5199 // We know that we have an integer-based boolean since these operations
5200 // are only available for integer.
5201 if (TLI->getBooleanContents(VT.isVector(), false) ==
5203 return VTBits;
5204 break;
5205 case ISD::SETCC:
5206 case ISD::SETCCCARRY:
5207 case ISD::STRICT_FSETCC:
5208 case ISD::STRICT_FSETCCS: {
5209 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5210 // If setcc returns 0/-1, all bits are sign bits.
5211 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5213 return VTBits;
5214 break;
5215 }
5216 case ISD::ROTL:
5217 case ISD::ROTR:
5218 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5219
5220 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5221 if (Tmp == VTBits)
5222 return VTBits;
5223
5224 if (ConstantSDNode *C =
5225 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5226 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5227
5228 // Handle rotate right by N like a rotate left by 32-N.
5229 if (Opcode == ISD::ROTR)
5230 RotAmt = (VTBits - RotAmt) % VTBits;
5231
5232 // If we aren't rotating out all of the known-in sign bits, return the
5233 // number that are left. This handles rotl(sext(x), 1) for example.
5234 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5235 }
5236 break;
5237 case ISD::ADD:
5238 case ISD::ADDC:
5239 // TODO: Move Operand 1 check before Operand 0 check
5240 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5241 if (Tmp == 1) return 1; // Early out.
5242
5243 // Special case decrementing a value (ADD X, -1):
5244 if (ConstantSDNode *CRHS =
5245 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5246 if (CRHS->isAllOnes()) {
5247 KnownBits Known =
5248 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5249
5250 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5251 // sign bits set.
5252 if ((Known.Zero | 1).isAllOnes())
5253 return VTBits;
5254
5255 // If we are subtracting one from a positive number, there is no carry
5256 // out of the result.
5257 if (Known.isNonNegative())
5258 return Tmp;
5259 }
5260
5261 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5262 if (Tmp2 == 1) return 1; // Early out.
5263
5264 // Add can have at most one carry bit. Thus we know that the output
5265 // is, at worst, one more bit than the inputs.
5266 return std::min(Tmp, Tmp2) - 1;
5267 case ISD::SUB:
5268 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5269 if (Tmp2 == 1) return 1; // Early out.
5270
5271 // Handle NEG.
5272 if (ConstantSDNode *CLHS =
5273 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5274 if (CLHS->isZero()) {
5275 KnownBits Known =
5276 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5277 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5278 // sign bits set.
5279 if ((Known.Zero | 1).isAllOnes())
5280 return VTBits;
5281
5282 // If the input is known to be positive (the sign bit is known clear),
5283 // the output of the NEG has the same number of sign bits as the input.
5284 if (Known.isNonNegative())
5285 return Tmp2;
5286
5287 // Otherwise, we treat this like a SUB.
5288 }
5289
5290 // Sub can have at most one carry bit. Thus we know that the output
5291 // is, at worst, one more bit than the inputs.
5292 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5293 if (Tmp == 1) return 1; // Early out.
5294 return std::min(Tmp, Tmp2) - 1;
5295 case ISD::MUL: {
5296 // The output of the Mul can be at most twice the valid bits in the inputs.
5297 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5298 if (SignBitsOp0 == 1)
5299 break;
5300 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5301 if (SignBitsOp1 == 1)
5302 break;
5303 unsigned OutValidBits =
5304 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5305 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5306 }
5307 case ISD::AVGCEILS:
5308 case ISD::AVGFLOORS:
5309 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5310 if (Tmp == 1)
5311 return 1; // Early out.
5312 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5313 return std::min(Tmp, Tmp2);
5314 case ISD::SREM:
5315 // The sign bit is the LHS's sign bit, except when the result of the
5316 // remainder is zero. The magnitude of the result should be less than or
5317 // equal to the magnitude of the LHS. Therefore, the result should have
5318 // at least as many sign bits as the left hand side.
5319 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5320 case ISD::TRUNCATE: {
5321 // Check if the sign bits of source go down as far as the truncated value.
5322 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5323 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5324 if (NumSrcSignBits > (NumSrcBits - VTBits))
5325 return NumSrcSignBits - (NumSrcBits - VTBits);
5326 break;
5327 }
5328 case ISD::EXTRACT_ELEMENT: {
5329 if (VT.isScalableVector())
5330 break;
5331 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5332 const int BitWidth = Op.getValueSizeInBits();
5333 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5334
5335 // Get reverse index (starting from 1), Op1 value indexes elements from
5336 // little end. Sign starts at big end.
5337 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5338
5339 // If the sign portion ends in our element the subtraction gives correct
5340 // result. Otherwise it gives either negative or > bitwidth result
5341 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5342 }
5344 if (VT.isScalableVector())
5345 break;
5346 // If we know the element index, split the demand between the
5347 // source vector and the inserted element, otherwise assume we need
5348 // the original demanded vector elements and the value.
5349 SDValue InVec = Op.getOperand(0);
5350 SDValue InVal = Op.getOperand(1);
5351 SDValue EltNo = Op.getOperand(2);
5352 bool DemandedVal = true;
5353 APInt DemandedVecElts = DemandedElts;
5354 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5355 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5356 unsigned EltIdx = CEltNo->getZExtValue();
5357 DemandedVal = !!DemandedElts[EltIdx];
5358 DemandedVecElts.clearBit(EltIdx);
5359 }
5360 Tmp = std::numeric_limits<unsigned>::max();
5361 if (DemandedVal) {
5362 // TODO - handle implicit truncation of inserted elements.
5363 if (InVal.getScalarValueSizeInBits() != VTBits)
5364 break;
5365 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5366 Tmp = std::min(Tmp, Tmp2);
5367 }
5368 if (!!DemandedVecElts) {
5369 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5370 Tmp = std::min(Tmp, Tmp2);
5371 }
5372 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5373 return Tmp;
5374 }
5376 SDValue InVec = Op.getOperand(0);
5377 SDValue EltNo = Op.getOperand(1);
5378 EVT VecVT = InVec.getValueType();
5379 // ComputeNumSignBits not yet implemented for scalable vectors.
5380 if (VecVT.isScalableVector())
5381 break;
5382 const unsigned BitWidth = Op.getValueSizeInBits();
5383 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5384 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5385
5386 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5387 // anything about sign bits. But if the sizes match we can derive knowledge
5388 // about sign bits from the vector operand.
5389 if (BitWidth != EltBitWidth)
5390 break;
5391
5392 // If we know the element index, just demand that vector element, else for
5393 // an unknown element index, ignore DemandedElts and demand them all.
5394 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5395 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5396 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5397 DemandedSrcElts =
5398 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5399
5400 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5401 }
5403 // Offset the demanded elts by the subvector index.
5404 SDValue Src = Op.getOperand(0);
5405
5406 APInt DemandedSrcElts;
5407 if (Src.getValueType().isScalableVector())
5408 DemandedSrcElts = APInt(1, 1);
5409 else {
5410 uint64_t Idx = Op.getConstantOperandVal(1);
5411 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5412 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5413 }
5414 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5415 }
5416 case ISD::CONCAT_VECTORS: {
5417 if (VT.isScalableVector())
5418 break;
5419 // Determine the minimum number of sign bits across all demanded
5420 // elts of the input vectors. Early out if the result is already 1.
5421 Tmp = std::numeric_limits<unsigned>::max();
5422 EVT SubVectorVT = Op.getOperand(0).getValueType();
5423 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5424 unsigned NumSubVectors = Op.getNumOperands();
5425 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5426 APInt DemandedSub =
5427 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5428 if (!DemandedSub)
5429 continue;
5430 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5431 Tmp = std::min(Tmp, Tmp2);
5432 }
5433 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5434 return Tmp;
5435 }
5436 case ISD::INSERT_SUBVECTOR: {
5437 if (VT.isScalableVector())
5438 break;
5439 // Demand any elements from the subvector and the remainder from the src its
5440 // inserted into.
5441 SDValue Src = Op.getOperand(0);
5442 SDValue Sub = Op.getOperand(1);
5443 uint64_t Idx = Op.getConstantOperandVal(2);
5444 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5445 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5446 APInt DemandedSrcElts = DemandedElts;
5447 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5448
5449 Tmp = std::numeric_limits<unsigned>::max();
5450 if (!!DemandedSubElts) {
5451 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5452 if (Tmp == 1)
5453 return 1; // early-out
5454 }
5455 if (!!DemandedSrcElts) {
5456 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5457 Tmp = std::min(Tmp, Tmp2);
5458 }
5459 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5460 return Tmp;
5461 }
5462 case ISD::LOAD: {
5463 // If we are looking at the loaded value of the SDNode.
5464 if (Op.getResNo() != 0)
5465 break;
5466
5468 if (const MDNode *Ranges = LD->getRanges()) {
5469 if (DemandedElts != 1)
5470 break;
5471
5473 if (VTBits > CR.getBitWidth()) {
5474 switch (LD->getExtensionType()) {
5475 case ISD::SEXTLOAD:
5476 CR = CR.signExtend(VTBits);
5477 break;
5478 case ISD::ZEXTLOAD:
5479 CR = CR.zeroExtend(VTBits);
5480 break;
5481 default:
5482 break;
5483 }
5484 }
5485
5486 if (VTBits != CR.getBitWidth())
5487 break;
5488 return std::min(CR.getSignedMin().getNumSignBits(),
5490 }
5491
5492 unsigned ExtType = LD->getExtensionType();
5493 switch (ExtType) {
5494 default:
5495 break;
5496 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5497 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5498 return VTBits - Tmp + 1;
5499 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5500 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5501 return VTBits - Tmp;
5502 case ISD::NON_EXTLOAD:
5503 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5504 // We only need to handle vectors - computeKnownBits should handle
5505 // scalar cases.
5506 Type *CstTy = Cst->getType();
5507 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5508 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5509 VTBits == CstTy->getScalarSizeInBits()) {
5510 Tmp = VTBits;
5511 for (unsigned i = 0; i != NumElts; ++i) {
5512 if (!DemandedElts[i])
5513 continue;
5514 if (Constant *Elt = Cst->getAggregateElement(i)) {
5515 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5516 const APInt &Value = CInt->getValue();
5517 Tmp = std::min(Tmp, Value.getNumSignBits());
5518 continue;
5519 }
5520 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5521 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5522 Tmp = std::min(Tmp, Value.getNumSignBits());
5523 continue;
5524 }
5525 }
5526 // Unknown type. Conservatively assume no bits match sign bit.
5527 return 1;
5528 }
5529 return Tmp;
5530 }
5531 }
5532 break;
5533 }
5534
5535 break;
5536 }
5539 case ISD::ATOMIC_SWAP:
5551 case ISD::ATOMIC_LOAD: {
5552 auto *AT = cast<AtomicSDNode>(Op);
5553 // If we are looking at the loaded value.
5554 if (Op.getResNo() == 0) {
5555 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5556 if (Tmp == VTBits)
5557 return 1; // early-out
5558
5559 // For atomic_load, prefer to use the extension type.
5560 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5561 switch (AT->getExtensionType()) {
5562 default:
5563 break;
5564 case ISD::SEXTLOAD:
5565 return VTBits - Tmp + 1;
5566 case ISD::ZEXTLOAD:
5567 return VTBits - Tmp;
5568 }
5569 }
5570
5571 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5572 return VTBits - Tmp + 1;
5573 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5574 return VTBits - Tmp;
5575 }
5576 break;
5577 }
5578 }
5579
5580 // Allow the target to implement this method for its nodes.
5581 if (Opcode >= ISD::BUILTIN_OP_END ||
5582 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5583 Opcode == ISD::INTRINSIC_W_CHAIN ||
5584 Opcode == ISD::INTRINSIC_VOID) {
5585 // TODO: This can probably be removed once target code is audited. This
5586 // is here purely to reduce patch size and review complexity.
5587 if (!VT.isScalableVector()) {
5588 unsigned NumBits =
5589 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5590 if (NumBits > 1)
5591 FirstAnswer = std::max(FirstAnswer, NumBits);
5592 }
5593 }
5594
5595 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5596 // use this information.
5597 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5598 return std::max(FirstAnswer, Known.countMinSignBits());
5599}
5600
5602 unsigned Depth) const {
5603 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5604 return Op.getScalarValueSizeInBits() - SignBits + 1;
5605}
5606
5608 const APInt &DemandedElts,
5609 unsigned Depth) const {
5610 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5611 return Op.getScalarValueSizeInBits() - SignBits + 1;
5612}
5613
5615 UndefPoisonKind Kind,
5616 unsigned Depth) const {
5617 // Early out for FREEZE.
5618 if (Op.getOpcode() == ISD::FREEZE)
5619 return true;
5620
5621 APInt DemandedElts = getDemandAllEltsMask(Op);
5622 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5623}
5624
5626 const APInt &DemandedElts,
5627 UndefPoisonKind Kind,
5628 unsigned Depth) const {
5629 unsigned Opcode = Op.getOpcode();
5630
5631 // Early out for FREEZE.
5632 if (Opcode == ISD::FREEZE)
5633 return true;
5634
5635 if (Depth >= MaxRecursionDepth)
5636 return false; // Limit search depth.
5637
5638 if (isIntOrFPConstant(Op))
5639 return true;
5640
5641 switch (Opcode) {
5642 case ISD::CONDCODE:
5643 case ISD::VALUETYPE:
5644 case ISD::FrameIndex:
5646 case ISD::CopyFromReg:
5647 return true;
5648
5649 case ISD::POISON:
5650 return !includesPoison(Kind);
5651
5652 case ISD::UNDEF:
5653 return !includesUndef(Kind);
5654
5655 case ISD::BUILD_VECTOR:
5656 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5657 // this shouldn't affect the result.
5658 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5659 if (!DemandedElts[i])
5660 continue;
5661 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5662 return false;
5663 }
5664 return true;
5665
5667 SDValue Src = Op.getOperand(0);
5668 if (Src.getValueType().isScalableVector())
5669 break;
5670 uint64_t Idx = Op.getConstantOperandVal(1);
5671 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5672 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5673 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5674 Depth + 1);
5675 }
5676
5677 case ISD::INSERT_SUBVECTOR: {
5678 if (Op.getValueType().isScalableVector())
5679 break;
5680 SDValue Src = Op.getOperand(0);
5681 SDValue Sub = Op.getOperand(1);
5682 uint64_t Idx = Op.getConstantOperandVal(2);
5683 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5684 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5685 APInt DemandedSrcElts = DemandedElts;
5686 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5687
5688 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5689 Sub, DemandedSubElts, Kind, Depth + 1))
5690 return false;
5691 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5692 Src, DemandedSrcElts, Kind, Depth + 1))
5693 return false;
5694 return true;
5695 }
5696
5698 SDValue Src = Op.getOperand(0);
5699 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5700 EVT SrcVT = Src.getValueType();
5701 if (SrcVT.isFixedLengthVector() && IndexC &&
5702 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5703 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5704 IndexC->getZExtValue());
5705 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5706 Depth + 1);
5707 }
5708 break;
5709 }
5710
5712 SDValue InVec = Op.getOperand(0);
5713 SDValue InVal = Op.getOperand(1);
5714 SDValue EltNo = Op.getOperand(2);
5715 EVT VT = InVec.getValueType();
5716 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5717 if (IndexC && VT.isFixedLengthVector() &&
5718 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5719 if (DemandedElts[IndexC->getZExtValue()] &&
5720 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5721 return false;
5722 APInt InVecDemandedElts = DemandedElts;
5723 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5724 if (!!InVecDemandedElts &&
5726 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5727 InVecDemandedElts, Kind, Depth + 1))
5728 return false;
5729 return true;
5730 }
5731 break;
5732 }
5733
5735 // Check upper (known undef) elements.
5736 if (DemandedElts.ugt(1) && includesUndef(Kind))
5737 return false;
5738 // Check element zero.
5739 if (DemandedElts[0] &&
5740 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5741 return false;
5742 return true;
5743
5744 case ISD::SPLAT_VECTOR:
5745 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5746
5747 case ISD::VECTOR_SHUFFLE: {
5748 APInt DemandedLHS, DemandedRHS;
5749 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5750 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5751 DemandedElts, DemandedLHS, DemandedRHS,
5752 /*AllowUndefElts=*/false))
5753 return false;
5754 if (!DemandedLHS.isZero() &&
5755 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5756 Depth + 1))
5757 return false;
5758 if (!DemandedRHS.isZero() &&
5759 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5760 Depth + 1))
5761 return false;
5762 return true;
5763 }
5764
5765 case ISD::SHL:
5766 case ISD::SRL:
5767 case ISD::SRA:
5768 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5769 // enough to check operand 0 if Op can't create undef/poison.
5770 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5771 /*ConsiderFlags*/ true, Depth) &&
5772 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5773 Kind, Depth + 1);
5774
5775 case ISD::BSWAP:
5776 case ISD::CTPOP:
5777 case ISD::BITREVERSE:
5778 case ISD::AND:
5779 case ISD::OR:
5780 case ISD::XOR:
5781 case ISD::ADD:
5782 case ISD::SUB:
5783 case ISD::MUL:
5784 case ISD::SADDSAT:
5785 case ISD::UADDSAT:
5786 case ISD::SSUBSAT:
5787 case ISD::USUBSAT:
5788 case ISD::SSHLSAT:
5789 case ISD::USHLSAT:
5790 case ISD::SMIN:
5791 case ISD::SMAX:
5792 case ISD::UMIN:
5793 case ISD::UMAX:
5794 case ISD::ZERO_EXTEND:
5795 case ISD::SIGN_EXTEND:
5796 case ISD::ANY_EXTEND:
5797 case ISD::TRUNCATE:
5798 case ISD::VSELECT: {
5799 // If Op can't create undef/poison and none of its operands are undef/poison
5800 // then Op is never undef/poison. A difference from the more common check
5801 // below, outside the switch, is that we handle elementwise operations for
5802 // which the DemandedElts mask is valid for all operands here.
5803 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5804 /*ConsiderFlags*/ true, Depth) &&
5805 all_of(Op->ops(), [&](SDValue V) {
5806 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5807 Depth + 1);
5808 });
5809 }
5810
5811 // TODO: Search for noundef attributes from library functions.
5812
5813 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5814
5815 default:
5816 // Allow the target to implement this method for its nodes.
5817 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5818 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5819 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5820 Op, DemandedElts, *this, Kind, Depth);
5821 break;
5822 }
5823
5824 // If Op can't create undef/poison and none of its operands are undef/poison
5825 // then Op is never undef/poison.
5826 // NOTE: TargetNodes can handle this in themselves in
5827 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5828 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5829 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5830 all_of(Op->ops(), [&](SDValue V) {
5831 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5832 });
5833}
5834
5836 bool ConsiderFlags,
5837 unsigned Depth) const {
5838 APInt DemandedElts = getDemandAllEltsMask(Op);
5839 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5840}
5841
5843 UndefPoisonKind Kind,
5844 bool ConsiderFlags,
5845 unsigned Depth) const {
5846 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5847 return true;
5848
5849 unsigned Opcode = Op.getOpcode();
5850 switch (Opcode) {
5851 case ISD::AssertSext:
5852 case ISD::AssertZext:
5853 case ISD::AssertAlign:
5855 // Assertion nodes can create poison if the assertion fails.
5856 return includesPoison(Kind);
5857
5858 case ISD::FREEZE:
5862 case ISD::SADDSAT:
5863 case ISD::UADDSAT:
5864 case ISD::SSUBSAT:
5865 case ISD::USUBSAT:
5866 case ISD::MULHU:
5867 case ISD::MULHS:
5868 case ISD::AVGFLOORS:
5869 case ISD::AVGFLOORU:
5870 case ISD::AVGCEILS:
5871 case ISD::AVGCEILU:
5872 case ISD::ABDU:
5873 case ISD::ABDS:
5874 case ISD::SMIN:
5875 case ISD::SMAX:
5876 case ISD::SCMP:
5877 case ISD::UMIN:
5878 case ISD::UMAX:
5879 case ISD::UCMP:
5880 case ISD::AND:
5881 case ISD::XOR:
5882 case ISD::ROTL:
5883 case ISD::ROTR:
5884 case ISD::FSHL:
5885 case ISD::FSHR:
5886 case ISD::BSWAP:
5887 case ISD::CTTZ:
5888 case ISD::CTLZ:
5889 case ISD::CTLS:
5890 case ISD::CTPOP:
5891 case ISD::BITREVERSE:
5892 case ISD::PARITY:
5893 case ISD::SIGN_EXTEND:
5894 case ISD::TRUNCATE:
5898 case ISD::BITCAST:
5899 case ISD::BUILD_VECTOR:
5900 case ISD::BUILD_PAIR:
5901 case ISD::SPLAT_VECTOR:
5902 case ISD::FABS:
5903 case ISD::FCEIL:
5904 case ISD::FFLOOR:
5905 case ISD::FTRUNC:
5906 case ISD::FRINT:
5907 case ISD::FNEARBYINT:
5908 case ISD::FROUND:
5909 case ISD::FROUNDEVEN:
5910 return false;
5911
5912 case ISD::ABS:
5913 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5914 // Different to Intrinsic::abs.
5915 return false;
5916
5917 case ISD::ADDC:
5918 case ISD::SUBC:
5919 case ISD::ADDE:
5920 case ISD::SUBE:
5921 case ISD::SADDO:
5922 case ISD::SSUBO:
5923 case ISD::SMULO:
5924 case ISD::SADDO_CARRY:
5925 case ISD::SSUBO_CARRY:
5926 case ISD::UADDO:
5927 case ISD::USUBO:
5928 case ISD::UMULO:
5929 case ISD::UADDO_CARRY:
5930 case ISD::USUBO_CARRY:
5931 // No poison on result or overflow flags.
5932 return false;
5933
5934 case ISD::SELECT_CC:
5935 case ISD::SETCC: {
5936 // Integer setcc cannot create undef or poison.
5937 if (Op.getOperand(0).getValueType().isInteger())
5938 return false;
5939
5940 // FP compares are more complicated. They can create poison for nan/infinity
5941 // based on options and flags. The options and flags also cause special
5942 // nonan condition codes to be used. Those condition codes may be preserved
5943 // even if the nonan flag is dropped somewhere.
5944 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
5945 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
5946 return (unsigned)CCCode & 0x10U;
5947 }
5948
5949 case ISD::OR:
5950 case ISD::ZERO_EXTEND:
5951 case ISD::SELECT:
5952 case ISD::VSELECT:
5953 case ISD::ADD:
5954 case ISD::SUB:
5955 case ISD::MUL:
5956 case ISD::FNEG:
5957 case ISD::FADD:
5958 case ISD::FSUB:
5959 case ISD::FMUL:
5960 case ISD::FDIV:
5961 case ISD::FREM:
5962 case ISD::FCOPYSIGN:
5963 case ISD::FMA:
5964 case ISD::FMAD:
5965 case ISD::FMULADD:
5966 case ISD::FP_EXTEND:
5967 case ISD::FMINNUM:
5968 case ISD::FMAXNUM:
5969 case ISD::FMINNUM_IEEE:
5970 case ISD::FMAXNUM_IEEE:
5971 case ISD::FMINIMUM:
5972 case ISD::FMAXIMUM:
5973 case ISD::FMINIMUMNUM:
5974 case ISD::FMAXIMUMNUM:
5980 // No poison except from flags (which is handled above)
5981 return false;
5982
5983 case ISD::SHL:
5984 case ISD::SRL:
5985 case ISD::SRA:
5986 // If the max shift amount isn't in range, then the shift can
5987 // create poison.
5988 return includesPoison(Kind) &&
5989 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
5990
5993 // If the amount is zero then the result will be poison.
5994 // TODO: Add isKnownNeverZero DemandedElts handling.
5995 return includesPoison(Kind) &&
5996 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
5997
5999 // Check if we demand any upper (undef) elements.
6000 return includesUndef(Kind) && DemandedElts.ugt(1);
6001
6004 // Ensure that the element index is in bounds.
6005 if (includesPoison(Kind)) {
6006 EVT VecVT = Op.getOperand(0).getValueType();
6007 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6008 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6009 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6010 }
6011 return false;
6012 }
6013
6014 case ISD::VECTOR_SHUFFLE: {
6015 // Check for any demanded shuffle element that is undef.
6016 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6017 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6018 if (Elt < 0 && DemandedElts[Idx])
6019 return true;
6020 return false;
6021 }
6022
6024 return false;
6025
6026 default:
6027 // Allow the target to implement this method for its nodes.
6028 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6029 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6030 return TLI->canCreateUndefOrPoisonForTargetNode(
6031 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6032 break;
6033 }
6034
6035 // Be conservative and return true.
6036 return true;
6037}
6038
6039bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6040 unsigned Opcode = Op.getOpcode();
6041 if (Opcode == ISD::OR)
6042 return Op->getFlags().hasDisjoint() ||
6043 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6044 if (Opcode == ISD::XOR)
6045 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6046 return false;
6047}
6048
6050 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6051 (Op.isAnyAdd() || isADDLike(Op));
6052}
6053
6055 FPClassTest InterestedClasses,
6056 unsigned Depth) const {
6057 APInt DemandedElts = getDemandAllEltsMask(Op);
6058 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6059}
6060
6062 const APInt &DemandedElts,
6063 FPClassTest InterestedClasses,
6064 unsigned Depth) const {
6065 KnownFPClass Known;
6066
6067 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6068 return KnownFPClass(CFP->getValueAPF());
6069
6070 if (Depth >= MaxRecursionDepth)
6071 return Known;
6072
6073 if (Op.getOpcode() == ISD::UNDEF)
6074 return Known;
6075
6076 EVT VT = Op.getValueType();
6077 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6078 assert((!VT.isFixedLengthVector() ||
6079 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6080 "Unexpected vector size");
6081
6082 if (!DemandedElts)
6083 return Known;
6084
6085 unsigned Opcode = Op.getOpcode();
6086 switch (Opcode) {
6087 case ISD::POISON: {
6088 Known.KnownFPClasses = fcNone;
6089 Known.SignBit = false;
6090 break;
6091 }
6092 case ISD::FNEG: {
6093 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6094 InterestedClasses, Depth + 1);
6095 Known.fneg();
6096 break;
6097 }
6098 case ISD::BUILD_VECTOR: {
6099 assert(!VT.isScalableVector());
6100 bool First = true;
6101 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6102 if (!DemandedElts[I])
6103 continue;
6104
6105 if (First) {
6106 Known =
6107 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6108 First = false;
6109 } else {
6110 Known |=
6111 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6112 }
6113
6114 if (Known.isUnknown())
6115 break;
6116 }
6117 break;
6118 }
6120 SDValue Src = Op.getOperand(0);
6121 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6122 EVT SrcVT = Src.getValueType();
6123 if (SrcVT.isFixedLengthVector() && CIdx) {
6124 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6125 APInt DemandedSrcElts = APInt::getOneBitSet(
6126 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6127 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6128 Depth + 1);
6129 } else {
6130 // Out of bounds index is poison.
6131 Known.KnownFPClasses = fcNone;
6132 }
6133 } else {
6134 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6135 }
6136 break;
6137 }
6138 case ISD::SPLAT_VECTOR: {
6139 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6140 break;
6141 }
6142 case ISD::BITCAST: {
6143 // FIXME: It should not be necessary to check for an elementwise bitcast.
6144 // If a bitcast is not elementwise between vector / scalar types,
6145 // computeKnownBits already splices the known bits of the source elements
6146 // appropriately so as to line up with the bits of the result's demanded
6147 // elements.
6148 EVT SrcVT = Op.getOperand(0).getValueType();
6149 if (VT.isScalableVector() || SrcVT.isScalableVector())
6150 break;
6151 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6152 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6153 if (VTNumElts != SrcVTNumElts)
6154 break;
6155
6156 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6157 Known = KnownFPClass::bitcast(VT.getFltSemantics(), Bits);
6158 break;
6159 }
6160 case ISD::FABS: {
6161 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6162 InterestedClasses, Depth + 1);
6163 Known.fabs();
6164 break;
6165 }
6166 case ISD::FCOPYSIGN: {
6167 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6168 InterestedClasses, Depth + 1);
6169 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6170 InterestedClasses, Depth + 1);
6171 Known.copysign(KnownSign);
6172 break;
6173 }
6174 case ISD::AssertNoFPClass: {
6175 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6176 InterestedClasses, Depth + 1);
6177 FPClassTest AssertedClasses =
6178 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6179 Known.KnownFPClasses &= ~AssertedClasses;
6180 break;
6181 }
6183 SDValue Src = Op.getOperand(0);
6184 EVT SrcVT = Src.getValueType();
6185 if (SrcVT.isFixedLengthVector()) {
6186 unsigned Idx = Op.getConstantOperandVal(1);
6187 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6188
6189 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6190 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6191 Depth + 1);
6192 } else {
6193 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6194 }
6195 break;
6196 }
6197 case ISD::INSERT_SUBVECTOR: {
6198 SDValue BaseVector = Op.getOperand(0);
6199 SDValue SubVector = Op.getOperand(1);
6200 EVT BaseVT = BaseVector.getValueType();
6201 if (BaseVT.isFixedLengthVector()) {
6202 unsigned Idx = Op.getConstantOperandVal(2);
6203 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6204 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6205
6206 APInt DemandedMask =
6207 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6208 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6209 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6210
6211 if (!DemandedSrcElts.isZero())
6212 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6213 InterestedClasses, Depth + 1);
6214 if (!DemandedSubElts.isZero()) {
6216 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6217 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6218 }
6219 } else {
6220 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6221 if (!Known.isUnknown())
6222 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6223 }
6224 break;
6225 }
6226 case ISD::SELECT:
6227 case ISD::VSELECT: {
6228 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6229 // IR-level ValueTracking.
6230 KnownFPClass KnownFalseClass = computeKnownFPClass(
6231 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6232 if (KnownFalseClass.isUnknown())
6233 break;
6234 KnownFPClass KnownTrueClass = computeKnownFPClass(
6235 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6236 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6237 break;
6238 }
6239 default:
6240 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6241 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6242 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6243 Depth);
6244 }
6245 break;
6246 }
6247
6248 return Known;
6249}
6250
6252 unsigned Depth) const {
6253 APInt DemandedElts = getDemandAllEltsMask(Op);
6254 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6255}
6256
6258 bool SNaN, unsigned Depth) const {
6259 assert(!DemandedElts.isZero() && "No demanded elements");
6260
6261 // If we're told that NaNs won't happen, assume they won't.
6262 if (Op->getFlags().hasNoNaNs())
6263 return true;
6264
6265 if (Depth >= MaxRecursionDepth)
6266 return false; // Limit search depth.
6267
6268 unsigned Opcode = Op.getOpcode();
6269 switch (Opcode) {
6270 case ISD::FADD:
6271 case ISD::FSUB:
6272 case ISD::FMUL:
6273 case ISD::FDIV:
6274 case ISD::FREM:
6275 case ISD::FSIN:
6276 case ISD::FCOS:
6277 case ISD::FTAN:
6278 case ISD::FASIN:
6279 case ISD::FACOS:
6280 case ISD::FATAN:
6281 case ISD::FATAN2:
6282 case ISD::FSINH:
6283 case ISD::FCOSH:
6284 case ISD::FTANH:
6285 case ISD::FMA:
6286 case ISD::FMULADD:
6287 case ISD::FMAD: {
6288 if (SNaN)
6289 return true;
6290 // TODO: Need isKnownNeverInfinity
6291 return false;
6292 }
6293 case ISD::FCANONICALIZE:
6294 case ISD::FEXP:
6295 case ISD::FEXP2:
6296 case ISD::FEXP10:
6297 case ISD::FTRUNC:
6298 case ISD::FFLOOR:
6299 case ISD::FCEIL:
6300 case ISD::FROUND:
6301 case ISD::FROUNDEVEN:
6302 case ISD::LROUND:
6303 case ISD::LLROUND:
6304 case ISD::FRINT:
6305 case ISD::LRINT:
6306 case ISD::LLRINT:
6307 case ISD::FNEARBYINT:
6308 case ISD::FLDEXP: {
6309 if (SNaN)
6310 return true;
6311 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6312 }
6313 case ISD::FABS:
6314 case ISD::FNEG:
6315 case ISD::FCOPYSIGN: {
6316 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6317 }
6318 case ISD::SELECT:
6319 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6320 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6321 case ISD::FP_EXTEND:
6322 case ISD::FP_ROUND: {
6323 if (SNaN)
6324 return true;
6325 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6326 }
6327 case ISD::SINT_TO_FP:
6328 case ISD::UINT_TO_FP:
6329 return true;
6330 case ISD::FSQRT: // Need is known positive
6331 case ISD::FLOG:
6332 case ISD::FLOG2:
6333 case ISD::FLOG10:
6334 case ISD::FPOWI:
6335 case ISD::FPOW: {
6336 if (SNaN)
6337 return true;
6338 // TODO: Refine on operand
6339 return false;
6340 }
6341 case ISD::FMINNUM:
6342 case ISD::FMAXNUM:
6343 case ISD::FMINIMUMNUM:
6344 case ISD::FMAXIMUMNUM: {
6345 // Only one needs to be known not-nan, since it will be returned if the
6346 // other ends up being one.
6347 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6348 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6349 }
6350 case ISD::FMINNUM_IEEE:
6351 case ISD::FMAXNUM_IEEE: {
6352 if (SNaN)
6353 return true;
6354 // This can return a NaN if either operand is an sNaN, or if both operands
6355 // are NaN.
6356 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6357 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6358 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6359 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6360 }
6361 case ISD::FMINIMUM:
6362 case ISD::FMAXIMUM: {
6363 // TODO: Does this quiet or return the origina NaN as-is?
6364 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6365 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6366 }
6368 SDValue Src = Op.getOperand(0);
6369 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6370 EVT SrcVT = Src.getValueType();
6371 if (SrcVT.isFixedLengthVector() && Idx &&
6372 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6373 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6374 Idx->getZExtValue());
6375 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6376 }
6377 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6378 }
6380 SDValue Src = Op.getOperand(0);
6381 if (Src.getValueType().isFixedLengthVector()) {
6382 unsigned Idx = Op.getConstantOperandVal(1);
6383 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6384 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6385 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6386 }
6387 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6388 }
6389 case ISD::INSERT_SUBVECTOR: {
6390 SDValue BaseVector = Op.getOperand(0);
6391 SDValue SubVector = Op.getOperand(1);
6392 EVT BaseVectorVT = BaseVector.getValueType();
6393 if (BaseVectorVT.isFixedLengthVector()) {
6394 unsigned Idx = Op.getConstantOperandVal(2);
6395 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6396 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6397
6398 // Clear/Extract the bits at the position where the subvector will be
6399 // inserted.
6400 APInt DemandedMask =
6401 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6402 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6403 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6404
6405 bool NeverNaN = true;
6406 if (!DemandedSrcElts.isZero())
6407 NeverNaN &=
6408 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6409 if (NeverNaN && !DemandedSubElts.isZero())
6410 NeverNaN &=
6411 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6412 return NeverNaN;
6413 }
6414 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6415 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6416 }
6417 case ISD::BUILD_VECTOR: {
6418 unsigned NumElts = Op.getNumOperands();
6419 for (unsigned I = 0; I != NumElts; ++I)
6420 if (DemandedElts[I] &&
6421 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6422 return false;
6423 return true;
6424 }
6425 case ISD::SPLAT_VECTOR:
6426 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6427 case ISD::AssertNoFPClass: {
6428 FPClassTest NoFPClass =
6429 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6430 if ((NoFPClass & fcNan) == fcNan)
6431 return true;
6432 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6433 return true;
6434 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6435 }
6436 default:
6437 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6438 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6439 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6440 Depth);
6441 }
6442 break;
6443 }
6444
6445 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6446 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6447 return Known.isKnownNever(NanMask);
6448}
6449
6451 APInt DemandedElts = getDemandAllEltsMask(Op);
6452 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6453}
6454
6456 const APInt &DemandedElts,
6457 unsigned Depth) const {
6458 assert(!DemandedElts.isZero() && "No demanded elements");
6459 EVT VT = Op.getValueType();
6460 KnownFPClass Known =
6461 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6462 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6463}
6464
6466 APInt DemandedElts = getDemandAllEltsMask(Op);
6467 return isKnownNeverZero(Op, DemandedElts, Depth);
6468}
6469
6471 unsigned Depth) const {
6472 if (Depth >= MaxRecursionDepth)
6473 return false; // Limit search depth.
6474
6475 EVT OpVT = Op.getValueType();
6476 unsigned BitWidth = OpVT.getScalarSizeInBits();
6477
6478 assert(!Op.getValueType().isFloatingPoint() &&
6479 "Floating point types unsupported - use isKnownNeverLogicalZero");
6480
6481 // If the value is a constant, we can obviously see if it is a zero or not.
6482 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6483 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6484 return !V.isZero();
6485 };
6486
6487 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6488 return true;
6489
6490 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6491 // some degree.
6492 switch (Op.getOpcode()) {
6493 default:
6494 break;
6495
6496 case ISD::BUILD_VECTOR:
6497 // Are all operands of a build vector constant non-zero?
6498 if (all_of(enumerate(Op->ops()), [&](auto P) {
6499 auto *C = dyn_cast<ConstantSDNode>(P.value());
6500 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6501 }))
6502 return true;
6503 break;
6504
6505 case ISD::SPLAT_VECTOR:
6506 // Is the operand of a splat vector a constant non-zero?
6507 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6508 if (IsNeverZero(C))
6509 return true;
6510 break;
6511
6513 SDValue InVec = Op.getOperand(0);
6514 SDValue EltNo = Op.getOperand(1);
6515 EVT VecVT = InVec.getValueType();
6516
6517 // Skip scalable vectors or implicit extensions.
6518 if (VecVT.isScalableVector() ||
6519 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6520 break;
6521
6522 // If we know the element index, just demand that vector element, else for
6523 // an unknown element index, ignore DemandedElts and demand them all.
6524 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6525 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6526 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6527 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6528 DemandedSrcElts =
6529 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6530
6531 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6532 }
6533
6534 case ISD::OR:
6535 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6536 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6537
6538 case ISD::VSELECT:
6539 case ISD::SELECT:
6540 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6541 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6542
6543 case ISD::SHL: {
6544 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6545 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6546 KnownBits ValKnown =
6547 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6548 // 1 << X is never zero.
6549 if (ValKnown.One[0])
6550 return true;
6551 // If max shift cnt of known ones is non-zero, result is non-zero.
6552 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6553 .getMaxValue();
6554 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6555 !ValKnown.One.shl(MaxCnt).isZero())
6556 return true;
6557 break;
6558 }
6559
6560 case ISD::VECTOR_SHUFFLE: {
6561 if (Op.getValueType().isScalableVector())
6562 return false;
6563
6564 unsigned NumElts = DemandedElts.getBitWidth();
6565
6566 // All demanded elements from LHS and RHS must be known non-zero.
6567 // Demanded elements with undef shuffle mask elements are unknown.
6568
6569 APInt DemandedLHS, DemandedRHS;
6570 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6571 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6572 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6573 DemandedLHS, DemandedRHS))
6574 return false;
6575
6576 return (!DemandedLHS ||
6577 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6578 (!DemandedRHS ||
6579 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6580 }
6581
6582 case ISD::UADDSAT:
6583 case ISD::UMAX:
6584 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6585 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6586
6587 case ISD::UMIN:
6588 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6589 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6590
6591 // For smin/smax: If either operand is known negative/positive
6592 // respectively we don't need the other to be known at all.
6593 case ISD::SMAX: {
6594 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6595 if (Op1.isStrictlyPositive())
6596 return true;
6597
6598 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6599 if (Op0.isStrictlyPositive())
6600 return true;
6601
6602 if (Op1.isNonZero() && Op0.isNonZero())
6603 return true;
6604
6605 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6606 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6607 }
6608 case ISD::SMIN: {
6609 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6610 if (Op1.isNegative())
6611 return true;
6612
6613 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6614 if (Op0.isNegative())
6615 return true;
6616
6617 if (Op1.isNonZero() && Op0.isNonZero())
6618 return true;
6619
6620 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6621 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6622 }
6623
6624 case ISD::ROTL:
6625 case ISD::ROTR:
6626 case ISD::BITREVERSE:
6627 case ISD::BSWAP:
6628 case ISD::CTPOP:
6629 case ISD::ABS:
6630 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6631
6632 case ISD::SRA:
6633 case ISD::SRL: {
6634 if (Op->getFlags().hasExact())
6635 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6636 KnownBits ValKnown =
6637 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6638 if (ValKnown.isNegative())
6639 return true;
6640 // If max shift cnt of known ones is non-zero, result is non-zero.
6641 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6642 .getMaxValue();
6643 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6644 !ValKnown.One.lshr(MaxCnt).isZero())
6645 return true;
6646 break;
6647 }
6648 case ISD::UDIV:
6649 case ISD::SDIV:
6650 // div exact can only produce a zero if the dividend is zero.
6651 // TODO: For udiv this is also true if Op1 u<= Op0
6652 if (Op->getFlags().hasExact())
6653 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6654 break;
6655
6656 case ISD::ADD:
6657 if (Op->getFlags().hasNoUnsignedWrap())
6658 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6659 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6660 return true;
6661 // TODO: There are a lot more cases we can prove for add.
6662 break;
6663
6664 case ISD::SUB: {
6665 if (isNullConstant(Op.getOperand(0)))
6666 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6667
6668 std::optional<bool> ne = KnownBits::ne(
6669 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6670 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6671 return ne && *ne;
6672 }
6673
6674 case ISD::MUL:
6675 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6676 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6677 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6678 return true;
6679 break;
6680
6681 case ISD::ZERO_EXTEND:
6682 case ISD::SIGN_EXTEND:
6683 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6684 case ISD::VSCALE: {
6686 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6687 ConstantRange CR =
6688 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6689 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6690 return true;
6691 break;
6692 }
6693 }
6694
6696}
6697
6699 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6700 return !C1->isNegative();
6701
6702 switch (Op.getOpcode()) {
6703 case ISD::FABS:
6704 case ISD::FEXP:
6705 case ISD::FEXP2:
6706 case ISD::FEXP10:
6707 return true;
6708 default:
6709 return false;
6710 }
6711
6712 llvm_unreachable("covered opcode switch");
6713}
6714
6716 assert(Use.getValueType().isFloatingPoint());
6717 const SDNode *User = Use.getUser();
6718 if (User->getFlags().hasNoSignedZeros())
6719 return true;
6720
6721 unsigned OperandNo = Use.getOperandNo();
6722 // Check if this use is insensitive to the sign of zero
6723 switch (User->getOpcode()) {
6724 case ISD::SETCC:
6725 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6726 case ISD::FABS:
6727 // fabs always produces +0.0.
6728 return true;
6729 case ISD::FCOPYSIGN:
6730 // copysign overwrites the sign bit of the first operand.
6731 return OperandNo == 0;
6732 case ISD::FADD:
6733 case ISD::FSUB: {
6734 // Arithmetic with non-zero constants fixes the uncertainty around the
6735 // sign bit.
6736 SDValue Other = User->getOperand(1 - OperandNo);
6738 }
6739 case ISD::FP_TO_SINT:
6740 case ISD::FP_TO_UINT:
6741 // fp-to-int conversions normalize signed zeros.
6742 return true;
6743 default:
6744 return false;
6745 }
6746}
6747
6749 if (Op->getFlags().hasNoSignedZeros())
6750 return true;
6751 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6752 // regression. Ideally, this should be implemented as a demanded-bits
6753 // optimization that stems from the users.
6754 if (Op->use_size() > 2)
6755 return false;
6756 return all_of(Op->uses(),
6757 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6758}
6759
6761 // Check the obvious case.
6762 if (A == B) return true;
6763
6764 // For negative and positive zero.
6767 if (CA->isZero() && CB->isZero()) return true;
6768
6769 // Otherwise they may not be equal.
6770 return false;
6771}
6772
6773// Only bits set in Mask must be negated, other bits may be arbitrary.
6775 if (isBitwiseNot(V, AllowUndefs))
6776 return V.getOperand(0);
6777
6778 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6779 // bits in the non-extended part.
6780 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6781 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6782 return SDValue();
6783 SDValue ExtArg = V.getOperand(0);
6784 if (ExtArg.getScalarValueSizeInBits() >=
6785 MaskC->getAPIntValue().getActiveBits() &&
6786 isBitwiseNot(ExtArg, AllowUndefs) &&
6787 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6788 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6789 return ExtArg.getOperand(0).getOperand(0);
6790 return SDValue();
6791}
6792
6794 // Match masked merge pattern (X & ~M) op (Y & M)
6795 // Including degenerate case (X & ~M) op M
6796 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6797 SDValue Other) {
6798 if (SDValue NotOperand =
6799 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6800 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6801 NotOperand->getOpcode() == ISD::TRUNCATE)
6802 NotOperand = NotOperand->getOperand(0);
6803
6804 if (Other == NotOperand)
6805 return true;
6806 if (Other->getOpcode() == ISD::AND)
6807 return NotOperand == Other->getOperand(0) ||
6808 NotOperand == Other->getOperand(1);
6809 }
6810 return false;
6811 };
6812
6813 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6814 A = A->getOperand(0);
6815
6816 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6817 B = B->getOperand(0);
6818
6819 if (A->getOpcode() == ISD::AND)
6820 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6821 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6822 return false;
6823}
6824
6825// FIXME: unify with llvm::haveNoCommonBitsSet.
6827 assert(A.getValueType() == B.getValueType() &&
6828 "Values must have the same type");
6831 return true;
6834}
6835
6836static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6837 SelectionDAG &DAG) {
6838 if (cast<ConstantSDNode>(Step)->isZero())
6839 return DAG.getConstant(0, DL, VT);
6840
6841 return SDValue();
6842}
6843
6846 SelectionDAG &DAG) {
6847 int NumOps = Ops.size();
6848 assert(NumOps != 0 && "Can't build an empty vector!");
6849 assert(!VT.isScalableVector() &&
6850 "BUILD_VECTOR cannot be used with scalable types");
6851 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6852 "Incorrect element count in BUILD_VECTOR!");
6853
6854 // BUILD_VECTOR of UNDEFs is UNDEF.
6855 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6856 return DAG.getUNDEF(VT);
6857
6858 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6859 SDValue IdentitySrc;
6860 bool IsIdentity = true;
6861 for (int i = 0; i != NumOps; ++i) {
6862 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6863 Ops[i].getOperand(0).getValueType() != VT ||
6864 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6865 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6866 Ops[i].getConstantOperandAPInt(1) != i) {
6867 IsIdentity = false;
6868 break;
6869 }
6870 IdentitySrc = Ops[i].getOperand(0);
6871 }
6872 if (IsIdentity)
6873 return IdentitySrc;
6874
6875 return SDValue();
6876}
6877
6878/// Try to simplify vector concatenation to an input value, undef, or build
6879/// vector.
6882 SelectionDAG &DAG) {
6883 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6885 [Ops](SDValue Op) {
6886 return Ops[0].getValueType() == Op.getValueType();
6887 }) &&
6888 "Concatenation of vectors with inconsistent value types!");
6889 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6890 VT.getVectorElementCount() &&
6891 "Incorrect element count in vector concatenation!");
6892
6893 if (Ops.size() == 1)
6894 return Ops[0];
6895
6896 // Concat of UNDEFs is UNDEF.
6897 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6898 return DAG.getUNDEF(VT);
6899
6900 // Scan the operands and look for extract operations from a single source
6901 // that correspond to insertion at the same location via this concatenation:
6902 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6903 SDValue IdentitySrc;
6904 bool IsIdentity = true;
6905 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6906 SDValue Op = Ops[i];
6907 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
6908 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
6909 Op.getOperand(0).getValueType() != VT ||
6910 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
6911 Op.getConstantOperandVal(1) != IdentityIndex) {
6912 IsIdentity = false;
6913 break;
6914 }
6915 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
6916 "Unexpected identity source vector for concat of extracts");
6917 IdentitySrc = Op.getOperand(0);
6918 }
6919 if (IsIdentity) {
6920 assert(IdentitySrc && "Failed to set source vector of extracts");
6921 return IdentitySrc;
6922 }
6923
6924 // The code below this point is only designed to work for fixed width
6925 // vectors, so we bail out for now.
6926 if (VT.isScalableVector())
6927 return SDValue();
6928
6929 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
6930 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
6931 // BUILD_VECTOR.
6932 // FIXME: Add support for SCALAR_TO_VECTOR as well.
6933 EVT SVT = VT.getScalarType();
6935 for (SDValue Op : Ops) {
6936 EVT OpVT = Op.getValueType();
6937 if (Op.isUndef())
6938 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
6939 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
6940 Elts.append(Op->op_begin(), Op->op_end());
6941 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
6942 OpVT.getVectorNumElements() == 1 &&
6943 isNullConstant(Op.getOperand(2)))
6944 Elts.push_back(Op.getOperand(1));
6945 else
6946 return SDValue();
6947 }
6948
6949 // BUILD_VECTOR requires all inputs to be of the same type, find the
6950 // maximum type and extend them all.
6951 for (SDValue Op : Elts)
6952 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
6953
6954 if (SVT.bitsGT(VT.getScalarType())) {
6955 for (SDValue &Op : Elts) {
6956 if (Op.isUndef())
6957 Op = DAG.getUNDEF(SVT);
6958 else
6959 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
6960 ? DAG.getZExtOrTrunc(Op, DL, SVT)
6961 : DAG.getSExtOrTrunc(Op, DL, SVT);
6962 }
6963 }
6964
6965 SDValue V = DAG.getBuildVector(VT, DL, Elts);
6966 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
6967 return V;
6968}
6969
6970/// Gets or creates the specified node.
6971SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6972 SDVTList VTs = getVTList(VT);
6974 AddNodeIDNode(ID, Opcode, VTs, {});
6975 void *IP = nullptr;
6976 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6977 return SDValue(E, 0);
6978
6979 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6980 CSEMap.InsertNode(N, IP);
6981
6982 InsertNode(N);
6983 SDValue V = SDValue(N, 0);
6984 NewSDValueDbgMsg(V, "Creating new node: ", this);
6985 return V;
6986}
6987
6988SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6989 SDValue N1) {
6990 SDNodeFlags Flags;
6991 if (Inserter)
6992 Flags = Inserter->getFlags();
6993 return getNode(Opcode, DL, VT, N1, Flags);
6994}
6995
6996SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6997 SDValue N1, const SDNodeFlags Flags) {
6998 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
6999
7000 // Constant fold unary operations with a vector integer or float operand.
7001 switch (Opcode) {
7002 default:
7003 // FIXME: Entirely reasonable to perform folding of other unary
7004 // operations here as the need arises.
7005 break;
7006 case ISD::FNEG:
7007 case ISD::FABS:
7008 case ISD::FCEIL:
7009 case ISD::FTRUNC:
7010 case ISD::FFLOOR:
7011 case ISD::FP_EXTEND:
7012 case ISD::FP_TO_SINT:
7013 case ISD::FP_TO_UINT:
7014 case ISD::FP_TO_FP16:
7015 case ISD::FP_TO_BF16:
7016 case ISD::TRUNCATE:
7017 case ISD::ANY_EXTEND:
7018 case ISD::ZERO_EXTEND:
7019 case ISD::SIGN_EXTEND:
7020 case ISD::UINT_TO_FP:
7021 case ISD::SINT_TO_FP:
7022 case ISD::FP16_TO_FP:
7023 case ISD::BF16_TO_FP:
7024 case ISD::BITCAST:
7025 case ISD::ABS:
7026 case ISD::BITREVERSE:
7027 case ISD::BSWAP:
7028 case ISD::CTLZ:
7030 case ISD::CTTZ:
7032 case ISD::CTPOP:
7033 case ISD::CTLS:
7034 case ISD::STEP_VECTOR: {
7035 SDValue Ops = {N1};
7036 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7037 return Fold;
7038 }
7039 }
7040
7041 unsigned OpOpcode = N1.getNode()->getOpcode();
7042 switch (Opcode) {
7043 case ISD::STEP_VECTOR:
7044 assert(VT.isScalableVector() &&
7045 "STEP_VECTOR can only be used with scalable types");
7046 assert(OpOpcode == ISD::TargetConstant &&
7047 VT.getVectorElementType() == N1.getValueType() &&
7048 "Unexpected step operand");
7049 break;
7050 case ISD::FREEZE:
7051 assert(VT == N1.getValueType() && "Unexpected VT!");
7053 return N1;
7054 break;
7055 case ISD::TokenFactor:
7056 case ISD::MERGE_VALUES:
7058 return N1; // Factor, merge or concat of one node? No need.
7059 case ISD::BUILD_VECTOR: {
7060 // Attempt to simplify BUILD_VECTOR.
7061 SDValue Ops[] = {N1};
7062 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7063 return V;
7064 break;
7065 }
7066 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7067 case ISD::FP_EXTEND:
7069 "Invalid FP cast!");
7070 if (N1.getValueType() == VT) return N1; // noop conversion.
7071 assert((!VT.isVector() || VT.getVectorElementCount() ==
7073 "Vector element count mismatch!");
7074 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7075 if (N1.isUndef())
7076 return getUNDEF(VT);
7077 break;
7078 case ISD::FP_TO_SINT:
7079 case ISD::FP_TO_UINT:
7080 if (N1.isUndef())
7081 return getUNDEF(VT);
7082 break;
7083 case ISD::SINT_TO_FP:
7084 case ISD::UINT_TO_FP:
7085 // [us]itofp(undef) = 0, because the result value is bounded.
7086 if (N1.isUndef())
7087 return getConstantFP(0.0, DL, VT);
7088 break;
7089 case ISD::SIGN_EXTEND:
7090 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7091 "Invalid SIGN_EXTEND!");
7092 assert(VT.isVector() == N1.getValueType().isVector() &&
7093 "SIGN_EXTEND result type type should be vector iff the operand "
7094 "type is vector!");
7095 if (N1.getValueType() == VT) return N1; // noop extension
7096 assert((!VT.isVector() || VT.getVectorElementCount() ==
7098 "Vector element count mismatch!");
7099 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7100 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7101 SDNodeFlags Flags;
7102 if (OpOpcode == ISD::ZERO_EXTEND)
7103 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7104 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7105 transferDbgValues(N1, NewVal);
7106 return NewVal;
7107 }
7108
7109 if (OpOpcode == ISD::POISON)
7110 return getPOISON(VT);
7111
7112 if (N1.isUndef())
7113 // sext(undef) = 0, because the top bits will all be the same.
7114 return getConstant(0, DL, VT);
7115
7116 // Skip unnecessary sext_inreg pattern:
7117 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7118 if (OpOpcode == ISD::TRUNCATE) {
7119 SDValue OpOp = N1.getOperand(0);
7120 if (OpOp.getValueType() == VT) {
7121 unsigned NumSignExtBits =
7123 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7124 transferDbgValues(N1, OpOp);
7125 return OpOp;
7126 }
7127 }
7128 }
7129 break;
7130 case ISD::ZERO_EXTEND:
7131 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7132 "Invalid ZERO_EXTEND!");
7133 assert(VT.isVector() == N1.getValueType().isVector() &&
7134 "ZERO_EXTEND result type type should be vector iff the operand "
7135 "type is vector!");
7136 if (N1.getValueType() == VT) return N1; // noop extension
7137 assert((!VT.isVector() || VT.getVectorElementCount() ==
7139 "Vector element count mismatch!");
7140 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7141 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7142 SDNodeFlags Flags;
7143 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7144 SDValue NewVal =
7145 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7146 transferDbgValues(N1, NewVal);
7147 return NewVal;
7148 }
7149
7150 if (OpOpcode == ISD::POISON)
7151 return getPOISON(VT);
7152
7153 if (N1.isUndef())
7154 // zext(undef) = 0, because the top bits will be zero.
7155 return getConstant(0, DL, VT);
7156
7157 // Skip unnecessary zext_inreg pattern:
7158 // (zext (trunc x)) -> x iff the upper bits are known zero.
7159 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7160 // use to recognise zext_inreg patterns.
7161 if (OpOpcode == ISD::TRUNCATE) {
7162 SDValue OpOp = N1.getOperand(0);
7163 if (OpOp.getValueType() == VT) {
7164 if (OpOp.getOpcode() != ISD::AND) {
7167 if (MaskedValueIsZero(OpOp, HiBits)) {
7168 transferDbgValues(N1, OpOp);
7169 return OpOp;
7170 }
7171 }
7172 }
7173 }
7174 break;
7175 case ISD::ANY_EXTEND:
7176 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7177 "Invalid ANY_EXTEND!");
7178 assert(VT.isVector() == N1.getValueType().isVector() &&
7179 "ANY_EXTEND result type type should be vector iff the operand "
7180 "type is vector!");
7181 if (N1.getValueType() == VT) return N1; // noop extension
7182 assert((!VT.isVector() || VT.getVectorElementCount() ==
7184 "Vector element count mismatch!");
7185 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7186
7187 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7188 OpOpcode == ISD::ANY_EXTEND) {
7189 SDNodeFlags Flags;
7190 if (OpOpcode == ISD::ZERO_EXTEND)
7191 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7192 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7193 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7194 }
7195 if (N1.isUndef())
7196 return getUNDEF(VT);
7197
7198 // (ext (trunc x)) -> x
7199 if (OpOpcode == ISD::TRUNCATE) {
7200 SDValue OpOp = N1.getOperand(0);
7201 if (OpOp.getValueType() == VT) {
7202 transferDbgValues(N1, OpOp);
7203 return OpOp;
7204 }
7205 }
7206 break;
7207 case ISD::TRUNCATE:
7208 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7209 "Invalid TRUNCATE!");
7210 assert(VT.isVector() == N1.getValueType().isVector() &&
7211 "TRUNCATE result type type should be vector iff the operand "
7212 "type is vector!");
7213 if (N1.getValueType() == VT) return N1; // noop truncate
7214 assert((!VT.isVector() || VT.getVectorElementCount() ==
7216 "Vector element count mismatch!");
7217 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7218 if (OpOpcode == ISD::TRUNCATE)
7219 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7220 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7221 OpOpcode == ISD::ANY_EXTEND) {
7222 // If the source is smaller than the dest, we still need an extend.
7224 VT.getScalarType())) {
7225 SDNodeFlags Flags;
7226 if (OpOpcode == ISD::ZERO_EXTEND)
7227 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7228 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7229 }
7230 if (N1.getOperand(0).getValueType().bitsGT(VT))
7231 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7232 return N1.getOperand(0);
7233 }
7234 if (N1.isUndef())
7235 return getUNDEF(VT);
7236 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7237 return getVScale(DL, VT,
7239 break;
7243 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7244 assert(N1.getValueType().bitsLE(VT) &&
7245 "The input must be the same size or smaller than the result.");
7248 "The destination vector type must have fewer lanes than the input.");
7249 break;
7250 case ISD::ABS:
7251 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7252 if (N1.isUndef())
7253 return getConstant(0, DL, VT);
7254 break;
7255 case ISD::BSWAP:
7256 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7257 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7258 "BSWAP types must be a multiple of 16 bits!");
7259 if (N1.isUndef())
7260 return getUNDEF(VT);
7261 // bswap(bswap(X)) -> X.
7262 if (OpOpcode == ISD::BSWAP)
7263 return N1.getOperand(0);
7264 break;
7265 case ISD::BITREVERSE:
7266 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7267 if (N1.isUndef())
7268 return getUNDEF(VT);
7269 break;
7270 case ISD::BITCAST:
7272 "Cannot BITCAST between types of different sizes!");
7273 if (VT == N1.getValueType()) return N1; // noop conversion.
7274 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7275 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7276 if (N1.isUndef())
7277 return getUNDEF(VT);
7278 break;
7280 assert(VT.isVector() && !N1.getValueType().isVector() &&
7281 (VT.getVectorElementType() == N1.getValueType() ||
7283 N1.getValueType().isInteger() &&
7285 "Illegal SCALAR_TO_VECTOR node!");
7286 if (N1.isUndef())
7287 return getUNDEF(VT);
7288 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7289 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7291 N1.getConstantOperandVal(1) == 0 &&
7292 N1.getOperand(0).getValueType() == VT)
7293 return N1.getOperand(0);
7294 break;
7295 case ISD::FNEG:
7296 // Negation of an unknown bag of bits is still completely undefined.
7297 if (N1.isUndef())
7298 return getUNDEF(VT);
7299
7300 if (OpOpcode == ISD::FNEG) // --X -> X
7301 return N1.getOperand(0);
7302 break;
7303 case ISD::FABS:
7304 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7305 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7306 break;
7307 case ISD::VSCALE:
7308 assert(VT == N1.getValueType() && "Unexpected VT!");
7309 break;
7310 case ISD::CTPOP:
7311 if (N1.getValueType().getScalarType() == MVT::i1)
7312 return N1;
7313 break;
7314 case ISD::CTLZ:
7315 case ISD::CTTZ:
7316 if (N1.getValueType().getScalarType() == MVT::i1)
7317 return getNOT(DL, N1, N1.getValueType());
7318 break;
7319 case ISD::CTLS:
7320 if (N1.getValueType().getScalarType() == MVT::i1)
7321 return getConstant(0, DL, VT);
7322 break;
7323 case ISD::VECREDUCE_ADD:
7324 if (N1.getValueType().getScalarType() == MVT::i1)
7325 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7326 break;
7329 if (N1.getValueType().getScalarType() == MVT::i1)
7330 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7331 break;
7334 if (N1.getValueType().getScalarType() == MVT::i1)
7335 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7336 break;
7337 case ISD::SPLAT_VECTOR:
7338 assert(VT.isVector() && "Wrong return type!");
7339 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7340 // that for now.
7342 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7344 N1.getValueType().isInteger() &&
7346 "Wrong operand type!");
7347 break;
7348 }
7349
7350 SDNode *N;
7351 SDVTList VTs = getVTList(VT);
7352 SDValue Ops[] = {N1};
7353 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7355 AddNodeIDNode(ID, Opcode, VTs, Ops);
7356 void *IP = nullptr;
7357 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7358 E->intersectFlagsWith(Flags);
7359 return SDValue(E, 0);
7360 }
7361
7362 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7363 N->setFlags(Flags);
7364 createOperands(N, Ops);
7365 CSEMap.InsertNode(N, IP);
7366 } else {
7367 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7368 createOperands(N, Ops);
7369 }
7370
7371 InsertNode(N);
7372 SDValue V = SDValue(N, 0);
7373 NewSDValueDbgMsg(V, "Creating new node: ", this);
7374 return V;
7375}
7376
7377static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7378 const APInt &C2) {
7379 switch (Opcode) {
7380 case ISD::ADD: return C1 + C2;
7381 case ISD::SUB: return C1 - C2;
7382 case ISD::MUL: return C1 * C2;
7383 case ISD::AND: return C1 & C2;
7384 case ISD::OR: return C1 | C2;
7385 case ISD::XOR: return C1 ^ C2;
7386 case ISD::SHL: return C1 << C2;
7387 case ISD::SRL: return C1.lshr(C2);
7388 case ISD::SRA: return C1.ashr(C2);
7389 case ISD::ROTL: return C1.rotl(C2);
7390 case ISD::ROTR: return C1.rotr(C2);
7391 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7392 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7393 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7394 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7395 case ISD::SADDSAT: return C1.sadd_sat(C2);
7396 case ISD::UADDSAT: return C1.uadd_sat(C2);
7397 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7398 case ISD::USUBSAT: return C1.usub_sat(C2);
7399 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7400 case ISD::USHLSAT: return C1.ushl_sat(C2);
7401 case ISD::UDIV:
7402 if (!C2.getBoolValue())
7403 break;
7404 return C1.udiv(C2);
7405 case ISD::UREM:
7406 if (!C2.getBoolValue())
7407 break;
7408 return C1.urem(C2);
7409 case ISD::SDIV:
7410 if (!C2.getBoolValue())
7411 break;
7412 return C1.sdiv(C2);
7413 case ISD::SREM:
7414 if (!C2.getBoolValue())
7415 break;
7416 return C1.srem(C2);
7417 case ISD::AVGFLOORS:
7418 return APIntOps::avgFloorS(C1, C2);
7419 case ISD::AVGFLOORU:
7420 return APIntOps::avgFloorU(C1, C2);
7421 case ISD::AVGCEILS:
7422 return APIntOps::avgCeilS(C1, C2);
7423 case ISD::AVGCEILU:
7424 return APIntOps::avgCeilU(C1, C2);
7425 case ISD::ABDS:
7426 return APIntOps::abds(C1, C2);
7427 case ISD::ABDU:
7428 return APIntOps::abdu(C1, C2);
7429 case ISD::MULHS:
7430 return APIntOps::mulhs(C1, C2);
7431 case ISD::MULHU:
7432 return APIntOps::mulhu(C1, C2);
7433 case ISD::CLMUL:
7434 return APIntOps::clmul(C1, C2);
7435 case ISD::CLMULR:
7436 return APIntOps::clmulr(C1, C2);
7437 case ISD::CLMULH:
7438 return APIntOps::clmulh(C1, C2);
7439 }
7440 return std::nullopt;
7441}
7442// Handle constant folding with UNDEF.
7443// TODO: Handle more cases.
7444static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7445 bool IsUndef1, const APInt &C2,
7446 bool IsUndef2) {
7447 if (!(IsUndef1 || IsUndef2))
7448 return FoldValue(Opcode, C1, C2);
7449
7450 // Fold and(x, undef) -> 0
7451 // Fold mul(x, undef) -> 0
7452 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7453 return APInt::getZero(C1.getBitWidth());
7454
7455 return std::nullopt;
7456}
7457
7459 const GlobalAddressSDNode *GA,
7460 const SDNode *N2) {
7461 if (GA->getOpcode() != ISD::GlobalAddress)
7462 return SDValue();
7463 if (!TLI->isOffsetFoldingLegal(GA))
7464 return SDValue();
7465 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7466 if (!C2)
7467 return SDValue();
7468 int64_t Offset = C2->getSExtValue();
7469 switch (Opcode) {
7470 case ISD::ADD:
7471 case ISD::PTRADD:
7472 break;
7473 case ISD::SUB: Offset = -uint64_t(Offset); break;
7474 default: return SDValue();
7475 }
7476 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7477 GA->getOffset() + uint64_t(Offset));
7478}
7479
7481 switch (Opcode) {
7482 case ISD::SDIV:
7483 case ISD::UDIV:
7484 case ISD::SREM:
7485 case ISD::UREM: {
7486 // If a divisor is zero/undef or any element of a divisor vector is
7487 // zero/undef, the whole op is undef.
7488 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7489 SDValue Divisor = Ops[1];
7490 if (Divisor.isUndef() || isNullConstant(Divisor))
7491 return true;
7492
7493 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7494 llvm::any_of(Divisor->op_values(),
7495 [](SDValue V) { return V.isUndef() ||
7496 isNullConstant(V); });
7497 // TODO: Handle signed overflow.
7498 }
7499 // TODO: Handle oversized shifts.
7500 default:
7501 return false;
7502 }
7503}
7504
7507 SDNodeFlags Flags) {
7508 // If the opcode is a target-specific ISD node, there's nothing we can
7509 // do here and the operand rules may not line up with the below, so
7510 // bail early.
7511 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7512 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7513 // foldCONCAT_VECTORS in getNode before this is called.
7514 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7515 return SDValue();
7516
7517 unsigned NumOps = Ops.size();
7518 if (NumOps == 0)
7519 return SDValue();
7520
7521 if (isUndef(Opcode, Ops))
7522 return getUNDEF(VT);
7523
7524 // Handle unary special cases.
7525 if (NumOps == 1) {
7526 SDValue N1 = Ops[0];
7527
7528 // Constant fold unary operations with an integer constant operand. Even
7529 // opaque constant will be folded, because the folding of unary operations
7530 // doesn't create new constants with different values. Nevertheless, the
7531 // opaque flag is preserved during folding to prevent future folding with
7532 // other constants.
7533 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7534 const APInt &Val = C->getAPIntValue();
7535 switch (Opcode) {
7536 case ISD::SIGN_EXTEND:
7537 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7538 C->isTargetOpcode(), C->isOpaque());
7539 case ISD::TRUNCATE:
7540 if (C->isOpaque())
7541 break;
7542 [[fallthrough]];
7543 case ISD::ZERO_EXTEND:
7544 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7545 C->isTargetOpcode(), C->isOpaque());
7546 case ISD::ANY_EXTEND:
7547 // Some targets like RISCV prefer to sign extend some types.
7548 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7549 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7550 C->isTargetOpcode(), C->isOpaque());
7551 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7552 C->isTargetOpcode(), C->isOpaque());
7553 case ISD::ABS:
7554 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7555 C->isOpaque());
7556 case ISD::BITREVERSE:
7557 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7558 C->isOpaque());
7559 case ISD::BSWAP:
7560 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7561 C->isOpaque());
7562 case ISD::CTPOP:
7563 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7564 C->isOpaque());
7565 case ISD::CTLZ:
7567 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7568 C->isOpaque());
7569 case ISD::CTTZ:
7571 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7572 C->isOpaque());
7573 case ISD::CTLS:
7574 // CTLS returns the number of extra sign bits so subtract one.
7575 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7576 C->isTargetOpcode(), C->isOpaque());
7577 case ISD::UINT_TO_FP:
7578 case ISD::SINT_TO_FP: {
7580 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7582 return getConstantFP(FPV, DL, VT);
7583 }
7584 case ISD::FP16_TO_FP:
7585 case ISD::BF16_TO_FP: {
7586 bool Ignored;
7587 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7588 : APFloat::BFloat(),
7589 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7590
7591 // This can return overflow, underflow, or inexact; we don't care.
7592 // FIXME need to be more flexible about rounding mode.
7594 &Ignored);
7595 return getConstantFP(FPV, DL, VT);
7596 }
7597 case ISD::STEP_VECTOR:
7598 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7599 return V;
7600 break;
7601 case ISD::BITCAST:
7602 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7603 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7604 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7605 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7606 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7607 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7608 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7609 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7610 break;
7611 }
7612 }
7613
7614 // Constant fold unary operations with a floating point constant operand.
7615 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7616 APFloat V = C->getValueAPF(); // make copy
7617 switch (Opcode) {
7618 case ISD::FNEG:
7619 V.changeSign();
7620 return getConstantFP(V, DL, VT);
7621 case ISD::FABS:
7622 V.clearSign();
7623 return getConstantFP(V, DL, VT);
7624 case ISD::FCEIL: {
7625 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7627 return getConstantFP(V, DL, VT);
7628 return SDValue();
7629 }
7630 case ISD::FTRUNC: {
7631 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7633 return getConstantFP(V, DL, VT);
7634 return SDValue();
7635 }
7636 case ISD::FFLOOR: {
7637 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7639 return getConstantFP(V, DL, VT);
7640 return SDValue();
7641 }
7642 case ISD::FP_EXTEND: {
7643 bool ignored;
7644 // This can return overflow, underflow, or inexact; we don't care.
7645 // FIXME need to be more flexible about rounding mode.
7646 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7647 &ignored);
7648 return getConstantFP(V, DL, VT);
7649 }
7650 case ISD::FP_TO_SINT:
7651 case ISD::FP_TO_UINT: {
7652 bool ignored;
7653 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7654 // FIXME need to be more flexible about rounding mode.
7656 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7657 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7658 break;
7659 return getConstant(IntVal, DL, VT);
7660 }
7661 case ISD::FP_TO_FP16:
7662 case ISD::FP_TO_BF16: {
7663 bool Ignored;
7664 // This can return overflow, underflow, or inexact; we don't care.
7665 // FIXME need to be more flexible about rounding mode.
7666 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7667 : APFloat::BFloat(),
7669 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7670 }
7671 case ISD::BITCAST:
7672 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7673 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7674 VT);
7675 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7676 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7677 VT);
7678 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7679 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7680 VT);
7681 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7682 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7683 break;
7684 }
7685 }
7686
7687 // Early-out if we failed to constant fold a bitcast.
7688 if (Opcode == ISD::BITCAST)
7689 return SDValue();
7690 }
7691
7692 // Handle binops special cases.
7693 if (NumOps == 2) {
7694 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7695 return CFP;
7696
7697 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7698 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7699 if (C1->isOpaque() || C2->isOpaque())
7700 return SDValue();
7701
7702 std::optional<APInt> FoldAttempt =
7703 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7704 if (!FoldAttempt)
7705 return SDValue();
7706
7707 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7708 assert((!Folded || !VT.isVector()) &&
7709 "Can't fold vectors ops with scalar operands");
7710 return Folded;
7711 }
7712 }
7713
7714 // fold (add Sym, c) -> Sym+c
7716 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7717 if (TLI->isCommutativeBinOp(Opcode))
7719 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7720
7721 // fold (sext_in_reg c1) -> c2
7722 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7723 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7724
7725 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7726 unsigned FromBits = EVT.getScalarSizeInBits();
7727 Val <<= Val.getBitWidth() - FromBits;
7728 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7729 return getConstant(Val, DL, ConstantVT);
7730 };
7731
7732 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7733 const APInt &Val = C1->getAPIntValue();
7734 return SignExtendInReg(Val, VT);
7735 }
7736
7738 SmallVector<SDValue, 8> ScalarOps;
7739 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7740 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7741 SDValue Op = Ops[0].getOperand(I);
7742 if (Op.isUndef()) {
7743 ScalarOps.push_back(getUNDEF(OpVT));
7744 continue;
7745 }
7746 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7747 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7748 }
7749 return getBuildVector(VT, DL, ScalarOps);
7750 }
7751
7752 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7753 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7754 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7755 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7756 Ops[0].getOperand(0).getValueType()));
7757 }
7758 }
7759
7760 // Handle fshl/fshr special cases.
7761 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7762 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7763 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7764 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7765
7766 if (C1 && C2 && C3) {
7767 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7768 return SDValue();
7769 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7770 &V3 = C3->getAPIntValue();
7771
7772 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7773 : APIntOps::fshr(V1, V2, V3);
7774 return getConstant(FoldedVal, DL, VT);
7775 }
7776 }
7777
7778 // Handle fma/fmad special cases.
7779 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7780 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7781 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7782 Ops[2].getValueType() == VT && "FMA types must match!");
7786 if (C1 && C2 && C3) {
7787 APFloat V1 = C1->getValueAPF();
7788 const APFloat &V2 = C2->getValueAPF();
7789 const APFloat &V3 = C3->getValueAPF();
7790 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7793 } else
7795 return getConstantFP(V1, DL, VT);
7796 }
7797 }
7798
7799 // This is for vector folding only from here on.
7800 if (!VT.isVector())
7801 return SDValue();
7802
7803 ElementCount NumElts = VT.getVectorElementCount();
7804
7805 // See if we can fold through any bitcasted integer ops.
7806 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7807 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7808 (Ops[0].getOpcode() == ISD::BITCAST ||
7809 Ops[1].getOpcode() == ISD::BITCAST)) {
7812 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7813 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7814 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7815 N2.getValueType().isInteger()) {
7816 bool IsLE = getDataLayout().isLittleEndian();
7817 unsigned EltBits = VT.getScalarSizeInBits();
7818 SmallVector<APInt> RawBits1, RawBits2;
7819 BitVector UndefElts1, UndefElts2;
7820 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7821 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7822 SmallVector<APInt> RawBits;
7823 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7824 std::optional<APInt> Fold = FoldValueWithUndef(
7825 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7826 if (!Fold)
7827 break;
7828 RawBits.push_back(*Fold);
7829 }
7830 if (RawBits.size() == NumElts.getFixedValue()) {
7831 // We have constant folded, but we might need to cast this again back
7832 // to the original (possibly legalized) type.
7833 EVT BVVT, BVEltVT;
7834 if (N1.getValueType() == VT) {
7835 BVVT = N1.getValueType();
7836 BVEltVT = BV1->getOperand(0).getValueType();
7837 } else {
7838 BVVT = N2.getValueType();
7839 BVEltVT = BV2->getOperand(0).getValueType();
7840 }
7841 unsigned BVEltBits = BVEltVT.getSizeInBits();
7842 SmallVector<APInt> DstBits;
7843 BitVector DstUndefs;
7845 DstBits, RawBits, DstUndefs,
7846 BitVector(RawBits.size(), false));
7847 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
7848 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
7849 if (DstUndefs[I])
7850 continue;
7851 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
7852 }
7853 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
7854 }
7855 }
7856 }
7857 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
7858 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
7859 isa<ConstantSDNode>(N2)) {
7860 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
7861 {N1, N2}, Flags))
7862 return getBitcast(VT, Res);
7863 }
7864 }
7865
7866 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
7867 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
7868 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
7869 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
7870 APInt RHSVal;
7871 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
7872 APInt NewStep = Opcode == ISD::MUL
7873 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
7874 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
7875 return getStepVector(DL, VT, NewStep);
7876 }
7877 }
7878
7879 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
7880 return !Op.getValueType().isVector() ||
7881 Op.getValueType().getVectorElementCount() == NumElts;
7882 };
7883
7884 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
7885 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
7886 Op.getOpcode() == ISD::BUILD_VECTOR ||
7887 Op.getOpcode() == ISD::SPLAT_VECTOR;
7888 };
7889
7890 // All operands must be vector types with the same number of elements as
7891 // the result type and must be either UNDEF or a build/splat vector
7892 // or UNDEF scalars.
7893 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
7894 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
7895 return SDValue();
7896
7897 // If we are comparing vectors, then the result needs to be a i1 boolean that
7898 // is then extended back to the legal result type depending on how booleans
7899 // are represented.
7900 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
7901 ISD::NodeType ExtendCode =
7902 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
7903 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
7905
7906 // Find legal integer scalar type for constant promotion and
7907 // ensure that its scalar size is at least as large as source.
7908 EVT LegalSVT = VT.getScalarType();
7909 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
7910 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
7911 if (LegalSVT.bitsLT(VT.getScalarType()))
7912 return SDValue();
7913 }
7914
7915 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
7916 // only have one operand to check. For fixed-length vector types we may have
7917 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
7918 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
7919
7920 // Constant fold each scalar lane separately.
7921 SmallVector<SDValue, 4> ScalarResults;
7922 for (unsigned I = 0; I != NumVectorElts; I++) {
7923 SmallVector<SDValue, 4> ScalarOps;
7924 for (SDValue Op : Ops) {
7925 EVT InSVT = Op.getValueType().getScalarType();
7926 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
7927 Op.getOpcode() != ISD::SPLAT_VECTOR) {
7928 if (Op.isUndef())
7929 ScalarOps.push_back(getUNDEF(InSVT));
7930 else
7931 ScalarOps.push_back(Op);
7932 continue;
7933 }
7934
7935 SDValue ScalarOp =
7936 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
7937 EVT ScalarVT = ScalarOp.getValueType();
7938
7939 // Build vector (integer) scalar operands may need implicit
7940 // truncation - do this before constant folding.
7941 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
7942 // Don't create illegally-typed nodes unless they're constants or undef
7943 // - if we fail to constant fold we can't guarantee the (dead) nodes
7944 // we're creating will be cleaned up before being visited for
7945 // legalization.
7946 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
7947 !isa<ConstantSDNode>(ScalarOp) &&
7948 TLI->getTypeAction(*getContext(), InSVT) !=
7950 return SDValue();
7951 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
7952 }
7953
7954 ScalarOps.push_back(ScalarOp);
7955 }
7956
7957 // Constant fold the scalar operands.
7958 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
7959
7960 // Scalar folding only succeeded if the result is a constant or UNDEF.
7961 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
7962 ScalarResult.getOpcode() != ISD::ConstantFP)
7963 return SDValue();
7964
7965 // Legalize the (integer) scalar constant if necessary. We only do
7966 // this once we know the folding succeeded, since otherwise we would
7967 // get a node with illegal type which has a user.
7968 if (LegalSVT != SVT)
7969 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
7970
7971 ScalarResults.push_back(ScalarResult);
7972 }
7973
7974 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
7975 : getBuildVector(VT, DL, ScalarResults);
7976 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
7977 return V;
7978}
7979
7982 // TODO: Add support for unary/ternary fp opcodes.
7983 if (Ops.size() != 2)
7984 return SDValue();
7985
7986 // TODO: We don't do any constant folding for strict FP opcodes here, but we
7987 // should. That will require dealing with a potentially non-default
7988 // rounding mode, checking the "opStatus" return value from the APFloat
7989 // math calculations, and possibly other variations.
7990 SDValue N1 = Ops[0];
7991 SDValue N2 = Ops[1];
7992 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
7993 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
7994 if (N1CFP && N2CFP) {
7995 APFloat C1 = N1CFP->getValueAPF(); // make copy
7996 const APFloat &C2 = N2CFP->getValueAPF();
7997 switch (Opcode) {
7998 case ISD::FADD:
8000 return getConstantFP(C1, DL, VT);
8001 case ISD::FSUB:
8003 return getConstantFP(C1, DL, VT);
8004 case ISD::FMUL:
8006 return getConstantFP(C1, DL, VT);
8007 case ISD::FDIV:
8009 return getConstantFP(C1, DL, VT);
8010 case ISD::FREM:
8011 C1.mod(C2);
8012 return getConstantFP(C1, DL, VT);
8013 case ISD::FCOPYSIGN:
8014 C1.copySign(C2);
8015 return getConstantFP(C1, DL, VT);
8016 case ISD::FMINNUM:
8017 return getConstantFP(minnum(C1, C2), DL, VT);
8018 case ISD::FMAXNUM:
8019 return getConstantFP(maxnum(C1, C2), DL, VT);
8020 case ISD::FMINIMUM:
8021 return getConstantFP(minimum(C1, C2), DL, VT);
8022 case ISD::FMAXIMUM:
8023 return getConstantFP(maximum(C1, C2), DL, VT);
8024 case ISD::FMINIMUMNUM:
8025 return getConstantFP(minimumnum(C1, C2), DL, VT);
8026 case ISD::FMAXIMUMNUM:
8027 return getConstantFP(maximumnum(C1, C2), DL, VT);
8028 default: break;
8029 }
8030 }
8031 if (N1CFP && Opcode == ISD::FP_ROUND) {
8032 APFloat C1 = N1CFP->getValueAPF(); // make copy
8033 bool Unused;
8034 // This can return overflow, underflow, or inexact; we don't care.
8035 // FIXME need to be more flexible about rounding mode.
8037 &Unused);
8038 return getConstantFP(C1, DL, VT);
8039 }
8040
8041 switch (Opcode) {
8042 case ISD::FSUB:
8043 // -0.0 - undef --> undef (consistent with "fneg undef")
8044 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8045 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8046 return getUNDEF(VT);
8047 [[fallthrough]];
8048
8049 case ISD::FADD:
8050 case ISD::FMUL:
8051 case ISD::FDIV:
8052 case ISD::FREM:
8053 // If both operands are undef, the result is undef. If 1 operand is undef,
8054 // the result is NaN. This should match the behavior of the IR optimizer.
8055 if (N1.isUndef() && N2.isUndef())
8056 return getUNDEF(VT);
8057 if (N1.isUndef() || N2.isUndef())
8059 }
8060 return SDValue();
8061}
8062
8064 const SDLoc &DL, EVT DstEltVT) {
8065 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8066
8067 // If this is already the right type, we're done.
8068 if (SrcEltVT == DstEltVT)
8069 return SDValue(BV, 0);
8070
8071 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8072 unsigned DstBitSize = DstEltVT.getSizeInBits();
8073
8074 // If this is a conversion of N elements of one type to N elements of another
8075 // type, convert each element. This handles FP<->INT cases.
8076 if (SrcBitSize == DstBitSize) {
8078 for (SDValue Op : BV->op_values()) {
8079 // If the vector element type is not legal, the BUILD_VECTOR operands
8080 // are promoted and implicitly truncated. Make that explicit here.
8081 if (Op.getValueType() != SrcEltVT)
8082 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8083 Ops.push_back(getBitcast(DstEltVT, Op));
8084 }
8085 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8087 return getBuildVector(VT, DL, Ops);
8088 }
8089
8090 // Otherwise, we're growing or shrinking the elements. To avoid having to
8091 // handle annoying details of growing/shrinking FP values, we convert them to
8092 // int first.
8093 if (SrcEltVT.isFloatingPoint()) {
8094 // Convert the input float vector to a int vector where the elements are the
8095 // same sizes.
8096 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8097 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8099 DstEltVT);
8100 return SDValue();
8101 }
8102
8103 // Now we know the input is an integer vector. If the output is a FP type,
8104 // convert to integer first, then to FP of the right size.
8105 if (DstEltVT.isFloatingPoint()) {
8106 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8107 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8109 DstEltVT);
8110 return SDValue();
8111 }
8112
8113 // Okay, we know the src/dst types are both integers of differing types.
8114 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8115
8116 // Extract the constant raw bit data.
8117 BitVector UndefElements;
8118 SmallVector<APInt> RawBits;
8119 bool IsLE = getDataLayout().isLittleEndian();
8120 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8121 return SDValue();
8122
8124 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8125 if (UndefElements[I])
8126 Ops.push_back(getUNDEF(DstEltVT));
8127 else
8128 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8129 }
8130
8131 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8132 return getBuildVector(VT, DL, Ops);
8133}
8134
8136 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8137
8138 // There's no need to assert on a byte-aligned pointer. All pointers are at
8139 // least byte aligned.
8140 if (A == Align(1))
8141 return Val;
8142
8143 SDVTList VTs = getVTList(Val.getValueType());
8145 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
8146 ID.AddInteger(A.value());
8147
8148 void *IP = nullptr;
8149 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
8150 return SDValue(E, 0);
8151
8152 auto *N =
8153 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8154 createOperands(N, {Val});
8155
8156 CSEMap.InsertNode(N, IP);
8157 InsertNode(N);
8158
8159 SDValue V(N, 0);
8160 NewSDValueDbgMsg(V, "Creating new node: ", this);
8161 return V;
8162}
8163
8164SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8165 SDValue N1, SDValue N2) {
8166 SDNodeFlags Flags;
8167 if (Inserter)
8168 Flags = Inserter->getFlags();
8169 return getNode(Opcode, DL, VT, N1, N2, Flags);
8170}
8171
8173 SDValue &N2) const {
8174 if (!TLI->isCommutativeBinOp(Opcode))
8175 return;
8176
8177 // Canonicalize:
8178 // binop(const, nonconst) -> binop(nonconst, const)
8181 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8182 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8183 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8184 std::swap(N1, N2);
8185
8186 // Canonicalize:
8187 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8188 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8190 std::swap(N1, N2);
8191}
8192
8193SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8194 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8196 N2.getOpcode() != ISD::DELETED_NODE &&
8197 "Operand is DELETED_NODE!");
8198
8199 canonicalizeCommutativeBinop(Opcode, N1, N2);
8200
8201 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8202 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8203
8204 // Don't allow undefs in vector splats - we might be returning N2 when folding
8205 // to zero etc.
8206 ConstantSDNode *N2CV =
8207 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8208
8209 switch (Opcode) {
8210 default: break;
8211 case ISD::TokenFactor:
8212 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8213 N2.getValueType() == MVT::Other && "Invalid token factor!");
8214 // Fold trivial token factors.
8215 if (N1.getOpcode() == ISD::EntryToken) return N2;
8216 if (N2.getOpcode() == ISD::EntryToken) return N1;
8217 if (N1 == N2) return N1;
8218 break;
8219 case ISD::BUILD_VECTOR: {
8220 // Attempt to simplify BUILD_VECTOR.
8221 SDValue Ops[] = {N1, N2};
8222 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8223 return V;
8224 break;
8225 }
8226 case ISD::CONCAT_VECTORS: {
8227 SDValue Ops[] = {N1, N2};
8228 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8229 return V;
8230 break;
8231 }
8232 case ISD::AND:
8233 assert(VT.isInteger() && "This operator does not apply to FP types!");
8234 assert(N1.getValueType() == N2.getValueType() &&
8235 N1.getValueType() == VT && "Binary operator types must match!");
8236 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8237 // worth handling here.
8238 if (N2CV && N2CV->isZero())
8239 return N2;
8240 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8241 return N1;
8242 break;
8243 case ISD::OR:
8244 case ISD::XOR:
8245 case ISD::ADD:
8246 case ISD::PTRADD:
8247 case ISD::SUB:
8248 assert(VT.isInteger() && "This operator does not apply to FP types!");
8249 assert(N1.getValueType() == N2.getValueType() &&
8250 N1.getValueType() == VT && "Binary operator types must match!");
8251 // The equal operand types requirement is unnecessarily strong for PTRADD.
8252 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8253 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8254 // logic everywhere where PTRADDs may be folded or combined to properly
8255 // support them. If/when we introduce pointer types to the SDAG, we will
8256 // need to relax this constraint.
8257
8258 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8259 // it's worth handling here.
8260 if (N2CV && N2CV->isZero())
8261 return N1;
8262 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8263 VT.getScalarType() == MVT::i1)
8264 return getNode(ISD::XOR, DL, VT, N1, N2);
8265 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8266 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8267 N2.getOpcode() == ISD::VSCALE) {
8268 const APInt &C1 = N1->getConstantOperandAPInt(0);
8269 const APInt &C2 = N2->getConstantOperandAPInt(0);
8270 return getVScale(DL, VT, C1 + C2);
8271 }
8272 break;
8273 case ISD::MUL:
8274 assert(VT.isInteger() && "This operator does not apply to FP types!");
8275 assert(N1.getValueType() == N2.getValueType() &&
8276 N1.getValueType() == VT && "Binary operator types must match!");
8277 if (VT.getScalarType() == MVT::i1)
8278 return getNode(ISD::AND, DL, VT, N1, N2);
8279 if (N2CV && N2CV->isZero())
8280 return N2;
8281 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8282 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8283 const APInt &N2CImm = N2C->getAPIntValue();
8284 return getVScale(DL, VT, MulImm * N2CImm);
8285 }
8286 break;
8287 case ISD::UDIV:
8288 case ISD::UREM:
8289 case ISD::MULHU:
8290 case ISD::MULHS:
8291 case ISD::SDIV:
8292 case ISD::SREM:
8293 case ISD::SADDSAT:
8294 case ISD::SSUBSAT:
8295 case ISD::UADDSAT:
8296 case ISD::USUBSAT:
8297 assert(VT.isInteger() && "This operator does not apply to FP types!");
8298 assert(N1.getValueType() == N2.getValueType() &&
8299 N1.getValueType() == VT && "Binary operator types must match!");
8300 if (VT.getScalarType() == MVT::i1) {
8301 // fold (add_sat x, y) -> (or x, y) for bool types.
8302 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8303 return getNode(ISD::OR, DL, VT, N1, N2);
8304 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8305 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8306 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8307 }
8308 break;
8309 case ISD::SCMP:
8310 case ISD::UCMP:
8311 assert(N1.getValueType() == N2.getValueType() &&
8312 "Types of operands of UCMP/SCMP must match");
8313 assert(N1.getValueType().isVector() == VT.isVector() &&
8314 "Operands and return type of must both be scalars or vectors");
8315 if (VT.isVector())
8318 "Result and operands must have the same number of elements");
8319 break;
8320 case ISD::AVGFLOORS:
8321 case ISD::AVGFLOORU:
8322 case ISD::AVGCEILS:
8323 case ISD::AVGCEILU:
8324 assert(VT.isInteger() && "This operator does not apply to FP types!");
8325 assert(N1.getValueType() == N2.getValueType() &&
8326 N1.getValueType() == VT && "Binary operator types must match!");
8327 break;
8328 case ISD::ABDS:
8329 case ISD::ABDU:
8330 assert(VT.isInteger() && "This operator does not apply to FP types!");
8331 assert(N1.getValueType() == N2.getValueType() &&
8332 N1.getValueType() == VT && "Binary operator types must match!");
8333 if (VT.getScalarType() == MVT::i1)
8334 return getNode(ISD::XOR, DL, VT, N1, N2);
8335 break;
8336 case ISD::SMIN:
8337 case ISD::UMAX:
8338 assert(VT.isInteger() && "This operator does not apply to FP types!");
8339 assert(N1.getValueType() == N2.getValueType() &&
8340 N1.getValueType() == VT && "Binary operator types must match!");
8341 if (VT.getScalarType() == MVT::i1)
8342 return getNode(ISD::OR, DL, VT, N1, N2);
8343 break;
8344 case ISD::SMAX:
8345 case ISD::UMIN:
8346 assert(VT.isInteger() && "This operator does not apply to FP types!");
8347 assert(N1.getValueType() == N2.getValueType() &&
8348 N1.getValueType() == VT && "Binary operator types must match!");
8349 if (VT.getScalarType() == MVT::i1)
8350 return getNode(ISD::AND, DL, VT, N1, N2);
8351 break;
8352 case ISD::FADD:
8353 case ISD::FSUB:
8354 case ISD::FMUL:
8355 case ISD::FDIV:
8356 case ISD::FREM:
8357 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8358 assert(N1.getValueType() == N2.getValueType() &&
8359 N1.getValueType() == VT && "Binary operator types must match!");
8360 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8361 return V;
8362 break;
8363 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8364 assert(N1.getValueType() == VT &&
8367 "Invalid FCOPYSIGN!");
8368 break;
8369 case ISD::SHL:
8370 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8371 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8372 const APInt &ShiftImm = N2C->getAPIntValue();
8373 return getVScale(DL, VT, MulImm << ShiftImm);
8374 }
8375 [[fallthrough]];
8376 case ISD::SRA:
8377 case ISD::SRL:
8378 if (SDValue V = simplifyShift(N1, N2))
8379 return V;
8380 [[fallthrough]];
8381 case ISD::ROTL:
8382 case ISD::ROTR:
8383 case ISD::SSHLSAT:
8384 case ISD::USHLSAT:
8385 assert(VT == N1.getValueType() &&
8386 "Shift operators return type must be the same as their first arg");
8387 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8388 "Shifts only work on integers");
8389 assert((!VT.isVector() || VT == N2.getValueType()) &&
8390 "Vector shift amounts must be in the same as their first arg");
8391 // Verify that the shift amount VT is big enough to hold valid shift
8392 // amounts. This catches things like trying to shift an i1024 value by an
8393 // i8, which is easy to fall into in generic code that uses
8394 // TLI.getShiftAmount().
8397 "Invalid use of small shift amount with oversized value!");
8398
8399 // Always fold shifts of i1 values so the code generator doesn't need to
8400 // handle them. Since we know the size of the shift has to be less than the
8401 // size of the value, the shift/rotate count is guaranteed to be zero.
8402 if (VT == MVT::i1)
8403 return N1;
8404 if (N2CV && N2CV->isZero())
8405 return N1;
8406 break;
8407 case ISD::FP_ROUND:
8409 VT.bitsLE(N1.getValueType()) && N2C &&
8410 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8411 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8412 if (N1.getValueType() == VT) return N1; // noop conversion.
8413 break;
8414 case ISD::IS_FPCLASS: {
8416 "IS_FPCLASS is used for a non-floating type");
8417 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8418 // is.fpclass(poison, mask) -> poison
8419 if (N1.getOpcode() == ISD::POISON)
8420 return getPOISON(VT);
8421 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8422 // If all tests are made, it doesn't matter what the value is.
8423 if ((Mask & fcAllFlags) == fcAllFlags)
8424 return getBoolConstant(true, DL, VT, N1.getValueType());
8425 if ((Mask & fcAllFlags) == 0)
8426 return getBoolConstant(false, DL, VT, N1.getValueType());
8427 break;
8428 }
8429 case ISD::AssertNoFPClass: {
8431 "AssertNoFPClass is used for a non-floating type");
8432 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8433 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8434 assert(llvm::to_underlying(NoFPClass) <=
8436 "FPClassTest value too large");
8437 (void)NoFPClass;
8438 break;
8439 }
8440 case ISD::AssertSext:
8441 case ISD::AssertZext: {
8442 EVT EVT = cast<VTSDNode>(N2)->getVT();
8443 assert(VT == N1.getValueType() && "Not an inreg extend!");
8444 assert(VT.isInteger() && EVT.isInteger() &&
8445 "Cannot *_EXTEND_INREG FP types");
8446 assert(!EVT.isVector() &&
8447 "AssertSExt/AssertZExt type should be the vector element type "
8448 "rather than the vector type!");
8449 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8450 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8451 break;
8452 }
8454 EVT EVT = cast<VTSDNode>(N2)->getVT();
8455 assert(VT == N1.getValueType() && "Not an inreg extend!");
8456 assert(VT.isInteger() && EVT.isInteger() &&
8457 "Cannot *_EXTEND_INREG FP types");
8458 assert(EVT.isVector() == VT.isVector() &&
8459 "SIGN_EXTEND_INREG type should be vector iff the operand "
8460 "type is vector!");
8461 assert((!EVT.isVector() ||
8463 "Vector element counts must match in SIGN_EXTEND_INREG");
8464 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8465 if (EVT == VT) return N1; // Not actually extending
8466 break;
8467 }
8469 case ISD::FP_TO_UINT_SAT: {
8470 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8471 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8472 assert(N1.getValueType().isVector() == VT.isVector() &&
8473 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8474 "vector!");
8475 assert((!VT.isVector() || VT.getVectorElementCount() ==
8477 "Vector element counts must match in FP_TO_*INT_SAT");
8478 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8479 "Type to saturate to must be a scalar.");
8480 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8481 "Not extending!");
8482 break;
8483 }
8486 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8487 element type of the vector.");
8488
8489 // Extract from an undefined value or using an undefined index is undefined.
8490 if (N1.isUndef() || N2.isUndef())
8491 return getUNDEF(VT);
8492
8493 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8494 // vectors. For scalable vectors we will provide appropriate support for
8495 // dealing with arbitrary indices.
8496 if (N2C && N1.getValueType().isFixedLengthVector() &&
8497 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8498 return getPOISON(VT);
8499
8500 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8501 // expanding copies of large vectors from registers. This only works for
8502 // fixed length vectors, since we need to know the exact number of
8503 // elements.
8504 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8506 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8507 return getExtractVectorElt(DL, VT,
8508 N1.getOperand(N2C->getZExtValue() / Factor),
8509 N2C->getZExtValue() % Factor);
8510 }
8511
8512 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8513 // lowering is expanding large vector constants.
8514 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8515 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8518 "BUILD_VECTOR used for scalable vectors");
8519 unsigned Index =
8520 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8521 SDValue Elt = N1.getOperand(Index);
8522
8523 if (VT != Elt.getValueType())
8524 // If the vector element type is not legal, the BUILD_VECTOR operands
8525 // are promoted and implicitly truncated, and the result implicitly
8526 // extended. Make that explicit here.
8527 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8528
8529 return Elt;
8530 }
8531
8532 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8533 // operations are lowered to scalars.
8534 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8535 // If the indices are the same, return the inserted element else
8536 // if the indices are known different, extract the element from
8537 // the original vector.
8538 SDValue N1Op2 = N1.getOperand(2);
8540
8541 if (N1Op2C && N2C) {
8542 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8543 if (VT == N1.getOperand(1).getValueType())
8544 return N1.getOperand(1);
8545 if (VT.isFloatingPoint()) {
8547 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8548 }
8549 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8550 }
8551 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8552 }
8553 }
8554
8555 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8556 // when vector types are scalarized and v1iX is legal.
8557 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8558 // Here we are completely ignoring the extract element index (N2),
8559 // which is fine for fixed width vectors, since any index other than 0
8560 // is undefined anyway. However, this cannot be ignored for scalable
8561 // vectors - in theory we could support this, but we don't want to do this
8562 // without a profitability check.
8563 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8565 N1.getValueType().getVectorNumElements() == 1) {
8566 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8567 N1.getOperand(1));
8568 }
8569 break;
8571 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8572 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8573 (N1.getValueType().isInteger() == VT.isInteger()) &&
8574 N1.getValueType() != VT &&
8575 "Wrong types for EXTRACT_ELEMENT!");
8576
8577 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8578 // 64-bit integers into 32-bit parts. Instead of building the extract of
8579 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8580 if (N1.getOpcode() == ISD::BUILD_PAIR)
8581 return N1.getOperand(N2C->getZExtValue());
8582
8583 // EXTRACT_ELEMENT of a constant int is also very common.
8584 if (N1C) {
8585 unsigned ElementSize = VT.getSizeInBits();
8586 unsigned Shift = ElementSize * N2C->getZExtValue();
8587 const APInt &Val = N1C->getAPIntValue();
8588 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8589 }
8590 break;
8592 EVT N1VT = N1.getValueType();
8593 assert(VT.isVector() && N1VT.isVector() &&
8594 "Extract subvector VTs must be vectors!");
8596 "Extract subvector VTs must have the same element type!");
8597 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8598 "Cannot extract a scalable vector from a fixed length vector!");
8599 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8601 "Extract subvector must be from larger vector to smaller vector!");
8602 assert(N2C && "Extract subvector index must be a constant");
8603 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8604 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8605 N1VT.getVectorMinNumElements()) &&
8606 "Extract subvector overflow!");
8607 assert(N2C->getAPIntValue().getBitWidth() ==
8608 TLI->getVectorIdxWidth(getDataLayout()) &&
8609 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8610 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8611 "Extract index is not a multiple of the output vector length");
8612
8613 // Trivial extraction.
8614 if (VT == N1VT)
8615 return N1;
8616
8617 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8618 if (N1.isUndef())
8619 return getUNDEF(VT);
8620
8621 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8622 // the concat have the same type as the extract.
8623 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8624 VT == N1.getOperand(0).getValueType()) {
8625 unsigned Factor = VT.getVectorMinNumElements();
8626 return N1.getOperand(N2C->getZExtValue() / Factor);
8627 }
8628
8629 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8630 // during shuffle legalization.
8631 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8632 VT == N1.getOperand(1).getValueType())
8633 return N1.getOperand(1);
8634 break;
8635 }
8636 }
8637
8638 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8639 switch (Opcode) {
8640 case ISD::XOR:
8641 case ISD::ADD:
8642 case ISD::PTRADD:
8643 case ISD::SUB:
8645 case ISD::UDIV:
8646 case ISD::SDIV:
8647 case ISD::UREM:
8648 case ISD::SREM:
8649 case ISD::MUL:
8650 case ISD::AND:
8651 case ISD::SSUBSAT:
8652 case ISD::USUBSAT:
8653 case ISD::UMIN:
8654 case ISD::OR:
8655 case ISD::SADDSAT:
8656 case ISD::UADDSAT:
8657 case ISD::UMAX:
8658 case ISD::SMAX:
8659 case ISD::SMIN:
8660 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8661 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8662 }
8663 }
8664
8665 // Canonicalize an UNDEF to the RHS, even over a constant.
8666 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8667 if (TLI->isCommutativeBinOp(Opcode)) {
8668 std::swap(N1, N2);
8669 } else {
8670 switch (Opcode) {
8671 case ISD::PTRADD:
8672 case ISD::SUB:
8673 // fold op(undef, non_undef_arg2) -> undef.
8674 return N1;
8676 case ISD::UDIV:
8677 case ISD::SDIV:
8678 case ISD::UREM:
8679 case ISD::SREM:
8680 case ISD::SSUBSAT:
8681 case ISD::USUBSAT:
8682 // fold op(undef, non_undef_arg2) -> 0.
8683 return getConstant(0, DL, VT);
8684 }
8685 }
8686 }
8687
8688 // Fold a bunch of operators when the RHS is undef.
8689 if (N2.getOpcode() == ISD::UNDEF) {
8690 switch (Opcode) {
8691 case ISD::XOR:
8692 if (N1.getOpcode() == ISD::UNDEF)
8693 // Handle undef ^ undef -> 0 special case. This is a common
8694 // idiom (misuse).
8695 return getConstant(0, DL, VT);
8696 [[fallthrough]];
8697 case ISD::ADD:
8698 case ISD::PTRADD:
8699 case ISD::SUB:
8700 // fold op(arg1, undef) -> undef.
8701 return N2;
8702 case ISD::UDIV:
8703 case ISD::SDIV:
8704 case ISD::UREM:
8705 case ISD::SREM:
8706 // fold op(arg1, undef) -> poison.
8707 return getPOISON(VT);
8708 case ISD::MUL:
8709 case ISD::AND:
8710 case ISD::SSUBSAT:
8711 case ISD::USUBSAT:
8712 case ISD::UMIN:
8713 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8714 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8715 case ISD::OR:
8716 case ISD::SADDSAT:
8717 case ISD::UADDSAT:
8718 case ISD::UMAX:
8719 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8720 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8721 case ISD::SMAX:
8722 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8723 return N1.getOpcode() == ISD::UNDEF
8724 ? N2
8725 : getConstant(
8727 VT);
8728 case ISD::SMIN:
8729 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8730 return N1.getOpcode() == ISD::UNDEF
8731 ? N2
8732 : getConstant(
8734 VT);
8735 }
8736 }
8737
8738 // Perform trivial constant folding.
8739 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8740 return SV;
8741
8742 // Memoize this node if possible.
8743 SDNode *N;
8744 SDVTList VTs = getVTList(VT);
8745 SDValue Ops[] = {N1, N2};
8746 if (VT != MVT::Glue) {
8748 AddNodeIDNode(ID, Opcode, VTs, Ops);
8749 void *IP = nullptr;
8750 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8751 E->intersectFlagsWith(Flags);
8752 return SDValue(E, 0);
8753 }
8754
8755 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8756 N->setFlags(Flags);
8757 createOperands(N, Ops);
8758 CSEMap.InsertNode(N, IP);
8759 } else {
8760 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8761 createOperands(N, Ops);
8762 }
8763
8764 InsertNode(N);
8765 SDValue V = SDValue(N, 0);
8766 NewSDValueDbgMsg(V, "Creating new node: ", this);
8767 return V;
8768}
8769
8770SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8771 SDValue N1, SDValue N2, SDValue N3) {
8772 SDNodeFlags Flags;
8773 if (Inserter)
8774 Flags = Inserter->getFlags();
8775 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8776}
8777
8778SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8779 SDValue N1, SDValue N2, SDValue N3,
8780 const SDNodeFlags Flags) {
8782 N2.getOpcode() != ISD::DELETED_NODE &&
8783 N3.getOpcode() != ISD::DELETED_NODE &&
8784 "Operand is DELETED_NODE!");
8785 // Perform various simplifications.
8786 switch (Opcode) {
8787 case ISD::BUILD_VECTOR: {
8788 // Attempt to simplify BUILD_VECTOR.
8789 SDValue Ops[] = {N1, N2, N3};
8790 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8791 return V;
8792 break;
8793 }
8794 case ISD::CONCAT_VECTORS: {
8795 SDValue Ops[] = {N1, N2, N3};
8796 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8797 return V;
8798 break;
8799 }
8800 case ISD::SETCC: {
8801 assert(VT.isInteger() && "SETCC result type must be an integer!");
8802 assert(N1.getValueType() == N2.getValueType() &&
8803 "SETCC operands must have the same type!");
8804 assert(VT.isVector() == N1.getValueType().isVector() &&
8805 "SETCC type should be vector iff the operand type is vector!");
8806 assert((!VT.isVector() || VT.getVectorElementCount() ==
8808 "SETCC vector element counts must match!");
8809 // Use FoldSetCC to simplify SETCC's.
8810 if (SDValue V =
8811 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8812 return V;
8813 break;
8814 }
8815 case ISD::SELECT:
8816 case ISD::VSELECT:
8817 if (SDValue V = simplifySelect(N1, N2, N3))
8818 return V;
8819 break;
8821 llvm_unreachable("should use getVectorShuffle constructor!");
8823 if (isNullConstant(N3))
8824 return N1;
8825 break;
8827 if (isNullConstant(N3))
8828 return N2;
8829 break;
8831 assert(VT.isVector() && VT == N1.getValueType() &&
8832 "INSERT_VECTOR_ELT vector type mismatch");
8834 "INSERT_VECTOR_ELT scalar fp/int mismatch");
8835 assert((!VT.isFloatingPoint() ||
8836 VT.getVectorElementType() == N2.getValueType()) &&
8837 "INSERT_VECTOR_ELT fp scalar type mismatch");
8838 assert((!VT.isInteger() ||
8840 "INSERT_VECTOR_ELT int scalar size mismatch");
8841
8842 auto *N3C = dyn_cast<ConstantSDNode>(N3);
8843 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
8844 // for scalable vectors where we will generate appropriate code to
8845 // deal with out-of-bounds cases correctly.
8846 if (N3C && VT.isFixedLengthVector() &&
8847 N3C->getZExtValue() >= VT.getVectorNumElements())
8848 return getUNDEF(VT);
8849
8850 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
8851 if (N3.isUndef())
8852 return getUNDEF(VT);
8853
8854 // If inserting poison, just use the input vector.
8855 if (N2.getOpcode() == ISD::POISON)
8856 return N1;
8857
8858 // Inserting undef into undef/poison is still undef.
8859 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8860 return getUNDEF(VT);
8861
8862 // If the inserted element is an UNDEF, just use the input vector.
8863 // But not if skipping the insert could make the result more poisonous.
8864 if (N2.isUndef()) {
8865 if (N3C && VT.isFixedLengthVector()) {
8866 APInt EltMask =
8867 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
8868 if (isGuaranteedNotToBePoison(N1, EltMask))
8869 return N1;
8870 } else if (isGuaranteedNotToBePoison(N1))
8871 return N1;
8872 }
8873 break;
8874 }
8875 case ISD::INSERT_SUBVECTOR: {
8876 // If inserting poison, just use the input vector,
8877 if (N2.getOpcode() == ISD::POISON)
8878 return N1;
8879
8880 // Inserting undef into undef/poison is still undef.
8881 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8882 return getUNDEF(VT);
8883
8884 EVT N2VT = N2.getValueType();
8885 assert(VT == N1.getValueType() &&
8886 "Dest and insert subvector source types must match!");
8887 assert(VT.isVector() && N2VT.isVector() &&
8888 "Insert subvector VTs must be vectors!");
8890 "Insert subvector VTs must have the same element type!");
8891 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
8892 "Cannot insert a scalable vector into a fixed length vector!");
8893 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8895 "Insert subvector must be from smaller vector to larger vector!");
8897 "Insert subvector index must be constant");
8898 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8899 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
8901 "Insert subvector overflow!");
8903 TLI->getVectorIdxWidth(getDataLayout()) &&
8904 "Constant index for INSERT_SUBVECTOR has an invalid size");
8905
8906 // Trivial insertion.
8907 if (VT == N2VT)
8908 return N2;
8909
8910 // If this is an insert of an extracted vector into an undef/poison vector,
8911 // we can just use the input to the extract. But not if skipping the
8912 // extract+insert could make the result more poisonous.
8913 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8914 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
8915 if (N1.getOpcode() == ISD::POISON)
8916 return N2.getOperand(0);
8917 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
8918 unsigned LoBit = N3->getAsZExtVal();
8919 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8920 APInt EltMask =
8921 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8922 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
8923 return N2.getOperand(0);
8924 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
8925 return N2.getOperand(0);
8926 }
8927
8928 // If the inserted subvector is UNDEF, just use the input vector.
8929 // But not if skipping the insert could make the result more poisonous.
8930 if (N2.isUndef()) {
8931 if (VT.isFixedLengthVector()) {
8932 unsigned LoBit = N3->getAsZExtVal();
8933 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8934 APInt EltMask =
8935 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8936 if (isGuaranteedNotToBePoison(N1, EltMask))
8937 return N1;
8938 } else if (isGuaranteedNotToBePoison(N1))
8939 return N1;
8940 }
8941 break;
8942 }
8943 case ISD::BITCAST:
8944 // Fold bit_convert nodes from a type to themselves.
8945 if (N1.getValueType() == VT)
8946 return N1;
8947 break;
8948 case ISD::VP_TRUNCATE:
8949 case ISD::VP_SIGN_EXTEND:
8950 case ISD::VP_ZERO_EXTEND:
8951 // Don't create noop casts.
8952 if (N1.getValueType() == VT)
8953 return N1;
8954 break;
8955 case ISD::VECTOR_COMPRESS: {
8956 [[maybe_unused]] EVT VecVT = N1.getValueType();
8957 [[maybe_unused]] EVT MaskVT = N2.getValueType();
8958 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
8959 assert(VT == VecVT && "Vector and result type don't match.");
8960 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
8961 "All inputs must be vectors.");
8962 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
8964 "Vector and mask must have same number of elements.");
8965
8966 if (N1.isUndef() || N2.isUndef())
8967 return N3;
8968
8969 break;
8970 }
8975 [[maybe_unused]] EVT AccVT = N1.getValueType();
8976 [[maybe_unused]] EVT Input1VT = N2.getValueType();
8977 [[maybe_unused]] EVT Input2VT = N3.getValueType();
8978 assert(Input1VT.isVector() && Input1VT == Input2VT &&
8979 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8980 "node to have the same type!");
8981 assert(VT.isVector() && VT == AccVT &&
8982 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
8983 "the same type as its result!");
8985 AccVT.getVectorElementCount()) &&
8986 "Expected the element count of the second and third operands of the "
8987 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
8988 "element count of the first operand and the result!");
8990 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8991 "node to have an element type which is the same as or smaller than "
8992 "the element type of the first operand and result!");
8993 break;
8994 }
8995 }
8996
8997 // Perform trivial constant folding for arithmetic operators.
8998 switch (Opcode) {
8999 case ISD::FMA:
9000 case ISD::FMAD:
9001 case ISD::SETCC:
9002 case ISD::FSHL:
9003 case ISD::FSHR:
9004 if (SDValue SV =
9005 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9006 return SV;
9007 break;
9008 }
9009
9010 // Memoize node if it doesn't produce a glue result.
9011 SDNode *N;
9012 SDVTList VTs = getVTList(VT);
9013 SDValue Ops[] = {N1, N2, N3};
9014 if (VT != MVT::Glue) {
9016 AddNodeIDNode(ID, Opcode, VTs, Ops);
9017 void *IP = nullptr;
9018 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9019 E->intersectFlagsWith(Flags);
9020 return SDValue(E, 0);
9021 }
9022
9023 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9024 N->setFlags(Flags);
9025 createOperands(N, Ops);
9026 CSEMap.InsertNode(N, IP);
9027 } else {
9028 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9029 createOperands(N, Ops);
9030 }
9031
9032 InsertNode(N);
9033 SDValue V = SDValue(N, 0);
9034 NewSDValueDbgMsg(V, "Creating new node: ", this);
9035 return V;
9036}
9037
9038SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9039 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9040 const SDNodeFlags Flags) {
9041 SDValue Ops[] = { N1, N2, N3, N4 };
9042 return getNode(Opcode, DL, VT, Ops, Flags);
9043}
9044
9045SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9046 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9047 SDNodeFlags Flags;
9048 if (Inserter)
9049 Flags = Inserter->getFlags();
9050 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9051}
9052
9053SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9054 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9055 SDValue N5, const SDNodeFlags Flags) {
9056 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9057 return getNode(Opcode, DL, VT, Ops, Flags);
9058}
9059
9060SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9061 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9062 SDValue N5) {
9063 SDNodeFlags Flags;
9064 if (Inserter)
9065 Flags = Inserter->getFlags();
9066 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9067}
9068
9069/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9070/// the incoming stack arguments to be loaded from the stack.
9072 SmallVector<SDValue, 8> ArgChains;
9073
9074 // Include the original chain at the beginning of the list. When this is
9075 // used by target LowerCall hooks, this helps legalize find the
9076 // CALLSEQ_BEGIN node.
9077 ArgChains.push_back(Chain);
9078
9079 // Add a chain value for each stack argument.
9080 for (SDNode *U : getEntryNode().getNode()->users())
9081 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9082 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9083 if (FI->getIndex() < 0)
9084 ArgChains.push_back(SDValue(L, 1));
9085
9086 // Build a tokenfactor for all the chains.
9087 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9088}
9089
9090/// getMemsetValue - Vectorized representation of the memset value
9091/// operand.
9093 const SDLoc &dl) {
9094 assert(!Value.isUndef());
9095
9096 unsigned NumBits = VT.getScalarSizeInBits();
9098 assert(C->getAPIntValue().getBitWidth() == 8);
9099 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9100 if (VT.isInteger()) {
9101 bool IsOpaque = VT.getSizeInBits() > 64 ||
9102 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9103 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9104 }
9105 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9106 }
9107
9108 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9109 EVT IntVT = VT.getScalarType();
9110 if (!IntVT.isInteger())
9111 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9112
9113 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9114 if (NumBits > 8) {
9115 // Use a multiplication with 0x010101... to extend the input to the
9116 // required length.
9117 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9118 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9119 DAG.getConstant(Magic, dl, IntVT));
9120 }
9121
9122 if (VT != Value.getValueType() && !VT.isInteger())
9123 Value = DAG.getBitcast(VT.getScalarType(), Value);
9124 if (VT != Value.getValueType())
9125 Value = DAG.getSplatBuildVector(VT, dl, Value);
9126
9127 return Value;
9128}
9129
9130/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9131/// used when a memcpy is turned into a memset when the source is a constant
9132/// string ptr.
9134 const TargetLowering &TLI,
9135 const ConstantDataArraySlice &Slice) {
9136 // Handle vector with all elements zero.
9137 if (Slice.Array == nullptr) {
9138 if (VT.isInteger())
9139 return DAG.getConstant(0, dl, VT);
9140 return DAG.getNode(ISD::BITCAST, dl, VT,
9141 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9142 }
9143
9144 assert(!VT.isVector() && "Can't handle vector type here!");
9145 unsigned NumVTBits = VT.getSizeInBits();
9146 unsigned NumVTBytes = NumVTBits / 8;
9147 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9148
9149 APInt Val(NumVTBits, 0);
9150 if (DAG.getDataLayout().isLittleEndian()) {
9151 for (unsigned i = 0; i != NumBytes; ++i)
9152 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9153 } else {
9154 for (unsigned i = 0; i != NumBytes; ++i)
9155 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9156 }
9157
9158 // If the "cost" of materializing the integer immediate is less than the cost
9159 // of a load, then it is cost effective to turn the load into the immediate.
9160 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9161 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9162 return DAG.getConstant(Val, dl, VT);
9163 return SDValue();
9164}
9165
9167 const SDLoc &DL,
9168 const SDNodeFlags Flags) {
9169 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9170 return getMemBasePlusOffset(Base, Index, DL, Flags);
9171}
9172
9174 const SDLoc &DL,
9175 const SDNodeFlags Flags) {
9176 assert(Offset.getValueType().isInteger());
9177 EVT BasePtrVT = Ptr.getValueType();
9178 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9179 BasePtrVT))
9180 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9181 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9182 SDNodeFlags AddFlags = Flags;
9183 AddFlags.setInBounds(false);
9184 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9185}
9186
9187/// Returns true if memcpy source is constant data.
9189 uint64_t SrcDelta = 0;
9190 GlobalAddressSDNode *G = nullptr;
9191 if (Src.getOpcode() == ISD::GlobalAddress)
9193 else if (Src->isAnyAdd() &&
9194 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9195 Src.getOperand(1).getOpcode() == ISD::Constant) {
9196 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9197 SrcDelta = Src.getConstantOperandVal(1);
9198 }
9199 if (!G)
9200 return false;
9201
9202 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9203 SrcDelta + G->getOffset());
9204}
9205
9207 SelectionDAG &DAG) {
9208 // On Darwin, -Os means optimize for size without hurting performance, so
9209 // only really optimize for size when -Oz (MinSize) is used.
9211 return MF.getFunction().hasMinSize();
9212 return DAG.shouldOptForSize();
9213}
9214
9216 SmallVector<SDValue, 32> &OutChains, unsigned From,
9217 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9218 SmallVector<SDValue, 16> &OutStoreChains) {
9219 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9220 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9221 SmallVector<SDValue, 16> GluedLoadChains;
9222 for (unsigned i = From; i < To; ++i) {
9223 OutChains.push_back(OutLoadChains[i]);
9224 GluedLoadChains.push_back(OutLoadChains[i]);
9225 }
9226
9227 // Chain for all loads.
9228 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9229 GluedLoadChains);
9230
9231 for (unsigned i = From; i < To; ++i) {
9232 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9233 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9234 ST->getBasePtr(), ST->getMemoryVT(),
9235 ST->getMemOperand());
9236 OutChains.push_back(NewStore);
9237 }
9238}
9239
9241 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9242 uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline,
9243 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
9244 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
9245 // Turn a memcpy of undef to nop.
9246 // FIXME: We need to honor volatile even is Src is undef.
9247 if (Src.isUndef())
9248 return Chain;
9249
9250 // Expand memcpy to a series of load and store ops if the size operand falls
9251 // below a certain threshold.
9252 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9253 // rather than maybe a humongous number of loads and stores.
9254 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9255 const DataLayout &DL = DAG.getDataLayout();
9256 LLVMContext &C = *DAG.getContext();
9257 std::vector<EVT> MemOps;
9258 bool DstAlignCanChange = false;
9260 MachineFrameInfo &MFI = MF.getFrameInfo();
9261 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9263 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9264 DstAlignCanChange = true;
9265 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
9266 if (!SrcAlign || Alignment > *SrcAlign)
9267 SrcAlign = Alignment;
9268 assert(SrcAlign && "SrcAlign must be set");
9270 // If marked as volatile, perform a copy even when marked as constant.
9271 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9272 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9273 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9274 const MemOp Op = isZeroConstant
9275 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
9276 /*IsZeroMemset*/ true, isVol)
9277 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
9278 *SrcAlign, isVol, CopyFromConstant);
9279 if (!TLI.findOptimalMemOpLowering(
9280 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9281 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9282 return SDValue();
9283
9284 if (DstAlignCanChange) {
9285 Type *Ty = MemOps[0].getTypeForEVT(C);
9286 Align NewAlign = DL.getABITypeAlign(Ty);
9287
9288 // Don't promote to an alignment that would require dynamic stack
9289 // realignment which may conflict with optimizations such as tail call
9290 // optimization.
9292 if (!TRI->hasStackRealignment(MF))
9293 if (MaybeAlign StackAlign = DL.getStackAlignment())
9294 NewAlign = std::min(NewAlign, *StackAlign);
9295
9296 if (NewAlign > Alignment) {
9297 // Give the stack frame object a larger alignment if needed.
9298 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9299 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9300 Alignment = NewAlign;
9301 }
9302 }
9303
9304 // Prepare AAInfo for loads/stores after lowering this memcpy.
9305 AAMDNodes NewAAInfo = AAInfo;
9306 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9307
9308 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9309 bool isConstant =
9310 BatchAA && SrcVal &&
9311 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9312
9313 MachineMemOperand::Flags MMOFlags =
9315 SmallVector<SDValue, 16> OutLoadChains;
9316 SmallVector<SDValue, 16> OutStoreChains;
9317 SmallVector<SDValue, 32> OutChains;
9318 unsigned NumMemOps = MemOps.size();
9319 uint64_t SrcOff = 0, DstOff = 0;
9320 for (unsigned i = 0; i != NumMemOps; ++i) {
9321 EVT VT = MemOps[i];
9322 unsigned VTSize = VT.getSizeInBits() / 8;
9323 SDValue Value, Store;
9324
9325 if (VTSize > Size) {
9326 // Issuing an unaligned load / store pair that overlaps with the previous
9327 // pair. Adjust the offset accordingly.
9328 assert(i == NumMemOps-1 && i != 0);
9329 SrcOff -= VTSize - Size;
9330 DstOff -= VTSize - Size;
9331 }
9332
9333 if (CopyFromConstant &&
9334 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9335 // It's unlikely a store of a vector immediate can be done in a single
9336 // instruction. It would require a load from a constantpool first.
9337 // We only handle zero vectors here.
9338 // FIXME: Handle other cases where store of vector immediate is done in
9339 // a single instruction.
9340 ConstantDataArraySlice SubSlice;
9341 if (SrcOff < Slice.Length) {
9342 SubSlice = Slice;
9343 SubSlice.move(SrcOff);
9344 } else {
9345 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9346 SubSlice.Array = nullptr;
9347 SubSlice.Offset = 0;
9348 SubSlice.Length = VTSize;
9349 }
9350 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9351 if (Value.getNode()) {
9352 Store = DAG.getStore(
9353 Chain, dl, Value,
9354 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9355 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
9356 OutChains.push_back(Store);
9357 }
9358 }
9359
9360 if (!Store.getNode()) {
9361 // The type might not be legal for the target. This should only happen
9362 // if the type is smaller than a legal type, as on PPC, so the right
9363 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9364 // to Load/Store if NVT==VT.
9365 // FIXME does the case above also need this?
9366 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9367 assert(NVT.bitsGE(VT));
9368
9369 bool isDereferenceable =
9370 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9371 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9372 if (isDereferenceable)
9374 if (isConstant)
9375 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9376
9377 Value = DAG.getExtLoad(
9378 ISD::EXTLOAD, dl, NVT, Chain,
9379 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9380 SrcPtrInfo.getWithOffset(SrcOff), VT,
9381 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9382 OutLoadChains.push_back(Value.getValue(1));
9383
9384 Store = DAG.getTruncStore(
9385 Chain, dl, Value,
9386 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9387 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
9388 OutStoreChains.push_back(Store);
9389 }
9390 SrcOff += VTSize;
9391 DstOff += VTSize;
9392 Size -= VTSize;
9393 }
9394
9395 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9397 unsigned NumLdStInMemcpy = OutStoreChains.size();
9398
9399 if (NumLdStInMemcpy) {
9400 // It may be that memcpy might be converted to memset if it's memcpy
9401 // of constants. In such a case, we won't have loads and stores, but
9402 // just stores. In the absence of loads, there is nothing to gang up.
9403 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9404 // If target does not care, just leave as it.
9405 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9406 OutChains.push_back(OutLoadChains[i]);
9407 OutChains.push_back(OutStoreChains[i]);
9408 }
9409 } else {
9410 // Ld/St less than/equal limit set by target.
9411 if (NumLdStInMemcpy <= GluedLdStLimit) {
9412 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9413 NumLdStInMemcpy, OutLoadChains,
9414 OutStoreChains);
9415 } else {
9416 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9417 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9418 unsigned GlueIter = 0;
9419
9420 // Residual ld/st.
9421 if (RemainingLdStInMemcpy) {
9423 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9424 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9425 }
9426
9427 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9428 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9429 GlueIter - GluedLdStLimit;
9430 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9431 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9432 OutLoadChains, OutStoreChains);
9433 GlueIter += GluedLdStLimit;
9434 }
9435 }
9436 }
9437 }
9438 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9439}
9440
9442 SDValue Chain, SDValue Dst, SDValue Src,
9443 uint64_t Size, Align Alignment,
9444 bool isVol, bool AlwaysInline,
9445 MachinePointerInfo DstPtrInfo,
9446 MachinePointerInfo SrcPtrInfo,
9447 const AAMDNodes &AAInfo) {
9448 // Turn a memmove of undef to nop.
9449 // FIXME: We need to honor volatile even is Src is undef.
9450 if (Src.isUndef())
9451 return Chain;
9452
9453 // Expand memmove to a series of load and store ops if the size operand falls
9454 // below a certain threshold.
9455 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9456 const DataLayout &DL = DAG.getDataLayout();
9457 LLVMContext &C = *DAG.getContext();
9458 std::vector<EVT> MemOps;
9459 bool DstAlignCanChange = false;
9461 MachineFrameInfo &MFI = MF.getFrameInfo();
9462 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9464 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9465 DstAlignCanChange = true;
9466 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
9467 if (!SrcAlign || Alignment > *SrcAlign)
9468 SrcAlign = Alignment;
9469 assert(SrcAlign && "SrcAlign must be set");
9470 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9471 if (!TLI.findOptimalMemOpLowering(
9472 C, MemOps, Limit,
9473 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign, isVol),
9474 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9475 MF.getFunction().getAttributes(), nullptr))
9476 return SDValue();
9477
9478 if (DstAlignCanChange) {
9479 Type *Ty = MemOps[0].getTypeForEVT(C);
9480 Align NewAlign = DL.getABITypeAlign(Ty);
9481
9482 // Don't promote to an alignment that would require dynamic stack
9483 // realignment which may conflict with optimizations such as tail call
9484 // optimization.
9486 if (!TRI->hasStackRealignment(MF))
9487 if (MaybeAlign StackAlign = DL.getStackAlignment())
9488 NewAlign = std::min(NewAlign, *StackAlign);
9489
9490 if (NewAlign > Alignment) {
9491 // Give the stack frame object a larger alignment if needed.
9492 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9493 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9494 Alignment = NewAlign;
9495 }
9496 }
9497
9498 // Prepare AAInfo for loads/stores after lowering this memmove.
9499 AAMDNodes NewAAInfo = AAInfo;
9500 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9501
9502 MachineMemOperand::Flags MMOFlags =
9504 uint64_t SrcOff = 0;
9505 SmallVector<SDValue, 8> LoadValues;
9506 SmallVector<SDValue, 8> LoadChains;
9507 SmallVector<SDValue, 8> OutChains;
9508 unsigned NumMemOps = MemOps.size();
9509 for (unsigned i = 0; i < NumMemOps; i++) {
9510 EVT VT = MemOps[i];
9511 unsigned VTSize = VT.getSizeInBits() / 8;
9512 SDValue Value;
9513 bool IsOverlapping = false;
9514
9515 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9516 // Issuing an unaligned load / store pair that overlaps with the previous
9517 // pair. Adjust the offset accordingly.
9518 SrcOff = Size - VTSize;
9519 IsOverlapping = true;
9520 }
9521
9522 // Calculate the actual alignment at the current offset. The alignment at
9523 // SrcOff may be lower than the base alignment, especially when using
9524 // overlapping loads.
9525 Align SrcAlignAtOffset = commonAlignment(*SrcAlign, SrcOff);
9526 if (IsOverlapping) {
9527 // Verify that the target allows misaligned memory accesses at the
9528 // adjusted offset when using overlapping loads.
9529 unsigned Fast;
9530 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9531 SrcAlignAtOffset, MMOFlags,
9532 &Fast) ||
9533 !Fast) {
9534 // This should have been caught by findOptimalMemOpLowering, but verify
9535 // here for safety.
9536 return SDValue();
9537 }
9538 }
9539
9540 bool isDereferenceable =
9541 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9542 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9543 if (isDereferenceable)
9545 Value =
9546 DAG.getLoad(VT, dl, Chain,
9547 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9548 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9549 SrcMMOFlags, NewAAInfo);
9550 LoadValues.push_back(Value);
9551 LoadChains.push_back(Value.getValue(1));
9552 SrcOff += VTSize;
9553 }
9554 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9555 OutChains.clear();
9556 uint64_t DstOff = 0;
9557 for (unsigned i = 0; i < NumMemOps; i++) {
9558 EVT VT = MemOps[i];
9559 unsigned VTSize = VT.getSizeInBits() / 8;
9560 SDValue Store;
9561 bool IsOverlapping = false;
9562
9563 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9564 // Issuing an unaligned load / store pair that overlaps with the previous
9565 // pair. Adjust the offset accordingly.
9566 DstOff = Size - VTSize;
9567 IsOverlapping = true;
9568 }
9569
9570 // Calculate the actual alignment at the current offset. The alignment at
9571 // DstOff may be lower than the base alignment, especially when using
9572 // overlapping stores.
9573 Align DstAlignAtOffset = commonAlignment(Alignment, DstOff);
9574 if (IsOverlapping) {
9575 // Verify that the target allows misaligned memory accesses at the
9576 // adjusted offset when using overlapping stores.
9577 unsigned Fast;
9578 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9579 DstAlignAtOffset, MMOFlags,
9580 &Fast) ||
9581 !Fast) {
9582 // This should have been caught by findOptimalMemOpLowering, but verify
9583 // here for safety.
9584 return SDValue();
9585 }
9586 }
9587 Store = DAG.getStore(
9588 Chain, dl, LoadValues[i],
9589 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9590 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9591 NewAAInfo);
9592 OutChains.push_back(Store);
9593 DstOff += VTSize;
9594 }
9595
9596 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9597}
9598
9599/// Lower the call to 'memset' intrinsic function into a series of store
9600/// operations.
9601///
9602/// \param DAG Selection DAG where lowered code is placed.
9603/// \param dl Link to corresponding IR location.
9604/// \param Chain Control flow dependency.
9605/// \param Dst Pointer to destination memory location.
9606/// \param Src Value of byte to write into the memory.
9607/// \param Size Number of bytes to write.
9608/// \param Alignment Alignment of the destination in bytes.
9609/// \param isVol True if destination is volatile.
9610/// \param AlwaysInline Makes sure no function call is generated.
9611/// \param DstPtrInfo IR information on the memory pointer.
9612/// \returns New head in the control flow, if lowering was successful, empty
9613/// SDValue otherwise.
9614///
9615/// The function tries to replace 'llvm.memset' intrinsic with several store
9616/// operations and value calculation code. This is usually profitable for small
9617/// memory size or when the semantic requires inlining.
9619 SDValue Chain, SDValue Dst, SDValue Src,
9620 uint64_t Size, Align Alignment, bool isVol,
9621 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9622 const AAMDNodes &AAInfo) {
9623 // Turn a memset of undef to nop.
9624 // FIXME: We need to honor volatile even is Src is undef.
9625 if (Src.isUndef())
9626 return Chain;
9627
9628 // Expand memset to a series of load/store ops if the size operand
9629 // falls below a certain threshold.
9630 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9631 std::vector<EVT> MemOps;
9632 bool DstAlignCanChange = false;
9633 LLVMContext &C = *DAG.getContext();
9635 MachineFrameInfo &MFI = MF.getFrameInfo();
9636 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9638 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9639 DstAlignCanChange = true;
9640 bool IsZeroVal = isNullConstant(Src);
9641 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9642
9643 EVT LargestVT;
9644 if (!TLI.findOptimalMemOpLowering(
9645 C, MemOps, Limit,
9646 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9647 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9648 &LargestVT))
9649 return SDValue();
9650
9651 if (DstAlignCanChange) {
9652 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9653 const DataLayout &DL = DAG.getDataLayout();
9654 Align NewAlign = DL.getABITypeAlign(Ty);
9655
9656 // Don't promote to an alignment that would require dynamic stack
9657 // realignment which may conflict with optimizations such as tail call
9658 // optimization.
9660 if (!TRI->hasStackRealignment(MF))
9661 if (MaybeAlign StackAlign = DL.getStackAlignment())
9662 NewAlign = std::min(NewAlign, *StackAlign);
9663
9664 if (NewAlign > Alignment) {
9665 // Give the stack frame object a larger alignment if needed.
9666 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9667 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9668 Alignment = NewAlign;
9669 }
9670 }
9671
9672 SmallVector<SDValue, 8> OutChains;
9673 uint64_t DstOff = 0;
9674 unsigned NumMemOps = MemOps.size();
9675
9676 // Find the largest store and generate the bit pattern for it.
9677 // If target didn't set LargestVT, compute it from MemOps.
9678 if (!LargestVT.isSimple()) {
9679 LargestVT = MemOps[0];
9680 for (unsigned i = 1; i < NumMemOps; i++)
9681 if (MemOps[i].bitsGT(LargestVT))
9682 LargestVT = MemOps[i];
9683 }
9684 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9685
9686 // Prepare AAInfo for loads/stores after lowering this memset.
9687 AAMDNodes NewAAInfo = AAInfo;
9688 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9689
9690 for (unsigned i = 0; i < NumMemOps; i++) {
9691 EVT VT = MemOps[i];
9692 unsigned VTSize = VT.getSizeInBits() / 8;
9693 // The target should specify store types that exactly cover the memset size
9694 // (with the last store potentially being oversized for overlapping stores).
9695 assert(Size > 0 && "Target specified more stores than needed in "
9696 "findOptimalMemOpLowering");
9697 if (VTSize > Size) {
9698 // Issuing an unaligned load / store pair that overlaps with the previous
9699 // pair. Adjust the offset accordingly.
9700 assert(i == NumMemOps-1 && i != 0);
9701 DstOff -= VTSize - Size;
9702 }
9703
9704 // If this store is smaller than the largest store see whether we can get
9705 // the smaller value for free with a truncate or extract vector element and
9706 // then store.
9707 SDValue Value = MemSetValue;
9708 if (VT.bitsLT(LargestVT)) {
9709 unsigned Index;
9710 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9711 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9712 if (!LargestVT.isVector() && !VT.isVector() &&
9713 TLI.isTruncateFree(LargestVT, VT))
9714 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9715 else if (LargestVT.isVector() && !VT.isVector() &&
9717 LargestVT.getTypeForEVT(*DAG.getContext()),
9718 VT.getSizeInBits(), Index) &&
9719 TLI.isTypeLegal(SVT) &&
9720 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9721 // Target which can combine store(extractelement VectorTy, Idx) can get
9722 // the smaller value for free.
9723 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9724 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9725 } else
9726 Value = getMemsetValue(Src, VT, DAG, dl);
9727 }
9728 assert(Value.getValueType() == VT && "Value with wrong type.");
9729 SDValue Store = DAG.getStore(
9730 Chain, dl, Value,
9731 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9732 DstPtrInfo.getWithOffset(DstOff), Alignment,
9734 NewAAInfo);
9735 OutChains.push_back(Store);
9736 DstOff += VT.getSizeInBits() / 8;
9737 // For oversized overlapping stores, only subtract the remaining bytes.
9738 // For normal stores, subtract the full store size.
9739 if (VTSize > Size) {
9740 Size = 0;
9741 } else {
9742 Size -= VTSize;
9743 }
9744 }
9745
9746 // After processing all stores, Size should be exactly 0. Any remaining bytes
9747 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9748 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9749 "stores that exactly cover the memset size");
9750
9751 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9752}
9753
9755 unsigned AS) {
9756 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9757 // pointer operands can be losslessly bitcasted to pointers of address space 0
9758 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9759 report_fatal_error("cannot lower memory intrinsic in address space " +
9760 Twine(AS));
9761 }
9762}
9763
9765 const SelectionDAG *SelDAG,
9766 bool AllowReturnsFirstArg) {
9767 if (!CI || !CI->isTailCall())
9768 return false;
9769 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9770 // helper symbol we lower to.
9771 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9772 AllowReturnsFirstArg &&
9774}
9775
9776static std::pair<SDValue, SDValue>
9779 const CallInst *CI, RTLIB::Libcall Call,
9780 SelectionDAG *DAG, const TargetLowering *TLI) {
9781 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9782
9783 if (LCImpl == RTLIB::Unsupported)
9784 return {};
9785
9787 bool IsTailCall =
9788 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9789 SDValue Callee =
9790 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9791
9792 CLI.setDebugLoc(dl)
9793 .setChain(Chain)
9795 CI->getType(), Callee, std::move(Args))
9796 .setTailCall(IsTailCall);
9797
9798 return TLI->LowerCallTo(CLI);
9799}
9800
9801std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9802 const SDLoc &dl, SDValue S1,
9803 SDValue S2,
9804 const CallInst *CI) {
9806 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9807 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9808 RTLIB::STRCMP, this, TLI);
9809}
9810
9811std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9812 const SDLoc &dl, SDValue S1,
9813 SDValue S2,
9814 const CallInst *CI) {
9816 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9817 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9818 RTLIB::STRSTR, this, TLI);
9819}
9820
9821std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9822 const SDLoc &dl,
9823 SDValue Dst, SDValue Src,
9825 const CallInst *CI) {
9827
9829 {Dst, PT},
9830 {Src, PT},
9833 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9834 RTLIB::MEMCCPY, this, TLI);
9835}
9836
9837std::pair<SDValue, SDValue>
9839 SDValue Mem1, SDValue Size, const CallInst *CI) {
9842 {Mem0, PT},
9843 {Mem1, PT},
9845 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9846 RTLIB::MEMCMP, this, TLI);
9847}
9848
9849std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
9850 const SDLoc &dl,
9851 SDValue Dst, SDValue Src,
9852 const CallInst *CI) {
9854 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
9855 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9856 RTLIB::STRCPY, this, TLI);
9857}
9858
9859std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
9860 const SDLoc &dl,
9861 SDValue Src,
9862 const CallInst *CI) {
9863 // Emit a library call.
9866 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9867 RTLIB::STRLEN, this, TLI);
9868}
9869
9871 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
9872 Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI,
9873 std::optional<bool> OverrideTailCall, MachinePointerInfo DstPtrInfo,
9874 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9875 BatchAAResults *BatchAA) {
9876 // Check to see if we should lower the memcpy to loads and stores first.
9877 // For cases within the target-specified limits, this is the best choice.
9879 if (ConstantSize) {
9880 // Memcpy with size zero? Just return the original chain.
9881 if (ConstantSize->isZero())
9882 return Chain;
9883
9885 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9886 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9887 if (Result.getNode())
9888 return Result;
9889 }
9890
9891 // Then check to see if we should lower the memcpy with target-specific
9892 // code. If the target chooses to do this, this is the next best.
9893 if (TSI) {
9894 SDValue Result = TSI->EmitTargetCodeForMemcpy(
9895 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
9896 DstPtrInfo, SrcPtrInfo);
9897 if (Result.getNode())
9898 return Result;
9899 }
9900
9901 // If we really need inline code and the target declined to provide it,
9902 // use a (potentially long) sequence of loads and stores.
9903 if (AlwaysInline) {
9904 assert(ConstantSize && "AlwaysInline requires a constant size!");
9906 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9907 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9908 }
9909
9912
9913 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
9914 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
9915 // respect volatile, so they may do things like read or write memory
9916 // beyond the given memory regions. But fixing this isn't easy, and most
9917 // people don't care.
9918
9919 // Emit a library call.
9922 Args.emplace_back(Dst, PtrTy);
9923 Args.emplace_back(Src, PtrTy);
9924 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9925 // FIXME: pass in SDLoc
9927 bool IsTailCall = false;
9928 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
9929
9930 if (OverrideTailCall.has_value()) {
9931 IsTailCall = *OverrideTailCall;
9932 } else {
9933 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
9934 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
9935 }
9936
9937 CLI.setDebugLoc(dl)
9938 .setChain(Chain)
9939 .setLibCallee(
9940 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
9941 Dst.getValueType().getTypeForEVT(*getContext()),
9942 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
9943 std::move(Args))
9945 .setTailCall(IsTailCall);
9946
9947 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9948 return CallResult.second;
9949}
9950
9952 SDValue Dst, SDValue Src, SDValue Size,
9953 Type *SizeTy, unsigned ElemSz,
9954 bool isTailCall,
9955 MachinePointerInfo DstPtrInfo,
9956 MachinePointerInfo SrcPtrInfo) {
9957 // Emit a library call.
9960 Args.emplace_back(Dst, ArgTy);
9961 Args.emplace_back(Src, ArgTy);
9962 Args.emplace_back(Size, SizeTy);
9963
9964 RTLIB::Libcall LibraryCall =
9966 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9967 if (LibcallImpl == RTLIB::Unsupported)
9968 report_fatal_error("Unsupported element size");
9969
9971 CLI.setDebugLoc(dl)
9972 .setChain(Chain)
9973 .setLibCallee(
9974 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9976 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9977 std::move(Args))
9979 .setTailCall(isTailCall);
9980
9981 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9982 return CallResult.second;
9983}
9984
9986 SDValue Src, SDValue Size, Align Alignment,
9987 bool isVol, const CallInst *CI,
9988 std::optional<bool> OverrideTailCall,
9989 MachinePointerInfo DstPtrInfo,
9990 MachinePointerInfo SrcPtrInfo,
9991 const AAMDNodes &AAInfo,
9992 BatchAAResults *BatchAA) {
9993 // Check to see if we should lower the memmove to loads and stores first.
9994 // For cases within the target-specified limits, this is the best choice.
9996 if (ConstantSize) {
9997 // Memmove with size zero? Just return the original chain.
9998 if (ConstantSize->isZero())
9999 return Chain;
10000
10002 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
10003 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10004 if (Result.getNode())
10005 return Result;
10006 }
10007
10008 // Then check to see if we should lower the memmove with target-specific
10009 // code. If the target chooses to do this, this is the next best.
10010 if (TSI) {
10011 SDValue Result =
10012 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
10013 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
10014 if (Result.getNode())
10015 return Result;
10016 }
10017
10020
10021 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10022 // not be safe. See memcpy above for more details.
10023
10024 // Emit a library call.
10027 Args.emplace_back(Dst, PtrTy);
10028 Args.emplace_back(Src, PtrTy);
10029 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10030 // FIXME: pass in SDLoc
10032
10033 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10034
10035 bool IsTailCall = false;
10036 if (OverrideTailCall.has_value()) {
10037 IsTailCall = *OverrideTailCall;
10038 } else {
10039 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10040 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10041 }
10042
10043 CLI.setDebugLoc(dl)
10044 .setChain(Chain)
10045 .setLibCallee(
10046 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10047 Dst.getValueType().getTypeForEVT(*getContext()),
10048 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10049 std::move(Args))
10051 .setTailCall(IsTailCall);
10052
10053 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10054 return CallResult.second;
10055}
10056
10058 SDValue Dst, SDValue Src, SDValue Size,
10059 Type *SizeTy, unsigned ElemSz,
10060 bool isTailCall,
10061 MachinePointerInfo DstPtrInfo,
10062 MachinePointerInfo SrcPtrInfo) {
10063 // Emit a library call.
10065 Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());
10066 Args.emplace_back(Dst, IntPtrTy);
10067 Args.emplace_back(Src, IntPtrTy);
10068 Args.emplace_back(Size, SizeTy);
10069
10070 RTLIB::Libcall LibraryCall =
10072 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10073 if (LibcallImpl == RTLIB::Unsupported)
10074 report_fatal_error("Unsupported element size");
10075
10077 CLI.setDebugLoc(dl)
10078 .setChain(Chain)
10079 .setLibCallee(
10080 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10082 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10083 std::move(Args))
10085 .setTailCall(isTailCall);
10086
10087 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10088 return CallResult.second;
10089}
10090
10092 SDValue Src, SDValue Size, Align Alignment,
10093 bool isVol, bool AlwaysInline,
10094 const CallInst *CI,
10095 MachinePointerInfo DstPtrInfo,
10096 const AAMDNodes &AAInfo) {
10097 // Check to see if we should lower the memset to stores first.
10098 // For cases within the target-specified limits, this is the best choice.
10100 if (ConstantSize) {
10101 // Memset with size zero? Just return the original chain.
10102 if (ConstantSize->isZero())
10103 return Chain;
10104
10105 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10106 ConstantSize->getZExtValue(), Alignment,
10107 isVol, false, DstPtrInfo, AAInfo);
10108
10109 if (Result.getNode())
10110 return Result;
10111 }
10112
10113 // Then check to see if we should lower the memset with target-specific
10114 // code. If the target chooses to do this, this is the next best.
10115 if (TSI) {
10116 SDValue Result = TSI->EmitTargetCodeForMemset(
10117 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10118 if (Result.getNode())
10119 return Result;
10120 }
10121
10122 // If we really need inline code and the target declined to provide it,
10123 // use a (potentially long) sequence of loads and stores.
10124 if (AlwaysInline) {
10125 assert(ConstantSize && "AlwaysInline requires a constant size!");
10126 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10127 ConstantSize->getZExtValue(), Alignment,
10128 isVol, true, DstPtrInfo, AAInfo);
10129 assert(Result &&
10130 "getMemsetStores must return a valid sequence when AlwaysInline");
10131 return Result;
10132 }
10133
10135
10136 // Emit a library call.
10137 auto &Ctx = *getContext();
10138 const auto& DL = getDataLayout();
10139
10141 // FIXME: pass in SDLoc
10142 CLI.setDebugLoc(dl).setChain(Chain);
10143
10144 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10145 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10146
10147 // If zeroing out and bzero is present, use it.
10148 if (UseBZero) {
10150 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10151 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10152 CLI.setLibCallee(
10153 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10154 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10155 } else {
10156 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10157
10159 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10160 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10161 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10162 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10163 Dst.getValueType().getTypeForEVT(Ctx),
10164 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10165 std::move(Args));
10166 }
10167
10168 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10169 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10170
10171 // If we're going to use bzero, make sure not to tail call unless the
10172 // subsequent return doesn't need a value, as bzero doesn't return the first
10173 // arg unlike memset.
10174 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10175 bool IsTailCall =
10176 CI && CI->isTailCall() &&
10177 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
10178 CLI.setDiscardResult().setTailCall(IsTailCall);
10179
10180 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10181 return CallResult.second;
10182}
10183
10186 Type *SizeTy, unsigned ElemSz,
10187 bool isTailCall,
10188 MachinePointerInfo DstPtrInfo) {
10189 // Emit a library call.
10191 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10192 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10193 Args.emplace_back(Size, SizeTy);
10194
10195 RTLIB::Libcall LibraryCall =
10197 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10198 if (LibcallImpl == RTLIB::Unsupported)
10199 report_fatal_error("Unsupported element size");
10200
10202 CLI.setDebugLoc(dl)
10203 .setChain(Chain)
10204 .setLibCallee(
10205 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10207 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10208 std::move(Args))
10210 .setTailCall(isTailCall);
10211
10212 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10213 return CallResult.second;
10214}
10215
10216SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10218 MachineMemOperand *MMO,
10219 ISD::LoadExtType ExtType) {
10221 AddNodeIDNode(ID, Opcode, VTList, Ops);
10222 ID.AddInteger(MemVT.getRawBits());
10223 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10224 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10225 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10226 ID.AddInteger(MMO->getFlags());
10227 void* IP = nullptr;
10228 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10229 E->refineAlignment(MMO);
10230 E->refineRanges(MMO);
10231 return SDValue(E, 0);
10232 }
10233
10234 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10235 VTList, MemVT, MMO, ExtType);
10236 createOperands(N, Ops);
10237
10238 CSEMap.InsertNode(N, IP);
10239 InsertNode(N);
10240 SDValue V(N, 0);
10241 NewSDValueDbgMsg(V, "Creating new node: ", this);
10242 return V;
10243}
10244
10246 EVT MemVT, SDVTList VTs, SDValue Chain,
10247 SDValue Ptr, SDValue Cmp, SDValue Swp,
10248 MachineMemOperand *MMO) {
10249 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10251 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10252
10253 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10254 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10255}
10256
10257SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10258 SDValue Chain, SDValue Ptr, SDValue Val,
10259 MachineMemOperand *MMO) {
10260 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10261 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10262 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10263 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10264 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10265 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10266 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10267 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10268 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10269 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10270 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10271 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10272 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10273 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10274 Opcode == ISD::ATOMIC_STORE) &&
10275 "Invalid Atomic Op");
10276
10277 EVT VT = Val.getValueType();
10278
10279 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10280 getVTList(VT, MVT::Other);
10281 SDValue Ops[] = {Chain, Ptr, Val};
10282 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10283}
10284
10286 EVT MemVT, EVT VT, SDValue Chain,
10287 SDValue Ptr, MachineMemOperand *MMO) {
10288 SDVTList VTs = getVTList(VT, MVT::Other);
10289 SDValue Ops[] = {Chain, Ptr};
10290 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10291}
10292
10293/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10295 if (Ops.size() == 1)
10296 return Ops[0];
10297
10299 VTs.reserve(Ops.size());
10300 for (const SDValue &Op : Ops)
10301 VTs.push_back(Op.getValueType());
10302 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10303}
10304
10306 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10307 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10309 const AAMDNodes &AAInfo) {
10310 if (Size.hasValue() && !Size.getValue())
10312
10314 MachineMemOperand *MMO =
10315 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10316
10317 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10318}
10319
10321 SDVTList VTList,
10322 ArrayRef<SDValue> Ops, EVT MemVT,
10323 MachineMemOperand *MMO) {
10324 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10325}
10326
10328 SDVTList VTList,
10329 ArrayRef<SDValue> Ops, EVT MemVT,
10331 assert(!MMOs.empty() && "Must have at least one MMO");
10332 assert(
10333 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10334 Opcode == ISD::PREFETCH ||
10335 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10336 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10337 "Opcode is not a memory-accessing opcode!");
10338
10340 if (MMOs.size() == 1) {
10341 MemRefs = MMOs[0];
10342 } else {
10343 // Allocate: [size_t count][MMO*][MMO*]...
10344 size_t AllocSize =
10345 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10346 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10347 size_t *CountPtr = static_cast<size_t *>(Buffer);
10348 *CountPtr = MMOs.size();
10349 MachineMemOperand **Array =
10350 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10351 llvm::copy(MMOs, Array);
10352 MemRefs = Array;
10353 }
10354
10355 // Memoize the node unless it returns a glue result.
10357 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10359 AddNodeIDNode(ID, Opcode, VTList, Ops);
10360 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10361 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10362 ID.AddInteger(MemVT.getRawBits());
10363 for (const MachineMemOperand *MMO : MMOs) {
10364 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10365 ID.AddInteger(MMO->getFlags());
10366 }
10367 void *IP = nullptr;
10368 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10369 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10370 return SDValue(E, 0);
10371 }
10372
10373 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10374 VTList, MemVT, MemRefs);
10375 createOperands(N, Ops);
10376 CSEMap.InsertNode(N, IP);
10377 } else {
10378 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10379 VTList, MemVT, MemRefs);
10380 createOperands(N, Ops);
10381 }
10382 InsertNode(N);
10383 SDValue V(N, 0);
10384 NewSDValueDbgMsg(V, "Creating new node: ", this);
10385 return V;
10386}
10387
10389 SDValue Chain, int FrameIndex) {
10390 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10391 const auto VTs = getVTList(MVT::Other);
10392 SDValue Ops[2] = {
10393 Chain,
10394 getFrameIndex(FrameIndex,
10395 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10396 true)};
10397
10399 AddNodeIDNode(ID, Opcode, VTs, Ops);
10400 ID.AddInteger(FrameIndex);
10401 void *IP = nullptr;
10402 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10403 return SDValue(E, 0);
10404
10405 LifetimeSDNode *N =
10406 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10407 createOperands(N, Ops);
10408 CSEMap.InsertNode(N, IP);
10409 InsertNode(N);
10410 SDValue V(N, 0);
10411 NewSDValueDbgMsg(V, "Creating new node: ", this);
10412 return V;
10413}
10414
10416 uint64_t Guid, uint64_t Index,
10417 uint32_t Attr) {
10418 const unsigned Opcode = ISD::PSEUDO_PROBE;
10419 const auto VTs = getVTList(MVT::Other);
10420 SDValue Ops[] = {Chain};
10422 AddNodeIDNode(ID, Opcode, VTs, Ops);
10423 ID.AddInteger(Guid);
10424 ID.AddInteger(Index);
10425 void *IP = nullptr;
10426 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10427 return SDValue(E, 0);
10428
10429 auto *N = newSDNode<PseudoProbeSDNode>(
10430 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10431 createOperands(N, Ops);
10432 CSEMap.InsertNode(N, IP);
10433 InsertNode(N);
10434 SDValue V(N, 0);
10435 NewSDValueDbgMsg(V, "Creating new node: ", this);
10436 return V;
10437}
10438
10439/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10440/// MachinePointerInfo record from it. This is particularly useful because the
10441/// code generator has many cases where it doesn't bother passing in a
10442/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10444 SelectionDAG &DAG, SDValue Ptr,
10445 int64_t Offset = 0) {
10446 // If this is FI+Offset, we can model it.
10447 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10449 FI->getIndex(), Offset);
10450
10451 // If this is (FI+Offset1)+Offset2, we can model it.
10452 if (Ptr.getOpcode() != ISD::ADD ||
10455 return Info;
10456
10457 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10459 DAG.getMachineFunction(), FI,
10460 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10461}
10462
10463/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10464/// MachinePointerInfo record from it. This is particularly useful because the
10465/// code generator has many cases where it doesn't bother passing in a
10466/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10468 SelectionDAG &DAG, SDValue Ptr,
10469 SDValue OffsetOp) {
10470 // If the 'Offset' value isn't a constant, we can't handle this.
10472 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10473 if (OffsetOp.isUndef())
10474 return InferPointerInfo(Info, DAG, Ptr);
10475 return Info;
10476}
10477
10479 EVT VT, const SDLoc &dl, SDValue Chain,
10480 SDValue Ptr, SDValue Offset,
10481 MachinePointerInfo PtrInfo, EVT MemVT,
10482 Align Alignment,
10483 MachineMemOperand::Flags MMOFlags,
10484 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10485 assert(Chain.getValueType() == MVT::Other &&
10486 "Invalid chain type");
10487
10488 MMOFlags |= MachineMemOperand::MOLoad;
10489 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10490 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10491 // clients.
10492 if (PtrInfo.V.isNull())
10493 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10494
10495 TypeSize Size = MemVT.getStoreSize();
10497 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10498 Alignment, AAInfo, Ranges);
10499 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10500}
10501
10503 EVT VT, const SDLoc &dl, SDValue Chain,
10504 SDValue Ptr, SDValue Offset, EVT MemVT,
10505 MachineMemOperand *MMO) {
10506 if (VT == MemVT) {
10507 ExtType = ISD::NON_EXTLOAD;
10508 } else if (ExtType == ISD::NON_EXTLOAD) {
10509 assert(VT == MemVT && "Non-extending load from different memory type!");
10510 } else {
10511 // Extending load.
10512 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10513 "Should only be an extending load, not truncating!");
10514 assert(VT.isInteger() == MemVT.isInteger() &&
10515 "Cannot convert from FP to Int or Int -> FP!");
10516 assert(VT.isVector() == MemVT.isVector() &&
10517 "Cannot use an ext load to convert to or from a vector!");
10518 assert((!VT.isVector() ||
10520 "Cannot use an ext load to change the number of vector elements!");
10521 }
10522
10523 assert((!MMO->getRanges() ||
10525 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10526 MemVT.isInteger())) &&
10527 "Range metadata and load type must match!");
10528
10529 bool Indexed = AM != ISD::UNINDEXED;
10530 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10531
10532 SDVTList VTs = Indexed ?
10533 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10534 SDValue Ops[] = { Chain, Ptr, Offset };
10536 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10537 ID.AddInteger(MemVT.getRawBits());
10538 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10539 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10540 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10541 ID.AddInteger(MMO->getFlags());
10542 void *IP = nullptr;
10543 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10544 E->refineAlignment(MMO);
10545 E->refineRanges(MMO);
10546 return SDValue(E, 0);
10547 }
10548 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10549 ExtType, MemVT, MMO);
10550 createOperands(N, Ops);
10551
10552 CSEMap.InsertNode(N, IP);
10553 InsertNode(N);
10554 SDValue V(N, 0);
10555 NewSDValueDbgMsg(V, "Creating new node: ", this);
10556 return V;
10557}
10558
10560 SDValue Ptr, MachinePointerInfo PtrInfo,
10561 MaybeAlign Alignment,
10562 MachineMemOperand::Flags MMOFlags,
10563 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10565 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10566 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10567}
10568
10570 SDValue Ptr, MachineMemOperand *MMO) {
10572 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10573 VT, MMO);
10574}
10575
10577 EVT VT, SDValue Chain, SDValue Ptr,
10578 MachinePointerInfo PtrInfo, EVT MemVT,
10579 MaybeAlign Alignment,
10580 MachineMemOperand::Flags MMOFlags,
10581 const AAMDNodes &AAInfo) {
10583 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10584 MemVT, Alignment, MMOFlags, AAInfo);
10585}
10586
10588 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10589 MachineMemOperand *MMO) {
10591 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10592 MemVT, MMO);
10593}
10594
10598 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10599 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10600 // Don't propagate the invariant or dereferenceable flags.
10601 auto MMOFlags =
10602 LD->getMemOperand()->getFlags() &
10604 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10605 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10606 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10607}
10608
10610 SDValue Ptr, MachinePointerInfo PtrInfo,
10611 Align Alignment,
10612 MachineMemOperand::Flags MMOFlags,
10613 const AAMDNodes &AAInfo) {
10614 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10615
10616 MMOFlags |= MachineMemOperand::MOStore;
10617 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10618
10619 if (PtrInfo.V.isNull())
10620 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10621
10624 MachineMemOperand *MMO =
10625 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10626 return getStore(Chain, dl, Val, Ptr, MMO);
10627}
10628
10630 SDValue Ptr, MachineMemOperand *MMO) {
10632 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10634}
10635
10637 SDValue Ptr, SDValue Offset, EVT SVT,
10639 bool IsTruncating) {
10640 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10641 EVT VT = Val.getValueType();
10642 if (VT == SVT) {
10643 IsTruncating = false;
10644 } else if (!IsTruncating) {
10645 assert(VT == SVT && "No-truncating store from different memory type!");
10646 } else {
10648 "Should only be a truncating store, not extending!");
10649 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10650 assert(VT.isVector() == SVT.isVector() &&
10651 "Cannot use trunc store to convert to or from a vector!");
10652 assert((!VT.isVector() ||
10654 "Cannot use trunc store to change the number of vector elements!");
10655 }
10656
10657 bool Indexed = AM != ISD::UNINDEXED;
10658 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10659 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10660 : getVTList(MVT::Other);
10661 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10664 ID.AddInteger(SVT.getRawBits());
10665 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10666 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10667 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10668 ID.AddInteger(MMO->getFlags());
10669 void *IP = nullptr;
10670 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10671 cast<StoreSDNode>(E)->refineAlignment(MMO);
10672 return SDValue(E, 0);
10673 }
10674 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10675 IsTruncating, SVT, MMO);
10676 createOperands(N, Ops);
10677
10678 CSEMap.InsertNode(N, IP);
10679 InsertNode(N);
10680 SDValue V(N, 0);
10681 NewSDValueDbgMsg(V, "Creating new node: ", this);
10682 return V;
10683}
10684
10686 SDValue Ptr, MachinePointerInfo PtrInfo,
10687 EVT SVT, Align Alignment,
10688 MachineMemOperand::Flags MMOFlags,
10689 const AAMDNodes &AAInfo) {
10690 assert(Chain.getValueType() == MVT::Other &&
10691 "Invalid chain type");
10692
10693 MMOFlags |= MachineMemOperand::MOStore;
10694 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10695
10696 if (PtrInfo.V.isNull())
10697 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10698
10700 MachineMemOperand *MMO = MF.getMachineMemOperand(
10701 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10702 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10703}
10704
10706 SDValue Ptr, EVT SVT,
10707 MachineMemOperand *MMO) {
10709 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10710}
10711
10715 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10716 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10717 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10718 ST->getMemoryVT(), ST->getMemOperand(), AM,
10719 ST->isTruncatingStore());
10720}
10721
10723 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10724 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10725 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10726 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10727 const MDNode *Ranges, bool IsExpanding) {
10728 MMOFlags |= MachineMemOperand::MOLoad;
10729 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10730 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10731 // clients.
10732 if (PtrInfo.V.isNull())
10733 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10734
10735 TypeSize Size = MemVT.getStoreSize();
10737 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10738 Alignment, AAInfo, Ranges);
10739 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10740 MMO, IsExpanding);
10741}
10742
10744 ISD::LoadExtType ExtType, EVT VT,
10745 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10746 SDValue Offset, SDValue Mask, SDValue EVL,
10747 EVT MemVT, MachineMemOperand *MMO,
10748 bool IsExpanding) {
10749 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10750 assert(Mask.getValueType().getVectorElementCount() ==
10751 VT.getVectorElementCount() &&
10752 "Vector width mismatch between mask and data");
10753
10754 bool Indexed = AM != ISD::UNINDEXED;
10755 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10756
10757 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10758 : getVTList(VT, MVT::Other);
10759 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10761 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10762 ID.AddInteger(MemVT.getRawBits());
10763 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10764 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10765 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10766 ID.AddInteger(MMO->getFlags());
10767 void *IP = nullptr;
10768 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10769 E->refineAlignment(MMO);
10770 E->refineRanges(MMO);
10771 return SDValue(E, 0);
10772 }
10773 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10774 ExtType, IsExpanding, MemVT, MMO);
10775 createOperands(N, Ops);
10776
10777 CSEMap.InsertNode(N, IP);
10778 InsertNode(N);
10779 SDValue V(N, 0);
10780 NewSDValueDbgMsg(V, "Creating new node: ", this);
10781 return V;
10782}
10783
10785 SDValue Ptr, SDValue Mask, SDValue EVL,
10786 MachinePointerInfo PtrInfo,
10787 MaybeAlign Alignment,
10788 MachineMemOperand::Flags MMOFlags,
10789 const AAMDNodes &AAInfo, const MDNode *Ranges,
10790 bool IsExpanding) {
10792 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10793 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10794 IsExpanding);
10795}
10796
10798 SDValue Ptr, SDValue Mask, SDValue EVL,
10799 MachineMemOperand *MMO, bool IsExpanding) {
10801 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10802 Mask, EVL, VT, MMO, IsExpanding);
10803}
10804
10806 EVT VT, SDValue Chain, SDValue Ptr,
10807 SDValue Mask, SDValue EVL,
10808 MachinePointerInfo PtrInfo, EVT MemVT,
10809 MaybeAlign Alignment,
10810 MachineMemOperand::Flags MMOFlags,
10811 const AAMDNodes &AAInfo, bool IsExpanding) {
10813 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10814 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10815 IsExpanding);
10816}
10817
10819 EVT VT, SDValue Chain, SDValue Ptr,
10820 SDValue Mask, SDValue EVL, EVT MemVT,
10821 MachineMemOperand *MMO, bool IsExpanding) {
10823 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10824 EVL, MemVT, MMO, IsExpanding);
10825}
10826
10830 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10831 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10832 // Don't propagate the invariant or dereferenceable flags.
10833 auto MMOFlags =
10834 LD->getMemOperand()->getFlags() &
10836 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10837 LD->getChain(), Base, Offset, LD->getMask(),
10838 LD->getVectorLength(), LD->getPointerInfo(),
10839 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
10840 nullptr, LD->isExpandingLoad());
10841}
10842
10844 SDValue Ptr, SDValue Offset, SDValue Mask,
10845 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
10846 ISD::MemIndexedMode AM, bool IsTruncating,
10847 bool IsCompressing) {
10848 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10849 assert(Mask.getValueType().getVectorElementCount() ==
10851 "Vector width mismatch between mask and data");
10852
10853 bool Indexed = AM != ISD::UNINDEXED;
10854 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10855 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10856 : getVTList(MVT::Other);
10857 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
10859 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10860 ID.AddInteger(MemVT.getRawBits());
10861 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10862 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10863 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10864 ID.AddInteger(MMO->getFlags());
10865 void *IP = nullptr;
10866 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10867 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10868 return SDValue(E, 0);
10869 }
10870 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10871 IsTruncating, IsCompressing, MemVT, MMO);
10872 createOperands(N, Ops);
10873
10874 CSEMap.InsertNode(N, IP);
10875 InsertNode(N);
10876 SDValue V(N, 0);
10877 NewSDValueDbgMsg(V, "Creating new node: ", this);
10878 return V;
10879}
10880
10882 SDValue Val, SDValue Ptr, SDValue Mask,
10883 SDValue EVL, MachinePointerInfo PtrInfo,
10884 EVT SVT, Align Alignment,
10885 MachineMemOperand::Flags MMOFlags,
10886 const AAMDNodes &AAInfo,
10887 bool IsCompressing) {
10888 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10889
10890 MMOFlags |= MachineMemOperand::MOStore;
10891 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10892
10893 if (PtrInfo.V.isNull())
10894 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10895
10897 MachineMemOperand *MMO = MF.getMachineMemOperand(
10898 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10899 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
10900 IsCompressing);
10901}
10902
10904 SDValue Val, SDValue Ptr, SDValue Mask,
10905 SDValue EVL, EVT SVT,
10906 MachineMemOperand *MMO,
10907 bool IsCompressing) {
10908 EVT VT = Val.getValueType();
10909
10910 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10911 if (VT == SVT)
10912 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
10913 EVL, VT, MMO, ISD::UNINDEXED,
10914 /*IsTruncating*/ false, IsCompressing);
10915
10917 "Should only be a truncating store, not extending!");
10918 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10919 assert(VT.isVector() == SVT.isVector() &&
10920 "Cannot use trunc store to convert to or from a vector!");
10921 assert((!VT.isVector() ||
10923 "Cannot use trunc store to change the number of vector elements!");
10924
10925 SDVTList VTs = getVTList(MVT::Other);
10927 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
10929 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10930 ID.AddInteger(SVT.getRawBits());
10931 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10932 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
10933 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10934 ID.AddInteger(MMO->getFlags());
10935 void *IP = nullptr;
10936 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10937 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10938 return SDValue(E, 0);
10939 }
10940 auto *N =
10941 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10942 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
10943 createOperands(N, Ops);
10944
10945 CSEMap.InsertNode(N, IP);
10946 InsertNode(N);
10947 SDValue V(N, 0);
10948 NewSDValueDbgMsg(V, "Creating new node: ", this);
10949 return V;
10950}
10951
10955 auto *ST = cast<VPStoreSDNode>(OrigStore);
10956 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
10957 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
10958 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
10959 Offset, ST->getMask(), ST->getVectorLength()};
10961 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10962 ID.AddInteger(ST->getMemoryVT().getRawBits());
10963 ID.AddInteger(ST->getRawSubclassData());
10964 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
10965 ID.AddInteger(ST->getMemOperand()->getFlags());
10966 void *IP = nullptr;
10967 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10968 return SDValue(E, 0);
10969
10970 auto *N = newSDNode<VPStoreSDNode>(
10971 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
10972 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
10973 createOperands(N, Ops);
10974
10975 CSEMap.InsertNode(N, IP);
10976 InsertNode(N);
10977 SDValue V(N, 0);
10978 NewSDValueDbgMsg(V, "Creating new node: ", this);
10979 return V;
10980}
10981
10983 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
10984 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
10985 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
10986 bool Indexed = AM != ISD::UNINDEXED;
10987 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10988
10989 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
10990 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10991 : getVTList(VT, MVT::Other);
10993 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
10994 ID.AddInteger(VT.getRawBits());
10995 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
10996 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10997 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10998
10999 void *IP = nullptr;
11000 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11001 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11002 return SDValue(E, 0);
11003 }
11004
11005 auto *N =
11006 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11007 ExtType, IsExpanding, MemVT, MMO);
11008 createOperands(N, Ops);
11009 CSEMap.InsertNode(N, IP);
11010 InsertNode(N);
11011 SDValue V(N, 0);
11012 NewSDValueDbgMsg(V, "Creating new node: ", this);
11013 return V;
11014}
11015
11017 SDValue Ptr, SDValue Stride,
11018 SDValue Mask, SDValue EVL,
11019 MachineMemOperand *MMO,
11020 bool IsExpanding) {
11022 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11023 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11024}
11025
11027 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11028 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11029 MachineMemOperand *MMO, bool IsExpanding) {
11031 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11032 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11033}
11034
11036 SDValue Val, SDValue Ptr,
11037 SDValue Offset, SDValue Stride,
11038 SDValue Mask, SDValue EVL, EVT MemVT,
11039 MachineMemOperand *MMO,
11041 bool IsTruncating, bool IsCompressing) {
11042 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11043 bool Indexed = AM != ISD::UNINDEXED;
11044 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11045 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11046 : getVTList(MVT::Other);
11047 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11049 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11050 ID.AddInteger(MemVT.getRawBits());
11051 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11052 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11053 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11054 void *IP = nullptr;
11055 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11056 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11057 return SDValue(E, 0);
11058 }
11059 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11060 VTs, AM, IsTruncating,
11061 IsCompressing, MemVT, MMO);
11062 createOperands(N, Ops);
11063
11064 CSEMap.InsertNode(N, IP);
11065 InsertNode(N);
11066 SDValue V(N, 0);
11067 NewSDValueDbgMsg(V, "Creating new node: ", this);
11068 return V;
11069}
11070
11072 SDValue Val, SDValue Ptr,
11073 SDValue Stride, SDValue Mask,
11074 SDValue EVL, EVT SVT,
11075 MachineMemOperand *MMO,
11076 bool IsCompressing) {
11077 EVT VT = Val.getValueType();
11078
11079 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11080 if (VT == SVT)
11081 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
11082 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
11083 /*IsTruncating*/ false, IsCompressing);
11084
11086 "Should only be a truncating store, not extending!");
11087 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11088 assert(VT.isVector() == SVT.isVector() &&
11089 "Cannot use trunc store to convert to or from a vector!");
11090 assert((!VT.isVector() ||
11092 "Cannot use trunc store to change the number of vector elements!");
11093
11094 SDVTList VTs = getVTList(MVT::Other);
11096 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
11098 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11099 ID.AddInteger(SVT.getRawBits());
11100 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11101 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11102 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11103 void *IP = nullptr;
11104 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11105 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11106 return SDValue(E, 0);
11107 }
11108 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11109 VTs, ISD::UNINDEXED, true,
11110 IsCompressing, SVT, MMO);
11111 createOperands(N, Ops);
11112
11113 CSEMap.InsertNode(N, IP);
11114 InsertNode(N);
11115 SDValue V(N, 0);
11116 NewSDValueDbgMsg(V, "Creating new node: ", this);
11117 return V;
11118}
11119
11122 ISD::MemIndexType IndexType) {
11123 assert(Ops.size() == 6 && "Incompatible number of operands");
11124
11126 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
11127 ID.AddInteger(VT.getRawBits());
11128 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11129 dl.getIROrder(), VTs, VT, MMO, IndexType));
11130 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11131 ID.AddInteger(MMO->getFlags());
11132 void *IP = nullptr;
11133 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11134 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11135 return SDValue(E, 0);
11136 }
11137
11138 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11139 VT, MMO, IndexType);
11140 createOperands(N, Ops);
11141
11142 assert(N->getMask().getValueType().getVectorElementCount() ==
11143 N->getValueType(0).getVectorElementCount() &&
11144 "Vector width mismatch between mask and data");
11145 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11146 N->getValueType(0).getVectorElementCount().isScalable() &&
11147 "Scalable flags of index and data do not match");
11149 N->getIndex().getValueType().getVectorElementCount(),
11150 N->getValueType(0).getVectorElementCount()) &&
11151 "Vector width mismatch between index and data");
11152 assert(isa<ConstantSDNode>(N->getScale()) &&
11153 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11154 "Scale should be a constant power of 2");
11155
11156 CSEMap.InsertNode(N, IP);
11157 InsertNode(N);
11158 SDValue V(N, 0);
11159 NewSDValueDbgMsg(V, "Creating new node: ", this);
11160 return V;
11161}
11162
11165 MachineMemOperand *MMO,
11166 ISD::MemIndexType IndexType) {
11167 assert(Ops.size() == 7 && "Incompatible number of operands");
11168
11170 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
11171 ID.AddInteger(VT.getRawBits());
11172 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11173 dl.getIROrder(), VTs, VT, MMO, IndexType));
11174 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11175 ID.AddInteger(MMO->getFlags());
11176 void *IP = nullptr;
11177 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11178 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11179 return SDValue(E, 0);
11180 }
11181 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11182 VT, MMO, IndexType);
11183 createOperands(N, Ops);
11184
11185 assert(N->getMask().getValueType().getVectorElementCount() ==
11186 N->getValue().getValueType().getVectorElementCount() &&
11187 "Vector width mismatch between mask and data");
11188 assert(
11189 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11190 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11191 "Scalable flags of index and data do not match");
11193 N->getIndex().getValueType().getVectorElementCount(),
11194 N->getValue().getValueType().getVectorElementCount()) &&
11195 "Vector width mismatch between index and data");
11196 assert(isa<ConstantSDNode>(N->getScale()) &&
11197 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11198 "Scale should be a constant power of 2");
11199
11200 CSEMap.InsertNode(N, IP);
11201 InsertNode(N);
11202 SDValue V(N, 0);
11203 NewSDValueDbgMsg(V, "Creating new node: ", this);
11204 return V;
11205}
11206
11209 SDValue PassThru, EVT MemVT,
11210 MachineMemOperand *MMO,
11212 ISD::LoadExtType ExtTy, bool isExpanding) {
11213 bool Indexed = AM != ISD::UNINDEXED;
11214 assert((Indexed || Offset.isUndef()) &&
11215 "Unindexed masked load with an offset!");
11216 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11217 : getVTList(VT, MVT::Other);
11218 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11221 ID.AddInteger(MemVT.getRawBits());
11222 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11223 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11224 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11225 ID.AddInteger(MMO->getFlags());
11226 void *IP = nullptr;
11227 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11228 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11229 return SDValue(E, 0);
11230 }
11231 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11232 AM, ExtTy, isExpanding, MemVT, MMO);
11233 createOperands(N, Ops);
11234
11235 CSEMap.InsertNode(N, IP);
11236 InsertNode(N);
11237 SDValue V(N, 0);
11238 NewSDValueDbgMsg(V, "Creating new node: ", this);
11239 return V;
11240}
11241
11246 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
11247 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11248 Offset, LD->getMask(), LD->getPassThru(),
11249 LD->getMemoryVT(), LD->getMemOperand(), AM,
11250 LD->getExtensionType(), LD->isExpandingLoad());
11251}
11252
11255 SDValue Mask, EVT MemVT,
11256 MachineMemOperand *MMO,
11257 ISD::MemIndexedMode AM, bool IsTruncating,
11258 bool IsCompressing) {
11259 assert(Chain.getValueType() == MVT::Other &&
11260 "Invalid chain type");
11261 bool Indexed = AM != ISD::UNINDEXED;
11262 assert((Indexed || Offset.isUndef()) &&
11263 "Unindexed masked store with an offset!");
11264 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11265 : getVTList(MVT::Other);
11266 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11269 ID.AddInteger(MemVT.getRawBits());
11270 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11271 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11272 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11273 ID.AddInteger(MMO->getFlags());
11274 void *IP = nullptr;
11275 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11276 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11277 return SDValue(E, 0);
11278 }
11279 auto *N =
11280 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11281 IsTruncating, IsCompressing, MemVT, MMO);
11282 createOperands(N, Ops);
11283
11284 CSEMap.InsertNode(N, IP);
11285 InsertNode(N);
11286 SDValue V(N, 0);
11287 NewSDValueDbgMsg(V, "Creating new node: ", this);
11288 return V;
11289}
11290
11295 assert(ST->getOffset().isUndef() &&
11296 "Masked store is already a indexed store!");
11297 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11298 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11299 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11300}
11301
11304 MachineMemOperand *MMO,
11305 ISD::MemIndexType IndexType,
11306 ISD::LoadExtType ExtTy) {
11307 assert(Ops.size() == 6 && "Incompatible number of operands");
11308
11311 ID.AddInteger(MemVT.getRawBits());
11312 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11313 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11314 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11315 ID.AddInteger(MMO->getFlags());
11316 void *IP = nullptr;
11317 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11318 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11319 return SDValue(E, 0);
11320 }
11321
11322 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11323 VTs, MemVT, MMO, IndexType, ExtTy);
11324 createOperands(N, Ops);
11325
11326 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11327 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11328 assert(N->getMask().getValueType().getVectorElementCount() ==
11329 N->getValueType(0).getVectorElementCount() &&
11330 "Vector width mismatch between mask and data");
11331 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11332 N->getValueType(0).getVectorElementCount().isScalable() &&
11333 "Scalable flags of index and data do not match");
11335 N->getIndex().getValueType().getVectorElementCount(),
11336 N->getValueType(0).getVectorElementCount()) &&
11337 "Vector width mismatch between index and data");
11338 assert(isa<ConstantSDNode>(N->getScale()) &&
11339 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11340 "Scale should be a constant power of 2");
11341
11342 CSEMap.InsertNode(N, IP);
11343 InsertNode(N);
11344 SDValue V(N, 0);
11345 NewSDValueDbgMsg(V, "Creating new node: ", this);
11346 return V;
11347}
11348
11351 MachineMemOperand *MMO,
11352 ISD::MemIndexType IndexType,
11353 bool IsTrunc) {
11354 assert(Ops.size() == 6 && "Incompatible number of operands");
11355
11358 ID.AddInteger(MemVT.getRawBits());
11359 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11360 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11361 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11362 ID.AddInteger(MMO->getFlags());
11363 void *IP = nullptr;
11364 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11365 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11366 return SDValue(E, 0);
11367 }
11368
11369 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11370 VTs, MemVT, MMO, IndexType, IsTrunc);
11371 createOperands(N, Ops);
11372
11373 assert(N->getMask().getValueType().getVectorElementCount() ==
11374 N->getValue().getValueType().getVectorElementCount() &&
11375 "Vector width mismatch between mask and data");
11376 assert(
11377 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11378 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11379 "Scalable flags of index and data do not match");
11381 N->getIndex().getValueType().getVectorElementCount(),
11382 N->getValue().getValueType().getVectorElementCount()) &&
11383 "Vector width mismatch between index and data");
11384 assert(isa<ConstantSDNode>(N->getScale()) &&
11385 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11386 "Scale should be a constant power of 2");
11387
11388 CSEMap.InsertNode(N, IP);
11389 InsertNode(N);
11390 SDValue V(N, 0);
11391 NewSDValueDbgMsg(V, "Creating new node: ", this);
11392 return V;
11393}
11394
11396 const SDLoc &dl, ArrayRef<SDValue> Ops,
11397 MachineMemOperand *MMO,
11398 ISD::MemIndexType IndexType) {
11399 assert(Ops.size() == 7 && "Incompatible number of operands");
11400
11403 ID.AddInteger(MemVT.getRawBits());
11404 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11405 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11406 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11407 ID.AddInteger(MMO->getFlags());
11408 void *IP = nullptr;
11409 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11410 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11411 return SDValue(E, 0);
11412 }
11413
11414 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11415 VTs, MemVT, MMO, IndexType);
11416 createOperands(N, Ops);
11417
11418 assert(N->getMask().getValueType().getVectorElementCount() ==
11419 N->getIndex().getValueType().getVectorElementCount() &&
11420 "Vector width mismatch between mask and data");
11421 assert(isa<ConstantSDNode>(N->getScale()) &&
11422 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11423 "Scale should be a constant power of 2");
11424 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11425
11426 CSEMap.InsertNode(N, IP);
11427 InsertNode(N);
11428 SDValue V(N, 0);
11429 NewSDValueDbgMsg(V, "Creating new node: ", this);
11430 return V;
11431}
11432
11434 SDValue Ptr, SDValue Mask, SDValue EVL,
11435 MachineMemOperand *MMO) {
11436 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11437 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11439 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11440 ID.AddInteger(VT.getRawBits());
11441 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11442 VTs, VT, MMO));
11443 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11444 ID.AddInteger(MMO->getFlags());
11445 void *IP = nullptr;
11446 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11447 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11448 return SDValue(E, 0);
11449 }
11450 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11451 VT, MMO);
11452 createOperands(N, Ops);
11453
11454 CSEMap.InsertNode(N, IP);
11455 InsertNode(N);
11456 SDValue V(N, 0);
11457 NewSDValueDbgMsg(V, "Creating new node: ", this);
11458 return V;
11459}
11460
11462 EVT MemVT, MachineMemOperand *MMO) {
11463 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11464 SDVTList VTs = getVTList(MVT::Other);
11465 SDValue Ops[] = {Chain, Ptr};
11468 ID.AddInteger(MemVT.getRawBits());
11469 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11470 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11471 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11472 ID.AddInteger(MMO->getFlags());
11473 void *IP = nullptr;
11474 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11475 return SDValue(E, 0);
11476
11477 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11478 dl.getDebugLoc(), VTs, MemVT, MMO);
11479 createOperands(N, Ops);
11480
11481 CSEMap.InsertNode(N, IP);
11482 InsertNode(N);
11483 SDValue V(N, 0);
11484 NewSDValueDbgMsg(V, "Creating new node: ", this);
11485 return V;
11486}
11487
11489 EVT MemVT, MachineMemOperand *MMO) {
11490 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11491 SDVTList VTs = getVTList(MVT::Other);
11492 SDValue Ops[] = {Chain, Ptr};
11495 ID.AddInteger(MemVT.getRawBits());
11496 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11497 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11498 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11499 ID.AddInteger(MMO->getFlags());
11500 void *IP = nullptr;
11501 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11502 return SDValue(E, 0);
11503
11504 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11505 dl.getDebugLoc(), VTs, MemVT, MMO);
11506 createOperands(N, Ops);
11507
11508 CSEMap.InsertNode(N, IP);
11509 InsertNode(N);
11510 SDValue V(N, 0);
11511 NewSDValueDbgMsg(V, "Creating new node: ", this);
11512 return V;
11513}
11514
11516 // select undef, T, F --> T (if T is a constant), otherwise F
11517 // select, ?, undef, F --> F
11518 // select, ?, T, undef --> T
11519 if (Cond.isUndef())
11520 return isConstantValueOfAnyType(T) ? T : F;
11521 if (T.isUndef())
11523 if (F.isUndef())
11525
11526 // select true, T, F --> T
11527 // select false, T, F --> F
11528 if (auto C = isBoolConstant(Cond))
11529 return *C ? T : F;
11530
11531 // select ?, T, T --> T
11532 if (T == F)
11533 return T;
11534
11535 return SDValue();
11536}
11537
11539 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11540 if (X.isUndef())
11541 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11542 // shift X, undef --> undef (because it may shift by the bitwidth)
11543 if (Y.isUndef())
11544 return getUNDEF(X.getValueType());
11545
11546 // shift 0, Y --> 0
11547 // shift X, 0 --> X
11549 return X;
11550
11551 // shift X, C >= bitwidth(X) --> undef
11552 // All vector elements must be too big (or undef) to avoid partial undefs.
11553 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11554 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11555 };
11556 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11557 return getUNDEF(X.getValueType());
11558
11559 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11560 if (X.getValueType().getScalarType() == MVT::i1)
11561 return X;
11562
11563 return SDValue();
11564}
11565
11567 SDNodeFlags Flags) {
11568 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11569 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11570 // operation is poison. That result can be relaxed to undef.
11571 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11572 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11573 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11574 (YC && YC->getValueAPF().isNaN());
11575 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11576 (YC && YC->getValueAPF().isInfinity());
11577
11578 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11579 return getUNDEF(X.getValueType());
11580
11581 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11582 return getUNDEF(X.getValueType());
11583
11584 if (!YC)
11585 return SDValue();
11586
11587 // X + -0.0 --> X
11588 if (Opcode == ISD::FADD)
11589 if (YC->getValueAPF().isNegZero())
11590 return X;
11591
11592 // X - +0.0 --> X
11593 if (Opcode == ISD::FSUB)
11594 if (YC->getValueAPF().isPosZero())
11595 return X;
11596
11597 // X * 1.0 --> X
11598 // X / 1.0 --> X
11599 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11600 if (YC->getValueAPF().isExactlyValue(1.0))
11601 return X;
11602
11603 // X * 0.0 --> 0.0
11604 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11605 if (YC->getValueAPF().isZero())
11606 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11607
11608 return SDValue();
11609}
11610
11612 SDValue Ptr, SDValue SV, unsigned Align) {
11613 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11614 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11615}
11616
11617SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11619 switch (Ops.size()) {
11620 case 0: return getNode(Opcode, DL, VT);
11621 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11622 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11623 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11624 default: break;
11625 }
11626
11627 // Copy from an SDUse array into an SDValue array for use with
11628 // the regular getNode logic.
11630 return getNode(Opcode, DL, VT, NewOps);
11631}
11632
11633SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11635 SDNodeFlags Flags;
11636 if (Inserter)
11637 Flags = Inserter->getFlags();
11638 return getNode(Opcode, DL, VT, Ops, Flags);
11639}
11640
11641SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11642 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11643 unsigned NumOps = Ops.size();
11644 switch (NumOps) {
11645 case 0: return getNode(Opcode, DL, VT);
11646 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11647 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11648 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11649 default: break;
11650 }
11651
11652#ifndef NDEBUG
11653 for (const auto &Op : Ops)
11654 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11655 "Operand is DELETED_NODE!");
11656#endif
11657
11658 switch (Opcode) {
11659 default: break;
11660 case ISD::BUILD_VECTOR:
11661 // Attempt to simplify BUILD_VECTOR.
11662 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11663 return V;
11664 break;
11666 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11667 return V;
11668 break;
11669 case ISD::SELECT_CC:
11670 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11671 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11672 "LHS and RHS of condition must have same type!");
11673 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11674 "True and False arms of SelectCC must have same type!");
11675 assert(Ops[2].getValueType() == VT &&
11676 "select_cc node must be of same type as true and false value!");
11677 assert((!Ops[0].getValueType().isVector() ||
11678 Ops[0].getValueType().getVectorElementCount() ==
11679 VT.getVectorElementCount()) &&
11680 "Expected select_cc with vector result to have the same sized "
11681 "comparison type!");
11682 break;
11683 case ISD::BR_CC:
11684 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11685 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11686 "LHS/RHS of comparison should match types!");
11687 break;
11688 case ISD::VP_ADD:
11689 case ISD::VP_SUB:
11690 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11691 if (VT.getScalarType() == MVT::i1)
11692 Opcode = ISD::VP_XOR;
11693 break;
11694 case ISD::VP_MUL:
11695 // If it is VP_MUL mask operation then turn it to VP_AND
11696 if (VT.getScalarType() == MVT::i1)
11697 Opcode = ISD::VP_AND;
11698 break;
11699 case ISD::VP_REDUCE_MUL:
11700 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11701 if (VT == MVT::i1)
11702 Opcode = ISD::VP_REDUCE_AND;
11703 break;
11704 case ISD::VP_REDUCE_ADD:
11705 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11706 if (VT == MVT::i1)
11707 Opcode = ISD::VP_REDUCE_XOR;
11708 break;
11709 case ISD::VP_REDUCE_SMAX:
11710 case ISD::VP_REDUCE_UMIN:
11711 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11712 // VP_REDUCE_AND.
11713 if (VT == MVT::i1)
11714 Opcode = ISD::VP_REDUCE_AND;
11715 break;
11716 case ISD::VP_REDUCE_SMIN:
11717 case ISD::VP_REDUCE_UMAX:
11718 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11719 // VP_REDUCE_OR.
11720 if (VT == MVT::i1)
11721 Opcode = ISD::VP_REDUCE_OR;
11722 break;
11723 }
11724
11725 // Memoize nodes.
11726 SDNode *N;
11727 SDVTList VTs = getVTList(VT);
11728
11729 if (VT != MVT::Glue) {
11731 AddNodeIDNode(ID, Opcode, VTs, Ops);
11732 void *IP = nullptr;
11733
11734 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11735 E->intersectFlagsWith(Flags);
11736 return SDValue(E, 0);
11737 }
11738
11739 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11740 createOperands(N, Ops);
11741
11742 CSEMap.InsertNode(N, IP);
11743 } else {
11744 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11745 createOperands(N, Ops);
11746 }
11747
11748 N->setFlags(Flags);
11749 InsertNode(N);
11750 SDValue V(N, 0);
11751 NewSDValueDbgMsg(V, "Creating new node: ", this);
11752 return V;
11753}
11754
11755SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11756 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11757 SDNodeFlags Flags;
11758 if (Inserter)
11759 Flags = Inserter->getFlags();
11760 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11761}
11762
11763SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11765 const SDNodeFlags Flags) {
11766 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11767}
11768
11769SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11771 SDNodeFlags Flags;
11772 if (Inserter)
11773 Flags = Inserter->getFlags();
11774 return getNode(Opcode, DL, VTList, Ops, Flags);
11775}
11776
11777SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11778 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11779 if (VTList.NumVTs == 1)
11780 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11781
11782#ifndef NDEBUG
11783 for (const auto &Op : Ops)
11784 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11785 "Operand is DELETED_NODE!");
11786#endif
11787
11788 switch (Opcode) {
11789 case ISD::SADDO:
11790 case ISD::UADDO:
11791 case ISD::SSUBO:
11792 case ISD::USUBO: {
11793 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11794 "Invalid add/sub overflow op!");
11795 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11796 Ops[0].getValueType() == Ops[1].getValueType() &&
11797 Ops[0].getValueType() == VTList.VTs[0] &&
11798 "Binary operator types must match!");
11799 SDValue N1 = Ops[0], N2 = Ops[1];
11800 canonicalizeCommutativeBinop(Opcode, N1, N2);
11801
11802 // (X +- 0) -> X with zero-overflow.
11803 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11804 /*AllowTruncation*/ true);
11805 if (N2CV && N2CV->isZero()) {
11806 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11807 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11808 }
11809
11810 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11811 VTList.VTs[1].getScalarType() == MVT::i1) {
11812 SDValue F1 = getFreeze(N1);
11813 SDValue F2 = getFreeze(N2);
11814 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11815 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11816 return getNode(ISD::MERGE_VALUES, DL, VTList,
11817 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11818 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11819 Flags);
11820 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11821 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11822 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11823 return getNode(ISD::MERGE_VALUES, DL, VTList,
11824 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11825 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11826 Flags);
11827 }
11828 }
11829 break;
11830 }
11831 case ISD::SADDO_CARRY:
11832 case ISD::UADDO_CARRY:
11833 case ISD::SSUBO_CARRY:
11834 case ISD::USUBO_CARRY:
11835 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11836 "Invalid add/sub overflow op!");
11837 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11838 Ops[0].getValueType() == Ops[1].getValueType() &&
11839 Ops[0].getValueType() == VTList.VTs[0] &&
11840 Ops[2].getValueType() == VTList.VTs[1] &&
11841 "Binary operator types must match!");
11842 break;
11843 case ISD::SMUL_LOHI:
11844 case ISD::UMUL_LOHI: {
11845 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
11846 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
11847 VTList.VTs[0] == Ops[0].getValueType() &&
11848 VTList.VTs[0] == Ops[1].getValueType() &&
11849 "Binary operator types must match!");
11850 // Constant fold.
11853 if (LHS && RHS) {
11854 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
11855 unsigned OutWidth = Width * 2;
11856 APInt Val = LHS->getAPIntValue();
11857 APInt Mul = RHS->getAPIntValue();
11858 if (Opcode == ISD::SMUL_LOHI) {
11859 Val = Val.sext(OutWidth);
11860 Mul = Mul.sext(OutWidth);
11861 } else {
11862 Val = Val.zext(OutWidth);
11863 Mul = Mul.zext(OutWidth);
11864 }
11865 Val *= Mul;
11866
11867 SDValue Hi =
11868 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
11869 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
11870 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
11871 }
11872 break;
11873 }
11874 case ISD::FFREXP: {
11875 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
11876 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
11877 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
11878
11880 int FrexpExp;
11881 APFloat FrexpMant =
11882 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
11883 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
11884 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
11885 DL, VTList.VTs[1]);
11886 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
11887 }
11888
11889 break;
11890 }
11892 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11893 "Invalid STRICT_FP_EXTEND!");
11894 assert(VTList.VTs[0].isFloatingPoint() &&
11895 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
11896 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11897 "STRICT_FP_EXTEND result type should be vector iff the operand "
11898 "type is vector!");
11899 assert((!VTList.VTs[0].isVector() ||
11900 VTList.VTs[0].getVectorElementCount() ==
11901 Ops[1].getValueType().getVectorElementCount()) &&
11902 "Vector element count mismatch!");
11903 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
11904 "Invalid fpext node, dst <= src!");
11905 break;
11907 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
11908 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11909 "STRICT_FP_ROUND result type should be vector iff the operand "
11910 "type is vector!");
11911 assert((!VTList.VTs[0].isVector() ||
11912 VTList.VTs[0].getVectorElementCount() ==
11913 Ops[1].getValueType().getVectorElementCount()) &&
11914 "Vector element count mismatch!");
11915 assert(VTList.VTs[0].isFloatingPoint() &&
11916 Ops[1].getValueType().isFloatingPoint() &&
11917 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
11918 Ops[2].getOpcode() == ISD::TargetConstant &&
11919 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
11920 "Invalid STRICT_FP_ROUND!");
11921 break;
11922 }
11923
11924 // Memoize the node unless it returns a glue result.
11925 SDNode *N;
11926 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
11928 AddNodeIDNode(ID, Opcode, VTList, Ops);
11929 void *IP = nullptr;
11930 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11931 E->intersectFlagsWith(Flags);
11932 return SDValue(E, 0);
11933 }
11934
11935 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11936 createOperands(N, Ops);
11937 CSEMap.InsertNode(N, IP);
11938 } else {
11939 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11940 createOperands(N, Ops);
11941 }
11942
11943 N->setFlags(Flags);
11944 InsertNode(N);
11945 SDValue V(N, 0);
11946 NewSDValueDbgMsg(V, "Creating new node: ", this);
11947 return V;
11948}
11949
11950SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11951 SDVTList VTList) {
11952 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
11953}
11954
11955SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11956 SDValue N1) {
11957 SDValue Ops[] = { N1 };
11958 return getNode(Opcode, DL, VTList, Ops);
11959}
11960
11961SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11962 SDValue N1, SDValue N2) {
11963 SDValue Ops[] = { N1, N2 };
11964 return getNode(Opcode, DL, VTList, Ops);
11965}
11966
11967SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11968 SDValue N1, SDValue N2, SDValue N3) {
11969 SDValue Ops[] = { N1, N2, N3 };
11970 return getNode(Opcode, DL, VTList, Ops);
11971}
11972
11973SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11974 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
11975 SDValue Ops[] = { N1, N2, N3, N4 };
11976 return getNode(Opcode, DL, VTList, Ops);
11977}
11978
11979SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11980 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
11981 SDValue N5) {
11982 SDValue Ops[] = { N1, N2, N3, N4, N5 };
11983 return getNode(Opcode, DL, VTList, Ops);
11984}
11985
11987 if (!VT.isExtended())
11988 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
11989
11990 return makeVTList(&(*EVTs.insert(VT).first), 1);
11991}
11992
11995 ID.AddInteger(2U);
11996 ID.AddInteger(VT1.getRawBits());
11997 ID.AddInteger(VT2.getRawBits());
11998
11999 void *IP = nullptr;
12000 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12001 if (!Result) {
12002 EVT *Array = Allocator.Allocate<EVT>(2);
12003 Array[0] = VT1;
12004 Array[1] = VT2;
12005 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
12006 VTListMap.InsertNode(Result, IP);
12007 }
12008 return Result->getSDVTList();
12009}
12010
12013 ID.AddInteger(3U);
12014 ID.AddInteger(VT1.getRawBits());
12015 ID.AddInteger(VT2.getRawBits());
12016 ID.AddInteger(VT3.getRawBits());
12017
12018 void *IP = nullptr;
12019 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12020 if (!Result) {
12021 EVT *Array = Allocator.Allocate<EVT>(3);
12022 Array[0] = VT1;
12023 Array[1] = VT2;
12024 Array[2] = VT3;
12025 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
12026 VTListMap.InsertNode(Result, IP);
12027 }
12028 return Result->getSDVTList();
12029}
12030
12033 ID.AddInteger(4U);
12034 ID.AddInteger(VT1.getRawBits());
12035 ID.AddInteger(VT2.getRawBits());
12036 ID.AddInteger(VT3.getRawBits());
12037 ID.AddInteger(VT4.getRawBits());
12038
12039 void *IP = nullptr;
12040 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12041 if (!Result) {
12042 EVT *Array = Allocator.Allocate<EVT>(4);
12043 Array[0] = VT1;
12044 Array[1] = VT2;
12045 Array[2] = VT3;
12046 Array[3] = VT4;
12047 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
12048 VTListMap.InsertNode(Result, IP);
12049 }
12050 return Result->getSDVTList();
12051}
12052
12054 unsigned NumVTs = VTs.size();
12056 ID.AddInteger(NumVTs);
12057 for (unsigned index = 0; index < NumVTs; index++) {
12058 ID.AddInteger(VTs[index].getRawBits());
12059 }
12060
12061 void *IP = nullptr;
12062 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12063 if (!Result) {
12064 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
12065 llvm::copy(VTs, Array);
12066 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
12067 VTListMap.InsertNode(Result, IP);
12068 }
12069 return Result->getSDVTList();
12070}
12071
12072
12073/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12074/// specified operands. If the resultant node already exists in the DAG,
12075/// this does not modify the specified node, instead it returns the node that
12076/// already exists. If the resultant node does not exist in the DAG, the
12077/// input node is returned. As a degenerate case, if you specify the same
12078/// input operands as the node already has, the input node is returned.
12080 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12081
12082 // Check to see if there is no change.
12083 if (Op == N->getOperand(0)) return N;
12084
12085 // See if the modified node already exists.
12086 void *InsertPos = nullptr;
12087 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
12088 return Existing;
12089
12090 // Nope it doesn't. Remove the node from its current place in the maps.
12091 if (InsertPos)
12092 if (!RemoveNodeFromCSEMaps(N))
12093 InsertPos = nullptr;
12094
12095 // Now we update the operands.
12096 N->OperandList[0].set(Op);
12097
12099 // If this gets put into a CSE map, add it.
12100 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12101 return N;
12102}
12103
12105 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12106
12107 // Check to see if there is no change.
12108 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12109 return N; // No operands changed, just return the input node.
12110
12111 // See if the modified node already exists.
12112 void *InsertPos = nullptr;
12113 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
12114 return Existing;
12115
12116 // Nope it doesn't. Remove the node from its current place in the maps.
12117 if (InsertPos)
12118 if (!RemoveNodeFromCSEMaps(N))
12119 InsertPos = nullptr;
12120
12121 // Now we update the operands.
12122 if (N->OperandList[0] != Op1)
12123 N->OperandList[0].set(Op1);
12124 if (N->OperandList[1] != Op2)
12125 N->OperandList[1].set(Op2);
12126
12128 // If this gets put into a CSE map, add it.
12129 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12130 return N;
12131}
12132
12135 SDValue Ops[] = { Op1, Op2, Op3 };
12136 return UpdateNodeOperands(N, Ops);
12137}
12138
12141 SDValue Op3, SDValue Op4) {
12142 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12143 return UpdateNodeOperands(N, Ops);
12144}
12145
12148 SDValue Op3, SDValue Op4, SDValue Op5) {
12149 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12150 return UpdateNodeOperands(N, Ops);
12151}
12152
12155 unsigned NumOps = Ops.size();
12156 assert(N->getNumOperands() == NumOps &&
12157 "Update with wrong number of operands");
12158
12159 // If no operands changed just return the input node.
12160 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12161 return N;
12162
12163 // See if the modified node already exists.
12164 void *InsertPos = nullptr;
12165 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
12166 return Existing;
12167
12168 // Nope it doesn't. Remove the node from its current place in the maps.
12169 if (InsertPos)
12170 if (!RemoveNodeFromCSEMaps(N))
12171 InsertPos = nullptr;
12172
12173 // Now we update the operands.
12174 for (unsigned i = 0; i != NumOps; ++i)
12175 if (N->OperandList[i] != Ops[i])
12176 N->OperandList[i].set(Ops[i]);
12177
12179 // If this gets put into a CSE map, add it.
12180 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12181 return N;
12182}
12183
12184/// DropOperands - Release the operands and set this node to have
12185/// zero operands.
12187 // Unlike the code in MorphNodeTo that does this, we don't need to
12188 // watch for dead nodes here.
12189 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12190 SDUse &Use = *I++;
12191 Use.set(SDValue());
12192 }
12193}
12194
12196 ArrayRef<MachineMemOperand *> NewMemRefs) {
12197 if (NewMemRefs.empty()) {
12198 N->clearMemRefs();
12199 return;
12200 }
12201
12202 // Check if we can avoid allocating by storing a single reference directly.
12203 if (NewMemRefs.size() == 1) {
12204 N->MemRefs = NewMemRefs[0];
12205 N->NumMemRefs = 1;
12206 return;
12207 }
12208
12209 MachineMemOperand **MemRefsBuffer =
12210 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12211 llvm::copy(NewMemRefs, MemRefsBuffer);
12212 N->MemRefs = MemRefsBuffer;
12213 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12214}
12215
12216/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12217/// machine opcode.
12218///
12220 EVT VT) {
12221 SDVTList VTs = getVTList(VT);
12222 return SelectNodeTo(N, MachineOpc, VTs, {});
12223}
12224
12226 EVT VT, SDValue Op1) {
12227 SDVTList VTs = getVTList(VT);
12228 SDValue Ops[] = { Op1 };
12229 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12230}
12231
12233 EVT VT, SDValue Op1,
12234 SDValue Op2) {
12235 SDVTList VTs = getVTList(VT);
12236 SDValue Ops[] = { Op1, Op2 };
12237 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12238}
12239
12241 EVT VT, SDValue Op1,
12242 SDValue Op2, SDValue Op3) {
12243 SDVTList VTs = getVTList(VT);
12244 SDValue Ops[] = { Op1, Op2, Op3 };
12245 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12246}
12247
12250 SDVTList VTs = getVTList(VT);
12251 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12252}
12253
12255 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12256 SDVTList VTs = getVTList(VT1, VT2);
12257 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12258}
12259
12261 EVT VT1, EVT VT2) {
12262 SDVTList VTs = getVTList(VT1, VT2);
12263 return SelectNodeTo(N, MachineOpc, VTs, {});
12264}
12265
12267 EVT VT1, EVT VT2, EVT VT3,
12269 SDVTList VTs = getVTList(VT1, VT2, VT3);
12270 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12271}
12272
12274 EVT VT1, EVT VT2,
12275 SDValue Op1, SDValue Op2) {
12276 SDVTList VTs = getVTList(VT1, VT2);
12277 SDValue Ops[] = { Op1, Op2 };
12278 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12279}
12280
12283 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12284 // Reset the NodeID to -1.
12285 New->setNodeId(-1);
12286 if (New != N) {
12287 ReplaceAllUsesWith(N, New);
12289 }
12290 return New;
12291}
12292
12293/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12294/// the line number information on the merged node since it is not possible to
12295/// preserve the information that operation is associated with multiple lines.
12296/// This will make the debugger working better at -O0, were there is a higher
12297/// probability having other instructions associated with that line.
12298///
12299/// For IROrder, we keep the smaller of the two
12300SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12301 DebugLoc NLoc = N->getDebugLoc();
12302 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12303 N->setDebugLoc(DebugLoc());
12304 }
12305 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12306 N->setIROrder(Order);
12307 return N;
12308}
12309
12310/// MorphNodeTo - This *mutates* the specified node to have the specified
12311/// return type, opcode, and operands.
12312///
12313/// Note that MorphNodeTo returns the resultant node. If there is already a
12314/// node of the specified opcode and operands, it returns that node instead of
12315/// the current one. Note that the SDLoc need not be the same.
12316///
12317/// Using MorphNodeTo is faster than creating a new node and swapping it in
12318/// with ReplaceAllUsesWith both because it often avoids allocating a new
12319/// node, and because it doesn't require CSE recalculation for any of
12320/// the node's users.
12321///
12322/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12323/// As a consequence it isn't appropriate to use from within the DAG combiner or
12324/// the legalizer which maintain worklists that would need to be updated when
12325/// deleting things.
12328 // If an identical node already exists, use it.
12329 void *IP = nullptr;
12330 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12332 AddNodeIDNode(ID, Opc, VTs, Ops);
12333 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
12334 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12335 }
12336
12337 if (!RemoveNodeFromCSEMaps(N))
12338 IP = nullptr;
12339
12340 // Start the morphing.
12341 N->NodeType = Opc;
12342 N->ValueList = VTs.VTs;
12343 N->NumValues = VTs.NumVTs;
12344
12345 // Clear the operands list, updating used nodes to remove this from their
12346 // use list. Keep track of any operands that become dead as a result.
12347 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12348 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12349 SDUse &Use = *I++;
12350 SDNode *Used = Use.getNode();
12351 Use.set(SDValue());
12352 if (Used->use_empty())
12353 DeadNodeSet.insert(Used);
12354 }
12355
12356 // For MachineNode, initialize the memory references information.
12358 MN->clearMemRefs();
12359
12360 // Swap for an appropriately sized array from the recycler.
12361 removeOperands(N);
12362 createOperands(N, Ops);
12363
12364 // Delete any nodes that are still dead after adding the uses for the
12365 // new operands.
12366 if (!DeadNodeSet.empty()) {
12367 SmallVector<SDNode *, 16> DeadNodes;
12368 for (SDNode *N : DeadNodeSet)
12369 if (N->use_empty())
12370 DeadNodes.push_back(N);
12371 RemoveDeadNodes(DeadNodes);
12372 }
12373
12374 if (IP)
12375 CSEMap.InsertNode(N, IP); // Memoize the new node.
12376 return N;
12377}
12378
12380 unsigned OrigOpc = Node->getOpcode();
12381 unsigned NewOpc;
12382 switch (OrigOpc) {
12383 default:
12384 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12385#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12386 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12387#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12388 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12389#include "llvm/IR/ConstrainedOps.def"
12390 }
12391
12392 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12393
12394 // We're taking this node out of the chain, so we need to re-link things.
12395 SDValue InputChain = Node->getOperand(0);
12396 SDValue OutputChain = SDValue(Node, 1);
12397 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12398
12400 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12401 Ops.push_back(Node->getOperand(i));
12402
12403 SDVTList VTs = getVTList(Node->getValueType(0));
12404 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12405
12406 // MorphNodeTo can operate in two ways: if an existing node with the
12407 // specified operands exists, it can just return it. Otherwise, it
12408 // updates the node in place to have the requested operands.
12409 if (Res == Node) {
12410 // If we updated the node in place, reset the node ID. To the isel,
12411 // this should be just like a newly allocated machine node.
12412 Res->setNodeId(-1);
12413 } else {
12416 }
12417
12418 return Res;
12419}
12420
12421/// getMachineNode - These are used for target selectors to create a new node
12422/// with specified return type(s), MachineInstr opcode, and operands.
12423///
12424/// Note that getMachineNode returns the resultant node. If there is already a
12425/// node of the specified opcode and operands, it returns that node instead of
12426/// the current one.
12428 EVT VT) {
12429 SDVTList VTs = getVTList(VT);
12430 return getMachineNode(Opcode, dl, VTs, {});
12431}
12432
12434 EVT VT, SDValue Op1) {
12435 SDVTList VTs = getVTList(VT);
12436 SDValue Ops[] = { Op1 };
12437 return getMachineNode(Opcode, dl, VTs, Ops);
12438}
12439
12441 EVT VT, SDValue Op1, SDValue Op2) {
12442 SDVTList VTs = getVTList(VT);
12443 SDValue Ops[] = { Op1, Op2 };
12444 return getMachineNode(Opcode, dl, VTs, Ops);
12445}
12446
12448 EVT VT, SDValue Op1, SDValue Op2,
12449 SDValue Op3) {
12450 SDVTList VTs = getVTList(VT);
12451 SDValue Ops[] = { Op1, Op2, Op3 };
12452 return getMachineNode(Opcode, dl, VTs, Ops);
12453}
12454
12457 SDVTList VTs = getVTList(VT);
12458 return getMachineNode(Opcode, dl, VTs, Ops);
12459}
12460
12462 EVT VT1, EVT VT2, SDValue Op1,
12463 SDValue Op2) {
12464 SDVTList VTs = getVTList(VT1, VT2);
12465 SDValue Ops[] = { Op1, Op2 };
12466 return getMachineNode(Opcode, dl, VTs, Ops);
12467}
12468
12470 EVT VT1, EVT VT2, SDValue Op1,
12471 SDValue Op2, SDValue Op3) {
12472 SDVTList VTs = getVTList(VT1, VT2);
12473 SDValue Ops[] = { Op1, Op2, Op3 };
12474 return getMachineNode(Opcode, dl, VTs, Ops);
12475}
12476
12478 EVT VT1, EVT VT2,
12480 SDVTList VTs = getVTList(VT1, VT2);
12481 return getMachineNode(Opcode, dl, VTs, Ops);
12482}
12483
12485 EVT VT1, EVT VT2, EVT VT3,
12486 SDValue Op1, SDValue Op2) {
12487 SDVTList VTs = getVTList(VT1, VT2, VT3);
12488 SDValue Ops[] = { Op1, Op2 };
12489 return getMachineNode(Opcode, dl, VTs, Ops);
12490}
12491
12493 EVT VT1, EVT VT2, EVT VT3,
12494 SDValue Op1, SDValue Op2,
12495 SDValue Op3) {
12496 SDVTList VTs = getVTList(VT1, VT2, VT3);
12497 SDValue Ops[] = { Op1, Op2, Op3 };
12498 return getMachineNode(Opcode, dl, VTs, Ops);
12499}
12500
12502 EVT VT1, EVT VT2, EVT VT3,
12504 SDVTList VTs = getVTList(VT1, VT2, VT3);
12505 return getMachineNode(Opcode, dl, VTs, Ops);
12506}
12507
12509 ArrayRef<EVT> ResultTys,
12511 SDVTList VTs = getVTList(ResultTys);
12512 return getMachineNode(Opcode, dl, VTs, Ops);
12513}
12514
12516 SDVTList VTs,
12518 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12520 void *IP = nullptr;
12521
12522 if (DoCSE) {
12524 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12525 IP = nullptr;
12526 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12527 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12528 }
12529 }
12530
12531 // Allocate a new MachineSDNode.
12532 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12533 createOperands(N, Ops);
12534
12535 if (DoCSE)
12536 CSEMap.InsertNode(N, IP);
12537
12538 InsertNode(N);
12539 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12540 return N;
12541}
12542
12543/// getTargetExtractSubreg - A convenience function for creating
12544/// TargetOpcode::EXTRACT_SUBREG nodes.
12546 SDValue Operand) {
12547 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12548 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12549 VT, Operand, SRIdxVal);
12550 return SDValue(Subreg, 0);
12551}
12552
12553/// getTargetInsertSubreg - A convenience function for creating
12554/// TargetOpcode::INSERT_SUBREG nodes.
12556 SDValue Operand, SDValue Subreg) {
12557 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12558 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12559 VT, Operand, Subreg, SRIdxVal);
12560 return SDValue(Result, 0);
12561}
12562
12563/// getNodeIfExists - Get the specified node if it's already available, or
12564/// else return NULL.
12567 bool AllowCommute) {
12568 SDNodeFlags Flags;
12569 if (Inserter)
12570 Flags = Inserter->getFlags();
12571 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12572}
12573
12576 const SDNodeFlags Flags,
12577 bool AllowCommute) {
12578 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12579 return nullptr;
12580
12581 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12583 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12584 void *IP = nullptr;
12585 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12586 E->intersectFlagsWith(Flags);
12587 return E;
12588 }
12589 return nullptr;
12590 };
12591
12592 if (SDNode *Existing = Lookup(Ops))
12593 return Existing;
12594
12595 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12596 return Lookup({Ops[1], Ops[0]});
12597
12598 return nullptr;
12599}
12600
12601/// doesNodeExist - Check if a node exists without modifying its flags.
12602bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12604 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12606 AddNodeIDNode(ID, Opcode, VTList, Ops);
12607 void *IP = nullptr;
12608 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12609 return true;
12610 }
12611 return false;
12612}
12613
12614/// getDbgValue - Creates a SDDbgValue node.
12615///
12616/// SDNode
12618 SDNode *N, unsigned R, bool IsIndirect,
12619 const DebugLoc &DL, unsigned O) {
12620 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12621 "Expected inlined-at fields to agree");
12622 return new (DbgInfo->getAlloc())
12623 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12624 {}, IsIndirect, DL, O,
12625 /*IsVariadic=*/false);
12626}
12627
12628/// Constant
12630 DIExpression *Expr,
12631 const Value *C,
12632 const DebugLoc &DL, unsigned O) {
12633 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12634 "Expected inlined-at fields to agree");
12635 return new (DbgInfo->getAlloc())
12636 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12637 /*IsIndirect=*/false, DL, O,
12638 /*IsVariadic=*/false);
12639}
12640
12641/// FrameIndex
12643 DIExpression *Expr, unsigned FI,
12644 bool IsIndirect,
12645 const DebugLoc &DL,
12646 unsigned O) {
12647 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12648 "Expected inlined-at fields to agree");
12649 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12650}
12651
12652/// FrameIndex with dependencies
12654 DIExpression *Expr, unsigned FI,
12655 ArrayRef<SDNode *> Dependencies,
12656 bool IsIndirect,
12657 const DebugLoc &DL,
12658 unsigned O) {
12659 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12660 "Expected inlined-at fields to agree");
12661 return new (DbgInfo->getAlloc())
12662 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12663 Dependencies, IsIndirect, DL, O,
12664 /*IsVariadic=*/false);
12665}
12666
12667/// VReg
12669 Register VReg, bool IsIndirect,
12670 const DebugLoc &DL, unsigned O) {
12671 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12672 "Expected inlined-at fields to agree");
12673 return new (DbgInfo->getAlloc())
12674 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12675 {}, IsIndirect, DL, O,
12676 /*IsVariadic=*/false);
12677}
12678
12681 ArrayRef<SDNode *> Dependencies,
12682 bool IsIndirect, const DebugLoc &DL,
12683 unsigned O, bool IsVariadic) {
12684 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12685 "Expected inlined-at fields to agree");
12686 return new (DbgInfo->getAlloc())
12687 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12688 DL, O, IsVariadic);
12689}
12690
12692 unsigned OffsetInBits, unsigned SizeInBits,
12693 bool InvalidateDbg) {
12694 SDNode *FromNode = From.getNode();
12695 SDNode *ToNode = To.getNode();
12696 assert(FromNode && ToNode && "Can't modify dbg values");
12697
12698 // PR35338
12699 // TODO: assert(From != To && "Redundant dbg value transfer");
12700 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12701 if (From == To || FromNode == ToNode)
12702 return;
12703
12704 if (!FromNode->getHasDebugValue())
12705 return;
12706
12707 SDDbgOperand FromLocOp =
12708 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12710
12712 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12713 if (Dbg->isInvalidated())
12714 continue;
12715
12716 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12717
12718 // Create a new location ops vector that is equal to the old vector, but
12719 // with each instance of FromLocOp replaced with ToLocOp.
12720 bool Changed = false;
12721 auto NewLocOps = Dbg->copyLocationOps();
12722 std::replace_if(
12723 NewLocOps.begin(), NewLocOps.end(),
12724 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12725 bool Match = Op == FromLocOp;
12726 Changed |= Match;
12727 return Match;
12728 },
12729 ToLocOp);
12730 // Ignore this SDDbgValue if we didn't find a matching location.
12731 if (!Changed)
12732 continue;
12733
12734 DIVariable *Var = Dbg->getVariable();
12735 auto *Expr = Dbg->getExpression();
12736 // If a fragment is requested, update the expression.
12737 if (SizeInBits) {
12738 // When splitting a larger (e.g., sign-extended) value whose
12739 // lower bits are described with an SDDbgValue, do not attempt
12740 // to transfer the SDDbgValue to the upper bits.
12741 if (auto FI = Expr->getFragmentInfo())
12742 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12743 continue;
12744 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12745 SizeInBits);
12746 if (!Fragment)
12747 continue;
12748 Expr = *Fragment;
12749 }
12750
12751 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12752 // Clone the SDDbgValue and move it to To.
12753 SDDbgValue *Clone = getDbgValueList(
12754 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12755 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12756 Dbg->isVariadic());
12757 ClonedDVs.push_back(Clone);
12758
12759 if (InvalidateDbg) {
12760 // Invalidate value and indicate the SDDbgValue should not be emitted.
12761 Dbg->setIsInvalidated();
12762 Dbg->setIsEmitted();
12763 }
12764 }
12765
12766 for (SDDbgValue *Dbg : ClonedDVs) {
12767 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12768 "Transferred DbgValues should depend on the new SDNode");
12769 AddDbgValue(Dbg, false);
12770 }
12771}
12772
12774 if (!N.getHasDebugValue())
12775 return;
12776
12777 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12778 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12779 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12780 return SDDbgOperand::fromNode(Node, ResNo);
12781 };
12782
12784 for (auto *DV : GetDbgValues(&N)) {
12785 if (DV->isInvalidated())
12786 continue;
12787 switch (N.getOpcode()) {
12788 default:
12789 break;
12790 case ISD::ADD: {
12791 SDValue N0 = N.getOperand(0);
12792 SDValue N1 = N.getOperand(1);
12793 if (!isa<ConstantSDNode>(N0)) {
12794 bool RHSConstant = isa<ConstantSDNode>(N1);
12796 if (RHSConstant)
12797 Offset = N.getConstantOperandVal(1);
12798 // We are not allowed to turn indirect debug values variadic, so
12799 // don't salvage those.
12800 if (!RHSConstant && DV->isIndirect())
12801 continue;
12802
12803 // Rewrite an ADD constant node into a DIExpression. Since we are
12804 // performing arithmetic to compute the variable's *value* in the
12805 // DIExpression, we need to mark the expression with a
12806 // DW_OP_stack_value.
12807 auto *DIExpr = DV->getExpression();
12808 auto NewLocOps = DV->copyLocationOps();
12809 bool Changed = false;
12810 size_t OrigLocOpsSize = NewLocOps.size();
12811 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12812 // We're not given a ResNo to compare against because the whole
12813 // node is going away. We know that any ISD::ADD only has one
12814 // result, so we can assume any node match is using the result.
12815 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12816 NewLocOps[i].getSDNode() != &N)
12817 continue;
12818 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12819 if (RHSConstant) {
12822 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12823 } else {
12824 // Convert to a variadic expression (if not already).
12825 // convertToVariadicExpression() returns a const pointer, so we use
12826 // a temporary const variable here.
12827 const auto *TmpDIExpr =
12831 ExprOps.push_back(NewLocOps.size());
12832 ExprOps.push_back(dwarf::DW_OP_plus);
12833 SDDbgOperand RHS =
12835 NewLocOps.push_back(RHS);
12836 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12837 }
12838 Changed = true;
12839 }
12840 (void)Changed;
12841 assert(Changed && "Salvage target doesn't use N");
12842
12843 bool IsVariadic =
12844 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12845
12846 auto AdditionalDependencies = DV->getAdditionalDependencies();
12847 SDDbgValue *Clone = getDbgValueList(
12848 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12849 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12850 ClonedDVs.push_back(Clone);
12851 DV->setIsInvalidated();
12852 DV->setIsEmitted();
12853 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12854 N0.getNode()->dumprFull(this);
12855 dbgs() << " into " << *DIExpr << '\n');
12856 }
12857 break;
12858 }
12859 case ISD::TRUNCATE: {
12860 SDValue N0 = N.getOperand(0);
12861 TypeSize FromSize = N0.getValueSizeInBits();
12862 TypeSize ToSize = N.getValueSizeInBits(0);
12863
12864 DIExpression *DbgExpression = DV->getExpression();
12865 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12866 auto NewLocOps = DV->copyLocationOps();
12867 bool Changed = false;
12868 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12869 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12870 NewLocOps[i].getSDNode() != &N)
12871 continue;
12872
12873 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12874 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
12875 Changed = true;
12876 }
12877 assert(Changed && "Salvage target doesn't use N");
12878 (void)Changed;
12879
12880 SDDbgValue *Clone =
12881 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
12882 DV->getAdditionalDependencies(), DV->isIndirect(),
12883 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
12884
12885 ClonedDVs.push_back(Clone);
12886 DV->setIsInvalidated();
12887 DV->setIsEmitted();
12888 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
12889 dbgs() << " into " << *DbgExpression << '\n');
12890 break;
12891 }
12892 }
12893 }
12894
12895 for (SDDbgValue *Dbg : ClonedDVs) {
12896 assert((!Dbg->getSDNodes().empty() ||
12897 llvm::any_of(Dbg->getLocationOps(),
12898 [&](const SDDbgOperand &Op) {
12899 return Op.getKind() == SDDbgOperand::FRAMEIX;
12900 })) &&
12901 "Salvaged DbgValue should depend on a new SDNode");
12902 AddDbgValue(Dbg, false);
12903 }
12904}
12905
12906/// Creates a SDDbgLabel node.
12908 const DebugLoc &DL, unsigned O) {
12909 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
12910 "Expected inlined-at fields to agree");
12911 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
12912}
12913
12914namespace {
12915
12916/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
12917/// pointed to by a use iterator is deleted, increment the use iterator
12918/// so that it doesn't dangle.
12919///
12920class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
12923
12924 void NodeDeleted(SDNode *N, SDNode *E) override {
12925 // Increment the iterator as needed.
12926 while (UI != UE && N == UI->getUser())
12927 ++UI;
12928 }
12929
12930public:
12931 RAUWUpdateListener(SelectionDAG &d,
12934 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
12935};
12936
12937} // end anonymous namespace
12938
12939/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12940/// This can cause recursive merging of nodes in the DAG.
12941///
12942/// This version assumes From has a single result value.
12943///
12945 SDNode *From = FromN.getNode();
12946 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
12947 "Cannot replace with this method!");
12948 assert(From != To.getNode() && "Cannot replace uses of with self");
12949
12950 // Preserve Debug Values
12951 transferDbgValues(FromN, To);
12952 // Preserve extra info.
12953 copyExtraInfo(From, To.getNode());
12954
12955 // Iterate over all the existing uses of From. New uses will be added
12956 // to the beginning of the use list, which we avoid visiting.
12957 // This specifically avoids visiting uses of From that arise while the
12958 // replacement is happening, because any such uses would be the result
12959 // of CSE: If an existing node looks like From after one of its operands
12960 // is replaced by To, we don't want to replace of all its users with To
12961 // too. See PR3018 for more info.
12962 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12963 RAUWUpdateListener Listener(*this, UI, UE);
12964 while (UI != UE) {
12965 SDNode *User = UI->getUser();
12966
12967 // This node is about to morph, remove its old self from the CSE maps.
12968 RemoveNodeFromCSEMaps(User);
12969
12970 // A user can appear in a use list multiple times, and when this
12971 // happens the uses are usually next to each other in the list.
12972 // To help reduce the number of CSE recomputations, process all
12973 // the uses of this user that we can find this way.
12974 do {
12975 SDUse &Use = *UI;
12976 ++UI;
12977 Use.set(To);
12978 if (To->isDivergent() != From->isDivergent())
12980 } while (UI != UE && UI->getUser() == User);
12981 // Now that we have modified User, add it back to the CSE maps. If it
12982 // already exists there, recursively merge the results together.
12983 AddModifiedNodeToCSEMaps(User);
12984 }
12985
12986 // If we just RAUW'd the root, take note.
12987 if (FromN == getRoot())
12988 setRoot(To);
12989}
12990
12991/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12992/// This can cause recursive merging of nodes in the DAG.
12993///
12994/// This version assumes that for each value of From, there is a
12995/// corresponding value in To in the same position with the same type.
12996///
12998#ifndef NDEBUG
12999 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13000 assert((!From->hasAnyUseOfValue(i) ||
13001 From->getValueType(i) == To->getValueType(i)) &&
13002 "Cannot use this version of ReplaceAllUsesWith!");
13003#endif
13004
13005 // Handle the trivial case.
13006 if (From == To)
13007 return;
13008
13009 // Preserve Debug Info. Only do this if there's a use.
13010 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13011 if (From->hasAnyUseOfValue(i)) {
13012 assert((i < To->getNumValues()) && "Invalid To location");
13013 transferDbgValues(SDValue(From, i), SDValue(To, i));
13014 }
13015 // Preserve extra info.
13016 copyExtraInfo(From, To);
13017
13018 // Iterate over just the existing users of From. See the comments in
13019 // the ReplaceAllUsesWith above.
13020 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13021 RAUWUpdateListener Listener(*this, UI, UE);
13022 while (UI != UE) {
13023 SDNode *User = UI->getUser();
13024
13025 // This node is about to morph, remove its old self from the CSE maps.
13026 RemoveNodeFromCSEMaps(User);
13027
13028 // A user can appear in a use list multiple times, and when this
13029 // happens the uses are usually next to each other in the list.
13030 // To help reduce the number of CSE recomputations, process all
13031 // the uses of this user that we can find this way.
13032 do {
13033 SDUse &Use = *UI;
13034 ++UI;
13035 Use.setNode(To);
13036 if (To->isDivergent() != From->isDivergent())
13038 } while (UI != UE && UI->getUser() == User);
13039
13040 // Now that we have modified User, add it back to the CSE maps. If it
13041 // already exists there, recursively merge the results together.
13042 AddModifiedNodeToCSEMaps(User);
13043 }
13044
13045 // If we just RAUW'd the root, take note.
13046 if (From == getRoot().getNode())
13047 setRoot(SDValue(To, getRoot().getResNo()));
13048}
13049
13050/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13051/// This can cause recursive merging of nodes in the DAG.
13052///
13053/// This version can replace From with any result values. To must match the
13054/// number and types of values returned by From.
13056 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13057 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13058
13059 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13060 // Preserve Debug Info.
13061 transferDbgValues(SDValue(From, i), To[i]);
13062 // Preserve extra info.
13063 copyExtraInfo(From, To[i].getNode());
13064 }
13065
13066 // Iterate over just the existing users of From. See the comments in
13067 // the ReplaceAllUsesWith above.
13068 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13069 RAUWUpdateListener Listener(*this, UI, UE);
13070 while (UI != UE) {
13071 SDNode *User = UI->getUser();
13072
13073 // This node is about to morph, remove its old self from the CSE maps.
13074 RemoveNodeFromCSEMaps(User);
13075
13076 // A user can appear in a use list multiple times, and when this happens the
13077 // uses are usually next to each other in the list. To help reduce the
13078 // number of CSE and divergence recomputations, process all the uses of this
13079 // user that we can find this way.
13080 bool To_IsDivergent = false;
13081 do {
13082 SDUse &Use = *UI;
13083 const SDValue &ToOp = To[Use.getResNo()];
13084 ++UI;
13085 Use.set(ToOp);
13086 if (ToOp.getValueType() != MVT::Other)
13087 To_IsDivergent |= ToOp->isDivergent();
13088 } while (UI != UE && UI->getUser() == User);
13089
13090 if (To_IsDivergent != From->isDivergent())
13092
13093 // Now that we have modified User, add it back to the CSE maps. If it
13094 // already exists there, recursively merge the results together.
13095 AddModifiedNodeToCSEMaps(User);
13096 }
13097
13098 // If we just RAUW'd the root, take note.
13099 if (From == getRoot().getNode())
13100 setRoot(SDValue(To[getRoot().getResNo()]));
13101}
13102
13103/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13104/// uses of other values produced by From.getNode() alone. The Deleted
13105/// vector is handled the same way as for ReplaceAllUsesWith.
13107 // Handle the really simple, really trivial case efficiently.
13108 if (From == To) return;
13109
13110 // Handle the simple, trivial, case efficiently.
13111 if (From.getNode()->getNumValues() == 1) {
13112 ReplaceAllUsesWith(From, To);
13113 return;
13114 }
13115
13116 // Preserve Debug Info.
13117 transferDbgValues(From, To);
13118 copyExtraInfo(From.getNode(), To.getNode());
13119
13120 // Iterate over just the existing users of From. See the comments in
13121 // the ReplaceAllUsesWith above.
13122 SDNode::use_iterator UI = From.getNode()->use_begin(),
13123 UE = From.getNode()->use_end();
13124 RAUWUpdateListener Listener(*this, UI, UE);
13125 while (UI != UE) {
13126 SDNode *User = UI->getUser();
13127 bool UserRemovedFromCSEMaps = false;
13128
13129 // A user can appear in a use list multiple times, and when this
13130 // happens the uses are usually next to each other in the list.
13131 // To help reduce the number of CSE recomputations, process all
13132 // the uses of this user that we can find this way.
13133 do {
13134 SDUse &Use = *UI;
13135
13136 // Skip uses of different values from the same node.
13137 if (Use.getResNo() != From.getResNo()) {
13138 ++UI;
13139 continue;
13140 }
13141
13142 // If this node hasn't been modified yet, it's still in the CSE maps,
13143 // so remove its old self from the CSE maps.
13144 if (!UserRemovedFromCSEMaps) {
13145 RemoveNodeFromCSEMaps(User);
13146 UserRemovedFromCSEMaps = true;
13147 }
13148
13149 ++UI;
13150 Use.set(To);
13151 if (To->isDivergent() != From->isDivergent())
13153 } while (UI != UE && UI->getUser() == User);
13154 // We are iterating over all uses of the From node, so if a use
13155 // doesn't use the specific value, no changes are made.
13156 if (!UserRemovedFromCSEMaps)
13157 continue;
13158
13159 // Now that we have modified User, add it back to the CSE maps. If it
13160 // already exists there, recursively merge the results together.
13161 AddModifiedNodeToCSEMaps(User);
13162 }
13163
13164 // If we just RAUW'd the root, take note.
13165 if (From == getRoot())
13166 setRoot(To);
13167}
13168
13169namespace {
13170
13171/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13172/// to record information about a use.
13173struct UseMemo {
13174 SDNode *User;
13175 unsigned Index;
13176 SDUse *Use;
13177};
13178
13179/// operator< - Sort Memos by User.
13180bool operator<(const UseMemo &L, const UseMemo &R) {
13181 return (intptr_t)L.User < (intptr_t)R.User;
13182}
13183
13184/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13185/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13186/// the node already has been taken care of recursively.
13187class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13188 SmallVectorImpl<UseMemo> &Uses;
13189
13190 void NodeDeleted(SDNode *N, SDNode *E) override {
13191 for (UseMemo &Memo : Uses)
13192 if (Memo.User == N)
13193 Memo.User = nullptr;
13194 }
13195
13196public:
13197 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13198 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13199};
13200
13201} // end anonymous namespace
13202
13203/// Return true if a glue output should propagate divergence information.
13205 switch (Node->getOpcode()) {
13206 case ISD::CopyFromReg:
13207 case ISD::CopyToReg:
13208 return false;
13209 default:
13210 return true;
13211 }
13212
13213 llvm_unreachable("covered opcode switch");
13214}
13215
13217 if (TLI->isSDNodeAlwaysUniform(N)) {
13218 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13219 "Conflicting divergence information!");
13220 return false;
13221 }
13222 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13223 return true;
13224 for (const auto &Op : N->ops()) {
13225 EVT VT = Op.getValueType();
13226
13227 // Skip Chain. It does not carry divergence.
13228 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13229 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13230 return true;
13231 }
13232 return false;
13233}
13234
13236 SmallVector<SDNode *, 16> Worklist(1, N);
13237 do {
13238 N = Worklist.pop_back_val();
13239 bool IsDivergent = calculateDivergence(N);
13240 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13241 N->SDNodeBits.IsDivergent = IsDivergent;
13242 llvm::append_range(Worklist, N->users());
13243 }
13244 } while (!Worklist.empty());
13245}
13246
13247void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13249 Order.reserve(AllNodes.size());
13250 for (auto &N : allnodes()) {
13251 unsigned NOps = N.getNumOperands();
13252 Degree[&N] = NOps;
13253 if (0 == NOps)
13254 Order.push_back(&N);
13255 }
13256 for (size_t I = 0; I != Order.size(); ++I) {
13257 SDNode *N = Order[I];
13258 for (auto *U : N->users()) {
13259 unsigned &UnsortedOps = Degree[U];
13260 if (0 == --UnsortedOps)
13261 Order.push_back(U);
13262 }
13263 }
13264}
13265
13266#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13267void SelectionDAG::VerifyDAGDivergence() {
13268 std::vector<SDNode *> TopoOrder;
13269 CreateTopologicalOrder(TopoOrder);
13270 for (auto *N : TopoOrder) {
13271 assert(calculateDivergence(N) == N->isDivergent() &&
13272 "Divergence bit inconsistency detected");
13273 }
13274}
13275#endif
13276
13277/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13278/// uses of other values produced by From.getNode() alone. The same value
13279/// may appear in both the From and To list. The Deleted vector is
13280/// handled the same way as for ReplaceAllUsesWith.
13282 const SDValue *To,
13283 unsigned Num){
13284 // Handle the simple, trivial case efficiently.
13285 if (Num == 1)
13286 return ReplaceAllUsesOfValueWith(*From, *To);
13287
13288 transferDbgValues(*From, *To);
13289 copyExtraInfo(From->getNode(), To->getNode());
13290
13291 // Read up all the uses and make records of them. This helps
13292 // processing new uses that are introduced during the
13293 // replacement process.
13295 for (unsigned i = 0; i != Num; ++i) {
13296 unsigned FromResNo = From[i].getResNo();
13297 SDNode *FromNode = From[i].getNode();
13298 for (SDUse &Use : FromNode->uses()) {
13299 if (Use.getResNo() == FromResNo) {
13300 UseMemo Memo = {Use.getUser(), i, &Use};
13301 Uses.push_back(Memo);
13302 }
13303 }
13304 }
13305
13306 // Sort the uses, so that all the uses from a given User are together.
13308 RAUOVWUpdateListener Listener(*this, Uses);
13309
13310 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13311 UseIndex != UseIndexEnd; ) {
13312 // We know that this user uses some value of From. If it is the right
13313 // value, update it.
13314 SDNode *User = Uses[UseIndex].User;
13315 // If the node has been deleted by recursive CSE updates when updating
13316 // another node, then just skip this entry.
13317 if (User == nullptr) {
13318 ++UseIndex;
13319 continue;
13320 }
13321
13322 // This node is about to morph, remove its old self from the CSE maps.
13323 RemoveNodeFromCSEMaps(User);
13324
13325 // The Uses array is sorted, so all the uses for a given User
13326 // are next to each other in the list.
13327 // To help reduce the number of CSE recomputations, process all
13328 // the uses of this user that we can find this way.
13329 do {
13330 unsigned i = Uses[UseIndex].Index;
13331 SDUse &Use = *Uses[UseIndex].Use;
13332 ++UseIndex;
13333
13334 Use.set(To[i]);
13335 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13336
13337 // Now that we have modified User, add it back to the CSE maps. If it
13338 // already exists there, recursively merge the results together.
13339 AddModifiedNodeToCSEMaps(User);
13340 }
13341}
13342
13343/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13344/// based on their topological order. It returns the maximum id and a vector
13345/// of the SDNodes* in assigned order by reference.
13347 unsigned DAGSize = 0;
13348
13349 // SortedPos tracks the progress of the algorithm. Nodes before it are
13350 // sorted, nodes after it are unsorted. When the algorithm completes
13351 // it is at the end of the list.
13352 allnodes_iterator SortedPos = allnodes_begin();
13353
13354 // Visit all the nodes. Move nodes with no operands to the front of
13355 // the list immediately. Annotate nodes that do have operands with their
13356 // operand count. Before we do this, the Node Id fields of the nodes
13357 // may contain arbitrary values. After, the Node Id fields for nodes
13358 // before SortedPos will contain the topological sort index, and the
13359 // Node Id fields for nodes At SortedPos and after will contain the
13360 // count of outstanding operands.
13362 checkForCycles(&N, this);
13363 unsigned Degree = N.getNumOperands();
13364 if (Degree == 0) {
13365 // A node with no uses, add it to the result array immediately.
13366 N.setNodeId(DAGSize++);
13367 allnodes_iterator Q(&N);
13368 if (Q != SortedPos)
13369 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13370 assert(SortedPos != AllNodes.end() && "Overran node list");
13371 ++SortedPos;
13372 } else {
13373 // Temporarily use the Node Id as scratch space for the degree count.
13374 N.setNodeId(Degree);
13375 }
13376 }
13377
13378 // Visit all the nodes. As we iterate, move nodes into sorted order,
13379 // such that by the time the end is reached all nodes will be sorted.
13380 for (SDNode &Node : allnodes()) {
13381 SDNode *N = &Node;
13382 checkForCycles(N, this);
13383 // N is in sorted position, so all its uses have one less operand
13384 // that needs to be sorted.
13385 for (SDNode *P : N->users()) {
13386 unsigned Degree = P->getNodeId();
13387 assert(Degree != 0 && "Invalid node degree");
13388 --Degree;
13389 if (Degree == 0) {
13390 // All of P's operands are sorted, so P may sorted now.
13391 P->setNodeId(DAGSize++);
13392 if (P->getIterator() != SortedPos)
13393 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13394 assert(SortedPos != AllNodes.end() && "Overran node list");
13395 ++SortedPos;
13396 } else {
13397 // Update P's outstanding operand count.
13398 P->setNodeId(Degree);
13399 }
13400 }
13401 if (Node.getIterator() == SortedPos) {
13402#ifndef NDEBUG
13404 SDNode *S = &*++I;
13405 dbgs() << "Overran sorted position:\n";
13406 S->dumprFull(this); dbgs() << "\n";
13407 dbgs() << "Checking if this is due to cycles\n";
13408 checkForCycles(this, true);
13409#endif
13410 llvm_unreachable(nullptr);
13411 }
13412 }
13413
13414 assert(SortedPos == AllNodes.end() &&
13415 "Topological sort incomplete!");
13416 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13417 "First node in topological sort is not the entry token!");
13418 assert(AllNodes.front().getNodeId() == 0 &&
13419 "First node in topological sort has non-zero id!");
13420 assert(AllNodes.front().getNumOperands() == 0 &&
13421 "First node in topological sort has operands!");
13422 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13423 "Last node in topologic sort has unexpected id!");
13424 assert(AllNodes.back().use_empty() &&
13425 "Last node in topologic sort has users!");
13426 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13427 return DAGSize;
13428}
13429
13431 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13432 SortedNodes.clear();
13433 // Node -> remaining number of outstanding operands.
13434 DenseMap<const SDNode *, unsigned> RemainingOperands;
13435
13436 // Put nodes without any operands into SortedNodes first.
13437 for (const SDNode &N : allnodes()) {
13438 checkForCycles(&N, this);
13439 unsigned NumOperands = N.getNumOperands();
13440 if (NumOperands == 0)
13441 SortedNodes.push_back(&N);
13442 else
13443 // Record their total number of outstanding operands.
13444 RemainingOperands[&N] = NumOperands;
13445 }
13446
13447 // A node is pushed into SortedNodes when all of its operands (predecessors in
13448 // the graph) are also in SortedNodes.
13449 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13450 const SDNode *N = SortedNodes[i];
13451 for (const SDNode *U : N->users()) {
13452 // HandleSDNode is never part of a DAG and therefore has no entry in
13453 // RemainingOperands.
13454 if (U->getOpcode() == ISD::HANDLENODE)
13455 continue;
13456 unsigned &NumRemOperands = RemainingOperands[U];
13457 assert(NumRemOperands && "Invalid number of remaining operands");
13458 --NumRemOperands;
13459 if (!NumRemOperands)
13460 SortedNodes.push_back(U);
13461 }
13462 }
13463
13464 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13465 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13466 "First node in topological sort is not the entry token");
13467 assert(SortedNodes.front()->getNumOperands() == 0 &&
13468 "First node in topological sort has operands");
13469}
13470
13471/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13472/// value is produced by SD.
13473void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13474 for (SDNode *SD : DB->getSDNodes()) {
13475 if (!SD)
13476 continue;
13477 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13478 SD->setHasDebugValue(true);
13479 }
13480 DbgInfo->add(DB, isParameter);
13481}
13482
13483void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13484
13486 SDValue NewMemOpChain) {
13487 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13488 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13489 // The new memory operation must have the same position as the old load in
13490 // terms of memory dependency. Create a TokenFactor for the old load and new
13491 // memory operation and update uses of the old load's output chain to use that
13492 // TokenFactor.
13493 if (OldChain == NewMemOpChain || OldChain.use_empty())
13494 return NewMemOpChain;
13495
13496 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13497 OldChain, NewMemOpChain);
13498 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13499 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13500 return TokenFactor;
13501}
13502
13504 SDValue NewMemOp) {
13505 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13506 SDValue OldChain = SDValue(OldLoad, 1);
13507 SDValue NewMemOpChain = NewMemOp.getValue(1);
13508 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13509}
13510
13512 Function **OutFunction) {
13513 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13514
13515 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13516 auto *Module = MF->getFunction().getParent();
13517 auto *Function = Module->getFunction(Symbol);
13518
13519 if (OutFunction != nullptr)
13520 *OutFunction = Function;
13521
13522 if (Function != nullptr) {
13523 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13524 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13525 }
13526
13527 std::string ErrorStr;
13528 raw_string_ostream ErrorFormatter(ErrorStr);
13529 ErrorFormatter << "Undefined external symbol ";
13530 ErrorFormatter << '"' << Symbol << '"';
13531 report_fatal_error(Twine(ErrorStr));
13532}
13533
13534//===----------------------------------------------------------------------===//
13535// SDNode Class
13536//===----------------------------------------------------------------------===//
13537
13540 return Const != nullptr && Const->isZero();
13541}
13542
13544 return V.isUndef() || isNullConstant(V);
13545}
13546
13549 return Const != nullptr && Const->isZero() && !Const->isNegative();
13550}
13551
13554 return Const != nullptr && Const->isAllOnes();
13555}
13556
13559 return Const != nullptr && Const->isOne();
13560}
13561
13564 return Const != nullptr && Const->isMinSignedValue();
13565}
13566
13568 SDValue V, unsigned OperandNo,
13569 unsigned Depth) const {
13570 APInt DemandedElts = getDemandAllEltsMask(V);
13571 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13572}
13573
13575 SDValue V, const APInt &DemandedElts,
13576 unsigned OperandNo, unsigned Depth) const {
13577 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13578 // TODO: Target-specific opcodes could be added.
13579 if (auto *ConstV = isConstOrConstSplat(V, DemandedElts, /*AllowUndefs*/ false,
13580 /*AllowTruncation*/ true)) {
13581 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
13582 switch (Opcode) {
13583 case ISD::ADD:
13584 case ISD::OR:
13585 case ISD::XOR:
13586 case ISD::UMAX:
13587 return Const.isZero();
13588 case ISD::MUL:
13589 return Const.isOne();
13590 case ISD::AND:
13591 case ISD::UMIN:
13592 return Const.isAllOnes();
13593 case ISD::SMAX:
13594 return Const.isMinSignedValue();
13595 case ISD::SMIN:
13596 return Const.isMaxSignedValue();
13597 case ISD::SUB:
13598 case ISD::SHL:
13599 case ISD::SRA:
13600 case ISD::SRL:
13601 return OperandNo == 1 && Const.isZero();
13602 case ISD::UDIV:
13603 case ISD::SDIV:
13604 return OperandNo == 1 && Const.isOne();
13605 }
13606 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13607 switch (Opcode) {
13608 case ISD::FADD:
13609 return ConstFP->isZero() &&
13610 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13611 case ISD::FSUB:
13612 return OperandNo == 1 && ConstFP->isZero() &&
13613 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13614 case ISD::FMUL:
13615 return ConstFP->isExactlyValue(1.0);
13616 case ISD::FDIV:
13617 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
13618 case ISD::FMINNUM:
13619 case ISD::FMAXNUM: {
13620 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13621 EVT VT = V.getValueType();
13622 const fltSemantics &Semantics = VT.getFltSemantics();
13623 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13624 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13625 : APFloat::getLargest(Semantics);
13626 if (Opcode == ISD::FMAXNUM)
13627 NeutralAF.changeSign();
13628
13629 return ConstFP->isExactlyValue(NeutralAF);
13630 }
13631 }
13632 }
13633 return false;
13634}
13635
13637 while (V.getOpcode() == ISD::BITCAST)
13638 V = V.getOperand(0);
13639 return V;
13640}
13641
13643 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13644 V = V.getOperand(0);
13645 return V;
13646}
13647
13649 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13650 V = V.getOperand(0);
13651 return V;
13652}
13653
13655 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13656 SDValue InVec = V.getOperand(0);
13657 SDValue EltNo = V.getOperand(2);
13658 EVT VT = InVec.getValueType();
13659 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13660 if (IndexC && VT.isFixedLengthVector() &&
13661 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13662 !DemandedElts[IndexC->getZExtValue()]) {
13663 V = InVec;
13664 continue;
13665 }
13666 break;
13667 }
13668 return V;
13669}
13670
13672 while (V.getOpcode() == ISD::TRUNCATE)
13673 V = V.getOperand(0);
13674 return V;
13675}
13676
13677bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13678 if (V.getOpcode() != ISD::XOR)
13679 return false;
13680 V = peekThroughBitcasts(V.getOperand(1));
13681 unsigned NumBits = V.getScalarValueSizeInBits();
13682 ConstantSDNode *C =
13683 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13684 return C && (C->getAPIntValue().countr_one() >= NumBits);
13685}
13686
13688 bool AllowTruncation) {
13689 APInt DemandedElts = getDemandAllEltsMask(N);
13690 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13691}
13692
13694 bool AllowUndefs,
13695 bool AllowTruncation) {
13697 return CN;
13698
13699 // SplatVectors can truncate their operands. Ignore that case here unless
13700 // AllowTruncation is set.
13701 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13702 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13703 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13704 EVT CVT = CN->getValueType(0);
13705 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13706 if (AllowTruncation || CVT == VecEltVT)
13707 return CN;
13708 }
13709 }
13710
13712 BitVector UndefElements;
13713 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13714
13715 // BuildVectors can truncate their operands. Ignore that case here unless
13716 // AllowTruncation is set.
13717 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13718 if (CN && (UndefElements.none() || AllowUndefs)) {
13719 EVT CVT = CN->getValueType(0);
13720 EVT NSVT = N.getValueType().getScalarType();
13721 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13722 if (AllowTruncation || (CVT == NSVT))
13723 return CN;
13724 }
13725 }
13726
13727 return nullptr;
13728}
13729
13731 APInt DemandedElts = getDemandAllEltsMask(N);
13732 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13733}
13734
13736 const APInt &DemandedElts,
13737 bool AllowUndefs) {
13739 return CN;
13740
13742 BitVector UndefElements;
13743 ConstantFPSDNode *CN =
13744 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13745 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13746 if (CN && (UndefElements.none() || AllowUndefs))
13747 return CN;
13748 }
13749
13750 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13751 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13752 return CN;
13753
13754 return nullptr;
13755}
13756
13757bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13758 // TODO: may want to use peekThroughBitcast() here.
13759 ConstantSDNode *C =
13760 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13761 return C && C->isZero();
13762}
13763
13764bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13765 ConstantSDNode *C =
13766 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13767 return C && C->isOne();
13768}
13769
13770bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13771 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13772 return C && C->isExactlyValue(1.0);
13773}
13774
13775bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13777 unsigned BitWidth = N.getScalarValueSizeInBits();
13778 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13779 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
13780}
13781
13782bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13783 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13784 return C && APInt::isSameValue(C->getAPIntValue(),
13785 APInt(C->getAPIntValue().getBitWidth(), 1));
13786}
13787
13788bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13790 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13791 return C && C->isZero();
13792}
13793
13794bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13795 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13796 return C && C->isZero();
13797}
13798
13802
13804 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13806 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13807 bool IsVolatile = false;
13808 bool IsNonTemporal = false;
13809 bool IsDereferenceable = true;
13810 bool IsInvariant = true;
13811 for (const MachineMemOperand *MMO : memoperands()) {
13812 IsVolatile |= MMO->isVolatile();
13813 IsNonTemporal |= MMO->isNonTemporal();
13814 IsDereferenceable &= MMO->isDereferenceable();
13815 IsInvariant &= MMO->isInvariant();
13816 }
13817 MemSDNodeBits.IsVolatile = IsVolatile;
13818 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13819 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13820 MemSDNodeBits.IsInvariant = IsInvariant;
13821
13822 // For the single-MMO case, we check here that the size of the memory operand
13823 // fits within the size of the MMO. This is because the MMO might indicate
13824 // only a possible address range instead of specifying the affected memory
13825 // addresses precisely.
13828 getMemOperand()->getSize().getValue())) &&
13829 "Size mismatch!");
13830}
13831
13832/// Profile - Gather unique data for the node.
13833///
13835 AddNodeIDNode(ID, this);
13836}
13837
13838namespace {
13839
13840 struct EVTArray {
13841 std::vector<EVT> VTs;
13842
13843 EVTArray() {
13844 VTs.reserve(MVT::VALUETYPE_SIZE);
13845 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13846 VTs.push_back(MVT((MVT::SimpleValueType)i));
13847 }
13848 };
13849
13850} // end anonymous namespace
13851
13852/// getValueTypeList - Return a pointer to the specified value type.
13853///
13854const EVT *SDNode::getValueTypeList(MVT VT) {
13855 static EVTArray SimpleVTArray;
13856
13857 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13858 return &SimpleVTArray.VTs[VT.SimpleTy];
13859}
13860
13861/// hasAnyUseOfValue - Return true if there are any use of the indicated
13862/// value. This method ignores uses of other values defined by this operation.
13863bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13864 assert(Value < getNumValues() && "Bad value!");
13865
13866 for (SDUse &U : uses())
13867 if (U.getResNo() == Value)
13868 return true;
13869
13870 return false;
13871}
13872
13873/// isOnlyUserOf - Return true if this node is the only use of N.
13874bool SDNode::isOnlyUserOf(const SDNode *N) const {
13875 bool Seen = false;
13876 for (const SDNode *User : N->users()) {
13877 if (User == this)
13878 Seen = true;
13879 else
13880 return false;
13881 }
13882
13883 return Seen;
13884}
13885
13886/// Return true if the only users of N are contained in Nodes.
13888 bool Seen = false;
13889 for (const SDNode *User : N->users()) {
13890 if (llvm::is_contained(Nodes, User))
13891 Seen = true;
13892 else
13893 return false;
13894 }
13895
13896 return Seen;
13897}
13898
13899/// Return true if the referenced return value is an operand of N.
13900bool SDValue::isOperandOf(const SDNode *N) const {
13901 return is_contained(N->op_values(), *this);
13902}
13903
13904bool SDNode::isOperandOf(const SDNode *N) const {
13905 return any_of(N->op_values(),
13906 [this](SDValue Op) { return this == Op.getNode(); });
13907}
13908
13909/// reachesChainWithoutSideEffects - Return true if this operand (which must
13910/// be a chain) reaches the specified operand without crossing any
13911/// side-effecting instructions on any chain path. In practice, this looks
13912/// through token factors and non-volatile loads. In order to remain efficient,
13913/// this only looks a couple of nodes in, it does not do an exhaustive search.
13914///
13915/// Note that we only need to examine chains when we're searching for
13916/// side-effects; SelectionDAG requires that all side-effects are represented
13917/// by chains, even if another operand would force a specific ordering. This
13918/// constraint is necessary to allow transformations like splitting loads.
13920 unsigned Depth) const {
13921 if (*this == Dest) return true;
13922
13923 // Don't search too deeply, we just want to be able to see through
13924 // TokenFactor's etc.
13925 if (Depth == 0) return false;
13926
13927 // If this is a token factor, all inputs to the TF happen in parallel.
13928 if (getOpcode() == ISD::TokenFactor) {
13929 // First, try a shallow search.
13930 if (is_contained((*this)->ops(), Dest)) {
13931 // We found the chain we want as an operand of this TokenFactor.
13932 // Essentially, we reach the chain without side-effects if we could
13933 // serialize the TokenFactor into a simple chain of operations with
13934 // Dest as the last operation. This is automatically true if the
13935 // chain has one use: there are no other ordering constraints.
13936 // If the chain has more than one use, we give up: some other
13937 // use of Dest might force a side-effect between Dest and the current
13938 // node.
13939 if (Dest.hasOneUse())
13940 return true;
13941 }
13942 // Next, try a deep search: check whether every operand of the TokenFactor
13943 // reaches Dest.
13944 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
13945 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
13946 });
13947 }
13948
13949 // Loads don't have side effects, look through them.
13950 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
13951 if (Ld->isUnordered())
13952 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
13953 }
13954 return false;
13955}
13956
13957bool SDNode::hasPredecessor(const SDNode *N) const {
13960 Worklist.push_back(this);
13961 return hasPredecessorHelper(N, Visited, Worklist);
13962}
13963
13965 this->Flags &= Flags;
13966}
13967
13968SDValue
13970 ArrayRef<ISD::NodeType> CandidateBinOps,
13971 bool AllowPartials) {
13972 // The pattern must end in an extract from index 0.
13973 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
13974 !isNullConstant(Extract->getOperand(1)))
13975 return SDValue();
13976
13977 // Match against one of the candidate binary ops.
13978 SDValue Op = Extract->getOperand(0);
13979 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
13980 return Op.getOpcode() == unsigned(BinOp);
13981 }))
13982 return SDValue();
13983
13984 // Floating-point reductions may require relaxed constraints on the final step
13985 // of the reduction because they may reorder intermediate operations.
13986 unsigned CandidateBinOp = Op.getOpcode();
13987 if (Op.getValueType().isFloatingPoint()) {
13988 SDNodeFlags Flags = Op->getFlags();
13989 switch (CandidateBinOp) {
13990 case ISD::FADD:
13991 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
13992 return SDValue();
13993 break;
13994 default:
13995 llvm_unreachable("Unhandled FP opcode for binop reduction");
13996 }
13997 }
13998
13999 // Matching failed - attempt to see if we did enough stages that a partial
14000 // reduction from a subvector is possible.
14001 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14002 if (!AllowPartials || !Op)
14003 return SDValue();
14004 EVT OpVT = Op.getValueType();
14005 EVT OpSVT = OpVT.getScalarType();
14006 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14007 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
14008 return SDValue();
14009 BinOp = (ISD::NodeType)CandidateBinOp;
14010 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14011 };
14012
14013 // At each stage, we're looking for something that looks like:
14014 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14015 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14016 // i32 undef, i32 undef, i32 undef, i32 undef>
14017 // %a = binop <8 x i32> %op, %s
14018 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14019 // we expect something like:
14020 // <4,5,6,7,u,u,u,u>
14021 // <2,3,u,u,u,u,u,u>
14022 // <1,u,u,u,u,u,u,u>
14023 // While a partial reduction match would be:
14024 // <2,3,u,u,u,u,u,u>
14025 // <1,u,u,u,u,u,u,u>
14026 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14027 SDValue PrevOp;
14028 for (unsigned i = 0; i < Stages; ++i) {
14029 unsigned MaskEnd = (1 << i);
14030
14031 if (Op.getOpcode() != CandidateBinOp)
14032 return PartialReduction(PrevOp, MaskEnd);
14033
14034 SDValue Op0 = Op.getOperand(0);
14035 SDValue Op1 = Op.getOperand(1);
14036
14038 if (Shuffle) {
14039 Op = Op1;
14040 } else {
14041 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14042 Op = Op0;
14043 }
14044
14045 // The first operand of the shuffle should be the same as the other operand
14046 // of the binop.
14047 if (!Shuffle || Shuffle->getOperand(0) != Op)
14048 return PartialReduction(PrevOp, MaskEnd);
14049
14050 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14051 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14052 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14053 return PartialReduction(PrevOp, MaskEnd);
14054
14055 PrevOp = Op;
14056 }
14057
14058 // Handle subvector reductions, which tend to appear after the shuffle
14059 // reduction stages.
14060 while (Op.getOpcode() == CandidateBinOp) {
14061 unsigned NumElts = Op.getValueType().getVectorNumElements();
14062 SDValue Op0 = Op.getOperand(0);
14063 SDValue Op1 = Op.getOperand(1);
14064 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14066 Op0.getOperand(0) != Op1.getOperand(0))
14067 break;
14068 SDValue Src = Op0.getOperand(0);
14069 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14070 if (NumSrcElts != (2 * NumElts))
14071 break;
14072 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14073 Op1.getConstantOperandAPInt(1) == NumElts) &&
14074 !(Op1.getConstantOperandAPInt(1) == 0 &&
14075 Op0.getConstantOperandAPInt(1) == NumElts))
14076 break;
14077 Op = Src;
14078 }
14079
14080 BinOp = (ISD::NodeType)CandidateBinOp;
14081 return Op;
14082}
14083
14085 EVT VT = N->getValueType(0);
14086 EVT EltVT = VT.getVectorElementType();
14087 unsigned NE = VT.getVectorNumElements();
14088
14089 SDLoc dl(N);
14090
14091 // If ResNE is 0, fully unroll the vector op.
14092 if (ResNE == 0)
14093 ResNE = NE;
14094 else if (NE > ResNE)
14095 NE = ResNE;
14096
14097 if (N->getNumValues() == 2) {
14098 SmallVector<SDValue, 8> Scalars0, Scalars1;
14099 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14100 EVT VT1 = N->getValueType(1);
14101 EVT EltVT1 = VT1.getVectorElementType();
14102
14103 unsigned i;
14104 for (i = 0; i != NE; ++i) {
14105 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14106 SDValue Operand = N->getOperand(j);
14107 EVT OperandVT = Operand.getValueType();
14108
14109 // A vector operand; extract a single element.
14110 EVT OperandEltVT = OperandVT.getVectorElementType();
14111 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14112 }
14113
14114 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14115 Scalars0.push_back(EltOp);
14116 Scalars1.push_back(EltOp.getValue(1));
14117 }
14118
14119 for (; i < ResNE; ++i) {
14120 Scalars0.push_back(getUNDEF(EltVT));
14121 Scalars1.push_back(getUNDEF(EltVT1));
14122 }
14123
14124 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14125 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
14126 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
14127 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
14128 return getMergeValues({Vec0, Vec1}, dl);
14129 }
14130
14131 assert(N->getNumValues() == 1 &&
14132 "Can't unroll a vector with multiple results!");
14133
14135 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14136
14137 unsigned i;
14138 for (i= 0; i != NE; ++i) {
14139 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14140 SDValue Operand = N->getOperand(j);
14141 EVT OperandVT = Operand.getValueType();
14142 if (OperandVT.isVector()) {
14143 // A vector operand; extract a single element.
14144 EVT OperandEltVT = OperandVT.getVectorElementType();
14145 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14146 } else {
14147 // A scalar operand; just use it as is.
14148 Operands[j] = Operand;
14149 }
14150 }
14151
14152 switch (N->getOpcode()) {
14153 default: {
14154 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14155 N->getFlags()));
14156 break;
14157 }
14158 case ISD::VSELECT:
14159 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
14160 break;
14161 case ISD::SHL:
14162 case ISD::SRA:
14163 case ISD::SRL:
14164 case ISD::ROTL:
14165 case ISD::ROTR:
14166 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14167 getShiftAmountOperand(Operands[0].getValueType(),
14168 Operands[1])));
14169 break;
14171 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14172 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14173 Operands[0],
14174 getValueType(ExtVT)));
14175 break;
14176 }
14177 case ISD::ADDRSPACECAST: {
14178 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14179 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
14180 ASC->getSrcAddressSpace(),
14181 ASC->getDestAddressSpace()));
14182 break;
14183 }
14184 }
14185 }
14186
14187 for (; i < ResNE; ++i)
14188 Scalars.push_back(getUNDEF(EltVT));
14189
14190 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14191 return getBuildVector(VecVT, dl, Scalars);
14192}
14193
14194std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14195 SDNode *N, unsigned ResNE) {
14196 unsigned Opcode = N->getOpcode();
14197 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14198 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14199 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14200 "Expected an overflow opcode");
14201
14202 EVT ResVT = N->getValueType(0);
14203 EVT OvVT = N->getValueType(1);
14204 EVT ResEltVT = ResVT.getVectorElementType();
14205 EVT OvEltVT = OvVT.getVectorElementType();
14206 SDLoc dl(N);
14207
14208 // If ResNE is 0, fully unroll the vector op.
14209 unsigned NE = ResVT.getVectorNumElements();
14210 if (ResNE == 0)
14211 ResNE = NE;
14212 else if (NE > ResNE)
14213 NE = ResNE;
14214
14215 SmallVector<SDValue, 8> LHSScalars;
14216 SmallVector<SDValue, 8> RHSScalars;
14217 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14218 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14219
14220 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14221 SDVTList VTs = getVTList(ResEltVT, SVT);
14222 SmallVector<SDValue, 8> ResScalars;
14223 SmallVector<SDValue, 8> OvScalars;
14224 for (unsigned i = 0; i < NE; ++i) {
14225 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14226 SDValue Ov =
14227 getSelect(dl, OvEltVT, Res.getValue(1),
14228 getBoolConstant(true, dl, OvEltVT, ResVT),
14229 getConstant(0, dl, OvEltVT));
14230
14231 ResScalars.push_back(Res);
14232 OvScalars.push_back(Ov);
14233 }
14234
14235 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14236 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14237
14238 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14239 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14240 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14241 getBuildVector(NewOvVT, dl, OvScalars));
14242}
14243
14246 unsigned Bytes,
14247 int Dist) const {
14248 if (LD->isVolatile() || Base->isVolatile())
14249 return false;
14250 // TODO: probably too restrictive for atomics, revisit
14251 if (!LD->isSimple())
14252 return false;
14253 if (LD->isIndexed() || Base->isIndexed())
14254 return false;
14255 if (LD->getChain() != Base->getChain())
14256 return false;
14257 EVT VT = LD->getMemoryVT();
14258 if (VT.getSizeInBits() / 8 != Bytes)
14259 return false;
14260
14261 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
14262 auto LocDecomp = BaseIndexOffset::match(LD, *this);
14263
14264 int64_t Offset = 0;
14265 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
14266 return (Dist * (int64_t)Bytes == Offset);
14267 return false;
14268}
14269
14270/// InferPtrAlignment - Infer alignment of a load / store address. Return
14271/// std::nullopt if it cannot be inferred.
14273 // If this is a GlobalAddress + cst, return the alignment.
14274 const GlobalValue *GV = nullptr;
14275 int64_t GVOffset = 0;
14276 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14277 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14278 KnownBits Known(PtrWidth);
14280 unsigned AlignBits = Known.countMinTrailingZeros();
14281 if (AlignBits)
14282 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14283 }
14284
14285 // If this is a direct reference to a stack slot, use information about the
14286 // stack slot's alignment.
14287 int FrameIdx = INT_MIN;
14288 int64_t FrameOffset = 0;
14290 FrameIdx = FI->getIndex();
14291 } else if (isBaseWithConstantOffset(Ptr) &&
14293 // Handle FI+Cst
14294 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14295 FrameOffset = Ptr.getConstantOperandVal(1);
14296 }
14297
14298 if (FrameIdx != INT_MIN) {
14300 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14301 }
14302
14303 return std::nullopt;
14304}
14305
14306/// Split the scalar node with EXTRACT_ELEMENT using the provided
14307/// VTs and return the low/high part.
14308std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14309 const SDLoc &DL,
14310 const EVT &LoVT,
14311 const EVT &HiVT) {
14312 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14313 "Split node must be a scalar type");
14314 SDValue Lo =
14316 SDValue Hi =
14318 return std::make_pair(Lo, Hi);
14319}
14320
14321/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14322/// which is split (or expanded) into two not necessarily identical pieces.
14323std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14324 // Currently all types are split in half.
14325 EVT LoVT, HiVT;
14326 if (!VT.isVector())
14327 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14328 else
14329 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14330
14331 return std::make_pair(LoVT, HiVT);
14332}
14333
14334/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14335/// type, dependent on an enveloping VT that has been split into two identical
14336/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14337std::pair<EVT, EVT>
14339 bool *HiIsEmpty) const {
14340 EVT EltTp = VT.getVectorElementType();
14341 // Examples:
14342 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14343 // custom VL=9 with enveloping VL=8/8 yields 8/1
14344 // custom VL=10 with enveloping VL=8/8 yields 8/2
14345 // etc.
14346 ElementCount VTNumElts = VT.getVectorElementCount();
14347 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14348 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14349 "Mixing fixed width and scalable vectors when enveloping a type");
14350 EVT LoVT, HiVT;
14351 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14352 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14353 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14354 *HiIsEmpty = false;
14355 } else {
14356 // Flag that hi type has zero storage size, but return split envelop type
14357 // (this would be easier if vector types with zero elements were allowed).
14358 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14359 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14360 *HiIsEmpty = true;
14361 }
14362 return std::make_pair(LoVT, HiVT);
14363}
14364
14365/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14366/// low/high part.
14367std::pair<SDValue, SDValue>
14368SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14369 const EVT &HiVT) {
14370 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14371 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14372 "Splitting vector with an invalid mixture of fixed and scalable "
14373 "vector types");
14375 N.getValueType().getVectorMinNumElements() &&
14376 "More vector elements requested than available!");
14377 SDValue Lo, Hi;
14378 Lo = getExtractSubvector(DL, LoVT, N, 0);
14379 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14380 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14381 // IDX with the runtime scaling factor of the result vector type. For
14382 // fixed-width result vectors, that runtime scaling factor is 1.
14385 return std::make_pair(Lo, Hi);
14386}
14387
14388std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14389 const SDLoc &DL) {
14390 // Split the vector length parameter.
14391 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14392 EVT VT = N.getValueType();
14394 "Expecting the mask to be an evenly-sized vector");
14395 SDValue HalfNumElts = getElementCount(
14397 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14398 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14399 return std::make_pair(Lo, Hi);
14400}
14401
14402/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14404 EVT VT = N.getValueType();
14407 return getInsertSubvector(DL, getUNDEF(WideVT), N, 0);
14408}
14409
14412 unsigned Start, unsigned Count,
14413 EVT EltVT) {
14414 EVT VT = Op.getValueType();
14415 if (Count == 0)
14417 if (EltVT == EVT())
14418 EltVT = VT.getVectorElementType();
14419 SDLoc SL(Op);
14420 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14421 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14422 }
14423}
14424
14425// getAddressSpace - Return the address space this GlobalAddress belongs to.
14427 return getGlobal()->getType()->getAddressSpace();
14428}
14429
14432 return Val.MachineCPVal->getType();
14433 return Val.ConstVal->getType();
14434}
14435
14436bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14437 unsigned &SplatBitSize,
14438 bool &HasAnyUndefs,
14439 unsigned MinSplatBits,
14440 bool IsBigEndian) const {
14441 EVT VT = getValueType(0);
14442 assert(VT.isVector() && "Expected a vector type");
14443 unsigned VecWidth = VT.getSizeInBits();
14444 if (MinSplatBits > VecWidth)
14445 return false;
14446
14447 // FIXME: The widths are based on this node's type, but build vectors can
14448 // truncate their operands.
14449 SplatValue = APInt(VecWidth, 0);
14450 SplatUndef = APInt(VecWidth, 0);
14451
14452 // Get the bits. Bits with undefined values (when the corresponding element
14453 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14454 // in SplatValue. If any of the values are not constant, give up and return
14455 // false.
14456 unsigned int NumOps = getNumOperands();
14457 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14458 unsigned EltWidth = VT.getScalarSizeInBits();
14459
14460 for (unsigned j = 0; j < NumOps; ++j) {
14461 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14462 SDValue OpVal = getOperand(i);
14463 unsigned BitPos = j * EltWidth;
14464
14465 if (OpVal.isUndef())
14466 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14467 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14468 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14469 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14470 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14471 else
14472 return false;
14473 }
14474
14475 // The build_vector is all constants or undefs. Find the smallest element
14476 // size that splats the vector.
14477 HasAnyUndefs = (SplatUndef != 0);
14478
14479 // FIXME: This does not work for vectors with elements less than 8 bits.
14480 while (VecWidth > 8) {
14481 // If we can't split in half, stop here.
14482 if (VecWidth & 1)
14483 break;
14484
14485 unsigned HalfSize = VecWidth / 2;
14486 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14487 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14488 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14489 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14490
14491 // If the two halves do not match (ignoring undef bits), stop here.
14492 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14493 MinSplatBits > HalfSize)
14494 break;
14495
14496 SplatValue = HighValue | LowValue;
14497 SplatUndef = HighUndef & LowUndef;
14498
14499 VecWidth = HalfSize;
14500 }
14501
14502 // FIXME: The loop above only tries to split in halves. But if the input
14503 // vector for example is <3 x i16> it wouldn't be able to detect a
14504 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14505 // optimizations. I guess that back in the days when this helper was created
14506 // vectors normally was power-of-2 sized.
14507
14508 SplatBitSize = VecWidth;
14509 return true;
14510}
14511
14513 BitVector *UndefElements) const {
14514 unsigned NumOps = getNumOperands();
14515 if (UndefElements) {
14516 UndefElements->clear();
14517 UndefElements->resize(NumOps);
14518 }
14519 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14520 if (!DemandedElts)
14521 return SDValue();
14522 SDValue Splatted;
14523 for (unsigned i = 0; i != NumOps; ++i) {
14524 if (!DemandedElts[i])
14525 continue;
14526 SDValue Op = getOperand(i);
14527 if (Op.isUndef()) {
14528 if (UndefElements)
14529 (*UndefElements)[i] = true;
14530 } else if (!Splatted) {
14531 Splatted = Op;
14532 } else if (Splatted != Op) {
14533 return SDValue();
14534 }
14535 }
14536
14537 if (!Splatted) {
14538 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14539 assert(getOperand(FirstDemandedIdx).isUndef() &&
14540 "Can only have a splat without a constant for all undefs.");
14541 return getOperand(FirstDemandedIdx);
14542 }
14543
14544 return Splatted;
14545}
14546
14548 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14549 return getSplatValue(DemandedElts, UndefElements);
14550}
14551
14553 SmallVectorImpl<SDValue> &Sequence,
14554 BitVector *UndefElements) const {
14555 unsigned NumOps = getNumOperands();
14556 Sequence.clear();
14557 if (UndefElements) {
14558 UndefElements->clear();
14559 UndefElements->resize(NumOps);
14560 }
14561 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14562 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14563 return false;
14564
14565 // Set the undefs even if we don't find a sequence (like getSplatValue).
14566 if (UndefElements)
14567 for (unsigned I = 0; I != NumOps; ++I)
14568 if (DemandedElts[I] && getOperand(I).isUndef())
14569 (*UndefElements)[I] = true;
14570
14571 // Iteratively widen the sequence length looking for repetitions.
14572 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14573 Sequence.append(SeqLen, SDValue());
14574 for (unsigned I = 0; I != NumOps; ++I) {
14575 if (!DemandedElts[I])
14576 continue;
14577 SDValue &SeqOp = Sequence[I % SeqLen];
14579 if (Op.isUndef()) {
14580 if (!SeqOp)
14581 SeqOp = Op;
14582 continue;
14583 }
14584 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14585 Sequence.clear();
14586 break;
14587 }
14588 SeqOp = Op;
14589 }
14590 if (!Sequence.empty())
14591 return true;
14592 }
14593
14594 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14595 return false;
14596}
14597
14599 BitVector *UndefElements) const {
14600 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14601 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14602}
14603
14606 BitVector *UndefElements) const {
14608 getSplatValue(DemandedElts, UndefElements));
14609}
14610
14613 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14614}
14615
14618 BitVector *UndefElements) const {
14620 getSplatValue(DemandedElts, UndefElements));
14621}
14622
14627
14628int32_t
14630 uint32_t BitWidth) const {
14631 if (ConstantFPSDNode *CN =
14633 bool IsExact;
14634 APSInt IntVal(BitWidth);
14635 const APFloat &APF = CN->getValueAPF();
14636 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14637 APFloat::opOK ||
14638 !IsExact)
14639 return -1;
14640
14641 return IntVal.exactLogBase2();
14642 }
14643 return -1;
14644}
14645
14647 bool IsLittleEndian, unsigned DstEltSizeInBits,
14648 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14649 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14650 if (!isConstant())
14651 return false;
14652
14653 unsigned NumSrcOps = getNumOperands();
14654 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14655 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14656 "Invalid bitcast scale");
14657
14658 // Extract raw src bits.
14659 SmallVector<APInt> SrcBitElements(NumSrcOps,
14660 APInt::getZero(SrcEltSizeInBits));
14661 BitVector SrcUndeElements(NumSrcOps, false);
14662
14663 for (unsigned I = 0; I != NumSrcOps; ++I) {
14665 if (Op.isUndef()) {
14666 SrcUndeElements.set(I);
14667 continue;
14668 }
14669 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14670 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14671 assert((CInt || CFP) && "Unknown constant");
14672 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14673 : CFP->getValueAPF().bitcastToAPInt();
14674 }
14675
14676 // Recast to dst width.
14677 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14678 SrcBitElements, UndefElements, SrcUndeElements);
14679 return true;
14680}
14681
14682void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14683 unsigned DstEltSizeInBits,
14684 SmallVectorImpl<APInt> &DstBitElements,
14685 ArrayRef<APInt> SrcBitElements,
14686 BitVector &DstUndefElements,
14687 const BitVector &SrcUndefElements) {
14688 unsigned NumSrcOps = SrcBitElements.size();
14689 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14690 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14691 "Invalid bitcast scale");
14692 assert(NumSrcOps == SrcUndefElements.size() &&
14693 "Vector size mismatch");
14694
14695 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14696 DstUndefElements.clear();
14697 DstUndefElements.resize(NumDstOps, false);
14698 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14699
14700 // Concatenate src elements constant bits together into dst element.
14701 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14702 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14703 for (unsigned I = 0; I != NumDstOps; ++I) {
14704 DstUndefElements.set(I);
14705 APInt &DstBits = DstBitElements[I];
14706 for (unsigned J = 0; J != Scale; ++J) {
14707 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14708 if (SrcUndefElements[Idx])
14709 continue;
14710 DstUndefElements.reset(I);
14711 const APInt &SrcBits = SrcBitElements[Idx];
14712 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14713 "Illegal constant bitwidths");
14714 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14715 }
14716 }
14717 return;
14718 }
14719
14720 // Split src element constant bits into dst elements.
14721 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14722 for (unsigned I = 0; I != NumSrcOps; ++I) {
14723 if (SrcUndefElements[I]) {
14724 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14725 continue;
14726 }
14727 const APInt &SrcBits = SrcBitElements[I];
14728 for (unsigned J = 0; J != Scale; ++J) {
14729 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14730 APInt &DstBits = DstBitElements[Idx];
14731 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14732 }
14733 }
14734}
14735
14737 for (const SDValue &Op : op_values()) {
14738 unsigned Opc = Op.getOpcode();
14739 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14740 return false;
14741 }
14742 return true;
14743}
14744
14745std::optional<std::pair<APInt, APInt>>
14747 unsigned NumOps = getNumOperands();
14748 if (NumOps < 2)
14749 return std::nullopt;
14750
14751 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14752 APInt Start, Stride;
14753 int FirstIdx = -1, SecondIdx = -1;
14754
14755 // Find the first two non-undef constant elements to determine Start and
14756 // Stride, then verify all remaining elements match the sequence.
14757 for (unsigned I = 0; I < NumOps; ++I) {
14759 if (Op->isUndef())
14760 continue;
14761 if (!isa<ConstantSDNode>(Op))
14762 return std::nullopt;
14763
14764 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14765 if (FirstIdx < 0) {
14766 FirstIdx = I;
14767 Start = Val;
14768 } else if (SecondIdx < 0) {
14769 SecondIdx = I;
14770 // Compute stride using modular arithmetic. Simple division would handle
14771 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14772 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14773 // Note that modular arithmetic is agnostic to signed/unsigned.
14774 unsigned IdxDiff = I - FirstIdx;
14775 APInt ValDiff = Val - Start;
14776
14777 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14778 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14779 if (ValDiff.countr_zero() < CommonPow2Bits)
14780 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14781 IdxDiff >>= CommonPow2Bits;
14782 ValDiff.lshrInPlace(CommonPow2Bits);
14783
14784 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14785 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14786 // one, but we could try all candidates to handle more cases.
14787 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14788 if (Stride.isZero())
14789 return std::nullopt;
14790
14791 // Step 3: Adjust Start based on the first defined element's index.
14792 Start -= Stride * FirstIdx;
14793 } else {
14794 // Verify this element matches the sequence.
14795 if (Val != Start + Stride * I)
14796 return std::nullopt;
14797 }
14798 }
14799
14800 // Need at least two defined elements.
14801 if (SecondIdx < 0)
14802 return std::nullopt;
14803
14804 return std::make_pair(Start, Stride);
14805}
14806
14808 // Find the first non-undef value in the shuffle mask.
14809 unsigned i, e;
14810 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14811 /* search */;
14812
14813 // If all elements are undefined, this shuffle can be considered a splat
14814 // (although it should eventually get simplified away completely).
14815 if (i == e)
14816 return true;
14817
14818 // Make sure all remaining elements are either undef or the same as the first
14819 // non-undef value.
14820 for (int Idx = Mask[i]; i != e; ++i)
14821 if (Mask[i] >= 0 && Mask[i] != Idx)
14822 return false;
14823 return true;
14824}
14825
14826// Returns true if it is a constant integer BuildVector or constant integer,
14827// possibly hidden by a bitcast.
14829 SDValue N, bool AllowOpaques) const {
14831
14832 if (auto *C = dyn_cast<ConstantSDNode>(N))
14833 return AllowOpaques || !C->isOpaque();
14834
14836 return true;
14837
14838 // Treat a GlobalAddress supporting constant offset folding as a
14839 // constant integer.
14840 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14841 if (GA->getOpcode() == ISD::GlobalAddress &&
14842 TLI->isOffsetFoldingLegal(GA))
14843 return true;
14844
14845 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14846 isa<ConstantSDNode>(N.getOperand(0)))
14847 return true;
14848 return false;
14849}
14850
14851// Returns true if it is a constant float BuildVector or constant float.
14854 return true;
14855
14857 return true;
14858
14859 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14860 isa<ConstantFPSDNode>(N.getOperand(0)))
14861 return true;
14862
14863 return false;
14864}
14865
14866std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
14867 ConstantSDNode *Const =
14868 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
14869 if (!Const)
14870 return std::nullopt;
14871
14872 EVT VT = N->getValueType(0);
14873 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
14874 switch (TLI->getBooleanContents(N.getValueType())) {
14876 if (CVal.isOne())
14877 return true;
14878 if (CVal.isZero())
14879 return false;
14880 return std::nullopt;
14882 if (CVal.isAllOnes())
14883 return true;
14884 if (CVal.isZero())
14885 return false;
14886 return std::nullopt;
14888 return CVal[0];
14889 }
14890 llvm_unreachable("Unknown BooleanContent enum");
14891}
14892
14893void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
14894 assert(!Node->OperandList && "Node already has operands");
14896 "too many operands to fit into SDNode");
14897 SDUse *Ops = OperandRecycler.allocate(
14898 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
14899
14900 bool IsDivergent = false;
14901 for (unsigned I = 0; I != Vals.size(); ++I) {
14902 Ops[I].setUser(Node);
14903 Ops[I].setInitial(Vals[I]);
14904 EVT VT = Ops[I].getValueType();
14905
14906 // Skip Chain. It does not carry divergence.
14907 if (VT != MVT::Other &&
14908 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
14909 Ops[I].getNode()->isDivergent()) {
14910 IsDivergent = true;
14911 }
14912 }
14913 Node->NumOperands = Vals.size();
14914 Node->OperandList = Ops;
14915 if (!TLI->isSDNodeAlwaysUniform(Node)) {
14916 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
14917 Node->SDNodeBits.IsDivergent = IsDivergent;
14918 }
14919 checkForCycles(Node);
14920}
14921
14924 size_t Limit = SDNode::getMaxNumOperands();
14925 while (Vals.size() > Limit) {
14926 unsigned SliceIdx = Vals.size() - Limit;
14927 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
14928 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
14929 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
14930 Vals.emplace_back(NewTF);
14931 }
14932 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
14933}
14934
14936 EVT VT, SDNodeFlags Flags) {
14937 switch (Opcode) {
14938 default:
14939 return SDValue();
14940 case ISD::ADD:
14941 case ISD::OR:
14942 case ISD::XOR:
14943 case ISD::UMAX:
14944 return getConstant(0, DL, VT);
14945 case ISD::MUL:
14946 return getConstant(1, DL, VT);
14947 case ISD::AND:
14948 case ISD::UMIN:
14949 return getAllOnesConstant(DL, VT);
14950 case ISD::SMAX:
14952 case ISD::SMIN:
14954 case ISD::FADD:
14955 // If flags allow, prefer positive zero since it's generally cheaper
14956 // to materialize on most targets.
14957 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
14958 case ISD::FMUL:
14959 return getConstantFP(1.0, DL, VT);
14960 case ISD::FMINNUM:
14961 case ISD::FMAXNUM: {
14962 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
14963 const fltSemantics &Semantics = VT.getFltSemantics();
14964 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
14965 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
14966 APFloat::getLargest(Semantics);
14967 if (Opcode == ISD::FMAXNUM)
14968 NeutralAF.changeSign();
14969
14970 return getConstantFP(NeutralAF, DL, VT);
14971 }
14972 case ISD::FMINIMUM:
14973 case ISD::FMAXIMUM: {
14974 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
14975 const fltSemantics &Semantics = VT.getFltSemantics();
14976 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
14977 : APFloat::getLargest(Semantics);
14978 if (Opcode == ISD::FMAXIMUM)
14979 NeutralAF.changeSign();
14980
14981 return getConstantFP(NeutralAF, DL, VT);
14982 }
14983
14984 }
14985}
14986
14988 SDValue Acc, SDValue LHS,
14989 SDValue RHS) {
14990 EVT AccVT = Acc.getValueType();
14991 if (AccVT.isFloatingPoint()) {
14992 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
14993 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
14994 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
14995 }
14997 "Unexpected opcode");
14998 SDValue NegAcc = getNegative(Acc, DL, AccVT);
14999 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15000 return getNegative(MLA, DL, AccVT);
15001}
15002
15003/// Helper used to make a call to a library function that has one argument of
15004/// pointer type.
15005///
15006/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15007/// used to get or set floating-point state. They have one argument of pointer
15008/// type, which points to the memory region containing bits of the
15009/// floating-point state. The value returned by such function is ignored in the
15010/// created call.
15011///
15012/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15013/// \param Ptr Pointer used to save/load state.
15014/// \param InChain Ingoing token chain.
15015/// \returns Outgoing chain token.
15017 SDValue InChain,
15018 const SDLoc &DLoc) {
15019 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15021 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15022 RTLIB::LibcallImpl LibcallImpl =
15023 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15024 if (LibcallImpl == RTLIB::Unsupported)
15025 reportFatalUsageError("emitting call to unsupported libcall");
15026
15027 SDValue Callee =
15028 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15030 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15031 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15032 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15033 return TLI->LowerCallTo(CLI).second;
15034}
15035
15037 assert(From && To && "Invalid SDNode; empty source SDValue?");
15038 auto I = SDEI.find(From);
15039 if (I == SDEI.end())
15040 return;
15041
15042 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15043 // the iterator, hence the need to make a copy to prevent a use-after-free.
15044 NodeExtraInfo NEI = I->second;
15045 if (LLVM_LIKELY(!NEI.PCSections)) {
15046 // No deep copy required for the types of extra info set.
15047 //
15048 // FIXME: Investigate if other types of extra info also need deep copy. This
15049 // depends on the types of nodes they can be attached to: if some extra info
15050 // is only ever attached to nodes where a replacement To node is always the
15051 // node where later use and propagation of the extra info has the intended
15052 // semantics, no deep copy is required.
15053 SDEI[To] = std::move(NEI);
15054 return;
15055 }
15056
15057 const SDNode *EntrySDN = getEntryNode().getNode();
15058
15059 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15060 // through the replacement of From with To. Otherwise, replacements of a node
15061 // (From) with more complex nodes (To and its operands) may result in lost
15062 // extra info where the root node (To) is insignificant in further propagating
15063 // and using extra info when further lowering to MIR.
15064 //
15065 // In the first step pre-populate the visited set with the nodes reachable
15066 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15067 // DAG that is not new and should be left untouched.
15068 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15069 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15070 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15071 if (MaxDepth == 0) {
15072 // Remember this node in case we need to increase MaxDepth and continue
15073 // populating FromReach from this node.
15074 Leafs.emplace_back(N);
15075 return;
15076 }
15077 if (!FromReach.insert(N).second)
15078 return;
15079 for (const SDValue &Op : N->op_values())
15080 Self(Self, Op.getNode(), MaxDepth - 1);
15081 };
15082
15083 // Copy extra info to To and all its transitive operands (that are new).
15085 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15086 if (FromReach.contains(N))
15087 return true;
15088 if (!Visited.insert(N).second)
15089 return true;
15090 if (EntrySDN == N)
15091 return false;
15092 for (const SDValue &Op : N->op_values()) {
15093 if (N == To && Op.getNode() == EntrySDN) {
15094 // Special case: New node's operand is the entry node; just need to
15095 // copy extra info to new node.
15096 break;
15097 }
15098 if (!Self(Self, Op.getNode()))
15099 return false;
15100 }
15101 // Copy only if entry node was not reached.
15102 SDEI[N] = std::move(NEI);
15103 return true;
15104 };
15105
15106 // We first try with a lower MaxDepth, assuming that the path to common
15107 // operands between From and To is relatively short. This significantly
15108 // improves performance in the common case. The initial MaxDepth is big
15109 // enough to avoid retry in the common case; the last MaxDepth is large
15110 // enough to avoid having to use the fallback below (and protects from
15111 // potential stack exhaustion from recursion).
15112 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15113 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15114 // StartFrom is the previous (or initial) set of leafs reachable at the
15115 // previous maximum depth.
15117 std::swap(StartFrom, Leafs);
15118 for (const SDNode *N : StartFrom)
15119 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15120 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15121 return;
15122 // This should happen very rarely (reached the entry node).
15123 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15124 assert(!Leafs.empty());
15125 }
15126
15127 // This should not happen - but if it did, that means the subgraph reachable
15128 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15129 // could not visit all reachable common operands. Consequently, we were able
15130 // to reach the entry node.
15131 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15132 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15133 // Best-effort fallback if assertions disabled.
15134 SDEI[To] = std::move(NEI);
15135}
15136
15137#ifndef NDEBUG
15138static void checkForCyclesHelper(const SDNode *N,
15141 const llvm::SelectionDAG *DAG) {
15142 // If this node has already been checked, don't check it again.
15143 if (Checked.count(N))
15144 return;
15145
15146 // If a node has already been visited on this depth-first walk, reject it as
15147 // a cycle.
15148 if (!Visited.insert(N).second) {
15149 errs() << "Detected cycle in SelectionDAG\n";
15150 dbgs() << "Offending node:\n";
15151 N->dumprFull(DAG); dbgs() << "\n";
15152 abort();
15153 }
15154
15155 for (const SDValue &Op : N->op_values())
15156 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15157
15158 Checked.insert(N);
15159 Visited.erase(N);
15160}
15161#endif
15162
15164 const llvm::SelectionDAG *DAG,
15165 bool force) {
15166#ifndef NDEBUG
15167 bool check = force;
15168#ifdef EXPENSIVE_CHECKS
15169 check = true;
15170#endif // EXPENSIVE_CHECKS
15171 if (check) {
15172 assert(N && "Checking nonexistent SDNode");
15175 checkForCyclesHelper(N, visited, checked, DAG);
15176 }
15177#endif // !NDEBUG
15178}
15179
15180void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15181 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15182}
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:853
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition Compiler.h:592
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:335
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
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 shouldLowerMemFuncForSize(const MachineFunction &MF)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
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.
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
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:296
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:334
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static const fltSemantics & BFloat()
Definition APFloat.h:295
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
static const fltSemantics & IEEEdouble()
Definition APFloat.h:297
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:347
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:346
static const fltSemantics & IEEEhalf()
Definition APFloat.h:294
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1179
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1267
void copySign(const APFloat &RHS)
Definition APFloat.h:1361
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5899
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1249
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition APFloat.h:1521
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1240
bool isFinite() const
Definition APFloat.h:1543
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1406
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1258
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
Definition APFloat.h:1294
bool isZero() const
Definition APFloat.h:1534
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1197
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1391
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1157
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1285
bool isPosZero() const
Definition APFloat.h:1549
bool isNegZero() const
Definition APFloat.h:1550
void changeSign()
Definition APFloat.h:1356
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1168
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2023
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2107
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1616
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:1429
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
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1563
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1414
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1693
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1408
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition APInt.cpp:640
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:1535
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:1353
APInt abs() const
Get the absolute value.
Definition APInt.h:1818
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2078
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1709
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1511
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1687
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1419
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:1173
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1662
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1651
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1621
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:2138
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2152
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
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1458
unsigned logBase2() const
Definition APInt.h:1784
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2088
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1317
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1788
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1028
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1390
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:1264
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1440
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1411
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:1244
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2097
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:1071
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.
LLVM_ABI ConstantRange multiply(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
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 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:123
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
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:711
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
LLVM_ABI CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
LLVM_ABI RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
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.
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 SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue 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
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 Alignment, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
LLVM_ABI 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:645
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:290
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:313
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:286
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:311
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:201
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:236
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
LLVM_ABI void set(Value *Val)
Definition Value.h:883
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:202
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3253
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3183
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3170
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3160
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3234
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3175
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:3243
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2297
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3225
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:3061
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3258
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2302
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3155
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3165
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:819
@ 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:511
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:538
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:522
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:910
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:788
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:715
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:665
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:873
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:827
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:691
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:792
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:704
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:649
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:811
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:899
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:888
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ 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:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:505
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:710
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:681
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:787
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:921
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition ISDOpcodes.h:997
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:833
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:871
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:722
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:875
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool 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:381
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:557
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1758
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:1738
MaybeAlign getAlign(const CallInst &I, unsigned Index)
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1569
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2553
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:1740
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2207
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:1551
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:1652
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:1745
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:1695
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:1635
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1726
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:1752
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
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:1676
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1884
constexpr unsigned BitWidth
bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
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:1946
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:1713
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1753
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:876
#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:403
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:528
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:292
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:308
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:358
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:381
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:367
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:393
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:324
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:189
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:331
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:300
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:264
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:182
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:336
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:344
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:316
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:469
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
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition KnownBits.h:269
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
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:125
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
bool isUnknown() const
Returns true if we don't know any bits.
Definition KnownBits.h:64
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.
void makeNegative()
Make this value negative.
Definition KnownBits.h:120
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:97
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:553
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:557
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 avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:325
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
LLVM_ABI KnownBits truncSSat(unsigned BitWidth) const
Truncate with signed saturation (signed input -> signed output)
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
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
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:233
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.
LLVM_ABI KnownBits truncUSat(unsigned BitWidth) const
Truncate with unsigned saturation (unsigned input -> unsigned output)
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
LLVM_ABI KnownBits truncSSatU(unsigned BitWidth) const
Truncate with signed saturation to unsigned (signed input -> unsigned output)
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
void copysign(const KnownFPClass &Sign)
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
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
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)