LLVM 24.0.0git
SelectionDAG.cpp
Go to the documentation of this file.
1//===- SelectionDAG.cpp - Implement the SelectionDAG data structures ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the SelectionDAG class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseSet.h"
21#include "llvm/ADT/FoldingSet.h"
22#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/Twine.h"
51#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugLoc.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/GlobalValue.h"
59#include "llvm/IR/Metadata.h"
60#include "llvm/IR/Type.h"
64#include "llvm/Support/Debug.h"
74#include <algorithm>
75#include <cassert>
76#include <cstdint>
77#include <cstdlib>
78#include <limits>
79#include <optional>
80#include <string>
81#include <utility>
82#include <vector>
83
84using namespace llvm;
85using namespace llvm::SDPatternMatch;
86
87/// makeVTList - Return an instance of the SDVTList struct initialized with the
88/// specified members.
89static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
90 SDVTList Res = {VTs, NumVTs};
91 return Res;
92}
93
94// Default null implementations of the callbacks.
98
99void SelectionDAG::DAGNodeDeletedListener::anchor() {}
100void SelectionDAG::DAGNodeInsertedListener::anchor() {}
101
102#define DEBUG_TYPE "selectiondag"
103
104static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
105 cl::Hidden, cl::init(true),
106 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
107
108static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
109 cl::desc("Number limit for gluing ld/st of memcpy."),
110 cl::Hidden, cl::init(0));
111
113 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
114 cl::desc("DAG combiner limit number of steps when searching DAG "
115 "for predecessor nodes"));
116
118 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
119}
120
122
123//===----------------------------------------------------------------------===//
124// ConstantFPSDNode Class
125//===----------------------------------------------------------------------===//
126
127/// isExactlyValue - We don't rely on operator== working on double values, as
128/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
129/// As such, this method can be used to do an exact bit-for-bit comparison of
130/// two floating point values.
132 return getValueAPF().bitwiseIsEqual(V);
133}
134
136 const APFloat& Val) {
137 assert(VT.isFloatingPoint() && "Can only convert between FP types");
138
139 // convert modifies in place, so make a copy.
140 APFloat Val2 = APFloat(Val);
141 bool losesInfo;
143 &losesInfo);
144 return !losesInfo;
145}
146
147//===----------------------------------------------------------------------===//
148// ISD Namespace
149//===----------------------------------------------------------------------===//
150
151bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
152 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
153 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
154 unsigned EltSize =
155 N->getValueType(0).getVectorElementType().getSizeInBits();
156 SplatVal = OptAPInt->trunc(EltSize);
157 return true;
158 }
159 }
160
161 auto *BV = dyn_cast<BuildVectorSDNode>(N);
162 if (!BV)
163 return false;
164
165 APInt SplatUndef;
166 unsigned SplatBitSize;
167 bool HasUndefs;
168 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
169 // Endianness does not matter here. We are checking for a splat given the
170 // element size of the vector, and if we find such a splat for little endian
171 // layout, then that should be valid also for big endian (as the full vector
172 // size is known to be a multiple of the element size).
173 const bool IsBigEndian = false;
174 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
175 EltSize, IsBigEndian) &&
176 EltSize == SplatBitSize;
177}
178
179// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
180// specializations of the more general isConstantSplatVector()?
181
182bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
183 // Look through a bit convert.
184 while (N->getOpcode() == ISD::BITCAST)
185 N = N->getOperand(0).getNode();
186
187 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
188 APInt SplatVal;
189 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
190 }
191
192 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
193
194 unsigned i = 0, e = N->getNumOperands();
195
196 // Skip over all of the undef values.
197 while (i != e && N->getOperand(i).isUndef())
198 ++i;
199
200 // Do not accept an all-undef vector.
201 if (i == e) return false;
202
203 // Do not accept build_vectors that aren't all constants or which have non-~0
204 // elements. We have to be a bit careful here, as the type of the constant
205 // may not be the same as the type of the vector elements due to type
206 // legalization (the elements are promoted to a legal type for the target and
207 // a vector of a type may be legal when the base element type is not).
208 // We only want to check enough bits to cover the vector elements, because
209 // we care if the resultant vector is all ones, not whether the individual
210 // constants are.
211 SDValue NotZero = N->getOperand(i);
212 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
213 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
214 if (OptAPInt->countr_one() < EltSize)
215 return false;
216 } else
217 return false;
218
219 // Okay, we have at least one ~0 value, check to see if the rest match or are
220 // undefs. Even with the above element type twiddling, this should be OK, as
221 // the same type legalization should have applied to all the elements.
222 for (++i; i != e; ++i)
223 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
224 return false;
225 return true;
226}
227
228bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
229 // Look through a bit convert.
230 while (N->getOpcode() == ISD::BITCAST)
231 N = N->getOperand(0).getNode();
232
233 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
234 APInt SplatVal;
235 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
236 }
237
238 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
239
240 bool IsAllUndef = true;
241 for (const SDValue &Op : N->op_values()) {
242 if (Op.isUndef())
243 continue;
244 IsAllUndef = false;
245 // Do not accept build_vectors that aren't all constants or which have non-0
246 // elements. We have to be a bit careful here, as the type of the constant
247 // may not be the same as the type of the vector elements due to type
248 // legalization (the elements are promoted to a legal type for the target
249 // and a vector of a type may be legal when the base element type is not).
250 // We only want to check enough bits to cover the vector elements, because
251 // we care if the resultant vector is all zeros, not whether the individual
252 // constants are.
253 if (auto OptAPInt = Op->bitcastToAPInt()) {
254 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
255 if (OptAPInt->countr_zero() < EltSize)
256 return false;
257 } else
258 return false;
259 }
260
261 // Do not accept an all-undef vector.
262 if (IsAllUndef)
263 return false;
264 return true;
265}
266
268 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
269}
270
272 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
273}
274
276 if (N->getOpcode() != ISD::BUILD_VECTOR)
277 return false;
278
279 for (const SDValue &Op : N->op_values()) {
280 if (Op.isUndef())
281 continue;
283 return false;
284 }
285 return true;
286}
287
289 if (N->getOpcode() != ISD::BUILD_VECTOR)
290 return false;
291
292 for (const SDValue &Op : N->op_values()) {
293 if (Op.isUndef())
294 continue;
296 return false;
297 }
298 return true;
299}
300
301bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
302 bool Signed) {
303 assert(N->getValueType(0).isVector() && "Expected a vector!");
304
305 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
306 if (EltSize <= NewEltSize)
307 return false;
308
309 if (N->getOpcode() == ISD::ZERO_EXTEND) {
310 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
311 NewEltSize) &&
312 !Signed;
313 }
314 if (N->getOpcode() == ISD::SIGN_EXTEND) {
315 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
316 NewEltSize) &&
317 Signed;
318 }
319 if (N->getOpcode() != ISD::BUILD_VECTOR)
320 return false;
321
322 for (const SDValue &Op : N->op_values()) {
323 if (Op.isUndef())
324 continue;
326 return false;
327
328 APInt C = Op->getAsAPIntVal().trunc(EltSize);
329 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
330 return false;
331 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
332 return false;
333 }
334
335 return true;
336}
337
339 // Return false if the node has no operands.
340 // This is "logically inconsistent" with the definition of "all" but
341 // is probably the desired behavior.
342 if (N->getNumOperands() == 0)
343 return false;
344 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
345}
346
348 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
349}
350
351template <typename ConstNodeType>
353 std::function<bool(ConstNodeType *)> Match,
354 bool AllowUndefs, bool AllowTruncation) {
355 // FIXME: Add support for scalar UNDEF cases?
356 if (auto *C = dyn_cast<ConstNodeType>(Op))
357 return Match(C);
358
359 // FIXME: Add support for vector UNDEF cases?
360 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
361 ISD::SPLAT_VECTOR != Op.getOpcode())
362 return false;
363
364 EVT SVT = Op.getValueType().getScalarType();
365 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
366 if (AllowUndefs && Op.getOperand(i).isUndef()) {
367 if (!Match(nullptr))
368 return false;
369 continue;
370 }
371
372 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
373 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
374 !Match(Cst))
375 return false;
376 }
377 return true;
378}
379// Build used template types.
381 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
383 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
384
386 SDValue LHS, SDValue RHS,
387 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
388 bool AllowUndefs, bool AllowTypeMismatch) {
389 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
390 return false;
391
392 // TODO: Add support for scalar UNDEF cases?
393 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
394 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
395 return Match(LHSCst, RHSCst);
396
397 // TODO: Add support for vector UNDEF cases?
398 if (LHS.getOpcode() != RHS.getOpcode() ||
399 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
400 LHS.getOpcode() != ISD::SPLAT_VECTOR))
401 return false;
402
403 EVT SVT = LHS.getValueType().getScalarType();
404 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
405 SDValue LHSOp = LHS.getOperand(i);
406 SDValue RHSOp = RHS.getOperand(i);
407 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
408 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
409 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
410 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
411 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
412 return false;
413 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
414 LHSOp.getValueType() != RHSOp.getValueType()))
415 return false;
416 if (!Match(LHSCst, RHSCst))
417 return false;
418 }
419 return true;
420}
421
423 switch (MinMaxOpc) {
424 default:
425 llvm_unreachable("unrecognized opcode");
426 case ISD::UMIN:
427 return ISD::UMAX;
428 case ISD::UMAX:
429 return ISD::UMIN;
430 case ISD::SMIN:
431 return ISD::SMAX;
432 case ISD::SMAX:
433 return ISD::SMIN;
434 }
435}
436
438 switch (MinMaxOpc) {
439 default:
440 llvm_unreachable("unrecognized min/max opcode");
441 case ISD::SMIN:
442 return ISD::UMIN;
443 case ISD::SMAX:
444 return ISD::UMAX;
445 case ISD::UMIN:
446 return ISD::SMIN;
447 case ISD::UMAX:
448 return ISD::SMAX;
449 }
450}
451
453 switch (VecReduceOpcode) {
454 default:
455 llvm_unreachable("Expected VECREDUCE opcode");
458 case ISD::VP_REDUCE_FADD:
459 case ISD::VP_REDUCE_SEQ_FADD:
460 return ISD::FADD;
463 case ISD::VP_REDUCE_FMUL:
464 case ISD::VP_REDUCE_SEQ_FMUL:
465 return ISD::FMUL;
467 case ISD::VP_REDUCE_ADD:
468 return ISD::ADD;
470 case ISD::VP_REDUCE_MUL:
471 return ISD::MUL;
473 case ISD::VP_REDUCE_AND:
474 return ISD::AND;
476 case ISD::VP_REDUCE_OR:
477 return ISD::OR;
479 case ISD::VP_REDUCE_XOR:
480 return ISD::XOR;
482 case ISD::VP_REDUCE_SMAX:
483 return ISD::SMAX;
485 case ISD::VP_REDUCE_SMIN:
486 return ISD::SMIN;
488 case ISD::VP_REDUCE_UMAX:
489 return ISD::UMAX;
491 case ISD::VP_REDUCE_UMIN:
492 return ISD::UMIN;
494 case ISD::VP_REDUCE_FMAX:
495 return ISD::FMAXNUM;
497 case ISD::VP_REDUCE_FMIN:
498 return ISD::FMINNUM;
500 case ISD::VP_REDUCE_FMAXIMUM:
501 return ISD::FMAXIMUM;
503 case ISD::VP_REDUCE_FMINIMUM:
504 return ISD::FMINIMUM;
505 }
506}
507
509 switch (MaskedOpc) {
510 case ISD::MASKED_UDIV:
511 return ISD::UDIV;
512 case ISD::MASKED_SDIV:
513 return ISD::SDIV;
514 case ISD::MASKED_UREM:
515 return ISD::UREM;
516 case ISD::MASKED_SREM:
517 return ISD::SREM;
518 default:
519 llvm_unreachable("Expected masked binop opcode");
520 }
521}
522
523bool ISD::isVPOpcode(unsigned Opcode) {
524 switch (Opcode) {
525 default:
526 return false;
527#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
528 case ISD::VPSD: \
529 return true;
530#include "llvm/IR/VPIntrinsics.def"
531 }
532}
533
534bool ISD::isVPBinaryOp(unsigned Opcode) {
535 switch (Opcode) {
536 default:
537 break;
538#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
539#define VP_PROPERTY_BINARYOP return true;
540#define END_REGISTER_VP_SDNODE(VPSD) break;
541#include "llvm/IR/VPIntrinsics.def"
542 }
543 return false;
544}
545
546bool ISD::isVPReduction(unsigned Opcode) {
547 switch (Opcode) {
548 default:
549 return false;
550 case ISD::VP_REDUCE_ADD:
551 case ISD::VP_REDUCE_MUL:
552 case ISD::VP_REDUCE_AND:
553 case ISD::VP_REDUCE_OR:
554 case ISD::VP_REDUCE_XOR:
555 case ISD::VP_REDUCE_SMAX:
556 case ISD::VP_REDUCE_SMIN:
557 case ISD::VP_REDUCE_UMAX:
558 case ISD::VP_REDUCE_UMIN:
559 case ISD::VP_REDUCE_FMAX:
560 case ISD::VP_REDUCE_FMIN:
561 case ISD::VP_REDUCE_FMAXIMUM:
562 case ISD::VP_REDUCE_FMINIMUM:
563 case ISD::VP_REDUCE_FADD:
564 case ISD::VP_REDUCE_FMUL:
565 case ISD::VP_REDUCE_SEQ_FADD:
566 case ISD::VP_REDUCE_SEQ_FMUL:
567 return true;
568 }
569}
570
571/// The operand position of the vector mask.
572std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
573 switch (Opcode) {
574 default:
575 return std::nullopt;
576#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
577 case ISD::VPSD: \
578 return MASKPOS;
579#include "llvm/IR/VPIntrinsics.def"
580 }
581}
582
583/// The operand position of the explicit vector length parameter.
584std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
585 switch (Opcode) {
586 default:
587 return std::nullopt;
588#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
589 case ISD::VPSD: \
590 return EVLPOS;
591#include "llvm/IR/VPIntrinsics.def"
592 }
593}
594
595std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
596 bool hasFPExcept) {
597 // FIXME: Return strict opcodes in case of fp exceptions.
598 switch (VPOpcode) {
599 default:
600 return std::nullopt;
601#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
602#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
603#define END_REGISTER_VP_SDNODE(VPOPC) break;
604#include "llvm/IR/VPIntrinsics.def"
605 }
606 return std::nullopt;
607}
608
609std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
610 switch (Opcode) {
611 default:
612 return std::nullopt;
613#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
614#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
615#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
616#include "llvm/IR/VPIntrinsics.def"
617 }
618}
619
621 switch (ExtType) {
622 case ISD::EXTLOAD:
623 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
624 case ISD::SEXTLOAD:
625 return ISD::SIGN_EXTEND;
626 case ISD::ZEXTLOAD:
627 return ISD::ZERO_EXTEND;
628 default:
629 break;
630 }
631
632 llvm_unreachable("Invalid LoadExtType");
633}
634
636 // To perform this operation, we just need to swap the L and G bits of the
637 // operation.
638 unsigned OldL = (Operation >> 2) & 1;
639 unsigned OldG = (Operation >> 1) & 1;
640 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
641 (OldL << 1) | // New G bit
642 (OldG << 2)); // New L bit.
643}
644
646 unsigned Operation = Op;
647 if (isIntegerLike)
648 Operation ^= 7; // Flip L, G, E bits, but not U.
649 else
650 Operation ^= 15; // Flip all of the condition bits.
651
653 Operation &= ~8; // Don't let N and U bits get set.
654
655 return ISD::CondCode(Operation);
656}
657
661
663 bool isIntegerLike) {
664 return getSetCCInverseImpl(Op, isIntegerLike);
665}
666
667/// For an integer comparison, return 1 if the comparison is a signed operation
668/// and 2 if the result is an unsigned comparison. Return zero if the operation
669/// does not depend on the sign of the input (setne and seteq).
670static int isSignedOp(ISD::CondCode Opcode) {
671 switch (Opcode) {
672 default: llvm_unreachable("Illegal integer setcc operation!");
673 case ISD::SETEQ:
674 case ISD::SETNE: return 0;
675 case ISD::SETLT:
676 case ISD::SETLE:
677 case ISD::SETGT:
678 case ISD::SETGE: return 1;
679 case ISD::SETULT:
680 case ISD::SETULE:
681 case ISD::SETUGT:
682 case ISD::SETUGE: return 2;
683 }
684}
685
687 EVT Type) {
688 bool IsInteger = Type.isInteger();
689 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
690 // Cannot fold a signed integer setcc with an unsigned integer setcc.
691 return ISD::SETCC_INVALID;
692
693 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
694
695 // If the N and U bits get set, then the resultant comparison DOES suddenly
696 // care about orderedness, and it is true when ordered.
697 if (Op > ISD::SETTRUE2)
698 Op &= ~16; // Clear the U bit if the N bit is set.
699
700 // Canonicalize illegal integer setcc's.
701 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
702 Op = ISD::SETNE;
703
704 return ISD::CondCode(Op);
705}
706
708 EVT Type) {
709 bool IsInteger = Type.isInteger();
710 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
711 // Cannot fold a signed setcc with an unsigned setcc.
712 return ISD::SETCC_INVALID;
713
714 // Combine all of the condition bits.
715 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
716
717 // Canonicalize illegal integer setcc's.
718 if (IsInteger) {
719 switch (Result) {
720 default: break;
721 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
722 case ISD::SETOEQ: // SETEQ & SETU[LG]E
723 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
724 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
725 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
726 }
727 }
728
729 return Result;
730}
731
732//===----------------------------------------------------------------------===//
733// SDNode Profile Support
734//===----------------------------------------------------------------------===//
735
736/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
737static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
738 ID.AddInteger(OpC);
739}
740
741/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
742/// solely with their pointer.
744 ID.AddPointer(VTList.VTs);
745}
746
747/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
750 for (const auto &Op : Ops) {
751 ID.AddPointer(Op.getNode());
752 ID.AddInteger(Op.getResNo());
753 }
754}
755
756/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
759 for (const auto &Op : Ops) {
760 ID.AddPointer(Op.getNode());
761 ID.AddInteger(Op.getResNo());
762 }
763}
764
765static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
766 SDVTList VTList, ArrayRef<SDValue> OpList) {
767 AddNodeIDOpcode(ID, OpC);
768 AddNodeIDValueTypes(ID, VTList);
769 AddNodeIDOperands(ID, OpList);
770}
771
772/// If this is an SDNode with special info, add this info to the NodeID data.
774 switch (N->getOpcode()) {
777 case ISD::MCSymbol:
778 llvm_unreachable("Should only be used on nodes with operands");
779 default: break; // Normal nodes don't need extra info.
781 case ISD::Constant: {
783 ID.AddPointer(C->getConstantIntValue());
784 ID.AddBoolean(C->isOpaque());
785 break;
786 }
788 case ISD::ConstantFP:
789 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
790 break;
796 ID.AddPointer(GA->getGlobal());
797 ID.AddInteger(GA->getOffset());
798 ID.AddInteger(GA->getTargetFlags());
799 break;
800 }
801 case ISD::BasicBlock:
803 break;
804 case ISD::Register:
805 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
806 break;
808 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
809 break;
810 case ISD::SRCVALUE:
811 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
812 break;
813 case ISD::FrameIndex:
815 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
816 break;
818 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
819 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
820 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
821 break;
822 case ISD::JumpTable:
824 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
825 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
826 break;
830 ID.AddInteger(CP->getAlign().value());
831 ID.AddInteger(CP->getOffset());
834 else
835 ID.AddPointer(CP->getConstVal());
836 ID.AddInteger(CP->getTargetFlags());
837 break;
838 }
839 case ISD::TargetIndex: {
841 ID.AddInteger(TI->getIndex());
842 ID.AddInteger(TI->getOffset());
843 ID.AddInteger(TI->getTargetFlags());
844 break;
845 }
846 case ISD::LOAD: {
847 const LoadSDNode *LD = cast<LoadSDNode>(N);
848 ID.AddInteger(LD->getMemoryVT().getRawBits());
849 ID.AddInteger(LD->getRawSubclassData());
850 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(LD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::STORE: {
855 const StoreSDNode *ST = cast<StoreSDNode>(N);
856 ID.AddInteger(ST->getMemoryVT().getRawBits());
857 ID.AddInteger(ST->getRawSubclassData());
858 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
859 ID.AddInteger(ST->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_LOAD: {
863 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
864 ID.AddInteger(ELD->getMemoryVT().getRawBits());
865 ID.AddInteger(ELD->getRawSubclassData());
866 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
867 ID.AddInteger(ELD->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::VP_LOAD_FF: {
871 const auto *LD = cast<VPLoadFFSDNode>(N);
872 ID.AddInteger(LD->getMemoryVT().getRawBits());
873 ID.AddInteger(LD->getRawSubclassData());
874 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
875 ID.AddInteger(LD->getMemOperand()->getFlags());
876 break;
877 }
878 case ISD::VP_STORE: {
879 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
880 ID.AddInteger(EST->getMemoryVT().getRawBits());
881 ID.AddInteger(EST->getRawSubclassData());
882 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
883 ID.AddInteger(EST->getMemOperand()->getFlags());
884 break;
885 }
886 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
888 ID.AddInteger(SLD->getMemoryVT().getRawBits());
889 ID.AddInteger(SLD->getRawSubclassData());
890 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
891 break;
892 }
893 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
895 ID.AddInteger(SST->getMemoryVT().getRawBits());
896 ID.AddInteger(SST->getRawSubclassData());
897 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
898 break;
899 }
900 case ISD::VP_GATHER: {
902 ID.AddInteger(EG->getMemoryVT().getRawBits());
903 ID.AddInteger(EG->getRawSubclassData());
904 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
905 ID.AddInteger(EG->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::VP_SCATTER: {
910 ID.AddInteger(ES->getMemoryVT().getRawBits());
911 ID.AddInteger(ES->getRawSubclassData());
912 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
913 ID.AddInteger(ES->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MLOAD: {
918 ID.AddInteger(MLD->getMemoryVT().getRawBits());
919 ID.AddInteger(MLD->getRawSubclassData());
920 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MLD->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSTORE: {
926 ID.AddInteger(MST->getMemoryVT().getRawBits());
927 ID.AddInteger(MST->getRawSubclassData());
928 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MST->getMemOperand()->getFlags());
930 break;
931 }
932 case ISD::MGATHER: {
934 ID.AddInteger(MG->getMemoryVT().getRawBits());
935 ID.AddInteger(MG->getRawSubclassData());
936 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
937 ID.AddInteger(MG->getMemOperand()->getFlags());
938 break;
939 }
940 case ISD::MSCATTER: {
942 ID.AddInteger(MS->getMemoryVT().getRawBits());
943 ID.AddInteger(MS->getRawSubclassData());
944 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
945 ID.AddInteger(MS->getMemOperand()->getFlags());
946 break;
947 }
950 case ISD::ATOMIC_SWAP:
962 case ISD::ATOMIC_LOAD:
963 case ISD::ATOMIC_STORE: {
964 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
965 ID.AddInteger(AT->getMemoryVT().getRawBits());
966 ID.AddInteger(AT->getRawSubclassData());
967 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
968 ID.AddInteger(AT->getMemOperand()->getFlags());
969 break;
970 }
971 case ISD::VECTOR_SHUFFLE: {
972 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
973 for (int M : Mask)
974 ID.AddInteger(M);
975 break;
976 }
977 case ISD::ADDRSPACECAST: {
979 ID.AddInteger(ASC->getSrcAddressSpace());
980 ID.AddInteger(ASC->getDestAddressSpace());
981 break;
982 }
984 case ISD::BlockAddress: {
986 ID.AddPointer(BA->getBlockAddress());
987 ID.AddInteger(BA->getOffset());
988 ID.AddInteger(BA->getTargetFlags());
989 break;
990 }
991 case ISD::AssertAlign:
992 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
993 break;
994 case ISD::PREFETCH:
997 // Handled by MemIntrinsicSDNode check after the switch.
998 break;
1000 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
1001 break;
1002 } // end switch (N->getOpcode())
1003
1004 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
1005 // to check.
1006 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
1007 ID.AddInteger(MN->getRawSubclassData());
1008 ID.AddInteger(MN->getMemoryVT().getRawBits());
1009 for (const MachineMemOperand *MMO : MN->memoperands()) {
1010 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
1011 ID.AddInteger(MMO->getFlags());
1012 }
1013 }
1014}
1015
1016/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1017/// data.
1019 AddNodeIDOpcode(ID, N->getOpcode());
1020 // Add the return value info.
1021 AddNodeIDValueTypes(ID, N->getVTList());
1022 // Add the operand info.
1023 AddNodeIDOperands(ID, N->ops());
1024
1025 // Handle SDNode leafs with special info.
1027}
1028
1029//===----------------------------------------------------------------------===//
1030// SelectionDAG Class
1031//===----------------------------------------------------------------------===//
1032
1033/// doNotCSE - Return true if CSE should not be performed for this node.
1034static bool doNotCSE(SDNode *N) {
1035 if (N->getValueType(0) == MVT::Glue)
1036 return true; // Never CSE anything that produces a glue result.
1037
1038 switch (N->getOpcode()) {
1039 default: break;
1040 case ISD::HANDLENODE:
1041 case ISD::EH_LABEL:
1042 return true; // Never CSE these nodes.
1043 }
1044
1045 // Check that remaining values produced are not flags.
1046 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1047 if (N->getValueType(i) == MVT::Glue)
1048 return true; // Never CSE anything that produces a glue result.
1049
1050 return false;
1051}
1052
1053/// Construct a DemandedElts mask which demands all elements of \p V.
1054/// If \p V is not a fixed-length vector, then this will return a single bit.
1056 EVT VT = V.getValueType();
1057 // Since the number of lanes in a scalable vector is unknown at compile time,
1058 // we track one bit which is implicitly broadcast to all lanes. This means
1059 // that all lanes in a scalable vector are considered demanded.
1061 : APInt(1, 1);
1062}
1063
1064/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1065/// SelectionDAG.
1067 // Create a dummy node (which is not added to allnodes), that adds a reference
1068 // to the root node, preventing it from being deleted.
1069 HandleSDNode Dummy(getRoot());
1070
1071 SmallVector<SDNode*, 128> DeadNodes;
1072
1073 // Add all obviously-dead nodes to the DeadNodes worklist.
1074 for (SDNode &Node : allnodes())
1075 if (Node.use_empty())
1076 DeadNodes.push_back(&Node);
1077
1078 RemoveDeadNodes(DeadNodes);
1079
1080 // If the root changed (e.g. it was a dead load, update the root).
1081 setRoot(Dummy.getValue());
1082}
1083
1084/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1085/// given list, and any nodes that become unreachable as a result.
1087
1088 // Process the worklist, deleting the nodes and adding their uses to the
1089 // worklist.
1090 while (!DeadNodes.empty()) {
1091 SDNode *N = DeadNodes.pop_back_val();
1092 // Skip to next node if we've already managed to delete the node. This could
1093 // happen if replacing a node causes a node previously added to the node to
1094 // be deleted.
1095 if (N->getOpcode() == ISD::DELETED_NODE)
1096 continue;
1097
1098 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1099 DUL->NodeDeleted(N, nullptr);
1100
1101 // Take the node out of the appropriate CSE map.
1102 RemoveNodeFromCSEMaps(N);
1103
1104 // Next, brutally remove the operand list. This is safe to do, as there are
1105 // no cycles in the graph.
1106 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1107 SDUse &Use = *I++;
1108 SDNode *Operand = Use.getNode();
1109 Use.set(SDValue());
1110
1111 // Now that we removed this operand, see if there are no uses of it left.
1112 if (Operand->use_empty())
1113 DeadNodes.push_back(Operand);
1114 }
1115
1116 DeallocateNode(N);
1117 }
1118}
1119
1121 SmallVector<SDNode*, 16> DeadNodes(1, N);
1122
1123 // Create a dummy node that adds a reference to the root node, preventing
1124 // it from being deleted. (This matters if the root is an operand of the
1125 // dead node.)
1126 HandleSDNode Dummy(getRoot());
1127
1128 RemoveDeadNodes(DeadNodes);
1129}
1130
1132 // First take this out of the appropriate CSE map.
1133 RemoveNodeFromCSEMaps(N);
1134
1135 // Finally, remove uses due to operands of this node, remove from the
1136 // AllNodes list, and delete the node.
1137 DeleteNodeNotInCSEMaps(N);
1138}
1139
1140void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1141 assert(N->getIterator() != AllNodes.begin() &&
1142 "Cannot delete the entry node!");
1143 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1144
1145 // Drop all of the operands and decrement used node's use counts.
1146 N->DropOperands();
1147
1148 DeallocateNode(N);
1149}
1150
1151void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1152 assert(!(V->isVariadic() && isParameter));
1153 if (isParameter)
1154 ByvalParmDbgValues.push_back(V);
1155 else
1156 DbgValues.push_back(V);
1157 for (const SDNode *Node : V->getSDNodes())
1158 if (Node)
1159 DbgValMap[Node].push_back(V);
1160}
1161
1163 DbgValMapType::iterator I = DbgValMap.find(Node);
1164 if (I == DbgValMap.end())
1165 return;
1166 for (auto &Val: I->second)
1167 Val->setIsInvalidated();
1168 DbgValMap.erase(I);
1169}
1170
1171void SelectionDAG::DeallocateNode(SDNode *N) {
1172 // If we have operands, deallocate them.
1174
1175 NodeAllocator.Deallocate(AllNodes.remove(N));
1176
1177 // Set the opcode to DELETED_NODE to help catch bugs when node
1178 // memory is reallocated.
1179 // FIXME: There are places in SDag that have grown a dependency on the opcode
1180 // value in the released node.
1181 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1182 N->NodeType = ISD::DELETED_NODE;
1183
1184 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1185 // them and forget about that node.
1186 DbgInfo->erase(N);
1187
1188 // Invalidate extra info.
1189 SDEI.erase(N);
1190}
1191
1192#ifndef NDEBUG
1193/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1194void SelectionDAG::verifyNode(SDNode *N) const {
1195 switch (N->getOpcode()) {
1196 default:
1197 if (N->isTargetOpcode())
1199 break;
1200 case ISD::BUILD_PAIR: {
1201 EVT VT = N->getValueType(0);
1202 assert(N->getNumValues() == 1 && "Too many results!");
1203 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1204 "Wrong return type!");
1205 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1206 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1207 "Mismatched operand types!");
1208 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1209 "Wrong operand type!");
1210 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1211 "Wrong return type size");
1212 break;
1213 }
1214 case ISD::BUILD_VECTOR: {
1215 assert(N->getNumValues() == 1 && "Too many results!");
1216 assert(N->getValueType(0).isVector() && "Wrong return type!");
1217 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1218 "Wrong number of operands!");
1219 EVT EltVT = N->getValueType(0).getVectorElementType();
1220 for (const SDUse &Op : N->ops()) {
1221 assert((Op.getValueType() == EltVT ||
1222 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1223 EltVT.bitsLE(Op.getValueType()))) &&
1224 "Wrong operand type!");
1225 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1226 "Operands must all have the same type");
1227 }
1228 break;
1229 }
1230 case ISD::SADDO:
1231 case ISD::UADDO:
1232 case ISD::SSUBO:
1233 case ISD::USUBO:
1234 assert(N->getNumValues() == 2 && "Wrong number of results!");
1235 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1236 "Invalid add/sub overflow op!");
1237 assert(N->getVTList().VTs[0].isInteger() &&
1238 N->getVTList().VTs[1].isInteger() &&
1239 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1240 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1241 "Binary operator types must match!");
1242 break;
1243 }
1244}
1245#endif // NDEBUG
1246
1247/// Insert a newly allocated node into the DAG.
1248///
1249/// Handles insertion into the all nodes list and CSE map, as well as
1250/// verification and other common operations when a new node is allocated.
1251void SelectionDAG::InsertNode(SDNode *N) {
1252 AllNodes.push_back(N);
1253#ifndef NDEBUG
1254 N->PersistentId = NextPersistentId++;
1255 verifyNode(N);
1256#endif
1257 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1258 DUL->NodeInserted(N);
1259}
1260
1261/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1262/// correspond to it. This is useful when we're about to delete or repurpose
1263/// the node. We don't want future request for structurally identical nodes
1264/// to return N anymore.
1265bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1266 bool Erased = false;
1267 switch (N->getOpcode()) {
1268 case ISD::HANDLENODE: return false; // noop.
1269 case ISD::CONDCODE:
1270 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1271 "Cond code doesn't exist!");
1272 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1273 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1274 break;
1276 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1277 break;
1279 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1280 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1281 ESN->getSymbol(), ESN->getTargetFlags()));
1282 break;
1283 }
1284 case ISD::MCSymbol: {
1285 auto *MCSN = cast<MCSymbolSDNode>(N);
1286 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1287 break;
1288 }
1289 case ISD::VALUETYPE: {
1290 EVT VT = cast<VTSDNode>(N)->getVT();
1291 if (VT.isExtended()) {
1292 Erased = ExtendedValueTypeNodes.erase(VT);
1293 } else {
1294 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1295 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1296 }
1297 break;
1298 }
1299 default:
1300 // Remove it from the CSE Map.
1301 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1302 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1303 Erased = CSEMap.RemoveNode(N);
1304 break;
1305 }
1306#ifndef NDEBUG
1307 // Verify that the node was actually in one of the CSE maps, unless it has a
1308 // glue result (which cannot be CSE'd) or is one of the special cases that are
1309 // not subject to CSE.
1310 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1311 !N->isMachineOpcode() && !doNotCSE(N)) {
1312 N->dump(this);
1313 dbgs() << "\n";
1314 llvm_unreachable("Node is not in map!");
1315 }
1316#endif
1317 return Erased;
1318}
1319
1320/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1321/// maps and modified in place. Add it back to the CSE maps, unless an identical
1322/// node already exists, in which case transfer all its users to the existing
1323/// node. This transfer can potentially trigger recursive merging.
1324void
1325SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1326 // For node types that aren't CSE'd, just act as if no identical node
1327 // already exists.
1328 if (!doNotCSE(N)) {
1329 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1330 if (Existing != N) {
1331 // If there was already an existing matching node, use ReplaceAllUsesWith
1332 // to replace the dead one with the existing one. This can cause
1333 // recursive merging of other unrelated nodes down the line.
1334 Existing->intersectFlagsWith(N->getFlags());
1335 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1336 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1337 ReplaceAllUsesWith(N, Existing);
1338
1339 // N is now dead. Inform the listeners and delete it.
1340 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1341 DUL->NodeDeleted(N, Existing);
1342 DeleteNodeNotInCSEMaps(N);
1343 return;
1344 }
1345 }
1346
1347 // If the node doesn't already exist, we updated it. Inform listeners.
1348 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1349 DUL->NodeUpdated(N);
1350}
1351
1352/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1353/// were replaced with those specified. If this node is never memoized,
1354/// return null, otherwise return a pointer to the slot it would take. If a
1355/// node already exists with these operands, the slot will be non-null.
1356SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1357 void *&InsertPos) {
1358 if (doNotCSE(N))
1359 return nullptr;
1360
1361 SDValue Ops[] = { Op };
1362 FoldingSetNodeID ID;
1363 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1365 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1366 if (Node)
1367 Node->intersectFlagsWith(N->getFlags());
1368 return Node;
1369}
1370
1371/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1372/// were replaced with those specified. If this node is never memoized,
1373/// return null, otherwise return a pointer to the slot it would take. If a
1374/// node already exists with these operands, the slot will be non-null.
1375SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1376 SDValue Op1, SDValue Op2,
1377 void *&InsertPos) {
1378 if (doNotCSE(N))
1379 return nullptr;
1380
1381 SDValue Ops[] = { Op1, Op2 };
1382 FoldingSetNodeID ID;
1383 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1385 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1386 if (Node)
1387 Node->intersectFlagsWith(N->getFlags());
1388 return Node;
1389}
1390
1391/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1392/// were replaced with those specified. If this node is never memoized,
1393/// return null, otherwise return a pointer to the slot it would take. If a
1394/// node already exists with these operands, the slot will be non-null.
1395SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1396 void *&InsertPos) {
1397 if (doNotCSE(N))
1398 return nullptr;
1399
1400 FoldingSetNodeID ID;
1401 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1403 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1404 if (Node)
1405 Node->intersectFlagsWith(N->getFlags());
1406 return Node;
1407}
1408
1410 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1411 : VT.getTypeForEVT(*getContext());
1412
1413 return getDataLayout().getABITypeAlign(Ty);
1414}
1415
1416// EntryNode could meaningfully have debug info if we can find it...
1418 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1419 getVTList(MVT::Other, MVT::Glue)),
1420 Root(getEntryNode()) {
1421 InsertNode(&EntryNode);
1422 DbgInfo = new SDDbgInfo();
1423}
1424
1426 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1427 const TargetLibraryInfo *LibraryInfo,
1428 const LibcallLoweringInfo *LibcallsInfo,
1429 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1431 FunctionVarLocs const *VarLocs) {
1432 MF = &NewMF;
1433 SDAGISelPass = PassPtr;
1434 ORE = &NewORE;
1437 LibInfo = LibraryInfo;
1438 Libcalls = LibcallsInfo;
1439 Context = &MF->getFunction().getContext();
1440 UA = NewUA;
1441 PSI = PSIin;
1442 BFI = BFIin;
1443 MMI = &MMIin;
1444 FnVarLocs = VarLocs;
1445}
1446
1448 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1449 allnodes_clear();
1450 OperandRecycler.clear(OperandAllocator);
1451 delete DbgInfo;
1452}
1453
1455 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1456}
1457
1458void SelectionDAG::allnodes_clear() {
1459 assert(&*AllNodes.begin() == &EntryNode);
1460 AllNodes.remove(AllNodes.begin());
1461 while (!AllNodes.empty())
1462 DeallocateNode(&AllNodes.front());
1463#ifndef NDEBUG
1464 NextPersistentId = 0;
1465#endif
1466}
1467
1468SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1469 void *&InsertPos) {
1470 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1471 if (N) {
1472 switch (N->getOpcode()) {
1473 default: break;
1474 case ISD::Constant:
1475 case ISD::ConstantFP:
1476 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1477 "debug location. Use another overload.");
1478 }
1479 }
1480 return N;
1481}
1482
1483SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1484 const SDLoc &DL, void *&InsertPos) {
1485 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1486 if (N) {
1487 switch (N->getOpcode()) {
1488 case ISD::Constant:
1489 case ISD::ConstantFP:
1490 // Erase debug location from the node if the node is used at several
1491 // different places. Do not propagate one location to all uses as it
1492 // will cause a worse single stepping debugging experience.
1493 if (N->getDebugLoc() != DL.getDebugLoc())
1494 N->setDebugLoc(DebugLoc());
1495 break;
1496 default:
1497 // When the node's point of use is located earlier in the instruction
1498 // sequence than its prior point of use, update its debug info to the
1499 // earlier location.
1500 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1501 N->setDebugLoc(DL.getDebugLoc());
1502 break;
1503 }
1504 }
1505 return N;
1506}
1507
1509 allnodes_clear();
1510 OperandRecycler.clear(OperandAllocator);
1511 OperandAllocator.Reset();
1512 CSEMap.clear();
1513
1514 ExtendedValueTypeNodes.clear();
1515 ExternalSymbols.clear();
1516 TargetExternalSymbols.clear();
1517 MCSymbols.clear();
1518 SDEI.clear();
1519 llvm::fill(CondCodeNodes, nullptr);
1520 llvm::fill(ValueTypeNodes, nullptr);
1521
1522 EntryNode.UseList = nullptr;
1523 InsertNode(&EntryNode);
1524 Root = getEntryNode();
1525 DbgInfo->clear();
1526}
1527
1529 return VT.bitsGT(Op.getValueType())
1530 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1531 : getNode(ISD::FP_ROUND, DL, VT, Op,
1532 getIntPtrConstant(0, DL, /*isTarget=*/true));
1533}
1534
1535std::pair<SDValue, SDValue>
1537 const SDLoc &DL, EVT VT) {
1538 assert(!VT.bitsEq(Op.getValueType()) &&
1539 "Strict no-op FP extend/round not allowed.");
1540 SDValue Res =
1541 VT.bitsGT(Op.getValueType())
1542 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1543 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1544 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1545
1546 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1547}
1548
1550 return VT.bitsGT(Op.getValueType()) ?
1551 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1552 getNode(ISD::TRUNCATE, DL, VT, Op);
1553}
1554
1556 return VT.bitsGT(Op.getValueType()) ?
1557 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1558 getNode(ISD::TRUNCATE, DL, VT, Op);
1559}
1560
1562 return VT.bitsGT(Op.getValueType()) ?
1563 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1564 getNode(ISD::TRUNCATE, DL, VT, Op);
1565}
1566
1568 EVT VT) {
1569 assert(!VT.isVector());
1570 auto Type = Op.getValueType();
1571 SDValue DestOp;
1572 if (Type == VT)
1573 return Op;
1574 auto Size = Op.getValueSizeInBits();
1575 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1576 if (DestOp.getValueType() == VT)
1577 return DestOp;
1578
1579 return getAnyExtOrTrunc(DestOp, DL, VT);
1580}
1581
1583 EVT VT) {
1584 assert(!VT.isVector());
1585 auto Type = Op.getValueType();
1586 SDValue DestOp;
1587 if (Type == VT)
1588 return Op;
1589 auto Size = Op.getValueSizeInBits();
1590 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1591 if (DestOp.getValueType() == VT)
1592 return DestOp;
1593
1594 return getSExtOrTrunc(DestOp, DL, VT);
1595}
1596
1598 EVT VT) {
1599 assert(!VT.isVector());
1600 auto Type = Op.getValueType();
1601 SDValue DestOp;
1602 if (Type == VT)
1603 return Op;
1604 auto Size = Op.getValueSizeInBits();
1605 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1606 if (DestOp.getValueType() == VT)
1607 return DestOp;
1608
1609 return getZExtOrTrunc(DestOp, DL, VT);
1610}
1611
1613 EVT OpVT) {
1614 if (VT.bitsLE(Op.getValueType()))
1615 return getNode(ISD::TRUNCATE, SL, VT, Op);
1616
1617 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1618 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1619}
1620
1622 EVT OpVT = Op.getValueType();
1623 assert(VT.isInteger() && OpVT.isInteger() &&
1624 "Cannot getZeroExtendInReg FP types");
1625 assert(VT.isVector() == OpVT.isVector() &&
1626 "getZeroExtendInReg type should be vector iff the operand "
1627 "type is vector!");
1628 assert((!VT.isVector() ||
1630 "Vector element counts must match in getZeroExtendInReg");
1631 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1632 if (OpVT == VT)
1633 return Op;
1634 // TODO: Use computeKnownBits instead of AssertZext.
1635 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1636 ->getVT()
1637 .getScalarType()
1638 .bitsLE(VT.getScalarType()))
1639 return Op;
1641 VT.getScalarSizeInBits());
1642 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1643}
1644
1646 SDValue EVL, const SDLoc &DL,
1647 EVT VT) {
1648 EVT OpVT = Op.getValueType();
1649 assert(VT.isInteger() && OpVT.isInteger() &&
1650 "Cannot getVPZeroExtendInReg FP types");
1651 assert(VT.isVector() && OpVT.isVector() &&
1652 "getVPZeroExtendInReg type and operand type should be vector!");
1654 "Vector element counts must match in getZeroExtendInReg");
1655 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1656 if (OpVT == VT)
1657 return Op;
1659 VT.getScalarSizeInBits());
1660 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1661 EVL);
1662}
1663
1665 // Only unsigned pointer semantics are supported right now. In the future this
1666 // might delegate to TLI to check pointer signedness.
1667 return getZExtOrTrunc(Op, DL, VT);
1668}
1669
1671 // Only unsigned pointer semantics are supported right now. In the future this
1672 // might delegate to TLI to check pointer signedness.
1673 return getZeroExtendInReg(Op, DL, VT);
1674}
1675
1677 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1678}
1679
1680/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1682 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1683}
1684
1686 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1687 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1688}
1689
1691 SDValue Mask, SDValue EVL, EVT VT) {
1692 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1693 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1694}
1695
1697 SDValue Mask, SDValue EVL) {
1698 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1699}
1700
1702 SDValue Mask, SDValue EVL) {
1703 if (VT.bitsGT(Op.getValueType()))
1704 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1705 if (VT.bitsLT(Op.getValueType()))
1706 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1707 return Op;
1708}
1709
1711 EVT OpVT) {
1712 if (!V)
1713 return getConstant(0, DL, VT);
1714
1715 switch (TLI->getBooleanContents(OpVT)) {
1718 return getConstant(1, DL, VT);
1720 return getAllOnesConstant(DL, VT);
1721 }
1722 llvm_unreachable("Unexpected boolean content enum!");
1723}
1724
1726 bool isT, bool isO) {
1727 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1728 DL, VT, isT, isO);
1729}
1730
1732 bool isT, bool isO) {
1733 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1734}
1735
1737 EVT VT, bool isT, bool isO) {
1738 assert(VT.isInteger() && "Cannot create FP integer constant!");
1739
1740 EVT EltVT = VT.getScalarType();
1741 const ConstantInt *Elt = &Val;
1742
1743 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1744 // to-be-splatted scalar ConstantInt.
1745 if (isa<VectorType>(Elt->getType()))
1746 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1747
1748 // In some cases the vector type is legal but the element type is illegal and
1749 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1750 // inserted value (the type does not need to match the vector element type).
1751 // Any extra bits introduced will be truncated away.
1752 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1754 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1755 APInt NewVal;
1756 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1757 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1758 else
1759 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1760 Elt = ConstantInt::get(*getContext(), NewVal);
1761 }
1762 // In other cases the element type is illegal and needs to be expanded, for
1763 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1764 // the value into n parts and use a vector type with n-times the elements.
1765 // Then bitcast to the type requested.
1766 // Legalizing constants too early makes the DAGCombiner's job harder so we
1767 // only legalize if the DAG tells us we must produce legal types.
1768 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1769 TLI->getTypeAction(*getContext(), EltVT) ==
1771 const APInt &NewVal = Elt->getValue();
1772 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1773 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1774
1775 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1776 if (VT.isScalableVector() ||
1777 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1778 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1779 "Can only handle an even split!");
1780 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1781
1782 SmallVector<SDValue, 2> ScalarParts;
1783 for (unsigned i = 0; i != Parts; ++i)
1784 ScalarParts.push_back(getConstant(
1785 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1786 ViaEltVT, isT, isO));
1787
1788 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1789 }
1790
1791 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1792 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1793
1794 // Check the temporary vector is the correct size. If this fails then
1795 // getTypeToTransformTo() probably returned a type whose size (in bits)
1796 // isn't a power-of-2 factor of the requested type size.
1797 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1798
1799 SmallVector<SDValue, 2> EltParts;
1800 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1801 EltParts.push_back(getConstant(
1802 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1803 ViaEltVT, isT, isO));
1804
1805 // EltParts is currently in little endian order. If we actually want
1806 // big-endian order then reverse it now.
1807 if (getDataLayout().isBigEndian())
1808 std::reverse(EltParts.begin(), EltParts.end());
1809
1810 // The elements must be reversed when the element order is different
1811 // to the endianness of the elements (because the BITCAST is itself a
1812 // vector shuffle in this situation). However, we do not need any code to
1813 // perform this reversal because getConstant() is producing a vector
1814 // splat.
1815 // This situation occurs in MIPS MSA.
1816
1818 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1819 llvm::append_range(Ops, EltParts);
1820
1821 SDValue V =
1822 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1823 return V;
1824 }
1825
1826 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1827 "APInt size does not match type size!");
1828 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1829 SDVTList VTs = getVTList(EltVT);
1831 AddNodeIDNode(ID, Opc, VTs, {});
1832 ID.AddPointer(Elt);
1833 ID.AddBoolean(isO);
1834 void *IP = nullptr;
1835 SDNode *N = nullptr;
1836 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1837 if (!VT.isVector())
1838 return SDValue(N, 0);
1839
1840 if (!N) {
1841 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1842 if (!isT)
1843 N->setDebugLoc(DL.getDebugLoc());
1844 CSEMap.InsertNode(N, IP);
1845 InsertNode(N);
1846 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1847 }
1848
1849 SDValue Result(N, 0);
1850 if (VT.isVector())
1851 Result = getSplat(VT, DL, Result);
1852 return Result;
1853}
1854
1856 bool isT, bool isO) {
1857 unsigned Size = VT.getScalarSizeInBits();
1858 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1859}
1860
1862 bool IsOpaque) {
1864 IsTarget, IsOpaque);
1865}
1866
1868 bool isTarget) {
1869 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1870}
1871
1873 const SDLoc &DL) {
1874 assert(VT.isInteger() && "Shift amount is not an integer type!");
1875 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1876 return getConstant(Val, DL, ShiftVT);
1877}
1878
1880 const SDLoc &DL) {
1881 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1882 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1883}
1884
1886 bool isTarget) {
1887 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1888}
1889
1891 bool isTarget) {
1892 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1893}
1894
1896 EVT VT, bool isTarget) {
1897 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1898
1899 EVT EltVT = VT.getScalarType();
1900 const ConstantFP *Elt = &V;
1901
1902 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1903 // the to-be-splatted scalar ConstantFP.
1904 if (isa<VectorType>(Elt->getType()))
1905 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1906
1907 // Do the map lookup using the actual bit pattern for the floating point
1908 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1909 // we don't have issues with SNANs.
1910 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1911 SDVTList VTs = getVTList(EltVT);
1913 AddNodeIDNode(ID, Opc, VTs, {});
1914 ID.AddPointer(Elt);
1915 void *IP = nullptr;
1916 SDNode *N = nullptr;
1917 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1918 if (!VT.isVector())
1919 return SDValue(N, 0);
1920
1921 if (!N) {
1922 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1923 CSEMap.InsertNode(N, IP);
1924 InsertNode(N);
1925 }
1926
1927 SDValue Result(N, 0);
1928 if (VT.isVector())
1929 Result = getSplat(VT, DL, Result);
1930 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1931 return Result;
1932}
1933
1935 bool isTarget) {
1936 EVT EltVT = VT.getScalarType();
1937 if (EltVT == MVT::f32)
1938 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1939 if (EltVT == MVT::f64)
1940 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1941 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1942 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1943 bool Ignored;
1944 APFloat APF = APFloat(Val);
1946 &Ignored);
1947 return getConstantFP(APF, DL, VT, isTarget);
1948 }
1949 llvm_unreachable("Unsupported type in getConstantFP");
1950}
1951
1953 EVT VT, int64_t Offset, bool isTargetGA,
1954 unsigned TargetFlags) {
1955 assert((TargetFlags == 0 || isTargetGA) &&
1956 "Cannot set target flags on target-independent globals");
1957
1958 // Truncate (with sign-extension) the offset value to the pointer size.
1960 if (BitWidth < 64)
1962
1963 unsigned Opc;
1964 if (GV->isThreadLocal())
1966 else
1968
1969 SDVTList VTs = getVTList(VT);
1971 AddNodeIDNode(ID, Opc, VTs, {});
1972 ID.AddPointer(GV);
1973 ID.AddInteger(Offset);
1974 ID.AddInteger(TargetFlags);
1975 void *IP = nullptr;
1976 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1977 return SDValue(E, 0);
1978
1979 auto *N = newSDNode<GlobalAddressSDNode>(
1980 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1981 CSEMap.InsertNode(N, IP);
1982 InsertNode(N);
1983 return SDValue(N, 0);
1984}
1985
1987 SDVTList VTs = getVTList(MVT::Untyped);
1990 ID.AddPointer(GV);
1991 void *IP = nullptr;
1992 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1993 return SDValue(E, 0);
1994
1995 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1996 CSEMap.InsertNode(N, IP);
1997 InsertNode(N);
1998 return SDValue(N, 0);
1999}
2000
2001SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
2002 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
2003 SDVTList VTs = getVTList(VT);
2005 AddNodeIDNode(ID, Opc, VTs, {});
2006 ID.AddInteger(FI);
2007 void *IP = nullptr;
2008 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2009 return SDValue(E, 0);
2010
2011 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
2012 CSEMap.InsertNode(N, IP);
2013 InsertNode(N);
2014 return SDValue(N, 0);
2015}
2016
2017SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
2018 unsigned TargetFlags) {
2019 assert((TargetFlags == 0 || isTarget) &&
2020 "Cannot set target flags on target-independent jump tables");
2021 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
2022 SDVTList VTs = getVTList(VT);
2024 AddNodeIDNode(ID, Opc, VTs, {});
2025 ID.AddInteger(JTI);
2026 ID.AddInteger(TargetFlags);
2027 void *IP = nullptr;
2028 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2029 return SDValue(E, 0);
2030
2031 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2032 CSEMap.InsertNode(N, IP);
2033 InsertNode(N);
2034 return SDValue(N, 0);
2035}
2036
2038 const SDLoc &DL) {
2040 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2041 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2042}
2043
2045 MaybeAlign Alignment, int Offset,
2046 bool isTarget, unsigned TargetFlags) {
2047 assert((TargetFlags == 0 || isTarget) &&
2048 "Cannot set target flags on target-independent globals");
2049 if (!Alignment)
2050 Alignment = shouldOptForSize()
2051 ? getDataLayout().getABITypeAlign(C->getType())
2052 : getDataLayout().getPrefTypeAlign(C->getType());
2053 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2054 SDVTList VTs = getVTList(VT);
2056 AddNodeIDNode(ID, Opc, VTs, {});
2057 ID.AddInteger(Alignment->value());
2058 ID.AddInteger(Offset);
2059 ID.AddPointer(C);
2060 ID.AddInteger(TargetFlags);
2061 void *IP = nullptr;
2062 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2063 return SDValue(E, 0);
2064
2065 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2066 TargetFlags);
2067 CSEMap.InsertNode(N, IP);
2068 InsertNode(N);
2069 SDValue V = SDValue(N, 0);
2070 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2071 return V;
2072}
2073
2075 MaybeAlign Alignment, int Offset,
2076 bool isTarget, unsigned TargetFlags) {
2077 assert((TargetFlags == 0 || isTarget) &&
2078 "Cannot set target flags on target-independent globals");
2079 if (!Alignment)
2080 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2081 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2082 SDVTList VTs = getVTList(VT);
2084 AddNodeIDNode(ID, Opc, VTs, {});
2085 ID.AddInteger(Alignment->value());
2086 ID.AddInteger(Offset);
2087 C->addSelectionDAGCSEId(ID);
2088 ID.AddInteger(TargetFlags);
2089 void *IP = nullptr;
2090 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2091 return SDValue(E, 0);
2092
2093 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2094 TargetFlags);
2095 CSEMap.InsertNode(N, IP);
2096 InsertNode(N);
2097 return SDValue(N, 0);
2098}
2099
2102 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2103 ID.AddPointer(MBB);
2104 void *IP = nullptr;
2105 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2106 return SDValue(E, 0);
2107
2108 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2109 CSEMap.InsertNode(N, IP);
2110 InsertNode(N);
2111 return SDValue(N, 0);
2112}
2113
2115 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2116 ValueTypeNodes.size())
2117 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2118
2119 SDNode *&N = VT.isExtended() ?
2120 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2121
2122 if (N) return SDValue(N, 0);
2123 N = newSDNode<VTSDNode>(VT);
2124 InsertNode(N);
2125 return SDValue(N, 0);
2126}
2127
2129 SDNode *&N = ExternalSymbols[Sym];
2130 if (N) return SDValue(N, 0);
2131 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2132 InsertNode(N);
2133 return SDValue(N, 0);
2134}
2135
2136SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2138 return getExternalSymbol(SymName.data(), VT);
2139}
2140
2142 SDNode *&N = MCSymbols[Sym];
2143 if (N)
2144 return SDValue(N, 0);
2145 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2146 InsertNode(N);
2147 return SDValue(N, 0);
2148}
2149
2151 unsigned TargetFlags) {
2152 SDNode *&N =
2153 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2154 if (N) return SDValue(N, 0);
2155 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2156 InsertNode(N);
2157 return SDValue(N, 0);
2158}
2159
2161 EVT VT, unsigned TargetFlags) {
2163 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2164}
2165
2167 if ((unsigned)Cond >= CondCodeNodes.size())
2168 CondCodeNodes.resize(Cond+1);
2169
2170 if (!CondCodeNodes[Cond]) {
2171 auto *N = newSDNode<CondCodeSDNode>(Cond);
2172 CondCodeNodes[Cond] = N;
2173 InsertNode(N);
2174 }
2175
2176 return SDValue(CondCodeNodes[Cond], 0);
2177}
2178
2180 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2181 "APInt size does not match type size!");
2182
2183 if (MulImm == 0)
2184 return getConstant(0, DL, VT);
2185
2186 const MachineFunction &MF = getMachineFunction();
2187 const Function &F = MF.getFunction();
2188 ConstantRange CR = getVScaleRange(&F, 64);
2189 if (const APInt *C = CR.getSingleElement())
2190 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2191
2192 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2193}
2194
2195/// \returns a value of type \p VT that represents the runtime value of \p
2196/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2197/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2198/// or TypeSize.
2199template <typename Ty>
2201 EVT VT, Ty Quantity) {
2202 if (Quantity.isScalable())
2203 return DAG.getVScale(
2204 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2205
2206 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2207}
2208
2210 ElementCount EC) {
2211 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2212}
2213
2215 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2216}
2217
2219 ElementCount EC) {
2220 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2221 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2222 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2223 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2224}
2225
2227 APInt One(ResVT.getScalarSizeInBits(), 1);
2228 return getStepVector(DL, ResVT, One);
2229}
2230
2232 const APInt &StepVal) {
2233 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2234 if (ResVT.isScalableVector())
2235 return getNode(
2236 ISD::STEP_VECTOR, DL, ResVT,
2237 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2238
2239 SmallVector<SDValue, 16> OpsStepConstants;
2240 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2241 OpsStepConstants.push_back(
2242 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2243 return getBuildVector(ResVT, DL, OpsStepConstants);
2244}
2245
2246/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2247/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2252
2254 SDValue N2, ArrayRef<int> Mask) {
2255 assert(VT.getVectorNumElements() == Mask.size() &&
2256 "Must have the same number of vector elements as mask elements!");
2257 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2258 "Invalid VECTOR_SHUFFLE");
2259
2260 // Canonicalize shuffle undef, undef -> undef
2261 if (N1.isUndef() && N2.isUndef())
2262 return getUNDEF(VT);
2263
2264 // Validate that all indices in Mask are within the range of the elements
2265 // input to the shuffle.
2266 int NElts = Mask.size();
2267 assert(llvm::all_of(Mask,
2268 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2269 "Index out of range");
2270
2271 // Copy the mask so we can do any needed cleanup.
2272 SmallVector<int, 8> MaskVec(Mask);
2273
2274 // Canonicalize shuffle v, v -> v, undef
2275 if (N1 == N2) {
2276 N2 = getUNDEF(VT);
2277 for (int i = 0; i != NElts; ++i)
2278 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2279 }
2280
2281 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2282 if (N1.isUndef())
2283 commuteShuffle(N1, N2, MaskVec);
2284
2285 if (TLI->hasVectorBlend()) {
2286 // If shuffling a splat, try to blend the splat instead. We do this here so
2287 // that even when this arises during lowering we don't have to re-handle it.
2288 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2289 BitVector UndefElements;
2290 SDValue Splat = BV->getSplatValue(&UndefElements);
2291 if (!Splat)
2292 return;
2293
2294 for (int i = 0; i < NElts; ++i) {
2295 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2296 continue;
2297
2298 // If this input comes from undef, mark it as such.
2299 if (UndefElements[MaskVec[i] - Offset]) {
2300 MaskVec[i] = -1;
2301 continue;
2302 }
2303
2304 // If we can blend a non-undef lane, use that instead.
2305 if (!UndefElements[i])
2306 MaskVec[i] = i + Offset;
2307 }
2308 };
2309 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2310 BlendSplat(N1BV, 0);
2311 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2312 BlendSplat(N2BV, NElts);
2313 }
2314
2315 // Canonicalize all index into lhs, -> shuffle lhs, undef
2316 // Canonicalize all index into rhs, -> shuffle rhs, undef
2317 bool AllLHS = true, AllRHS = true;
2318 bool N2Undef = N2.isUndef();
2319 for (int i = 0; i != NElts; ++i) {
2320 if (MaskVec[i] >= NElts) {
2321 if (N2Undef)
2322 MaskVec[i] = -1;
2323 else
2324 AllLHS = false;
2325 } else if (MaskVec[i] >= 0) {
2326 AllRHS = false;
2327 }
2328 }
2329 if (AllLHS && AllRHS)
2330 return getUNDEF(VT);
2331 if (AllLHS && !N2Undef)
2332 N2 = getUNDEF(VT);
2333 if (AllRHS) {
2334 N1 = getUNDEF(VT);
2335 commuteShuffle(N1, N2, MaskVec);
2336 }
2337 // Reset our undef status after accounting for the mask.
2338 N2Undef = N2.isUndef();
2339 // Re-check whether both sides ended up undef.
2340 if (N1.isUndef() && N2Undef)
2341 return getUNDEF(VT);
2342
2343 // If Identity shuffle return that node.
2344 bool Identity = true, AllSame = true;
2345 for (int i = 0; i != NElts; ++i) {
2346 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2347 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2348 }
2349 if (Identity && NElts)
2350 return N1;
2351
2352 // Shuffling a constant splat doesn't change the result.
2353 if (N2Undef) {
2354 SDValue V = N1;
2355
2356 // Look through any bitcasts. We check that these don't change the number
2357 // (and size) of elements and just changes their types.
2358 while (V.getOpcode() == ISD::BITCAST)
2359 V = V->getOperand(0);
2360
2361 // A splat should always show up as a build vector node.
2362 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2363 BitVector UndefElements;
2364 SDValue Splat = BV->getSplatValue(&UndefElements);
2365 // If this is a splat of an undef, shuffling it is also undef.
2366 if (Splat && Splat.isUndef())
2367 return getUNDEF(VT);
2368
2369 bool SameNumElts =
2370 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2371
2372 // We only have a splat which can skip shuffles if there is a splatted
2373 // value and no undef lanes rearranged by the shuffle.
2374 if (Splat && UndefElements.none()) {
2375 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2376 // number of elements match or the value splatted is a zero constant.
2377 if (SameNumElts || isNullConstant(Splat))
2378 return N1;
2379 }
2380
2381 // If the shuffle itself creates a splat, build the vector directly.
2382 if (AllSame && SameNumElts) {
2383 EVT BuildVT = BV->getValueType(0);
2384 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2385 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2386
2387 // We may have jumped through bitcasts, so the type of the
2388 // BUILD_VECTOR may not match the type of the shuffle.
2389 if (BuildVT != VT)
2390 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2391 return NewBV;
2392 }
2393 }
2394 }
2395
2396 SDVTList VTs = getVTList(VT);
2398 SDValue Ops[2] = { N1, N2 };
2400 for (int i = 0; i != NElts; ++i)
2401 ID.AddInteger(MaskVec[i]);
2402
2403 void* IP = nullptr;
2404 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2405 return SDValue(E, 0);
2406
2407 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2408 // SDNode doesn't have access to it. This memory will be "leaked" when
2409 // the node is deallocated, but recovered when the NodeAllocator is released.
2410 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2411 llvm::copy(MaskVec, MaskAlloc);
2412
2413 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2414 dl.getDebugLoc(), MaskAlloc);
2415 createOperands(N, Ops);
2416
2417 CSEMap.InsertNode(N, IP);
2418 InsertNode(N);
2419 SDValue V = SDValue(N, 0);
2420 NewSDValueDbgMsg(V, "Creating new node: ", this);
2421 return V;
2422}
2423
2425 EVT VT = SV.getValueType(0);
2426 SmallVector<int, 8> MaskVec(SV.getMask());
2428
2429 SDValue Op0 = SV.getOperand(0);
2430 SDValue Op1 = SV.getOperand(1);
2431 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2432}
2433
2435 SDVTList VTs = getVTList(VT);
2437 AddNodeIDNode(ID, ISD::Register, VTs, {});
2438 ID.AddInteger(Reg.id());
2439 void *IP = nullptr;
2440 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2441 return SDValue(E, 0);
2442
2443 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2444 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2445 CSEMap.InsertNode(N, IP);
2446 InsertNode(N);
2447 return SDValue(N, 0);
2448}
2449
2452 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2453 ID.AddPointer(RegMask);
2454 void *IP = nullptr;
2455 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2456 return SDValue(E, 0);
2457
2458 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2459 CSEMap.InsertNode(N, IP);
2460 InsertNode(N);
2461 return SDValue(N, 0);
2462}
2463
2465 MCSymbol *Label) {
2466 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2467}
2468
2469SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2470 SDValue Root, MCSymbol *Label) {
2472 SDValue Ops[] = { Root };
2473 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2474 ID.AddPointer(Label);
2475 void *IP = nullptr;
2476 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2477 return SDValue(E, 0);
2478
2479 auto *N =
2480 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2481 createOperands(N, Ops);
2482
2483 CSEMap.InsertNode(N, IP);
2484 InsertNode(N);
2485 return SDValue(N, 0);
2486}
2487
2489 int64_t Offset, bool isTarget,
2490 unsigned TargetFlags) {
2491 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2492 SDVTList VTs = getVTList(VT);
2493
2495 AddNodeIDNode(ID, Opc, VTs, {});
2496 ID.AddPointer(BA);
2497 ID.AddInteger(Offset);
2498 ID.AddInteger(TargetFlags);
2499 void *IP = nullptr;
2500 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2501 return SDValue(E, 0);
2502
2503 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2504 CSEMap.InsertNode(N, IP);
2505 InsertNode(N);
2506 return SDValue(N, 0);
2507}
2508
2511 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2512 ID.AddPointer(V);
2513
2514 void *IP = nullptr;
2515 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2516 return SDValue(E, 0);
2517
2518 auto *N = newSDNode<SrcValueSDNode>(V);
2519 CSEMap.InsertNode(N, IP);
2520 InsertNode(N);
2521 return SDValue(N, 0);
2522}
2523
2526 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2527 ID.AddPointer(MD);
2528
2529 void *IP = nullptr;
2530 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2531 return SDValue(E, 0);
2532
2533 auto *N = newSDNode<MDNodeSDNode>(MD);
2534 CSEMap.InsertNode(N, IP);
2535 InsertNode(N);
2536 return SDValue(N, 0);
2537}
2538
2540 if (VT == V.getValueType())
2541 return V;
2542
2543 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2544}
2545
2547 unsigned SrcAS, unsigned DestAS) {
2548 SDVTList VTs = getVTList(VT);
2549 SDValue Ops[] = {Ptr};
2552 ID.AddInteger(SrcAS);
2553 ID.AddInteger(DestAS);
2554
2555 void *IP = nullptr;
2556 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2557 return SDValue(E, 0);
2558
2559 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2560 VTs, SrcAS, DestAS);
2561 createOperands(N, Ops);
2562
2563 CSEMap.InsertNode(N, IP);
2564 InsertNode(N);
2565 return SDValue(N, 0);
2566}
2567
2569 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2570}
2571
2573 UndefPoisonKind Kind) {
2574 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind))
2575 return V;
2576 return getFreeze(V);
2577}
2578
2579/// getShiftAmountOperand - Return the specified value casted to
2580/// the target's desired shift amount type.
2582 EVT OpTy = Op.getValueType();
2583 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2584 if (OpTy == ShTy || OpTy.isVector()) return Op;
2585
2586 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2587}
2588
2590 SDLoc dl(Node);
2592 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2593 EVT VT = Node->getValueType(0);
2594 SDValue Tmp1 = Node->getOperand(0);
2595 SDValue Tmp2 = Node->getOperand(1);
2596 const MaybeAlign MA(Node->getConstantOperandVal(3));
2597
2598 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2599 Tmp2, MachinePointerInfo(V));
2600 SDValue VAList = VAListLoad;
2601
2602 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2603 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2604 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2605
2606 VAList = getNode(
2607 ISD::AND, dl, VAList.getValueType(), VAList,
2608 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2609 }
2610
2611 // Increment the pointer, VAList, to the next vaarg
2612 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2613 getConstant(getDataLayout().getTypeAllocSize(
2614 VT.getTypeForEVT(*getContext())),
2615 dl, VAList.getValueType()));
2616 // Store the incremented VAList to the legalized pointer
2617 Tmp1 =
2618 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2619 // Load the actual argument out of the pointer VAList
2620 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2621}
2622
2624 SDLoc dl(Node);
2626 // This defaults to loading a pointer from the input and storing it to the
2627 // output, returning the chain.
2628 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2629 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2630 SDValue Tmp1 =
2631 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2632 Node->getOperand(2), MachinePointerInfo(VS));
2633 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2634 MachinePointerInfo(VD));
2635}
2636
2638 const DataLayout &DL = getDataLayout();
2639 Type *Ty = VT.getTypeForEVT(*getContext());
2640 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2641
2642 if (TLI->isTypeLegal(VT) || !VT.isVector())
2643 return RedAlign;
2644
2645 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2646 const Align StackAlign = TFI->getStackAlign();
2647
2648 // See if we can choose a smaller ABI alignment in cases where it's an
2649 // illegal vector type that will get broken down.
2650 if (RedAlign > StackAlign) {
2651 EVT IntermediateVT;
2652 MVT RegisterVT;
2653 unsigned NumIntermediates;
2654 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2655 NumIntermediates, RegisterVT);
2656 Ty = IntermediateVT.getTypeForEVT(*getContext());
2657 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2658 if (RedAlign2 < RedAlign)
2659 RedAlign = RedAlign2;
2660
2661 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2662 // If the stack is not realignable, the alignment should be limited to the
2663 // StackAlignment
2664 RedAlign = std::min(RedAlign, StackAlign);
2665 }
2666
2667 return RedAlign;
2668}
2669
2671 MachineFrameInfo &MFI = MF->getFrameInfo();
2672 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2673 int StackID = 0;
2674 if (Bytes.isScalable())
2675 StackID = TFI->getStackIDForScalableVectors();
2676 // The stack id gives an indication of whether the object is scalable or
2677 // not, so it's safe to pass in the minimum size here.
2678 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2679 false, nullptr, StackID);
2680 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2681}
2682
2684 Type *Ty = VT.getTypeForEVT(*getContext());
2685 Align StackAlign =
2686 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2687 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2688}
2689
2691 TypeSize VT1Size = VT1.getStoreSize();
2692 TypeSize VT2Size = VT2.getStoreSize();
2693 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2694 "Don't know how to choose the maximum size when creating a stack "
2695 "temporary");
2696 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2697 ? VT1Size
2698 : VT2Size;
2699
2700 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2701 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2702 const DataLayout &DL = getDataLayout();
2703 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2704 return CreateStackTemporary(Bytes, Align);
2705}
2706
2708 ISD::CondCode Cond, const SDLoc &dl,
2709 SDNodeFlags Flags) {
2710 EVT OpVT = N1.getValueType();
2711
2712 auto GetUndefBooleanConstant = [&]() {
2713 if (VT.getScalarType() == MVT::i1 ||
2714 TLI->getBooleanContents(OpVT) ==
2716 return getUNDEF(VT);
2717 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2718 // so we cannot use getUNDEF(). Return zero instead.
2719 return getConstant(0, dl, VT);
2720 };
2721
2722 // These setcc operations always fold.
2723 switch (Cond) {
2724 default: break;
2725 case ISD::SETFALSE:
2726 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2727 case ISD::SETTRUE:
2728 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2729
2730 case ISD::SETOEQ:
2731 case ISD::SETOGT:
2732 case ISD::SETOGE:
2733 case ISD::SETOLT:
2734 case ISD::SETOLE:
2735 case ISD::SETONE:
2736 case ISD::SETO:
2737 case ISD::SETUO:
2738 case ISD::SETUEQ:
2739 case ISD::SETUNE:
2740 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2741 break;
2742 }
2743
2744 if (OpVT.isInteger()) {
2745 // For EQ and NE, we can always pick a value for the undef to make the
2746 // predicate pass or fail, so we can return undef.
2747 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2748 // icmp eq/ne X, undef -> undef.
2749 if ((N1.isUndef() || N2.isUndef()) &&
2750 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2751 return GetUndefBooleanConstant();
2752
2753 // If both operands are undef, we can return undef for int comparison.
2754 // icmp undef, undef -> undef.
2755 if (N1.isUndef() && N2.isUndef())
2756 return GetUndefBooleanConstant();
2757
2758 // icmp X, X -> true/false
2759 // icmp X, undef -> true/false because undef could be X.
2760 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2761 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2762 }
2763
2765 const APInt &C2 = N2C->getAPIntValue();
2767 const APInt &C1 = N1C->getAPIntValue();
2768
2770 dl, VT, OpVT);
2771 }
2772 }
2773
2774 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2775 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2776
2777 if (N1CFP && N2CFP) {
2778 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2779 switch (Cond) {
2780 default: break;
2781 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2782 return GetUndefBooleanConstant();
2783 [[fallthrough]];
2784 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2785 OpVT);
2786 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2787 return GetUndefBooleanConstant();
2788 [[fallthrough]];
2790 R==APFloat::cmpLessThan, dl, VT,
2791 OpVT);
2792 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2793 return GetUndefBooleanConstant();
2794 [[fallthrough]];
2795 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2796 OpVT);
2797 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2798 return GetUndefBooleanConstant();
2799 [[fallthrough]];
2801 VT, OpVT);
2802 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2803 return GetUndefBooleanConstant();
2804 [[fallthrough]];
2806 R==APFloat::cmpEqual, dl, VT,
2807 OpVT);
2808 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2809 return GetUndefBooleanConstant();
2810 [[fallthrough]];
2812 R==APFloat::cmpEqual, dl, VT, OpVT);
2813 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2814 OpVT);
2815 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2816 OpVT);
2818 R==APFloat::cmpEqual, dl, VT,
2819 OpVT);
2820 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2821 OpVT);
2823 R==APFloat::cmpLessThan, dl, VT,
2824 OpVT);
2826 R==APFloat::cmpUnordered, dl, VT,
2827 OpVT);
2829 VT, OpVT);
2830 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2831 OpVT);
2832 }
2833 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2834 // Ensure that the constant occurs on the RHS.
2836 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2837 return SDValue();
2838 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2839 /*IsSignaling=*/false, Flags);
2840 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2841 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2842 // If an operand is known to be a nan (or undef that could be a nan), we can
2843 // fold it.
2844 // Choosing NaN for the undef will always make unordered comparison succeed
2845 // and ordered comparison fails.
2846 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2847 switch (ISD::getUnorderedFlavor(Cond)) {
2848 default:
2849 llvm_unreachable("Unknown flavor!");
2850 case 0: // Known false.
2851 return getBoolConstant(false, dl, VT, OpVT);
2852 case 1: // Known true.
2853 return getBoolConstant(true, dl, VT, OpVT);
2854 case 2: // Undefined.
2855 return GetUndefBooleanConstant();
2856 }
2857 }
2858
2859 // Could not fold it.
2860 return SDValue();
2861}
2862
2863/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2864/// use this predicate to simplify operations downstream.
2866 unsigned BitWidth = Op.getScalarValueSizeInBits();
2868}
2869
2870// TODO: Should have argument to specify if sign bit of nan is ignorable.
2872 if (Depth >= MaxRecursionDepth)
2873 return false; // Limit search depth.
2874
2875 unsigned Opc = Op.getOpcode();
2876 switch (Opc) {
2877 case ISD::FABS:
2878 return true;
2879 case ISD::AssertNoFPClass: {
2880 FPClassTest NoFPClass =
2881 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2882
2883 const FPClassTest TestMask = fcNan | fcNegative;
2884 return (NoFPClass & TestMask) == TestMask;
2885 }
2886 case ISD::ARITH_FENCE:
2887 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2888 case ISD::FEXP:
2889 case ISD::FEXP2:
2890 case ISD::FEXP10:
2891 return Op->getFlags().hasNoNaNs();
2892 case ISD::FMINNUM:
2893 case ISD::FMINNUM_IEEE:
2894 case ISD::FMINIMUM:
2895 case ISD::FMINIMUMNUM:
2896 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2897 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2898 case ISD::FMAXNUM:
2899 case ISD::FMAXNUM_IEEE:
2900 case ISD::FMAXIMUM:
2901 case ISD::FMAXIMUMNUM:
2902 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2903 // is sufficient.
2904 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2905 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2906 default:
2907 return false;
2908 }
2909
2910 llvm_unreachable("covered opcode switch");
2911}
2912
2913/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2914/// this predicate to simplify operations downstream. Mask is known to be zero
2915/// for bits that V cannot have.
2917 unsigned Depth) const {
2918 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2919}
2920
2921/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2922/// DemandedElts. We use this predicate to simplify operations downstream.
2923/// Mask is known to be zero for bits that V cannot have.
2925 const APInt &DemandedElts,
2926 unsigned Depth) const {
2927 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2928}
2929
2930/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2931/// DemandedElts. We use this predicate to simplify operations downstream.
2933 unsigned Depth /* = 0 */) const {
2934 return computeKnownBits(V, DemandedElts, Depth).isZero();
2935}
2936
2937/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2939 unsigned Depth) const {
2940 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2941}
2942
2944 const APInt &DemandedElts,
2945 unsigned Depth) const {
2946 EVT VT = Op.getValueType();
2947 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2948
2949 unsigned NumElts = VT.getVectorNumElements();
2950 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2951
2952 APInt KnownZeroElements = APInt::getZero(NumElts);
2953 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2954 if (!DemandedElts[EltIdx])
2955 continue; // Don't query elements that are not demanded.
2956 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2957 if (MaskedVectorIsZero(Op, Mask, Depth))
2958 KnownZeroElements.setBit(EltIdx);
2959 }
2960 return KnownZeroElements;
2961}
2962
2963/// isSplatValue - Return true if the vector V has the same value
2964/// across all DemandedElts. For scalable vectors, we don't know the
2965/// number of lanes at compile time. Instead, we use a 1 bit APInt
2966/// to represent a conservative value for all lanes; that is, that
2967/// one bit value is implicitly splatted across all lanes.
2968bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2969 APInt &UndefElts, unsigned Depth) const {
2970 unsigned Opcode = V.getOpcode();
2971 EVT VT = V.getValueType();
2972 assert(VT.isVector() && "Vector type expected");
2973 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2974 "scalable demanded bits are ignored");
2975
2976 if (!DemandedElts)
2977 return false; // No demanded elts, better to assume we don't know anything.
2978
2979 if (Depth >= MaxRecursionDepth)
2980 return false; // Limit search depth.
2981
2982 // Deal with some common cases here that work for both fixed and scalable
2983 // vector types.
2984 switch (Opcode) {
2985 case ISD::SPLAT_VECTOR:
2986 UndefElts = V.getOperand(0).isUndef()
2987 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2988 : APInt(DemandedElts.getBitWidth(), 0);
2989 return true;
2990 case ISD::ADD:
2991 case ISD::SUB:
2992 case ISD::AND:
2993 case ISD::XOR:
2994 case ISD::OR: {
2995 APInt UndefLHS, UndefRHS;
2996 SDValue LHS = V.getOperand(0);
2997 SDValue RHS = V.getOperand(1);
2998 // Only recognize splats with the same demanded undef elements for both
2999 // operands, otherwise we might fail to handle binop-specific undef
3000 // handling.
3001 // e.g. (and undef, 0) -> 0 etc.
3002 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
3003 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
3004 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
3005 UndefElts = UndefLHS | UndefRHS;
3006 return true;
3007 }
3008 return false;
3009 }
3010 case ISD::ABS:
3012 case ISD::TRUNCATE:
3013 case ISD::SIGN_EXTEND:
3014 case ISD::ZERO_EXTEND:
3015 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3016 default:
3017 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3018 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3019 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3020 Depth);
3021 break;
3022 }
3023
3024 // We don't support other cases than those above for scalable vectors at
3025 // the moment.
3026 if (VT.isScalableVector())
3027 return false;
3028
3029 unsigned NumElts = VT.getVectorNumElements();
3030 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3031 UndefElts = APInt::getZero(NumElts);
3032
3033 switch (Opcode) {
3034 case ISD::BUILD_VECTOR: {
3035 SDValue Scl;
3036 for (unsigned i = 0; i != NumElts; ++i) {
3037 SDValue Op = V.getOperand(i);
3038 if (Op.isUndef()) {
3039 UndefElts.setBit(i);
3040 continue;
3041 }
3042 if (!DemandedElts[i])
3043 continue;
3044 if (Scl && Scl != Op)
3045 return false;
3046 Scl = Op;
3047 }
3048 return true;
3049 }
3050 case ISD::VECTOR_SHUFFLE: {
3051 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3052 APInt DemandedLHS = APInt::getZero(NumElts);
3053 APInt DemandedRHS = APInt::getZero(NumElts);
3054 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3055 for (int i = 0; i != (int)NumElts; ++i) {
3056 int M = Mask[i];
3057 if (M < 0) {
3058 UndefElts.setBit(i);
3059 continue;
3060 }
3061 if (!DemandedElts[i])
3062 continue;
3063 if (M < (int)NumElts)
3064 DemandedLHS.setBit(M);
3065 else
3066 DemandedRHS.setBit(M - NumElts);
3067 }
3068
3069 // If we aren't demanding either op, assume there's no splat.
3070 // If we are demanding both ops, assume there's no splat.
3071 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3072 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3073 return false;
3074
3075 // See if the demanded elts of the source op is a splat or we only demand
3076 // one element, which should always be a splat.
3077 // TODO: Handle source ops splats with undefs.
3078 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3079 APInt SrcUndefs;
3080 return (SrcElts.popcount() == 1) ||
3081 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3082 (SrcElts & SrcUndefs).isZero());
3083 };
3084 if (!DemandedLHS.isZero())
3085 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3086 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3087 }
3089 // Offset the demanded elts by the subvector index.
3090 SDValue Src = V.getOperand(0);
3091 // We don't support scalable vectors at the moment.
3092 if (Src.getValueType().isScalableVector())
3093 return false;
3094 uint64_t Idx = V.getConstantOperandVal(1);
3095 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3096 APInt UndefSrcElts;
3097 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3098 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3099 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3100 return true;
3101 }
3102 break;
3103 }
3107 // Widen the demanded elts by the src element count.
3108 SDValue Src = V.getOperand(0);
3109 // We don't support scalable vectors at the moment.
3110 if (Src.getValueType().isScalableVector())
3111 return false;
3112 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3113 APInt UndefSrcElts;
3114 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3115 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3116 UndefElts = UndefSrcElts.trunc(NumElts);
3117 return true;
3118 }
3119 break;
3120 }
3121 case ISD::BITCAST: {
3122 SDValue Src = V.getOperand(0);
3123 EVT SrcVT = Src.getValueType();
3124 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3125 unsigned BitWidth = VT.getScalarSizeInBits();
3126
3127 // Ignore bitcasts from unsupported types.
3128 // TODO: Add fp support?
3129 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3130 break;
3131
3132 // Bitcast 'small element' vector to 'large element' vector.
3133 if ((BitWidth % SrcBitWidth) == 0) {
3134 // See if each sub element is a splat.
3135 unsigned Scale = BitWidth / SrcBitWidth;
3136 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3137 APInt ScaledDemandedElts =
3138 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3139 for (unsigned I = 0; I != Scale; ++I) {
3140 APInt SubUndefElts;
3141 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3142 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3143 SubDemandedElts &= ScaledDemandedElts;
3144 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3145 return false;
3146 // TODO: Add support for merging sub undef elements.
3147 if (!SubUndefElts.isZero())
3148 return false;
3149 }
3150 return true;
3151 }
3152 break;
3153 }
3154 }
3155
3156 return false;
3157}
3158
3159/// Helper wrapper to main isSplatValue function.
3160bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3161 EVT VT = V.getValueType();
3162 assert(VT.isVector() && "Vector type expected");
3163
3164 APInt UndefElts;
3165 // Since the number of lanes in a scalable vector is unknown at compile time,
3166 // we track one bit which is implicitly broadcast to all lanes. This means
3167 // that all lanes in a scalable vector are considered demanded.
3168 APInt DemandedElts
3170 return isSplatValue(V, DemandedElts, UndefElts) &&
3171 (AllowUndefs || !UndefElts);
3172}
3173
3176
3177 EVT VT = V.getValueType();
3178 unsigned Opcode = V.getOpcode();
3179 switch (Opcode) {
3180 default: {
3181 APInt UndefElts;
3182 // Since the number of lanes in a scalable vector is unknown at compile time,
3183 // we track one bit which is implicitly broadcast to all lanes. This means
3184 // that all lanes in a scalable vector are considered demanded.
3185 APInt DemandedElts
3187
3188 if (isSplatValue(V, DemandedElts, UndefElts)) {
3189 if (VT.isScalableVector()) {
3190 // DemandedElts and UndefElts are ignored for scalable vectors, since
3191 // the only supported cases are SPLAT_VECTOR nodes.
3192 SplatIdx = 0;
3193 } else {
3194 // Handle case where all demanded elements are UNDEF.
3195 if (DemandedElts.isSubsetOf(UndefElts)) {
3196 SplatIdx = 0;
3197 return getUNDEF(VT);
3198 }
3199 SplatIdx = (UndefElts & DemandedElts).countr_one();
3200 }
3201 return V;
3202 }
3203 break;
3204 }
3205 case ISD::SPLAT_VECTOR:
3206 SplatIdx = 0;
3207 return V;
3208 case ISD::VECTOR_SHUFFLE: {
3209 assert(!VT.isScalableVector());
3210 // Check if this is a shuffle node doing a splat.
3211 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3212 // getTargetVShiftNode currently struggles without the splat source.
3213 auto *SVN = cast<ShuffleVectorSDNode>(V);
3214 if (!SVN->isSplat())
3215 break;
3216 int Idx = SVN->getSplatIndex();
3217 int NumElts = V.getValueType().getVectorNumElements();
3218 SplatIdx = Idx % NumElts;
3219 return V.getOperand(Idx / NumElts);
3220 }
3221 }
3222
3223 return SDValue();
3224}
3225
3227 int SplatIdx;
3228 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3229 EVT SVT = SrcVector.getValueType().getScalarType();
3230 EVT LegalSVT = SVT;
3231 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3232 if (!SVT.isInteger())
3233 return SDValue();
3234 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3235 if (LegalSVT.bitsLT(SVT))
3236 return SDValue();
3237 }
3238 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3239 }
3240 return SDValue();
3241}
3242
3243std::optional<ConstantRange>
3245 unsigned Depth) const {
3246 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3247 V.getOpcode() == ISD::SRA) &&
3248 "Unknown shift node");
3249 // Shifting more than the bitwidth is not valid.
3250 unsigned BitWidth = V.getScalarValueSizeInBits();
3251
3252 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3253 const APInt &ShAmt = Cst->getAPIntValue();
3254 if (ShAmt.uge(BitWidth))
3255 return std::nullopt;
3256 return ConstantRange(ShAmt);
3257 }
3258
3259 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3260 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3261 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3262 if (!DemandedElts[i])
3263 continue;
3264 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3265 if (!SA) {
3266 MinAmt = MaxAmt = nullptr;
3267 break;
3268 }
3269 const APInt &ShAmt = SA->getAPIntValue();
3270 if (ShAmt.uge(BitWidth))
3271 return std::nullopt;
3272 if (!MinAmt || MinAmt->ugt(ShAmt))
3273 MinAmt = &ShAmt;
3274 if (!MaxAmt || MaxAmt->ult(ShAmt))
3275 MaxAmt = &ShAmt;
3276 }
3277 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3278 "Failed to find matching min/max shift amounts");
3279 if (MinAmt && MaxAmt)
3280 return ConstantRange(*MinAmt, *MaxAmt + 1);
3281 }
3282
3283 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3284 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3285 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3286 if (KnownAmt.getMaxValue().ult(BitWidth))
3287 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3288
3289 return std::nullopt;
3290}
3291
3292std::optional<unsigned>
3294 unsigned Depth) const {
3295 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3296 V.getOpcode() == ISD::SRA) &&
3297 "Unknown shift node");
3298 if (std::optional<ConstantRange> AmtRange =
3299 getValidShiftAmountRange(V, DemandedElts, Depth))
3300 if (const APInt *ShAmt = AmtRange->getSingleElement())
3301 return ShAmt->getZExtValue();
3302 return std::nullopt;
3303}
3304
3305std::optional<unsigned>
3307 APInt DemandedElts = getDemandAllEltsMask(V);
3308 return getValidShiftAmount(V, DemandedElts, Depth);
3309}
3310
3311std::optional<unsigned>
3313 unsigned Depth) const {
3314 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3315 V.getOpcode() == ISD::SRA) &&
3316 "Unknown shift node");
3317 if (std::optional<ConstantRange> AmtRange =
3318 getValidShiftAmountRange(V, DemandedElts, Depth))
3319 return AmtRange->getUnsignedMin().getZExtValue();
3320 return std::nullopt;
3321}
3322
3323std::optional<unsigned>
3325 APInt DemandedElts = getDemandAllEltsMask(V);
3326 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3327}
3328
3329std::optional<unsigned>
3331 unsigned Depth) const {
3332 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3333 V.getOpcode() == ISD::SRA) &&
3334 "Unknown shift node");
3335 if (std::optional<ConstantRange> AmtRange =
3336 getValidShiftAmountRange(V, DemandedElts, Depth))
3337 return AmtRange->getUnsignedMax().getZExtValue();
3338 return std::nullopt;
3339}
3340
3341std::optional<unsigned>
3343 APInt DemandedElts = getDemandAllEltsMask(V);
3344 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3345}
3346
3347/// Determine which bits of Op are known to be either zero or one and return
3348/// them in Known. For vectors, the known bits are those that are shared by
3349/// every vector element.
3351 APInt DemandedElts = getDemandAllEltsMask(Op);
3352 return computeKnownBits(Op, DemandedElts, Depth);
3353}
3354
3355/// Determine which bits of Op are known to be either zero or one and return
3356/// them in Known. The DemandedElts argument allows us to only collect the known
3357/// bits that are shared by the requested vector elements.
3359 unsigned Depth) const {
3360 unsigned BitWidth = Op.getScalarValueSizeInBits();
3361
3362 KnownBits Known(BitWidth); // Don't know anything.
3363
3364 if (auto OptAPInt = Op->bitcastToAPInt()) {
3365 // We know all of the bits for a constant!
3366 return KnownBits::makeConstant(*std::move(OptAPInt));
3367 }
3368
3369 if (Depth >= MaxRecursionDepth)
3370 return Known; // Limit search depth.
3371
3372 KnownBits Known2;
3373 unsigned NumElts = DemandedElts.getBitWidth();
3374 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3375 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3376 assert((!Op.getValueType().isFixedLengthVector() ||
3377 NumElts == Op.getValueType().getVectorNumElements()) &&
3378 "Unexpected vector size");
3379
3380 if (!DemandedElts)
3381 return Known; // No demanded elts, better to assume we don't know anything.
3382
3383 unsigned Opcode = Op.getOpcode();
3384 switch (Opcode) {
3385 case ISD::MERGE_VALUES:
3386 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3387 Depth + 1);
3388 case ISD::SPLAT_VECTOR: {
3389 SDValue SrcOp = Op.getOperand(0);
3390 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3391 "Expected SPLAT_VECTOR implicit truncation");
3392 // Implicitly truncate the bits to match the official semantics of
3393 // SPLAT_VECTOR.
3395 break;
3396 }
3398 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3399 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3400 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3401 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3402 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3403 }
3404 break;
3405 }
3406 case ISD::STEP_VECTOR: {
3407 const APInt &Step = Op.getConstantOperandAPInt(0);
3408
3409 if (Step.isPowerOf2())
3410 Known.Zero.setLowBits(Step.logBase2());
3411
3413
3414 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3415 break;
3416 const APInt MinNumElts =
3417 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3418
3419 bool Overflow;
3420 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3422 .umul_ov(MinNumElts, Overflow);
3423 if (Overflow)
3424 break;
3425
3426 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3427 if (Overflow)
3428 break;
3429
3430 Known.Zero.setHighBits(MaxValue.countl_zero());
3431 break;
3432 }
3433 case ISD::BUILD_VECTOR:
3434 assert(!Op.getValueType().isScalableVector());
3435 // Collect the known bits that are shared by every demanded vector element.
3436 Known.setAllConflict();
3437 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3438 if (!DemandedElts[i])
3439 continue;
3440
3441 SDValue SrcOp = Op.getOperand(i);
3442 Known2 = computeKnownBits(SrcOp, Depth + 1);
3443
3444 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3445 if (SrcOp.getValueSizeInBits() != BitWidth) {
3446 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3447 "Expected BUILD_VECTOR implicit truncation");
3448 Known2 = Known2.trunc(BitWidth);
3449 }
3450
3451 // Known bits are the values that are shared by every demanded element.
3452 Known = Known.intersectWith(Known2);
3453
3454 // If we don't know any bits, early out.
3455 if (Known.isUnknown())
3456 break;
3457 }
3458 break;
3459 case ISD::VECTOR_COMPRESS: {
3460 SDValue Vec = Op.getOperand(0);
3461 SDValue PassThru = Op.getOperand(2);
3462 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3463 // If we don't know any bits, early out.
3464 if (Known.isUnknown())
3465 break;
3466 Known2 = computeKnownBits(Vec, Depth + 1);
3467 Known = Known.intersectWith(Known2);
3468 break;
3469 }
3470 case ISD::VECTOR_SHUFFLE: {
3471 assert(!Op.getValueType().isScalableVector());
3472 // Collect the known bits that are shared by every vector element referenced
3473 // by the shuffle.
3474 APInt DemandedLHS, DemandedRHS;
3476 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3477 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3478 DemandedLHS, DemandedRHS))
3479 break;
3480
3481 // Known bits are the values that are shared by every demanded element.
3482 Known.setAllConflict();
3483 if (!!DemandedLHS) {
3484 SDValue LHS = Op.getOperand(0);
3485 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3486 Known = Known.intersectWith(Known2);
3487 }
3488 // If we don't know any bits, early out.
3489 if (Known.isUnknown())
3490 break;
3491 if (!!DemandedRHS) {
3492 SDValue RHS = Op.getOperand(1);
3493 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3494 Known = Known.intersectWith(Known2);
3495 }
3496 break;
3497 }
3498 case ISD::VSCALE: {
3500 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3502 break;
3503 }
3504 case ISD::CONCAT_VECTORS: {
3505 if (Op.getValueType().isScalableVector())
3506 break;
3507 // Split DemandedElts and test each of the demanded subvectors.
3508 Known.setAllConflict();
3509 EVT SubVectorVT = Op.getOperand(0).getValueType();
3510 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3511 unsigned NumSubVectors = Op.getNumOperands();
3512 for (unsigned i = 0; i != NumSubVectors; ++i) {
3513 APInt DemandedSub =
3514 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3515 if (!!DemandedSub) {
3516 SDValue Sub = Op.getOperand(i);
3517 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3518 Known = Known.intersectWith(Known2);
3519 }
3520 // If we don't know any bits, early out.
3521 if (Known.isUnknown())
3522 break;
3523 }
3524 break;
3525 }
3526 case ISD::INSERT_SUBVECTOR: {
3527 if (Op.getValueType().isScalableVector())
3528 break;
3529 // Demand any elements from the subvector and the remainder from the src its
3530 // inserted into.
3531 SDValue Src = Op.getOperand(0);
3532 SDValue Sub = Op.getOperand(1);
3533 uint64_t Idx = Op.getConstantOperandVal(2);
3534 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3535 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3536 APInt DemandedSrcElts = DemandedElts;
3537 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3538
3539 Known.setAllConflict();
3540 if (!!DemandedSubElts) {
3541 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3542 if (Known.isUnknown())
3543 break; // early-out.
3544 }
3545 if (!!DemandedSrcElts) {
3546 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3547 Known = Known.intersectWith(Known2);
3548 }
3549 break;
3550 }
3552 // Offset the demanded elts by the subvector index.
3553 SDValue Src = Op.getOperand(0);
3554
3555 APInt DemandedSrcElts;
3556 if (Src.getValueType().isScalableVector())
3557 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3558 else {
3559 uint64_t Idx = Op.getConstantOperandVal(1);
3560 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3561 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3562 }
3563 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3564 break;
3565 }
3566 case ISD::SCALAR_TO_VECTOR: {
3567 if (Op.getValueType().isScalableVector())
3568 break;
3569 // We know about scalar_to_vector as much as we know about it source,
3570 // which becomes the first element of otherwise unknown vector.
3571 if (DemandedElts != 1)
3572 break;
3573
3574 SDValue N0 = Op.getOperand(0);
3575 Known = computeKnownBits(N0, Depth + 1);
3576 if (N0.getValueSizeInBits() != BitWidth)
3577 Known = Known.trunc(BitWidth);
3578
3579 break;
3580 }
3581 case ISD::BITCAST: {
3582 if (Op.getValueType().isScalableVector())
3583 break;
3584
3585 SDValue N0 = Op.getOperand(0);
3586 EVT SubVT = N0.getValueType();
3587 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3588
3589 // Ignore bitcasts from unsupported types.
3590 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3591 break;
3592
3593 // Fast handling of 'identity' bitcasts.
3594 if (BitWidth == SubBitWidth) {
3595 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3596 break;
3597 }
3598
3599 bool IsLE = getDataLayout().isLittleEndian();
3600
3601 // Bitcast 'small element' vector to 'large element' scalar/vector.
3602 if ((BitWidth % SubBitWidth) == 0) {
3603 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3604
3605 // Collect known bits for the (larger) output by collecting the known
3606 // bits from each set of sub elements and shift these into place.
3607 // We need to separately call computeKnownBits for each set of
3608 // sub elements as the knownbits for each is likely to be different.
3609 unsigned SubScale = BitWidth / SubBitWidth;
3610 APInt SubDemandedElts(NumElts * SubScale, 0);
3611 for (unsigned i = 0; i != NumElts; ++i)
3612 if (DemandedElts[i])
3613 SubDemandedElts.setBit(i * SubScale);
3614
3615 for (unsigned i = 0; i != SubScale; ++i) {
3616 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3617 Depth + 1);
3618 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3619 Known.insertBits(Known2, SubBitWidth * Shifts);
3620 }
3621 }
3622
3623 // Bitcast 'large element' scalar/vector to 'small element' vector.
3624 if ((SubBitWidth % BitWidth) == 0) {
3625 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3626
3627 // Collect known bits for the (smaller) output by collecting the known
3628 // bits from the overlapping larger input elements and extracting the
3629 // sub sections we actually care about.
3630 unsigned SubScale = SubBitWidth / BitWidth;
3631 APInt SubDemandedElts =
3632 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3633 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3634
3635 Known.setAllConflict();
3636 for (unsigned i = 0; i != NumElts; ++i)
3637 if (DemandedElts[i]) {
3638 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3639 unsigned Offset = (Shifts % SubScale) * BitWidth;
3640 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3641 // If we don't know any bits, early out.
3642 if (Known.isUnknown())
3643 break;
3644 }
3645 }
3646 break;
3647 }
3648 case ISD::AND:
3649 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3650 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3651
3652 Known &= Known2;
3653 break;
3654 case ISD::OR:
3655 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3656 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3657
3658 Known |= Known2;
3659 break;
3660 case ISD::XOR:
3661 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3662 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3663
3664 Known ^= Known2;
3665 break;
3666 case ISD::MUL: {
3667 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3668 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3669 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3670 // TODO: SelfMultiply can be poison, but not undef.
3671 if (SelfMultiply)
3672 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3673 Op.getOperand(0), DemandedElts, UndefPoisonKind::UndefOrPoison,
3674 Depth + 1);
3675 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3676
3677 // If the multiplication is known not to overflow, the product of a number
3678 // with itself is non-negative. Only do this if we didn't already computed
3679 // the opposite value for the sign bit.
3680 if (Op->getFlags().hasNoSignedWrap() &&
3681 Op.getOperand(0) == Op.getOperand(1) &&
3682 !Known.isNegative())
3683 Known.makeNonNegative();
3684 break;
3685 }
3686 case ISD::MULHU: {
3687 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3688 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3689 Known = KnownBits::mulhu(Known, Known2);
3690 break;
3691 }
3692 case ISD::MULHS: {
3693 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3694 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3695 Known = KnownBits::mulhs(Known, Known2);
3696 break;
3697 }
3698 case ISD::ABDU: {
3699 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3700 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3701 Known = KnownBits::abdu(Known, Known2);
3702 break;
3703 }
3704 case ISD::ABDS: {
3705 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3706 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3707 Known = KnownBits::abds(Known, Known2);
3708 unsigned SignBits1 =
3709 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3710 if (SignBits1 == 1)
3711 break;
3712 unsigned SignBits0 =
3713 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3714 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3715 break;
3716 }
3717 case ISD::UMUL_LOHI: {
3718 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3719 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3720 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3721 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3722 if (Op.getResNo() == 0)
3723 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3724 else
3725 Known = KnownBits::mulhu(Known, Known2);
3726 break;
3727 }
3728 case ISD::SMUL_LOHI: {
3729 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3730 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3731 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3732 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3733 if (Op.getResNo() == 0)
3734 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3735 else
3736 Known = KnownBits::mulhs(Known, Known2);
3737 break;
3738 }
3739 case ISD::AVGFLOORU: {
3740 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3741 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3742 Known = KnownBits::avgFloorU(Known, Known2);
3743 break;
3744 }
3745 case ISD::AVGCEILU: {
3746 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3747 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3748 Known = KnownBits::avgCeilU(Known, Known2);
3749 break;
3750 }
3751 case ISD::AVGFLOORS: {
3752 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3753 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3754 Known = KnownBits::avgFloorS(Known, Known2);
3755 break;
3756 }
3757 case ISD::AVGCEILS: {
3758 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3759 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3760 Known = KnownBits::avgCeilS(Known, Known2);
3761 break;
3762 }
3763 case ISD::SELECT:
3764 case ISD::VSELECT:
3765 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3766 // If we don't know any bits, early out.
3767 if (Known.isUnknown())
3768 break;
3769 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3770
3771 // Only known if known in both the LHS and RHS.
3772 Known = Known.intersectWith(Known2);
3773 break;
3774 case ISD::SELECT_CC:
3775 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3776 // If we don't know any bits, early out.
3777 if (Known.isUnknown())
3778 break;
3779 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3780
3781 // Only known if known in both the LHS and RHS.
3782 Known = Known.intersectWith(Known2);
3783 break;
3784 case ISD::SMULO:
3785 case ISD::UMULO:
3786 if (Op.getResNo() != 1)
3787 break;
3788 // The boolean result conforms to getBooleanContents.
3789 // If we know the result of a setcc has the top bits zero, use this info.
3790 // We know that we have an integer-based boolean since these operations
3791 // are only available for integer.
3792 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3794 BitWidth > 1)
3795 Known.Zero.setBitsFrom(1);
3796 break;
3797 case ISD::SETCC:
3798 case ISD::SETCCCARRY:
3799 case ISD::STRICT_FSETCC:
3800 case ISD::STRICT_FSETCCS: {
3801 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3802 // If we know the result of a setcc has the top bits zero, use this info.
3803 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3805 BitWidth > 1)
3806 Known.Zero.setBitsFrom(1);
3807 break;
3808 }
3809 case ISD::SHL: {
3810 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3811 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3812
3813 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3814 bool NSW = Op->getFlags().hasNoSignedWrap();
3815
3816 bool ShAmtNonZero = Known2.isNonZero();
3817
3818 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3819
3820 // Minimum shift low bits are known zero.
3821 if (std::optional<unsigned> ShMinAmt =
3822 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3823 Known.Zero.setLowBits(*ShMinAmt);
3824 break;
3825 }
3826 case ISD::SRL:
3827 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3828 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3829 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3830 Op->getFlags().hasExact());
3831
3832 // Minimum shift high bits are known zero.
3833 if (std::optional<unsigned> ShMinAmt =
3834 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3835 Known.Zero.setHighBits(*ShMinAmt);
3836 break;
3837 case ISD::SRA:
3838 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3839 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3840 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3841 Op->getFlags().hasExact());
3842 break;
3843 case ISD::ROTL:
3844 case ISD::ROTR:
3845 if (ConstantSDNode *C =
3846 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3847 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3848
3849 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3850
3851 // Canonicalize to ROTR.
3852 if (Opcode == ISD::ROTL && Amt != 0)
3853 Amt = BitWidth - Amt;
3854
3855 Known.Zero = Known.Zero.rotr(Amt);
3856 Known.One = Known.One.rotr(Amt);
3857 }
3858 break;
3859 case ISD::FSHL:
3860 case ISD::FSHR:
3861 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3862 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3863
3864 // For fshl, 0-shift returns the 1st arg.
3865 // For fshr, 0-shift returns the 2nd arg.
3866 if (Amt == 0) {
3867 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3868 DemandedElts, Depth + 1);
3869 break;
3870 }
3871
3872 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3873 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3874 const APInt ShAmt(BitWidth, Amt);
3875 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3876 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3877 Known = Opcode == ISD::FSHL ? KnownBits::fshl(Known, Known2, ShAmt)
3878 : KnownBits::fshr(Known, Known2, ShAmt);
3879 }
3880 break;
3881 case ISD::SHL_PARTS:
3882 case ISD::SRA_PARTS:
3883 case ISD::SRL_PARTS: {
3884 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3885
3886 // Collect lo/hi source values and concatenate.
3887 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3888 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3889 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3890 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3891 Known = Known2.concat(Known);
3892
3893 // Collect shift amount.
3894 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3895
3896 if (Opcode == ISD::SHL_PARTS)
3897 Known = KnownBits::shl(Known, Known2);
3898 else if (Opcode == ISD::SRA_PARTS)
3899 Known = KnownBits::ashr(Known, Known2);
3900 else // if (Opcode == ISD::SRL_PARTS)
3901 Known = KnownBits::lshr(Known, Known2);
3902
3903 // TODO: Minimum shift low/high bits are known zero.
3904
3905 if (Op.getResNo() == 0)
3906 Known = Known.extractBits(LoBits, 0);
3907 else
3908 Known = Known.extractBits(HiBits, LoBits);
3909 break;
3910 }
3912 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3913 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3914 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3915 break;
3916 }
3917 case ISD::CTTZ:
3918 case ISD::CTTZ_ZERO_POISON: {
3919 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3920 // If we have a known 1, its position is our upper bound.
3921 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3922 unsigned LowBits = llvm::bit_width(PossibleTZ);
3923 Known.Zero.setBitsFrom(LowBits);
3924 break;
3925 }
3926 case ISD::CTLZ:
3927 case ISD::CTLZ_ZERO_POISON: {
3928 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3929 // If we have a known 1, its position is our upper bound.
3930 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3931 unsigned LowBits = llvm::bit_width(PossibleLZ);
3932 Known.Zero.setBitsFrom(LowBits);
3933 break;
3934 }
3935 case ISD::CTLS: {
3936 unsigned MinRedundantSignBits =
3937 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3938 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3940 Known = Range.toKnownBits();
3941 break;
3942 }
3943 case ISD::CTPOP: {
3944 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3945 // If we know some of the bits are zero, they can't be one.
3946 unsigned PossibleOnes = Known2.countMaxPopulation();
3947 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3948 break;
3949 }
3950 case ISD::PARITY: {
3951 // Parity returns 0 everywhere but the LSB.
3952 Known.Zero.setBitsFrom(1);
3953 break;
3954 }
3955 case ISD::PDEP: {
3956 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3957 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3958 Known = KnownBits::pdep(Known2, Known);
3959 break;
3960 }
3961 case ISD::PEXT: {
3962 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3963 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3964 Known = KnownBits::pext(Known2, Known);
3965 break;
3966 }
3967 case ISD::CLMUL: {
3968 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3969 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3970 Known = KnownBits::clmul(Known, Known2);
3971 break;
3972 }
3973 case ISD::MGATHER:
3974 case ISD::MLOAD: {
3975 ISD::LoadExtType ETy =
3976 (Opcode == ISD::MGATHER)
3977 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3978 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3979 if (ETy == ISD::ZEXTLOAD) {
3980 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3981 KnownBits Known0(MemVT.getScalarSizeInBits());
3982 return Known0.zext(BitWidth);
3983 }
3984 break;
3985 }
3986 case ISD::LOAD: {
3988 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3989 if (ISD::isNON_EXTLoad(LD) && Cst) {
3990 // Determine any common known bits from the loaded constant pool value.
3991 Type *CstTy = Cst->getType();
3992 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3993 !Op.getValueType().isScalableVector()) {
3994 // If its a vector splat, then we can (quickly) reuse the scalar path.
3995 // NOTE: We assume all elements match and none are UNDEF.
3996 if (CstTy->isVectorTy()) {
3997 if (const Constant *Splat = Cst->getSplatValue()) {
3998 Cst = Splat;
3999 CstTy = Cst->getType();
4000 }
4001 }
4002 // TODO - do we need to handle different bitwidths?
4003 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
4004 // Iterate across all vector elements finding common known bits.
4005 Known.setAllConflict();
4006 for (unsigned i = 0; i != NumElts; ++i) {
4007 if (!DemandedElts[i])
4008 continue;
4009 if (Constant *Elt = Cst->getAggregateElement(i)) {
4010 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4011 const APInt &Value = CInt->getValue();
4012 Known.One &= Value;
4013 Known.Zero &= ~Value;
4014 continue;
4015 }
4016 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4017 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4018 Known.One &= Value;
4019 Known.Zero &= ~Value;
4020 continue;
4021 }
4022 }
4023 Known.One.clearAllBits();
4024 Known.Zero.clearAllBits();
4025 break;
4026 }
4027 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4028 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4029 Known = KnownBits::makeConstant(CInt->getValue());
4030 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4031 Known =
4032 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4033 }
4034 }
4035 }
4036 } else if (Op.getResNo() == 0) {
4037 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4038 KnownBits KnownScalarMemory(ScalarMemorySize);
4039 if (const MDNode *MD = LD->getRanges())
4040 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4041
4042 // Extend the Known bits from memory to the size of the scalar result.
4043 if (ISD::isZEXTLoad(Op.getNode()))
4044 Known = KnownScalarMemory.zext(BitWidth);
4045 else if (ISD::isSEXTLoad(Op.getNode()))
4046 Known = KnownScalarMemory.sext(BitWidth);
4047 else if (ISD::isEXTLoad(Op.getNode()))
4048 Known = KnownScalarMemory.anyext(BitWidth);
4049 else
4050 Known = KnownScalarMemory;
4051 assert(Known.getBitWidth() == BitWidth);
4052 return Known;
4053 }
4054 break;
4055 }
4057 if (Op.getValueType().isScalableVector())
4058 break;
4059 EVT InVT = Op.getOperand(0).getValueType();
4060 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4061 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4062 Known = Known.zext(BitWidth);
4063 break;
4064 }
4065 case ISD::ZERO_EXTEND: {
4066 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4067 Known = Known.zext(BitWidth);
4068 break;
4069 }
4071 if (Op.getValueType().isScalableVector())
4072 break;
4073 EVT InVT = Op.getOperand(0).getValueType();
4074 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4075 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4076 // If the sign bit is known to be zero or one, then sext will extend
4077 // it to the top bits, else it will just zext.
4078 Known = Known.sext(BitWidth);
4079 break;
4080 }
4081 case ISD::SIGN_EXTEND: {
4082 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4083 // If the sign bit is known to be zero or one, then sext will extend
4084 // it to the top bits, else it will just zext.
4085 Known = Known.sext(BitWidth);
4086 break;
4087 }
4089 if (Op.getValueType().isScalableVector())
4090 break;
4091 EVT InVT = Op.getOperand(0).getValueType();
4092 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4093 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4094 Known = Known.anyext(BitWidth);
4095 break;
4096 }
4097 case ISD::ANY_EXTEND: {
4098 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4099 Known = Known.anyext(BitWidth);
4100 break;
4101 }
4102 case ISD::TRUNCATE: {
4103 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4104 Known = Known.trunc(BitWidth);
4105 break;
4106 }
4107 case ISD::TRUNCATE_SSAT_S: {
4108 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4109 Known = Known.truncSSat(BitWidth);
4110 break;
4111 }
4112 case ISD::TRUNCATE_SSAT_U: {
4113 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4114 Known = Known.truncSSatU(BitWidth);
4115 break;
4116 }
4117 case ISD::TRUNCATE_USAT_U: {
4118 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4119 Known = Known.truncUSat(BitWidth);
4120 break;
4121 }
4122 case ISD::AssertZext: {
4123 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4125 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4126 Known.Zero |= (~InMask);
4127 Known.One &= (~Known.Zero);
4128 break;
4129 }
4130 case ISD::AssertAlign: {
4131 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4132 assert(LogOfAlign != 0);
4133
4134 // TODO: Should use maximum with source
4135 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4136 // well as clearing one bits.
4137 Known.Zero.setLowBits(LogOfAlign);
4138 Known.One.clearLowBits(LogOfAlign);
4139 break;
4140 }
4141 case ISD::AssertNoFPClass: {
4142 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4143
4144 FPClassTest NoFPClass =
4145 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4146 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4147 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4148 // Cannot be negative.
4149 Known.makeNonNegative();
4150 }
4151
4152 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4153 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4154 // Cannot be positive.
4155 Known.makeNegative();
4156 }
4157
4158 break;
4159 }
4160 case ISD::FABS:
4161 // fabs clears the sign bit
4162 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4163 Known.makeNonNegative();
4164 break;
4165 case ISD::FGETSIGN:
4166 // All bits are zero except the low bit.
4167 Known.Zero.setBitsFrom(1);
4168 break;
4169 case ISD::ADD: {
4170 SDNodeFlags Flags = Op.getNode()->getFlags();
4171 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4172 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4173 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4175 Op.getOperand(0), DemandedElts,
4177 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4178 Flags.hasNoUnsignedWrap(), SelfAdd);
4179 break;
4180 }
4181 case ISD::SUB: {
4182 SDNodeFlags Flags = Op.getNode()->getFlags();
4183 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4184 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4185 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4186 Flags.hasNoUnsignedWrap());
4187 break;
4188 }
4189 case ISD::USUBO:
4190 case ISD::SSUBO:
4191 case ISD::USUBO_CARRY:
4192 case ISD::SSUBO_CARRY:
4193 if (Op.getResNo() == 1) {
4194 // If we know the result of a setcc has the top bits zero, use this info.
4195 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4197 BitWidth > 1)
4198 Known.Zero.setBitsFrom(1);
4199 break;
4200 }
4201 [[fallthrough]];
4202 case ISD::SUBC: {
4203 assert(Op.getResNo() == 0 &&
4204 "We only compute knownbits for the difference here.");
4205
4206 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4207 KnownBits Borrow(1);
4208 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4209 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4210 // Borrow has bit width 1
4211 Borrow = Borrow.trunc(1);
4212 } else {
4213 Borrow.setAllZero();
4214 }
4215
4216 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4217 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4218 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4219 break;
4220 }
4221 case ISD::UADDO:
4222 case ISD::SADDO:
4223 case ISD::UADDO_CARRY:
4224 case ISD::SADDO_CARRY:
4225 if (Op.getResNo() == 1) {
4226 // If we know the result of a setcc has the top bits zero, use this info.
4227 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4229 BitWidth > 1)
4230 Known.Zero.setBitsFrom(1);
4231 break;
4232 }
4233 [[fallthrough]];
4234 case ISD::ADDC:
4235 case ISD::ADDE: {
4236 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4237
4238 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4239 KnownBits Carry(1);
4240 if (Opcode == ISD::ADDE)
4241 // Can't track carry from glue, set carry to unknown.
4242 Carry.resetAll();
4243 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4244 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4245 // Carry has bit width 1
4246 Carry = Carry.trunc(1);
4247 } else {
4248 Carry.setAllZero();
4249 }
4250
4251 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4252 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4253 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4254 break;
4255 }
4256 case ISD::UDIV: {
4257 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4258 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4259 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4260 break;
4261 }
4262 case ISD::SDIV: {
4263 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4264 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4265 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4266 break;
4267 }
4268 case ISD::SREM: {
4269 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4270 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4271 Known = KnownBits::srem(Known, Known2);
4272 break;
4273 }
4274 case ISD::UREM: {
4275 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4276 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4277 Known = KnownBits::urem(Known, Known2);
4278 break;
4279 }
4280 case ISD::EXTRACT_ELEMENT: {
4281 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4282 const unsigned Index = Op.getConstantOperandVal(1);
4283 const unsigned EltBitWidth = Op.getValueSizeInBits();
4284
4285 // Remove low part of known bits mask
4286 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4287 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4288
4289 // Remove high part of known bit mask
4290 Known = Known.trunc(EltBitWidth);
4291 break;
4292 }
4294 SDValue InVec = Op.getOperand(0);
4295 SDValue EltNo = Op.getOperand(1);
4296 EVT VecVT = InVec.getValueType();
4297 // computeKnownBits not yet implemented for scalable vectors.
4298 if (VecVT.isScalableVector())
4299 break;
4300 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4301 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4302
4303 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4304 // anything about the extended bits.
4305 if (BitWidth > EltBitWidth)
4306 Known = Known.trunc(EltBitWidth);
4307
4308 // If we know the element index, just demand that vector element, else for
4309 // an unknown element index, ignore DemandedElts and demand them all.
4310 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4311 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4312 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4313 DemandedSrcElts =
4314 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4315
4316 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4317 if (BitWidth > EltBitWidth)
4318 Known = Known.anyext(BitWidth);
4319 break;
4320 }
4322 if (Op.getValueType().isScalableVector())
4323 break;
4324
4325 // If we know the element index, split the demand between the
4326 // source vector and the inserted element, otherwise assume we need
4327 // the original demanded vector elements and the value.
4328 SDValue InVec = Op.getOperand(0);
4329 SDValue InVal = Op.getOperand(1);
4330 SDValue EltNo = Op.getOperand(2);
4331 bool DemandedVal = true;
4332 APInt DemandedVecElts = DemandedElts;
4333 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4334 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4335 unsigned EltIdx = CEltNo->getZExtValue();
4336 DemandedVal = !!DemandedElts[EltIdx];
4337 DemandedVecElts.clearBit(EltIdx);
4338 }
4339 Known.setAllConflict();
4340 if (DemandedVal) {
4341 Known2 = computeKnownBits(InVal, Depth + 1);
4342 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4343 }
4344 if (!!DemandedVecElts) {
4345 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4346 Known = Known.intersectWith(Known2);
4347 }
4348 break;
4349 }
4350 case ISD::BITREVERSE: {
4351 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4352 Known = Known2.reverseBits();
4353 break;
4354 }
4355 case ISD::BSWAP: {
4356 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4357 Known = Known2.byteSwap();
4358 break;
4359 }
4360 case ISD::ABS:
4361 case ISD::ABS_MIN_POISON: {
4362 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4363 Known = Known2.abs();
4364 Known.Zero.setHighBits(
4365 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4366 break;
4367 }
4368 case ISD::USUBSAT: {
4369 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4370 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4371 Known = KnownBits::usub_sat(Known, Known2);
4372 break;
4373 }
4374 case ISD::UMIN: {
4375 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4376 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4377 Known = KnownBits::umin(Known, Known2);
4378 break;
4379 }
4380 case ISD::UMAX: {
4381 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4382 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4383 Known = KnownBits::umax(Known, Known2);
4384 break;
4385 }
4386 case ISD::SMIN:
4387 case ISD::SMAX: {
4388 // If we have a clamp pattern, we know that the number of sign bits will be
4389 // the minimum of the clamp min/max range.
4390 bool IsMax = (Opcode == ISD::SMAX);
4391 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4392 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4393 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4394 CstHigh =
4395 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4396 if (CstLow && CstHigh) {
4397 if (!IsMax)
4398 std::swap(CstLow, CstHigh);
4399
4400 const APInt &ValueLow = CstLow->getAPIntValue();
4401 const APInt &ValueHigh = CstHigh->getAPIntValue();
4402 if (ValueLow.sle(ValueHigh)) {
4403 unsigned LowSignBits = ValueLow.getNumSignBits();
4404 unsigned HighSignBits = ValueHigh.getNumSignBits();
4405 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4406 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4407 Known.One.setHighBits(MinSignBits);
4408 break;
4409 }
4410 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4411 Known.Zero.setHighBits(MinSignBits);
4412 break;
4413 }
4414 }
4415 }
4416
4417 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4418 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4419 if (IsMax)
4420 Known = KnownBits::smax(Known, Known2);
4421 else
4422 Known = KnownBits::smin(Known, Known2);
4423
4424 // For SMAX, if CstLow is non-negative we know the result will be
4425 // non-negative and thus all sign bits are 0.
4426 // TODO: There's an equivalent of this for smin with negative constant for
4427 // known ones.
4428 if (IsMax && CstLow) {
4429 const APInt &ValueLow = CstLow->getAPIntValue();
4430 if (ValueLow.isNonNegative()) {
4431 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4432 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4433 }
4434 }
4435
4436 break;
4437 }
4438 case ISD::UINT_TO_FP: {
4439 Known.makeNonNegative();
4440 break;
4441 }
4442 case ISD::SINT_TO_FP: {
4443 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4444 if (Known2.isNonNegative())
4445 Known.makeNonNegative();
4446 else if (Known2.isNegative())
4447 Known.makeNegative();
4448 break;
4449 }
4450 case ISD::FP_TO_UINT_SAT: {
4451 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4452 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4454 break;
4455 }
4456 case ISD::ATOMIC_LOAD: {
4457 // If we are looking at the loaded value.
4458 if (Op.getResNo() == 0) {
4459 auto *AT = cast<AtomicSDNode>(Op);
4460 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4461 KnownBits KnownScalarMemory(ScalarMemorySize);
4462 if (const MDNode *MD = AT->getRanges())
4463 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4464
4465 switch (AT->getExtensionType()) {
4466 case ISD::ZEXTLOAD:
4467 Known = KnownScalarMemory.zext(BitWidth);
4468 break;
4469 case ISD::SEXTLOAD:
4470 Known = KnownScalarMemory.sext(BitWidth);
4471 break;
4472 case ISD::EXTLOAD:
4473 switch (TLI->getExtendForAtomicOps()) {
4474 case ISD::ZERO_EXTEND:
4475 Known = KnownScalarMemory.zext(BitWidth);
4476 break;
4477 case ISD::SIGN_EXTEND:
4478 Known = KnownScalarMemory.sext(BitWidth);
4479 break;
4480 default:
4481 Known = KnownScalarMemory.anyext(BitWidth);
4482 break;
4483 }
4484 break;
4485 case ISD::NON_EXTLOAD:
4486 Known = KnownScalarMemory;
4487 break;
4488 }
4489 assert(Known.getBitWidth() == BitWidth);
4490 }
4491 break;
4492 }
4494 if (Op.getResNo() == 1) {
4495 // The boolean result conforms to getBooleanContents.
4496 // If we know the result of a setcc has the top bits zero, use this info.
4497 // We know that we have an integer-based boolean since these operations
4498 // are only available for integer.
4499 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4501 BitWidth > 1)
4502 Known.Zero.setBitsFrom(1);
4503 break;
4504 }
4505 [[fallthrough]];
4507 case ISD::ATOMIC_SWAP:
4518 case ISD::ATOMIC_LOAD_UMAX: {
4519 // If we are looking at the loaded value.
4520 if (Op.getResNo() == 0) {
4521 auto *AT = cast<AtomicSDNode>(Op);
4522 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4523
4524 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4525 Known.Zero.setBitsFrom(MemBits);
4526 }
4527 break;
4528 }
4529 case ISD::FrameIndex:
4530 case ISD::TargetFrameIndex: {
4531 const MachineFunction &MF = getMachineFunction();
4532 int FrameIdx = cast<FrameIndexSDNode>(Op)->getIndex();
4533 TLI->computeKnownBitsForStackObjectPointer(
4534 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4535 break;
4536 }
4537
4538 default:
4539 if (Opcode < ISD::BUILTIN_OP_END)
4540 break;
4541 [[fallthrough]];
4545 // Allow the target to implement this method for its nodes.
4546 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4547 break;
4548 }
4549
4550 return Known;
4551}
4552
4553/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4566
4569 // X + 0 never overflow
4570 if (isNullConstant(N1))
4571 return OFK_Never;
4572
4573 // If both operands each have at least two sign bits, the addition
4574 // cannot overflow.
4575 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4576 return OFK_Never;
4577
4578 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4579 return OFK_Sometime;
4580}
4581
4584 // X + 0 never overflow
4585 if (isNullConstant(N1))
4586 return OFK_Never;
4587
4588 // mulhi + 1 never overflow
4589 KnownBits N1Known = computeKnownBits(N1);
4590 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4591 N1Known.getMaxValue().ult(2))
4592 return OFK_Never;
4593
4594 KnownBits N0Known = computeKnownBits(N0);
4595 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4596 N0Known.getMaxValue().ult(2))
4597 return OFK_Never;
4598
4599 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4600 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4601 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4602 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4603}
4604
4607 // X - 0 never overflow
4608 if (isNullConstant(N1))
4609 return OFK_Never;
4610
4611 // If both operands each have at least two sign bits, the subtraction
4612 // cannot overflow.
4613 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4614 return OFK_Never;
4615
4616 KnownBits N0Known = computeKnownBits(N0);
4617 KnownBits N1Known = computeKnownBits(N1);
4618 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4619 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4620 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4621}
4622
4625 // X - 0 never overflow
4626 if (isNullConstant(N1))
4627 return OFK_Never;
4628
4629 ConstantRange N0Range =
4630 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4631 ConstantRange N1Range =
4632 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4633 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4634}
4635
4638 // X * 0 and X * 1 never overflow.
4639 if (isNullConstant(N1) || isOneConstant(N1))
4640 return OFK_Never;
4641
4644 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4645}
4646
4649 // X * 0 and X * 1 never overflow.
4650 if (isNullConstant(N1) || isOneConstant(N1))
4651 return OFK_Never;
4652
4653 // Get the size of the result.
4654 unsigned BitWidth = N0.getScalarValueSizeInBits();
4655
4656 // Sum of the sign bits.
4657 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4658
4659 // If we have enough sign bits, then there's no overflow.
4660 if (SignBits > BitWidth + 1)
4661 return OFK_Never;
4662
4663 if (SignBits == BitWidth + 1) {
4664 // The overflow occurs when the true multiplication of the
4665 // the operands is the minimum negative number.
4666 KnownBits N0Known = computeKnownBits(N0);
4667 KnownBits N1Known = computeKnownBits(N1);
4668 // If one of the operands is non-negative, then there's no
4669 // overflow.
4670 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4671 return OFK_Never;
4672 }
4673
4674 return OFK_Sometime;
4675}
4676
4678 unsigned Depth) const {
4679 APInt DemandedElts = getDemandAllEltsMask(Op);
4680 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4681}
4682
4684 const APInt &DemandedElts,
4685 bool ForSigned,
4686 unsigned Depth) const {
4687 EVT VT = Op.getValueType();
4688 unsigned BitWidth = VT.getScalarSizeInBits();
4689
4690 if (Depth >= MaxRecursionDepth)
4691 return ConstantRange::getFull(BitWidth);
4692
4693 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4694 return ConstantRange(C->getAPIntValue());
4695
4696 unsigned Opcode = Op.getOpcode();
4697 switch (Opcode) {
4698 case ISD::VSCALE: {
4700 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4701 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4702 }
4703 default:
4704 break;
4705 }
4706
4707 return ConstantRange::getFull(BitWidth);
4708}
4709
4712 unsigned Depth) const {
4713 APInt DemandedElts = getDemandAllEltsMask(Op);
4714 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4715 Depth);
4716}
4717
4719 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4720 unsigned Depth) const {
4721 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4723 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4726 return CR1.intersectWith(CR2, RangeType);
4727}
4728
4730 unsigned Depth) const {
4731 APInt DemandedElts = getDemandAllEltsMask(Val);
4732 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4733}
4734
4736 const APInt &DemandedElts,
4737 bool OrZero, unsigned Depth) const {
4738 if (Depth >= MaxRecursionDepth)
4739 return false; // Limit search depth.
4740
4741 EVT OpVT = Val.getValueType();
4742 unsigned BitWidth = OpVT.getScalarSizeInBits();
4743 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4744 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4745 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4746 assert(
4747 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4748 "Unexpected vector size");
4749
4750 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4751 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4752 return (OrZero && V.isZero()) || V.isPowerOf2();
4753 };
4754
4755 // Is the constant a known power of 2 or zero?
4756 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4757 return true;
4758
4759 switch (Val.getOpcode()) {
4760 case ISD::BUILD_VECTOR:
4761 // Are all operands of a build vector constant powers of two or zero?
4762 if (all_of(enumerate(Val->ops()), [&](auto P) {
4763 auto *C = dyn_cast<ConstantSDNode>(P.value());
4764 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4765 }))
4766 return true;
4767 break;
4768
4769 case ISD::SPLAT_VECTOR:
4770 // Is the operand of a splat vector a constant power of two?
4771 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4772 if (IsPowerOfTwoOrZero(C))
4773 return true;
4774 break;
4775
4777 SDValue InVec = Val.getOperand(0);
4778 SDValue EltNo = Val.getOperand(1);
4779 EVT VecVT = InVec.getValueType();
4780
4781 // Skip scalable vectors or implicit extensions.
4782 if (VecVT.isScalableVector() ||
4783 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4784 break;
4785
4786 // If we know the element index, just demand that vector element, else for
4787 // an unknown element index, ignore DemandedElts and demand them all.
4788 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4789 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4790 APInt DemandedSrcElts =
4791 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4792 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4793 : APInt::getAllOnes(NumSrcElts);
4794 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4795 }
4796
4797 case ISD::AND: {
4798 // Looking for `x & -x` pattern:
4799 // If x == 0:
4800 // x & -x -> 0
4801 // If x != 0:
4802 // x & -x -> non-zero pow2
4803 // so if we find the pattern return whether we know `x` is non-zero.
4804 SDValue X, Z;
4805 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4806 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4807 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4808 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4809 break;
4810 }
4811
4812 case ISD::SHL: {
4813 // A left-shift of a constant one will have exactly one bit set because
4814 // shifting the bit off the end is undefined.
4815 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4816 if (C && C->getAPIntValue() == 1)
4817 return true;
4818 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4819 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4820 Depth + 1);
4821 }
4822
4823 case ISD::SRL: {
4824 // A logical right-shift of a constant sign-bit will have exactly
4825 // one bit set.
4826 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4827 if (C && C->getAPIntValue().isSignMask())
4828 return true;
4829 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4830 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4831 Depth + 1);
4832 }
4833
4834 case ISD::TRUNCATE:
4835 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4836 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4837 Depth + 1);
4838
4839 case ISD::ROTL:
4840 case ISD::ROTR:
4841 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4842 Depth + 1);
4843 case ISD::BSWAP:
4844 case ISD::BITREVERSE:
4845 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4846 Depth + 1);
4847
4848 case ISD::SMIN:
4849 case ISD::SMAX:
4850 case ISD::UMIN:
4851 case ISD::UMAX:
4852 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4853 Depth + 1) &&
4854 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4855 Depth + 1);
4856
4857 case ISD::SELECT:
4858 case ISD::VSELECT:
4859 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4860 Depth + 1) &&
4861 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4862 Depth + 1);
4863
4864 case ISD::ZERO_EXTEND:
4865 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4866 Depth + 1);
4867
4868 case ISD::VSCALE:
4869 // vscale(power-of-two) is a power-of-two
4870 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4871 Depth + 1);
4872
4873 case ISD::VECTOR_SHUFFLE: {
4875 // Demanded elements with undef shuffle mask elements are unknown
4876 // - we cannot guarantee they are a power of two, so return false.
4877 APInt DemandedLHS, DemandedRHS;
4879 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4880 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4881 DemandedLHS, DemandedRHS))
4882 return false;
4883
4884 // All demanded elements from LHS must be known power of two.
4885 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4886 OrZero, Depth + 1))
4887 return false;
4888
4889 // All demanded elements from RHS must be known power of two.
4890 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4891 OrZero, Depth + 1))
4892 return false;
4893
4894 return true;
4895 }
4896 }
4897
4898 // More could be done here, though the above checks are enough
4899 // to handle some common cases.
4900 return false;
4901}
4902
4904 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4905 return C1->getValueAPF().getExactLog2Abs() >= 0;
4906
4907 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4908 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4909
4910 return false;
4911}
4912
4914 APInt DemandedElts = getDemandAllEltsMask(Op);
4915 return ComputeNumSignBits(Op, DemandedElts, Depth);
4916}
4917
4918unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4919 unsigned Depth) const {
4920 EVT VT = Op.getValueType();
4921 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4922 unsigned VTBits = VT.getScalarSizeInBits();
4923 unsigned NumElts = DemandedElts.getBitWidth();
4924 unsigned Tmp, Tmp2;
4925 unsigned FirstAnswer = 1;
4926
4927 assert((!VT.isScalableVector() || NumElts == 1) &&
4928 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4929
4930 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4931 const APInt &Val = C->getAPIntValue();
4932 return Val.getNumSignBits();
4933 }
4934
4935 if (Depth >= MaxRecursionDepth)
4936 return 1; // Limit search depth.
4937
4938 if (!DemandedElts)
4939 return 1; // No demanded elts, better to assume we don't know anything.
4940
4941 unsigned Opcode = Op.getOpcode();
4942 switch (Opcode) {
4943 default: break;
4944 case ISD::AssertSext:
4945 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4946 return VTBits-Tmp+1;
4947 case ISD::AssertZext:
4948 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4949 return VTBits-Tmp;
4950 case ISD::FREEZE:
4951 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4953 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4954 break;
4955 case ISD::MERGE_VALUES:
4956 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4957 Depth + 1);
4958 case ISD::SPLAT_VECTOR: {
4959 // Check if the sign bits of source go down as far as the truncated value.
4960 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4961 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4962 if (NumSrcSignBits > (NumSrcBits - VTBits))
4963 return NumSrcSignBits - (NumSrcBits - VTBits);
4964 break;
4965 }
4966 case ISD::BUILD_VECTOR:
4967 assert(!VT.isScalableVector());
4968 Tmp = VTBits;
4969 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4970 if (!DemandedElts[i])
4971 continue;
4972
4973 SDValue SrcOp = Op.getOperand(i);
4974 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4975 // for constant nodes to ensure we only look at the sign bits.
4977 APInt T = C->getAPIntValue().trunc(VTBits);
4978 Tmp2 = T.getNumSignBits();
4979 } else {
4980 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4981
4982 if (SrcOp.getValueSizeInBits() != VTBits) {
4983 assert(SrcOp.getValueSizeInBits() > VTBits &&
4984 "Expected BUILD_VECTOR implicit truncation");
4985 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4986 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4987 }
4988 }
4989 Tmp = std::min(Tmp, Tmp2);
4990 }
4991 return Tmp;
4992
4993 case ISD::VECTOR_COMPRESS: {
4994 SDValue Vec = Op.getOperand(0);
4995 SDValue PassThru = Op.getOperand(2);
4996 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4997 if (Tmp == 1)
4998 return 1;
4999 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
5000 Tmp = std::min(Tmp, Tmp2);
5001 return Tmp;
5002 }
5003
5004 case ISD::VECTOR_SHUFFLE: {
5005 // Collect the minimum number of sign bits that are shared by every vector
5006 // element referenced by the shuffle.
5007 APInt DemandedLHS, DemandedRHS;
5009 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5010 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5011 DemandedLHS, DemandedRHS))
5012 return 1;
5013
5014 Tmp = std::numeric_limits<unsigned>::max();
5015 if (!!DemandedLHS)
5016 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5017 if (!!DemandedRHS) {
5018 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5019 Tmp = std::min(Tmp, Tmp2);
5020 }
5021 // If we don't know anything, early out and try computeKnownBits fall-back.
5022 if (Tmp == 1)
5023 break;
5024 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5025 return Tmp;
5026 }
5027
5028 case ISD::BITCAST: {
5029 if (VT.isScalableVector())
5030 break;
5031 SDValue N0 = Op.getOperand(0);
5032 EVT SrcVT = N0.getValueType();
5033 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5034
5035 // Ignore bitcasts from unsupported types..
5036 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5037 break;
5038
5039 // Fast handling of 'identity' bitcasts.
5040 if (VTBits == SrcBits)
5041 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5042
5043 bool IsLE = getDataLayout().isLittleEndian();
5044
5045 // Bitcast 'large element' scalar/vector to 'small element' vector.
5046 if ((SrcBits % VTBits) == 0) {
5047 assert(VT.isVector() && "Expected bitcast to vector");
5048
5049 unsigned Scale = SrcBits / VTBits;
5050 APInt SrcDemandedElts =
5051 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5052
5053 // Fast case - sign splat can be simply split across the small elements.
5054 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5055 if (Tmp == SrcBits)
5056 return VTBits;
5057
5058 // Slow case - determine how far the sign extends into each sub-element.
5059 Tmp2 = VTBits;
5060 for (unsigned i = 0; i != NumElts; ++i)
5061 if (DemandedElts[i]) {
5062 unsigned SubOffset = i % Scale;
5063 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5064 SubOffset = SubOffset * VTBits;
5065 if (Tmp <= SubOffset)
5066 return 1;
5067 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5068 }
5069 return Tmp2;
5070 }
5071 break;
5072 }
5073
5075 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5076 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5077 return VTBits - Tmp + 1;
5078 case ISD::SIGN_EXTEND:
5079 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5080 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5082 // Max of the input and what this extends.
5083 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5084 Tmp = VTBits-Tmp+1;
5085 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5086 return std::max(Tmp, Tmp2);
5088 if (VT.isScalableVector())
5089 break;
5090 SDValue Src = Op.getOperand(0);
5091 EVT SrcVT = Src.getValueType();
5092 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5093 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5094 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5095 }
5096 case ISD::SRA:
5097 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5098 // SRA X, C -> adds C sign bits.
5099 if (std::optional<unsigned> ShAmt =
5100 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5101 Tmp = std::min(Tmp + *ShAmt, VTBits);
5102 return Tmp;
5103 case ISD::SHL:
5104 if (std::optional<ConstantRange> ShAmtRange =
5105 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5106 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5107 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5108 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5109 // shifted out, then we can compute the number of sign bits for the
5110 // operand being extended. A future improvement could be to pass along the
5111 // "shifted left by" information in the recursive calls to
5112 // ComputeKnownSignBits. Allowing us to handle this more generically.
5113 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5114 SDValue Ext = Op.getOperand(0);
5115 EVT ExtVT = Ext.getValueType();
5116 SDValue Extendee = Ext.getOperand(0);
5117 EVT ExtendeeVT = Extendee.getValueType();
5118 unsigned SizeDifference =
5119 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5120 if (SizeDifference <= MinShAmt) {
5121 Tmp = SizeDifference +
5122 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5123 if (MaxShAmt < Tmp)
5124 return Tmp - MaxShAmt;
5125 }
5126 }
5127 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5128 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5129 if (MaxShAmt < Tmp)
5130 return Tmp - MaxShAmt;
5131 }
5132 break;
5133 case ISD::AND:
5134 case ISD::OR:
5135 case ISD::XOR: // NOT is handled here.
5136 // Logical binary ops preserve the number of sign bits at the worst.
5137 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5138 if (Tmp != 1) {
5139 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5140 FirstAnswer = std::min(Tmp, Tmp2);
5141 // We computed what we know about the sign bits as our first
5142 // answer. Now proceed to the generic code that uses
5143 // computeKnownBits, and pick whichever answer is better.
5144 }
5145 break;
5146
5147 case ISD::SELECT:
5148 case ISD::VSELECT:
5149 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5150 if (Tmp == 1) return 1; // Early out.
5151 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5152 return std::min(Tmp, Tmp2);
5153 case ISD::SELECT_CC:
5154 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5155 if (Tmp == 1) return 1; // Early out.
5156 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5157 return std::min(Tmp, Tmp2);
5158
5159 case ISD::SMIN:
5160 case ISD::SMAX: {
5161 // If we have a clamp pattern, we know that the number of sign bits will be
5162 // the minimum of the clamp min/max range.
5163 bool IsMax = (Opcode == ISD::SMAX);
5164 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5165 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5166 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5167 CstHigh =
5168 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5169 if (CstLow && CstHigh) {
5170 if (!IsMax)
5171 std::swap(CstLow, CstHigh);
5172 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5173 Tmp = CstLow->getAPIntValue().getNumSignBits();
5174 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5175 return std::min(Tmp, Tmp2);
5176 }
5177 }
5178
5179 // Fallback - just get the minimum number of sign bits of the operands.
5180 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5181 if (Tmp == 1)
5182 return 1; // Early out.
5183 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5184 return std::min(Tmp, Tmp2);
5185 }
5186 case ISD::UMIN:
5187 case ISD::UMAX:
5188 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5189 if (Tmp == 1)
5190 return 1; // Early out.
5191 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5192 return std::min(Tmp, Tmp2);
5193 case ISD::SSUBO_CARRY:
5194 case ISD::USUBO_CARRY:
5195 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5196 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5197 return VTBits;
5198 [[fallthrough]];
5199 case ISD::SADDO:
5200 case ISD::UADDO:
5201 case ISD::SADDO_CARRY:
5202 case ISD::UADDO_CARRY:
5203 case ISD::SSUBO:
5204 case ISD::USUBO:
5205 case ISD::SMULO:
5206 case ISD::UMULO:
5207 if (Op.getResNo() != 1)
5208 break;
5209 // The boolean result conforms to getBooleanContents. Fall through.
5210 // If setcc returns 0/-1, all bits are sign bits.
5211 // We know that we have an integer-based boolean since these operations
5212 // are only available for integer.
5213 if (TLI->getBooleanContents(VT.isVector(), false) ==
5215 return VTBits;
5216 break;
5217 case ISD::SETCC:
5218 case ISD::SETCCCARRY:
5219 case ISD::STRICT_FSETCC:
5220 case ISD::STRICT_FSETCCS: {
5221 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5222 // If setcc returns 0/-1, all bits are sign bits.
5223 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5225 return VTBits;
5226 break;
5227 }
5229 // Semantically similar to icmp ult.
5230 if (TLI->getBooleanContents(VT.isVector(), /*isFloat=*/false) ==
5232 return VTBits;
5233 break;
5234 case ISD::ROTL:
5235 case ISD::ROTR:
5236 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5237
5238 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5239 if (Tmp == VTBits)
5240 return VTBits;
5241
5242 if (ConstantSDNode *C =
5243 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5244 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5245
5246 // Handle rotate right by N like a rotate left by 32-N.
5247 if (Opcode == ISD::ROTR)
5248 RotAmt = (VTBits - RotAmt) % VTBits;
5249
5250 // If we aren't rotating out all of the known-in sign bits, return the
5251 // number that are left. This handles rotl(sext(x), 1) for example.
5252 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5253 }
5254 break;
5255 case ISD::ADD:
5256 case ISD::ADDC:
5257 // TODO: Move Operand 1 check before Operand 0 check
5258 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5259 if (Tmp == 1) return 1; // Early out.
5260
5261 // Special case decrementing a value (ADD X, -1):
5262 if (ConstantSDNode *CRHS =
5263 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5264 if (CRHS->isAllOnes()) {
5266 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5267
5268 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5269 // sign bits set.
5270 if ((Known.Zero | 1).isAllOnes())
5271 return VTBits;
5272
5273 // If we are subtracting one from a positive number, there is no carry
5274 // out of the result.
5275 if (Known.isNonNegative())
5276 return Tmp;
5277 }
5278
5279 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5280 if (Tmp2 == 1) return 1; // Early out.
5281
5282 // Add can have at most one carry bit. Thus we know that the output
5283 // is, at worst, one more bit than the inputs.
5284 return std::min(Tmp, Tmp2) - 1;
5285 case ISD::SUB:
5286 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5287 if (Tmp2 == 1) return 1; // Early out.
5288
5289 // Handle NEG.
5290 if (ConstantSDNode *CLHS =
5291 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5292 if (CLHS->isZero()) {
5294 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5295 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5296 // sign bits set.
5297 if ((Known.Zero | 1).isAllOnes())
5298 return VTBits;
5299
5300 // If the input is known to be positive (the sign bit is known clear),
5301 // the output of the NEG has the same number of sign bits as the input.
5302 if (Known.isNonNegative())
5303 return Tmp2;
5304
5305 // Otherwise, we treat this like a SUB.
5306 }
5307
5308 // Sub can have at most one carry bit. Thus we know that the output
5309 // is, at worst, one more bit than the inputs.
5310 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5311 if (Tmp == 1) return 1; // Early out.
5312 return std::min(Tmp, Tmp2) - 1;
5313 case ISD::MUL: {
5314 // The output of the Mul can be at most twice the valid bits in the inputs.
5315 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5316 if (SignBitsOp0 == 1)
5317 break;
5318 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5319 if (SignBitsOp1 == 1)
5320 break;
5321 unsigned OutValidBits =
5322 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5323 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5324 }
5325 case ISD::AVGCEILS:
5326 case ISD::AVGFLOORS:
5327 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5328 if (Tmp == 1)
5329 return 1; // Early out.
5330 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5331 return std::min(Tmp, Tmp2);
5332 case ISD::SREM:
5333 // The sign bit is the LHS's sign bit, except when the result of the
5334 // remainder is zero. The magnitude of the result should be less than or
5335 // equal to the magnitude of the LHS. Therefore, the result should have
5336 // at least as many sign bits as the left hand side.
5337 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5338 case ISD::TRUNCATE: {
5339 // Check if the sign bits of source go down as far as the truncated value.
5340 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5341 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5342 if (NumSrcSignBits > (NumSrcBits - VTBits))
5343 return NumSrcSignBits - (NumSrcBits - VTBits);
5344 break;
5345 }
5346 case ISD::EXTRACT_ELEMENT: {
5347 if (VT.isScalableVector())
5348 break;
5349 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5350 const int BitWidth = Op.getValueSizeInBits();
5351 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5352
5353 // Get reverse index (starting from 1), Op1 value indexes elements from
5354 // little end. Sign starts at big end.
5355 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5356
5357 // If the sign portion ends in our element the subtraction gives correct
5358 // result. Otherwise it gives either negative or > bitwidth result
5359 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5360 }
5362 if (VT.isScalableVector())
5363 break;
5364 // If we know the element index, split the demand between the
5365 // source vector and the inserted element, otherwise assume we need
5366 // the original demanded vector elements and the value.
5367 SDValue InVec = Op.getOperand(0);
5368 SDValue InVal = Op.getOperand(1);
5369 SDValue EltNo = Op.getOperand(2);
5370 bool DemandedVal = true;
5371 APInt DemandedVecElts = DemandedElts;
5372 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5373 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5374 unsigned EltIdx = CEltNo->getZExtValue();
5375 DemandedVal = !!DemandedElts[EltIdx];
5376 DemandedVecElts.clearBit(EltIdx);
5377 }
5378 Tmp = std::numeric_limits<unsigned>::max();
5379 if (DemandedVal) {
5380 // TODO - handle implicit truncation of inserted elements.
5381 if (InVal.getScalarValueSizeInBits() != VTBits)
5382 break;
5383 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5384 Tmp = std::min(Tmp, Tmp2);
5385 }
5386 if (!!DemandedVecElts) {
5387 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5388 Tmp = std::min(Tmp, Tmp2);
5389 }
5390 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5391 return Tmp;
5392 }
5394 SDValue InVec = Op.getOperand(0);
5395 SDValue EltNo = Op.getOperand(1);
5396 EVT VecVT = InVec.getValueType();
5397 // ComputeNumSignBits not yet implemented for scalable vectors.
5398 if (VecVT.isScalableVector())
5399 break;
5400 const unsigned BitWidth = Op.getValueSizeInBits();
5401 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5402 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5403
5404 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5405 // anything about sign bits. But if the sizes match we can derive knowledge
5406 // about sign bits from the vector operand.
5407 if (BitWidth != EltBitWidth)
5408 break;
5409
5410 // If we know the element index, just demand that vector element, else for
5411 // an unknown element index, ignore DemandedElts and demand them all.
5412 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5413 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5414 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5415 DemandedSrcElts =
5416 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5417
5418 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5419 }
5421 // Offset the demanded elts by the subvector index.
5422 SDValue Src = Op.getOperand(0);
5423
5424 APInt DemandedSrcElts;
5425 if (Src.getValueType().isScalableVector())
5426 DemandedSrcElts = APInt(1, 1);
5427 else {
5428 uint64_t Idx = Op.getConstantOperandVal(1);
5429 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5430 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5431 }
5432 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5433 }
5434 case ISD::CONCAT_VECTORS: {
5435 if (VT.isScalableVector())
5436 break;
5437 // Determine the minimum number of sign bits across all demanded
5438 // elts of the input vectors. Early out if the result is already 1.
5439 Tmp = std::numeric_limits<unsigned>::max();
5440 EVT SubVectorVT = Op.getOperand(0).getValueType();
5441 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5442 unsigned NumSubVectors = Op.getNumOperands();
5443 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5444 APInt DemandedSub =
5445 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5446 if (!DemandedSub)
5447 continue;
5448 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5449 Tmp = std::min(Tmp, Tmp2);
5450 }
5451 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5452 return Tmp;
5453 }
5454 case ISD::INSERT_SUBVECTOR: {
5455 if (VT.isScalableVector())
5456 break;
5457 // Demand any elements from the subvector and the remainder from the src its
5458 // inserted into.
5459 SDValue Src = Op.getOperand(0);
5460 SDValue Sub = Op.getOperand(1);
5461 uint64_t Idx = Op.getConstantOperandVal(2);
5462 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5463 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5464 APInt DemandedSrcElts = DemandedElts;
5465 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5466
5467 Tmp = std::numeric_limits<unsigned>::max();
5468 if (!!DemandedSubElts) {
5469 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5470 if (Tmp == 1)
5471 return 1; // early-out
5472 }
5473 if (!!DemandedSrcElts) {
5474 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5475 Tmp = std::min(Tmp, Tmp2);
5476 }
5477 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5478 return Tmp;
5479 }
5480 case ISD::LOAD: {
5481 // If we are looking at the loaded value of the SDNode.
5482 if (Op.getResNo() != 0)
5483 break;
5484
5486 if (const MDNode *Ranges = LD->getRanges()) {
5487 if (DemandedElts != 1)
5488 break;
5489
5491 if (VTBits > CR.getBitWidth()) {
5492 switch (LD->getExtensionType()) {
5493 case ISD::SEXTLOAD:
5494 CR = CR.signExtend(VTBits);
5495 break;
5496 case ISD::ZEXTLOAD:
5497 CR = CR.zeroExtend(VTBits);
5498 break;
5499 default:
5500 break;
5501 }
5502 }
5503
5504 if (VTBits != CR.getBitWidth())
5505 break;
5506 return std::min(CR.getSignedMin().getNumSignBits(),
5508 }
5509
5510 unsigned ExtType = LD->getExtensionType();
5511 switch (ExtType) {
5512 default:
5513 break;
5514 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5515 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5516 return VTBits - Tmp + 1;
5517 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5518 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5519 return VTBits - Tmp;
5520 case ISD::NON_EXTLOAD:
5521 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5522 // We only need to handle vectors - computeKnownBits should handle
5523 // scalar cases.
5524 Type *CstTy = Cst->getType();
5525 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5526 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5527 VTBits == CstTy->getScalarSizeInBits()) {
5528 Tmp = VTBits;
5529 for (unsigned i = 0; i != NumElts; ++i) {
5530 if (!DemandedElts[i])
5531 continue;
5532 if (Constant *Elt = Cst->getAggregateElement(i)) {
5533 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5534 const APInt &Value = CInt->getValue();
5535 Tmp = std::min(Tmp, Value.getNumSignBits());
5536 continue;
5537 }
5538 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5539 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5540 Tmp = std::min(Tmp, Value.getNumSignBits());
5541 continue;
5542 }
5543 }
5544 // Unknown type. Conservatively assume no bits match sign bit.
5545 return 1;
5546 }
5547 return Tmp;
5548 }
5549 }
5550 break;
5551 }
5552
5553 break;
5554 }
5557 case ISD::ATOMIC_SWAP:
5569 case ISD::ATOMIC_LOAD: {
5570 auto *AT = cast<AtomicSDNode>(Op);
5571 // If we are looking at the loaded value.
5572 if (Op.getResNo() == 0) {
5573 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5574 if (Tmp == VTBits)
5575 return 1; // early-out
5576
5577 // For atomic_load, prefer to use the extension type.
5578 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5579 switch (AT->getExtensionType()) {
5580 default:
5581 break;
5582 case ISD::SEXTLOAD:
5583 return VTBits - Tmp + 1;
5584 case ISD::ZEXTLOAD:
5585 return VTBits - Tmp;
5586 }
5587 }
5588
5589 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5590 return VTBits - Tmp + 1;
5591 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5592 return VTBits - Tmp;
5593 }
5594 break;
5595 }
5596 }
5597
5598 // Allow the target to implement this method for its nodes.
5599 if (Opcode >= ISD::BUILTIN_OP_END ||
5600 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5601 Opcode == ISD::INTRINSIC_W_CHAIN ||
5602 Opcode == ISD::INTRINSIC_VOID) {
5603 // TODO: This can probably be removed once target code is audited. This
5604 // is here purely to reduce patch size and review complexity.
5605 if (!VT.isScalableVector()) {
5606 unsigned NumBits =
5607 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5608 if (NumBits > 1)
5609 FirstAnswer = std::max(FirstAnswer, NumBits);
5610 }
5611 }
5612
5613 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5614 // use this information.
5615 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5616 return std::max(FirstAnswer, Known.countMinSignBits());
5617}
5618
5620 unsigned Depth) const {
5621 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5622 return Op.getScalarValueSizeInBits() - SignBits + 1;
5623}
5624
5626 const APInt &DemandedElts,
5627 unsigned Depth) const {
5628 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5629 return Op.getScalarValueSizeInBits() - SignBits + 1;
5630}
5631
5633 UndefPoisonKind Kind,
5634 unsigned Depth) const {
5635 // Early out for FREEZE.
5636 if (Op.getOpcode() == ISD::FREEZE)
5637 return true;
5638
5639 APInt DemandedElts = getDemandAllEltsMask(Op);
5640 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5641}
5642
5644 const APInt &DemandedElts,
5645 UndefPoisonKind Kind,
5646 unsigned Depth) const {
5647 unsigned Opcode = Op.getOpcode();
5648
5649 // Early out for FREEZE.
5650 if (Opcode == ISD::FREEZE)
5651 return true;
5652
5653 if (Depth >= MaxRecursionDepth)
5654 return false; // Limit search depth.
5655
5656 if (isIntOrFPConstant(Op))
5657 return true;
5658
5659 switch (Opcode) {
5660 case ISD::CONDCODE:
5661 case ISD::VALUETYPE:
5662 case ISD::FrameIndex:
5664 case ISD::CopyFromReg:
5665 return true;
5666
5667 case ISD::POISON:
5668 return !includesPoison(Kind);
5669
5670 case ISD::UNDEF:
5671 return !includesUndef(Kind);
5672
5673 case ISD::BITCAST: {
5674 SDValue Src = Op.getOperand(0);
5675 EVT SrcVT = Src.getValueType();
5676 EVT DstVT = Op.getValueType();
5677
5678 if (!SrcVT.isVector() || !DstVT.isVector())
5679 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5680
5681 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5682 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5683 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5684 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5685
5686 if (SrcEltBits == DstEltBits)
5687 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5688 Depth + 1);
5689
5690 if (SrcEltBits < DstEltBits) {
5691 if (DstEltBits % SrcEltBits != 0)
5692 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5693
5694 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5695 "Unexpected vector bitcast");
5696 APInt DemandedSrcElts =
5697 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5698 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5699 Depth + 1);
5700 }
5701
5702 if (SrcEltBits % DstEltBits != 0)
5703 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5704
5705 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5706 "Unexpected vector bitcast");
5707 APInt DemandedSrcElts =
5708 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5709 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5710 Depth + 1);
5711 }
5712
5713 case ISD::BUILD_VECTOR:
5714 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5715 // this shouldn't affect the result.
5716 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5717 if (!DemandedElts[i])
5718 continue;
5719 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5720 return false;
5721 }
5722 return true;
5723
5724 case ISD::CONCAT_VECTORS: {
5725 EVT VT = Op.getValueType();
5726 if (!VT.isFixedLengthVector())
5727 break;
5728
5729 EVT SubVT = Op.getOperand(0).getValueType();
5730 unsigned NumSubElts = SubVT.getVectorNumElements();
5731 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5732 APInt DemandedSubElts =
5733 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5734 if (!!DemandedSubElts &&
5735 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5736 Kind, Depth + 1))
5737 return false;
5738 }
5739 return true;
5740 }
5741
5743 SDValue Src = Op.getOperand(0);
5744 if (Src.getValueType().isScalableVector())
5745 break;
5746 uint64_t Idx = Op.getConstantOperandVal(1);
5747 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5748 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5749 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5750 Depth + 1);
5751 }
5752
5753 case ISD::INSERT_SUBVECTOR: {
5754 if (Op.getValueType().isScalableVector())
5755 break;
5756 SDValue Src = Op.getOperand(0);
5757 SDValue Sub = Op.getOperand(1);
5758 uint64_t Idx = Op.getConstantOperandVal(2);
5759 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5760 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5761 APInt DemandedSrcElts = DemandedElts;
5762 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5763
5764 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5765 Sub, DemandedSubElts, Kind, Depth + 1))
5766 return false;
5767 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5768 Src, DemandedSrcElts, Kind, Depth + 1))
5769 return false;
5770 return true;
5771 }
5772
5774 SDValue Src = Op.getOperand(0);
5775 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5776 EVT SrcVT = Src.getValueType();
5777 if (SrcVT.isFixedLengthVector() && IndexC &&
5778 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5779 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5780 IndexC->getZExtValue());
5781 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5782 Depth + 1);
5783 }
5784 break;
5785 }
5786
5788 SDValue InVec = Op.getOperand(0);
5789 SDValue InVal = Op.getOperand(1);
5790 SDValue EltNo = Op.getOperand(2);
5791 EVT VT = InVec.getValueType();
5792 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5793 if (IndexC && VT.isFixedLengthVector() &&
5794 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5795 if (DemandedElts[IndexC->getZExtValue()] &&
5796 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5797 return false;
5798 APInt InVecDemandedElts = DemandedElts;
5799 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5800 if (!!InVecDemandedElts &&
5802 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5803 InVecDemandedElts, Kind, Depth + 1))
5804 return false;
5805 return true;
5806 }
5807 break;
5808 }
5809
5811 // Check upper (known undef) elements.
5812 if (DemandedElts.ugt(1) && includesUndef(Kind))
5813 return false;
5814 // Check element zero.
5815 if (DemandedElts[0] &&
5816 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5817 return false;
5818 return true;
5819
5820 case ISD::SPLAT_VECTOR:
5821 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5822
5823 case ISD::SELECT: {
5824 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5825 /*ConsiderFlags*/ true, Depth) &&
5826 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5827 Depth + 1) &&
5828 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5829 Kind, Depth + 1) &&
5830 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5831 Kind, Depth + 1);
5832 }
5833
5834 case ISD::VECTOR_SHUFFLE: {
5835 APInt DemandedLHS, DemandedRHS;
5836 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5837 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5838 DemandedElts, DemandedLHS, DemandedRHS,
5839 /*AllowUndefElts=*/false))
5840 return false;
5841 if (!DemandedLHS.isZero() &&
5842 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5843 Depth + 1))
5844 return false;
5845 if (!DemandedRHS.isZero() &&
5846 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5847 Depth + 1))
5848 return false;
5849 return true;
5850 }
5851
5852 case ISD::SHL:
5853 case ISD::SRL:
5854 case ISD::SRA:
5855 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5856 // enough to check operand 0 if Op can't create undef/poison.
5857 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5858 /*ConsiderFlags*/ true, Depth) &&
5859 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5860 Kind, Depth + 1);
5861
5862 case ISD::BSWAP:
5863 case ISD::CTPOP:
5864 case ISD::BITREVERSE:
5865 case ISD::AND:
5866 case ISD::OR:
5867 case ISD::XOR:
5868 case ISD::ADD:
5869 case ISD::SUB:
5870 case ISD::MUL:
5871 case ISD::SADDSAT:
5872 case ISD::UADDSAT:
5873 case ISD::SSUBSAT:
5874 case ISD::USUBSAT:
5875 case ISD::SSHLSAT:
5876 case ISD::USHLSAT:
5877 case ISD::SMIN:
5878 case ISD::SMAX:
5879 case ISD::UMIN:
5880 case ISD::UMAX:
5881 case ISD::ZERO_EXTEND:
5882 case ISD::SIGN_EXTEND:
5883 case ISD::ANY_EXTEND:
5884 case ISD::TRUNCATE:
5885 case ISD::VSELECT: {
5886 // If Op can't create undef/poison and none of its operands are undef/poison
5887 // then Op is never undef/poison. A difference from the more common check
5888 // below, outside the switch, is that we handle elementwise operations for
5889 // which the DemandedElts mask is valid for all operands here.
5890 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5891 /*ConsiderFlags*/ true, Depth) &&
5892 all_of(Op->ops(), [&](SDValue V) {
5893 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5894 Depth + 1);
5895 });
5896 }
5897
5898 // TODO: Search for noundef attributes from library functions.
5899
5900 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5901
5902 default:
5903 // Allow the target to implement this method for its nodes.
5904 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5905 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5906 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5907 Op, DemandedElts, *this, Kind, Depth);
5908 break;
5909 }
5910
5911 // If Op can't create undef/poison and none of its operands are undef/poison
5912 // then Op is never undef/poison.
5913 // NOTE: TargetNodes can handle this in themselves in
5914 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5915 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5916 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5917 all_of(Op->ops(), [&](SDValue V) {
5918 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5919 });
5920}
5921
5923 bool ConsiderFlags,
5924 unsigned Depth) const {
5925 APInt DemandedElts = getDemandAllEltsMask(Op);
5926 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5927}
5928
5930 UndefPoisonKind Kind,
5931 bool ConsiderFlags,
5932 unsigned Depth) const {
5933 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5934 return true;
5935
5936 unsigned Opcode = Op.getOpcode();
5937 switch (Opcode) {
5938 case ISD::AssertSext:
5939 case ISD::AssertZext:
5940 case ISD::AssertAlign:
5942 // Assertion nodes can create poison if the assertion fails.
5943 return includesPoison(Kind);
5944
5945 case ISD::FREEZE:
5949 case ISD::SADDSAT:
5950 case ISD::UADDSAT:
5951 case ISD::SSUBSAT:
5952 case ISD::USUBSAT:
5953 case ISD::MULHU:
5954 case ISD::MULHS:
5955 case ISD::AVGFLOORS:
5956 case ISD::AVGFLOORU:
5957 case ISD::AVGCEILS:
5958 case ISD::AVGCEILU:
5959 case ISD::ABDU:
5960 case ISD::ABDS:
5961 case ISD::SMIN:
5962 case ISD::SMAX:
5963 case ISD::SCMP:
5964 case ISD::UMIN:
5965 case ISD::UMAX:
5966 case ISD::UCMP:
5967 case ISD::AND:
5968 case ISD::XOR:
5969 case ISD::ROTL:
5970 case ISD::ROTR:
5971 case ISD::FSHL:
5972 case ISD::FSHR:
5973 case ISD::BSWAP:
5974 case ISD::CTTZ:
5975 case ISD::CTLZ:
5976 case ISD::CTLS:
5977 case ISD::CTPOP:
5978 case ISD::BITREVERSE:
5979 case ISD::PARITY:
5980 case ISD::SIGN_EXTEND:
5981 case ISD::TRUNCATE:
5985 case ISD::BITCAST:
5986 case ISD::BUILD_VECTOR:
5987 case ISD::BUILD_PAIR:
5988 case ISD::SPLAT_VECTOR:
5989 case ISD::FABS:
5990 case ISD::FCEIL:
5991 case ISD::FFLOOR:
5992 case ISD::FTRUNC:
5993 case ISD::FRINT:
5994 case ISD::FNEARBYINT:
5995 case ISD::FROUND:
5996 case ISD::FROUNDEVEN:
5997 return false;
5998
5999 case ISD::ABS:
6000 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
6001 // Different to Intrinsic::abs.
6002 return false;
6004 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
6005 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
6006
6007 case ISD::ADDC:
6008 case ISD::SUBC:
6009 case ISD::ADDE:
6010 case ISD::SUBE:
6011 case ISD::SADDO:
6012 case ISD::SSUBO:
6013 case ISD::SMULO:
6014 case ISD::SADDO_CARRY:
6015 case ISD::SSUBO_CARRY:
6016 case ISD::UADDO:
6017 case ISD::USUBO:
6018 case ISD::UMULO:
6019 case ISD::UADDO_CARRY:
6020 case ISD::USUBO_CARRY:
6021 // No poison on result or overflow flags.
6022 return false;
6023
6024 case ISD::SELECT_CC:
6025 case ISD::SETCC: {
6026 // Integer setcc cannot create undef or poison.
6027 if (Op.getOperand(0).getValueType().isInteger())
6028 return false;
6029
6030 // FP compares are more complicated. They can create poison for nan/infinity
6031 // based on options and flags. The options and flags also cause special
6032 // nonan condition codes to be used. Those condition codes may be preserved
6033 // even if the nonan flag is dropped somewhere.
6034 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6035 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6036 return (unsigned)CCCode & 0x10U;
6037 }
6038
6039 case ISD::OR:
6040 case ISD::ZERO_EXTEND:
6041 case ISD::SELECT:
6042 case ISD::VSELECT:
6043 case ISD::ADD:
6044 case ISD::SUB:
6045 case ISD::MUL:
6046 case ISD::FNEG:
6047 case ISD::FADD:
6048 case ISD::FSUB:
6049 case ISD::FMUL:
6050 case ISD::FDIV:
6051 case ISD::FREM:
6052 case ISD::FCOPYSIGN:
6053 case ISD::FMA:
6054 case ISD::FMAD:
6055 case ISD::FMULADD:
6056 case ISD::FP_EXTEND:
6057 case ISD::FMINNUM:
6058 case ISD::FMAXNUM:
6059 case ISD::FMINNUM_IEEE:
6060 case ISD::FMAXNUM_IEEE:
6061 case ISD::FMINIMUM:
6062 case ISD::FMAXIMUM:
6063 case ISD::FMINIMUMNUM:
6064 case ISD::FMAXIMUMNUM:
6070 // No poison except from flags (which is handled above)
6071 return false;
6072
6073 case ISD::SHL:
6074 case ISD::SRL:
6075 case ISD::SRA:
6076 // If the max shift amount isn't in range, then the shift can
6077 // create poison.
6078 return includesPoison(Kind) &&
6079 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6080
6083 // If the amount is zero then the result will be poison.
6084 // TODO: Add isKnownNeverZero DemandedElts handling.
6085 return includesPoison(Kind) &&
6086 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6087
6089 // Check if we demand any upper (undef) elements.
6090 return includesUndef(Kind) && DemandedElts.ugt(1);
6091
6094 // Ensure that the element index is in bounds.
6095 if (includesPoison(Kind)) {
6096 EVT VecVT = Op.getOperand(0).getValueType();
6097 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6098 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6099 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6100 }
6101 return false;
6102 }
6103
6104 case ISD::VECTOR_SHUFFLE: {
6105 // Check for any demanded shuffle element that is undef.
6106 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6107 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6108 if (Elt < 0 && DemandedElts[Idx])
6109 return true;
6110 return false;
6111 }
6112
6114 return false;
6115
6116 default:
6117 // Allow the target to implement this method for its nodes.
6118 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6119 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6120 return TLI->canCreateUndefOrPoisonForTargetNode(
6121 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6122 break;
6123 }
6124
6125 // Be conservative and return true.
6126 return true;
6127}
6128
6129bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6130 unsigned Opcode = Op.getOpcode();
6131 if (Opcode == ISD::OR)
6132 return Op->getFlags().hasDisjoint() ||
6133 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6134 if (Opcode == ISD::XOR)
6135 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6136 return false;
6137}
6138
6140 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6141 (Op.isAnyAdd() || isADDLike(Op));
6142}
6143
6145 FPClassTest InterestedClasses,
6146 unsigned Depth) const {
6147 APInt DemandedElts = getDemandAllEltsMask(Op);
6148 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6149}
6150
6152 const APInt &DemandedElts,
6153 FPClassTest InterestedClasses,
6154 unsigned Depth) const {
6156
6157 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6158 return KnownFPClass(CFP->getValueAPF());
6159
6160 if (Depth >= MaxRecursionDepth)
6161 return Known;
6162
6163 if (Op.getOpcode() == ISD::UNDEF)
6164 return Known;
6165
6166 EVT VT = Op.getValueType();
6167 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6168 assert((!VT.isFixedLengthVector() ||
6169 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6170 "Unexpected vector size");
6171
6172 if (!DemandedElts)
6173 return Known;
6174
6175 unsigned Opcode = Op.getOpcode();
6176 switch (Opcode) {
6177 case ISD::POISON: {
6178 Known.KnownFPClasses = fcNone;
6179 Known.SignBit = false;
6180 break;
6181 }
6182 case ISD::FNEG: {
6183 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6184 InterestedClasses, Depth + 1);
6185 Known.fneg();
6186 break;
6187 }
6188 case ISD::BUILD_VECTOR: {
6189 assert(!VT.isScalableVector());
6190 bool First = true;
6191 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6192 if (!DemandedElts[I])
6193 continue;
6194
6195 if (First) {
6196 Known =
6197 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6198 First = false;
6199 } else {
6200 Known |=
6201 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6202 }
6203
6204 if (Known.isUnknown())
6205 break;
6206 }
6207 break;
6208 }
6210 SDValue Src = Op.getOperand(0);
6211 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6212 EVT SrcVT = Src.getValueType();
6213 if (SrcVT.isFixedLengthVector() && CIdx) {
6214 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6215 APInt DemandedSrcElts = APInt::getOneBitSet(
6216 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6217 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6218 Depth + 1);
6219 } else {
6220 // Out of bounds index is poison.
6221 Known.KnownFPClasses = fcNone;
6222 }
6223 } else {
6224 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6225 }
6226 break;
6227 }
6228 case ISD::SPLAT_VECTOR: {
6229 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6230 break;
6231 }
6232 case ISD::BITCAST: {
6233 // FIXME: It should not be necessary to check for an elementwise bitcast.
6234 // If a bitcast is not elementwise between vector / scalar types,
6235 // computeKnownBits already splices the known bits of the source elements
6236 // appropriately so as to line up with the bits of the result's demanded
6237 // elements.
6238 EVT SrcVT = Op.getOperand(0).getValueType();
6239 if (VT.isScalableVector() || SrcVT.isScalableVector())
6240 break;
6241 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6242 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6243 if (VTNumElts != SrcVTNumElts)
6244 break;
6245
6246 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6248 break;
6249 }
6250 case ISD::FABS: {
6251 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6252 InterestedClasses, Depth + 1);
6253 Known.fabs();
6254 break;
6255 }
6256 case ISD::FCOPYSIGN: {
6257 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6258 InterestedClasses, Depth + 1);
6259 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6260 InterestedClasses, Depth + 1);
6261 Known.copysign(KnownSign);
6262 break;
6263 }
6264 case ISD::AssertNoFPClass: {
6265 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6266 InterestedClasses, Depth + 1);
6267 FPClassTest AssertedClasses =
6268 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6269 Known.KnownFPClasses &= ~AssertedClasses;
6270 break;
6271 }
6273 SDValue Src = Op.getOperand(0);
6274 EVT SrcVT = Src.getValueType();
6275 if (SrcVT.isFixedLengthVector()) {
6276 unsigned Idx = Op.getConstantOperandVal(1);
6277 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6278
6279 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6280 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6281 Depth + 1);
6282 } else {
6283 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6284 }
6285 break;
6286 }
6287 case ISD::INSERT_SUBVECTOR: {
6288 SDValue BaseVector = Op.getOperand(0);
6289 SDValue SubVector = Op.getOperand(1);
6290 EVT BaseVT = BaseVector.getValueType();
6291 if (BaseVT.isFixedLengthVector()) {
6292 unsigned Idx = Op.getConstantOperandVal(2);
6293 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6294 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6295
6296 APInt DemandedMask =
6297 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6298 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6299 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6300
6301 if (!DemandedSrcElts.isZero())
6302 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6303 InterestedClasses, Depth + 1);
6304 if (!DemandedSubElts.isZero()) {
6306 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6307 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6308 }
6309 } else {
6310 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6311 if (!Known.isUnknown())
6312 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6313 }
6314 break;
6315 }
6316 case ISD::SELECT:
6317 case ISD::VSELECT: {
6318 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6319 // IR-level ValueTracking.
6320 KnownFPClass KnownFalseClass = computeKnownFPClass(
6321 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6322 if (KnownFalseClass.isUnknown())
6323 break;
6324 KnownFPClass KnownTrueClass = computeKnownFPClass(
6325 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6326 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6327 break;
6328 }
6329 default:
6330 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6331 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6332 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6333 Depth);
6334 }
6335 break;
6336 }
6337
6338 return Known;
6339}
6340
6342 unsigned Depth) const {
6343 APInt DemandedElts = getDemandAllEltsMask(Op);
6344 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6345}
6346
6348 bool SNaN, unsigned Depth) const {
6349 assert(!DemandedElts.isZero() && "No demanded elements");
6350
6351 // If we're told that NaNs won't happen, assume they won't.
6352 if (Op->getFlags().hasNoNaNs())
6353 return true;
6354
6355 if (Depth >= MaxRecursionDepth)
6356 return false; // Limit search depth.
6357
6358 unsigned Opcode = Op.getOpcode();
6359 switch (Opcode) {
6360 case ISD::FADD:
6361 case ISD::FSUB:
6362 case ISD::FMUL:
6363 case ISD::FDIV:
6364 case ISD::FREM:
6365 case ISD::FSIN:
6366 case ISD::FCOS:
6367 case ISD::FTAN:
6368 case ISD::FASIN:
6369 case ISD::FACOS:
6370 case ISD::FATAN:
6371 case ISD::FATAN2:
6372 case ISD::FSINH:
6373 case ISD::FCOSH:
6374 case ISD::FTANH:
6375 case ISD::FMA:
6376 case ISD::FMULADD:
6377 case ISD::FMAD: {
6378 if (SNaN)
6379 return true;
6380 // TODO: Need isKnownNeverInfinity
6381 return false;
6382 }
6383 case ISD::FCANONICALIZE:
6384 case ISD::FEXP:
6385 case ISD::FEXP2:
6386 case ISD::FEXP10:
6387 case ISD::FTRUNC:
6388 case ISD::FFLOOR:
6389 case ISD::FCEIL:
6390 case ISD::FROUND:
6391 case ISD::FROUNDEVEN:
6392 case ISD::LROUND:
6393 case ISD::LLROUND:
6394 case ISD::FRINT:
6395 case ISD::LRINT:
6396 case ISD::LLRINT:
6397 case ISD::FNEARBYINT:
6398 case ISD::FLDEXP: {
6399 if (SNaN)
6400 return true;
6401 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6402 }
6403 case ISD::FABS:
6404 case ISD::FNEG:
6405 case ISD::FCOPYSIGN: {
6406 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6407 }
6408 case ISD::SELECT:
6409 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6410 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6411 case ISD::FP_EXTEND:
6412 case ISD::FP_ROUND: {
6413 if (SNaN)
6414 return true;
6415 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6416 }
6417 case ISD::SINT_TO_FP:
6418 case ISD::UINT_TO_FP:
6419 return true;
6420 case ISD::FSQRT: // Need is known positive
6421 case ISD::FLOG:
6422 case ISD::FLOG2:
6423 case ISD::FLOG10:
6424 case ISD::FPOWI:
6425 case ISD::FPOW: {
6426 if (SNaN)
6427 return true;
6428 // TODO: Refine on operand
6429 return false;
6430 }
6431 case ISD::FMINNUM:
6432 case ISD::FMAXNUM:
6433 case ISD::FMINIMUMNUM:
6434 case ISD::FMAXIMUMNUM: {
6435 // Only one needs to be known not-nan, since it will be returned if the
6436 // other ends up being one.
6437 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6438 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6439 }
6440 case ISD::FMINNUM_IEEE:
6441 case ISD::FMAXNUM_IEEE: {
6442 if (SNaN)
6443 return true;
6444 // This can return a NaN if either operand is an sNaN, or if both operands
6445 // are NaN.
6446 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6447 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6448 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6449 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6450 }
6451 case ISD::FMINIMUM:
6452 case ISD::FMAXIMUM: {
6453 // TODO: Does this quiet or return the origina NaN as-is?
6454 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6455 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6456 }
6458 SDValue Src = Op.getOperand(0);
6459 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6460 EVT SrcVT = Src.getValueType();
6461 if (SrcVT.isFixedLengthVector() && Idx &&
6462 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6463 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6464 Idx->getZExtValue());
6465 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6466 }
6467 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6468 }
6470 SDValue Src = Op.getOperand(0);
6471 if (Src.getValueType().isFixedLengthVector()) {
6472 unsigned Idx = Op.getConstantOperandVal(1);
6473 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6474 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6475 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6476 }
6477 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6478 }
6479 case ISD::INSERT_SUBVECTOR: {
6480 SDValue BaseVector = Op.getOperand(0);
6481 SDValue SubVector = Op.getOperand(1);
6482 EVT BaseVectorVT = BaseVector.getValueType();
6483 if (BaseVectorVT.isFixedLengthVector()) {
6484 unsigned Idx = Op.getConstantOperandVal(2);
6485 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6486 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6487
6488 // Clear/Extract the bits at the position where the subvector will be
6489 // inserted.
6490 APInt DemandedMask =
6491 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6492 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6493 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6494
6495 bool NeverNaN = true;
6496 if (!DemandedSrcElts.isZero())
6497 NeverNaN &=
6498 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6499 if (NeverNaN && !DemandedSubElts.isZero())
6500 NeverNaN &=
6501 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6502 return NeverNaN;
6503 }
6504 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6505 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6506 }
6507 case ISD::BUILD_VECTOR: {
6508 unsigned NumElts = Op.getNumOperands();
6509 for (unsigned I = 0; I != NumElts; ++I)
6510 if (DemandedElts[I] &&
6511 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6512 return false;
6513 return true;
6514 }
6515 case ISD::SPLAT_VECTOR:
6516 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6517 case ISD::AssertNoFPClass: {
6518 FPClassTest NoFPClass =
6519 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6520 if ((NoFPClass & fcNan) == fcNan)
6521 return true;
6522 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6523 return true;
6524 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6525 }
6526 default:
6527 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6528 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6529 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6530 Depth);
6531 }
6532 break;
6533 }
6534
6535 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6536 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6537 return Known.isKnownNever(NanMask);
6538}
6539
6541 APInt DemandedElts = getDemandAllEltsMask(Op);
6542 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6543}
6544
6546 const APInt &DemandedElts,
6547 unsigned Depth) const {
6548 assert(!DemandedElts.isZero() && "No demanded elements");
6549 EVT VT = Op.getValueType();
6551 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6552 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6553}
6554
6556 APInt DemandedElts = getDemandAllEltsMask(Op);
6557 return isKnownNeverZero(Op, DemandedElts, Depth);
6558}
6559
6561 unsigned Depth) const {
6562 if (Depth >= MaxRecursionDepth)
6563 return false; // Limit search depth.
6564
6565 EVT OpVT = Op.getValueType();
6566 unsigned BitWidth = OpVT.getScalarSizeInBits();
6567
6568 assert(!Op.getValueType().isFloatingPoint() &&
6569 "Floating point types unsupported - use isKnownNeverLogicalZero");
6570
6571 // If the value is a constant, we can obviously see if it is a zero or not.
6572 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6573 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6574 return !V.isZero();
6575 };
6576
6577 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6578 return true;
6579
6580 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6581 // some degree.
6582 switch (Op.getOpcode()) {
6583 default:
6584 break;
6585
6586 case ISD::BUILD_VECTOR:
6587 // Are all operands of a build vector constant non-zero?
6588 if (all_of(enumerate(Op->ops()), [&](auto P) {
6589 auto *C = dyn_cast<ConstantSDNode>(P.value());
6590 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6591 }))
6592 return true;
6593 break;
6594
6595 case ISD::SPLAT_VECTOR:
6596 // Is the operand of a splat vector a constant non-zero?
6597 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6598 if (IsNeverZero(C))
6599 return true;
6600 break;
6601
6603 SDValue InVec = Op.getOperand(0);
6604 SDValue EltNo = Op.getOperand(1);
6605 EVT VecVT = InVec.getValueType();
6606
6607 // Skip scalable vectors or implicit extensions.
6608 if (VecVT.isScalableVector() ||
6609 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6610 break;
6611
6612 // If we know the element index, just demand that vector element, else for
6613 // an unknown element index, ignore DemandedElts and demand them all.
6614 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6615 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6616 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6617 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6618 DemandedSrcElts =
6619 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6620
6621 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6622 }
6623
6624 case ISD::OR:
6625 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6626 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6627
6628 case ISD::VSELECT:
6629 case ISD::SELECT:
6630 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6631 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6632
6633 case ISD::SHL: {
6634 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6635 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6636 KnownBits ValKnown =
6637 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6638 // 1 << X is never zero.
6639 if (ValKnown.One[0])
6640 return true;
6641 // If max shift cnt of known ones is non-zero, result is non-zero.
6642 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6643 .getMaxValue();
6644 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6645 !ValKnown.One.shl(MaxCnt).isZero())
6646 return true;
6647 break;
6648 }
6649
6650 case ISD::VECTOR_SHUFFLE: {
6651 if (Op.getValueType().isScalableVector())
6652 return false;
6653
6654 unsigned NumElts = DemandedElts.getBitWidth();
6655
6656 // All demanded elements from LHS and RHS must be known non-zero.
6657 // Demanded elements with undef shuffle mask elements are unknown.
6658
6659 APInt DemandedLHS, DemandedRHS;
6660 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6661 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6662 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6663 DemandedLHS, DemandedRHS))
6664 return false;
6665
6666 return (!DemandedLHS ||
6667 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6668 (!DemandedRHS ||
6669 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6670 }
6671
6672 case ISD::UADDSAT:
6673 case ISD::UMAX:
6674 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6675 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6676
6677 case ISD::UMIN:
6678 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6679 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6680
6681 // For smin/smax: If either operand is known negative/positive
6682 // respectively we don't need the other to be known at all.
6683 case ISD::SMAX: {
6684 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6685 if (Op1.isStrictlyPositive())
6686 return true;
6687
6688 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6689 if (Op0.isStrictlyPositive())
6690 return true;
6691
6692 if (Op1.isNonZero() && Op0.isNonZero())
6693 return true;
6694
6695 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6696 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6697 }
6698 case ISD::SMIN: {
6699 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6700 if (Op1.isNegative())
6701 return true;
6702
6703 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6704 if (Op0.isNegative())
6705 return true;
6706
6707 if (Op1.isNonZero() && Op0.isNonZero())
6708 return true;
6709
6710 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6711 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6712 }
6713
6714 case ISD::ROTL:
6715 case ISD::ROTR:
6716 case ISD::BITREVERSE:
6717 case ISD::BSWAP:
6718 case ISD::CTPOP:
6719 case ISD::ABS:
6721 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6722
6723 case ISD::SRA:
6724 case ISD::SRL: {
6725 if (Op->getFlags().hasExact())
6726 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6727 KnownBits ValKnown =
6728 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6729 if (ValKnown.isNegative())
6730 return true;
6731 // If max shift cnt of known ones is non-zero, result is non-zero.
6732 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6733 .getMaxValue();
6734 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6735 !ValKnown.One.lshr(MaxCnt).isZero())
6736 return true;
6737 break;
6738 }
6739 case ISD::UDIV:
6740 case ISD::SDIV:
6741 // div exact can only produce a zero if the dividend is zero.
6742 // TODO: For udiv this is also true if Op1 u<= Op0
6743 if (Op->getFlags().hasExact())
6744 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6745 break;
6746
6747 case ISD::ADD:
6748 if (Op->getFlags().hasNoUnsignedWrap())
6749 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6750 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6751 return true;
6752 // TODO: There are a lot more cases we can prove for add.
6753 break;
6754
6755 case ISD::SUB: {
6756 if (isNullConstant(Op.getOperand(0)))
6757 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6758
6759 std::optional<bool> ne = KnownBits::ne(
6760 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6761 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6762 return ne && *ne;
6763 }
6764
6765 case ISD::MUL:
6766 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6767 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6768 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6769 return true;
6770 break;
6771
6772 case ISD::ZERO_EXTEND:
6773 case ISD::SIGN_EXTEND:
6774 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6775 case ISD::VSCALE: {
6777 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6778 ConstantRange CR =
6779 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6780 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6781 return true;
6782 break;
6783 }
6784 }
6785
6786 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6787}
6788
6790 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6791 return !C1->isNegative();
6792
6793 switch (Op.getOpcode()) {
6794 case ISD::FABS:
6795 case ISD::FEXP:
6796 case ISD::FEXP2:
6797 case ISD::FEXP10:
6798 return true;
6799 default:
6800 return false;
6801 }
6802
6803 llvm_unreachable("covered opcode switch");
6804}
6805
6807 assert(Use.getValueType().isFloatingPoint());
6808 const SDNode *User = Use.getUser();
6809 if (User->getFlags().hasNoSignedZeros())
6810 return true;
6811
6812 unsigned OperandNo = Use.getOperandNo();
6813 // Check if this use is insensitive to the sign of zero
6814 switch (User->getOpcode()) {
6815 case ISD::SETCC:
6816 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6817 case ISD::FABS:
6818 // fabs always produces +0.0.
6819 return true;
6820 case ISD::FCOPYSIGN:
6821 // copysign overwrites the sign bit of the first operand.
6822 return OperandNo == 0;
6823 case ISD::FADD:
6824 case ISD::FSUB: {
6825 // Arithmetic with non-zero constants fixes the uncertainty around the
6826 // sign bit.
6827 SDValue Other = User->getOperand(1 - OperandNo);
6829 }
6830 case ISD::FP_TO_SINT:
6831 case ISD::FP_TO_UINT:
6832 // fp-to-int conversions normalize signed zeros.
6833 return true;
6834 default:
6835 return false;
6836 }
6837}
6838
6840 if (Op->getFlags().hasNoSignedZeros())
6841 return true;
6842 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6843 // regression. Ideally, this should be implemented as a demanded-bits
6844 // optimization that stems from the users.
6845 if (Op->use_size() > 2)
6846 return false;
6847 return all_of(Op->uses(),
6848 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6849}
6850
6852 // Check the obvious case.
6853 if (A == B) return true;
6854
6855 // For negative and positive zero.
6858 if (CA->isZero() && CB->isZero()) return true;
6859
6860 // Otherwise they may not be equal.
6861 return false;
6862}
6863
6864// Only bits set in Mask must be negated, other bits may be arbitrary.
6866 if (isBitwiseNot(V, AllowUndefs))
6867 return V.getOperand(0);
6868
6869 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6870 // bits in the non-extended part.
6871 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6872 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6873 return SDValue();
6874 SDValue ExtArg = V.getOperand(0);
6875 if (ExtArg.getScalarValueSizeInBits() >=
6876 MaskC->getAPIntValue().getActiveBits() &&
6877 isBitwiseNot(ExtArg, AllowUndefs) &&
6878 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6879 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6880 return ExtArg.getOperand(0).getOperand(0);
6881 return SDValue();
6882}
6883
6885 // Match masked merge pattern (X & ~M) op (Y & M)
6886 // Including degenerate case (X & ~M) op M
6887 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6888 SDValue Other) {
6889 if (SDValue NotOperand =
6890 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6891 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6892 NotOperand->getOpcode() == ISD::TRUNCATE)
6893 NotOperand = NotOperand->getOperand(0);
6894
6895 if (Other == NotOperand)
6896 return true;
6897 if (Other->getOpcode() == ISD::AND)
6898 return NotOperand == Other->getOperand(0) ||
6899 NotOperand == Other->getOperand(1);
6900 }
6901 return false;
6902 };
6903
6904 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6905 A = A->getOperand(0);
6906
6907 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6908 B = B->getOperand(0);
6909
6910 if (A->getOpcode() == ISD::AND)
6911 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6912 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6913 return false;
6914}
6915
6916// FIXME: unify with llvm::haveNoCommonBitsSet.
6918 assert(A.getValueType() == B.getValueType() &&
6919 "Values must have the same type");
6922 return true;
6925}
6926
6927static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6928 SelectionDAG &DAG) {
6929 if (cast<ConstantSDNode>(Step)->isZero())
6930 return DAG.getConstant(0, DL, VT);
6931
6932 return SDValue();
6933}
6934
6937 SelectionDAG &DAG) {
6938 int NumOps = Ops.size();
6939 assert(NumOps != 0 && "Can't build an empty vector!");
6940 assert(!VT.isScalableVector() &&
6941 "BUILD_VECTOR cannot be used with scalable types");
6942 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6943 "Incorrect element count in BUILD_VECTOR!");
6944
6945 // BUILD_VECTOR of UNDEFs is UNDEF.
6946 bool AllPoison = true;
6947 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6948 AllPoison &= Op.getOpcode() == ISD::POISON;
6949 return Op.isUndef();
6950 }))
6951 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6952
6953 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6954 SDValue IdentitySrc;
6955 bool IsIdentity = true;
6956 for (int i = 0; i != NumOps; ++i) {
6957 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6958 Ops[i].getOperand(0).getValueType() != VT ||
6959 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6960 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6961 Ops[i].getConstantOperandAPInt(1) != i) {
6962 IsIdentity = false;
6963 break;
6964 }
6965 IdentitySrc = Ops[i].getOperand(0);
6966 }
6967 if (IsIdentity)
6968 return IdentitySrc;
6969
6970 return SDValue();
6971}
6972
6973/// Try to simplify vector concatenation to an input value, undef, or build
6974/// vector.
6977 SelectionDAG &DAG) {
6978 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6980 [Ops](SDValue Op) {
6981 return Ops[0].getValueType() == Op.getValueType();
6982 }) &&
6983 "Concatenation of vectors with inconsistent value types!");
6984 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6985 VT.getVectorElementCount() &&
6986 "Incorrect element count in vector concatenation!");
6987
6988 if (Ops.size() == 1)
6989 return Ops[0];
6990
6991 // Concat of UNDEFs is UNDEF.
6992 bool AllPoison = true;
6993 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6994 AllPoison &= Op.getOpcode() == ISD::POISON;
6995 return Op.isUndef();
6996 }))
6997 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6998
6999 // Scan the operands and look for extract operations from a single source
7000 // that correspond to insertion at the same location via this concatenation:
7001 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
7002 SDValue IdentitySrc;
7003 bool IsIdentity = true;
7004 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
7005 SDValue Op = Ops[i];
7006 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
7007 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
7008 Op.getOperand(0).getValueType() != VT ||
7009 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
7010 Op.getConstantOperandVal(1) != IdentityIndex) {
7011 IsIdentity = false;
7012 break;
7013 }
7014 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
7015 "Unexpected identity source vector for concat of extracts");
7016 IdentitySrc = Op.getOperand(0);
7017 }
7018 if (IsIdentity) {
7019 assert(IdentitySrc && "Failed to set source vector of extracts");
7020 return IdentitySrc;
7021 }
7022
7023 // The code below this point is only designed to work for fixed width
7024 // vectors, so we bail out for now.
7025 if (VT.isScalableVector())
7026 return SDValue();
7027
7028 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7029 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7030 // BUILD_VECTOR.
7031 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7032 EVT SVT = VT.getScalarType();
7034 for (SDValue Op : Ops) {
7035 EVT OpVT = Op.getValueType();
7036 if (Op.getOpcode() == ISD::POISON)
7037 Elts.append(OpVT.getVectorNumElements(), DAG.getPOISON(SVT));
7038 else if (Op.getOpcode() == ISD::UNDEF)
7039 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7040 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7041 Elts.append(Op->op_begin(), Op->op_end());
7042 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7043 OpVT.getVectorNumElements() == 1 &&
7044 isNullConstant(Op.getOperand(2)))
7045 Elts.push_back(Op.getOperand(1));
7046 else
7047 return SDValue();
7048 }
7049
7050 // BUILD_VECTOR requires all inputs to be of the same type, find the
7051 // maximum type and extend them all.
7052 for (SDValue Op : Elts)
7053 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7054
7055 if (SVT.bitsGT(VT.getScalarType())) {
7056 for (SDValue &Op : Elts) {
7057 if (Op.getOpcode() == ISD::POISON)
7058 Op = DAG.getPOISON(SVT);
7059 else if (Op.getOpcode() == ISD::UNDEF)
7060 Op = DAG.getUNDEF(SVT);
7061 else
7062 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7063 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7064 : DAG.getSExtOrTrunc(Op, DL, SVT);
7065 }
7066 }
7067
7068 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7069 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7070 return V;
7071}
7072
7073/// Gets or creates the specified node.
7074SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7075 SDVTList VTs = getVTList(VT);
7077 AddNodeIDNode(ID, Opcode, VTs, {});
7078 void *IP = nullptr;
7079 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
7080 return SDValue(E, 0);
7081
7082 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7083 CSEMap.InsertNode(N, IP);
7084
7085 InsertNode(N);
7086 SDValue V = SDValue(N, 0);
7087 NewSDValueDbgMsg(V, "Creating new node: ", this);
7088 return V;
7089}
7090
7091SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7092 SDValue N1) {
7093 SDNodeFlags Flags;
7094 if (Inserter)
7095 Flags = Inserter->getFlags();
7096 return getNode(Opcode, DL, VT, N1, Flags);
7097}
7098
7099SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7100 SDValue N1, const SDNodeFlags Flags) {
7101 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7102
7103 // Constant fold unary operations with a vector integer or float operand.
7104 switch (Opcode) {
7105 default:
7106 // FIXME: Entirely reasonable to perform folding of other unary
7107 // operations here as the need arises.
7108 break;
7109 case ISD::FNEG:
7110 case ISD::FABS:
7111 case ISD::FCEIL:
7112 case ISD::FTRUNC:
7113 case ISD::FFLOOR:
7114 case ISD::FP_EXTEND:
7115 case ISD::FP_TO_SINT:
7116 case ISD::FP_TO_UINT:
7117 case ISD::FP_TO_FP16:
7118 case ISD::FP_TO_BF16:
7119 case ISD::TRUNCATE:
7120 case ISD::ANY_EXTEND:
7121 case ISD::ZERO_EXTEND:
7122 case ISD::SIGN_EXTEND:
7123 case ISD::UINT_TO_FP:
7124 case ISD::SINT_TO_FP:
7125 case ISD::FP16_TO_FP:
7126 case ISD::BF16_TO_FP:
7127 case ISD::BITCAST:
7128 case ISD::ABS:
7130 case ISD::BITREVERSE:
7131 case ISD::BSWAP:
7132 case ISD::CTLZ:
7134 case ISD::CTTZ:
7136 case ISD::CTPOP:
7137 case ISD::CTLS:
7138 case ISD::VECREDUCE_ADD:
7143 case ISD::VECREDUCE_MUL:
7144 case ISD::VECREDUCE_AND:
7145 case ISD::VECREDUCE_OR:
7146 case ISD::VECREDUCE_XOR:
7147 case ISD::STEP_VECTOR: {
7148 SDValue Ops = {N1};
7149 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7150 return Fold;
7151 }
7152 }
7153
7154 unsigned OpOpcode = N1.getNode()->getOpcode();
7155 switch (Opcode) {
7156 case ISD::STEP_VECTOR:
7157 assert(VT.isScalableVector() &&
7158 "STEP_VECTOR can only be used with scalable types");
7159 assert(OpOpcode == ISD::TargetConstant &&
7160 VT.getVectorElementType() == N1.getValueType() &&
7161 "Unexpected step operand");
7162 break;
7163 case ISD::FREEZE:
7164 assert(VT == N1.getValueType() && "Unexpected VT!");
7166 return N1;
7167 break;
7168 case ISD::TokenFactor:
7169 case ISD::MERGE_VALUES:
7171 return N1; // Factor, merge or concat of one node? No need.
7172 case ISD::BUILD_VECTOR: {
7173 // Attempt to simplify BUILD_VECTOR.
7174 SDValue Ops[] = {N1};
7175 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7176 return V;
7177 break;
7178 }
7179 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7180 case ISD::FP_EXTEND:
7182 "Invalid FP cast!");
7183 if (N1.getValueType() == VT) return N1; // noop conversion.
7184 assert((!VT.isVector() || VT.getVectorElementCount() ==
7186 "Vector element count mismatch!");
7187 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7188 if (N1.isUndef())
7189 return getUNDEF(VT);
7190 break;
7191 case ISD::FP_TO_SINT:
7192 case ISD::FP_TO_UINT:
7193 if (N1.isUndef())
7194 return getUNDEF(VT);
7195 break;
7196 case ISD::SINT_TO_FP:
7197 case ISD::UINT_TO_FP:
7198 // [us]itofp(undef) = 0, because the result value is bounded.
7199 if (N1.isUndef())
7200 return getConstantFP(0.0, DL, VT);
7201 break;
7202 case ISD::SIGN_EXTEND:
7203 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7204 "Invalid SIGN_EXTEND!");
7205 assert(VT.isVector() == N1.getValueType().isVector() &&
7206 "SIGN_EXTEND result type type should be vector iff the operand "
7207 "type is vector!");
7208 if (N1.getValueType() == VT) return N1; // noop extension
7209 assert((!VT.isVector() || VT.getVectorElementCount() ==
7211 "Vector element count mismatch!");
7212 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7213 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7214 SDNodeFlags Flags;
7215 if (OpOpcode == ISD::ZERO_EXTEND)
7216 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7217 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7218 transferDbgValues(N1, NewVal);
7219 return NewVal;
7220 }
7221
7222 if (OpOpcode == ISD::POISON)
7223 return getPOISON(VT);
7224
7225 if (N1.isUndef())
7226 // sext(undef) = 0, because the top bits will all be the same.
7227 return getConstant(0, DL, VT);
7228
7229 // Skip unnecessary sext_inreg pattern:
7230 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7231 if (OpOpcode == ISD::TRUNCATE) {
7232 SDValue OpOp = N1.getOperand(0);
7233 if (OpOp.getValueType() == VT) {
7234 unsigned NumSignExtBits =
7236 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7237 transferDbgValues(N1, OpOp);
7238 return OpOp;
7239 }
7240 }
7241 }
7242 break;
7243 case ISD::ZERO_EXTEND:
7244 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7245 "Invalid ZERO_EXTEND!");
7246 assert(VT.isVector() == N1.getValueType().isVector() &&
7247 "ZERO_EXTEND result type type should be vector iff the operand "
7248 "type is vector!");
7249 if (N1.getValueType() == VT) return N1; // noop extension
7250 assert((!VT.isVector() || VT.getVectorElementCount() ==
7252 "Vector element count mismatch!");
7253 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7254 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7255 SDNodeFlags Flags;
7256 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7257 SDValue NewVal =
7258 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7259 transferDbgValues(N1, NewVal);
7260 return NewVal;
7261 }
7262
7263 if (OpOpcode == ISD::POISON)
7264 return getPOISON(VT);
7265
7266 if (N1.isUndef())
7267 // zext(undef) = 0, because the top bits will be zero.
7268 return getConstant(0, DL, VT);
7269
7270 // Skip unnecessary zext_inreg pattern:
7271 // (zext (trunc x)) -> x iff the upper bits are known zero.
7272 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7273 // use to recognise zext_inreg patterns.
7274 if (OpOpcode == ISD::TRUNCATE) {
7275 SDValue OpOp = N1.getOperand(0);
7276 if (OpOp.getValueType() == VT) {
7277 if (OpOp.getOpcode() != ISD::AND) {
7280 if (MaskedValueIsZero(OpOp, HiBits)) {
7281 transferDbgValues(N1, OpOp);
7282 return OpOp;
7283 }
7284 }
7285 }
7286 }
7287 break;
7288 case ISD::ANY_EXTEND:
7289 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7290 "Invalid ANY_EXTEND!");
7291 assert(VT.isVector() == N1.getValueType().isVector() &&
7292 "ANY_EXTEND result type type should be vector iff the operand "
7293 "type is vector!");
7294 if (N1.getValueType() == VT) return N1; // noop extension
7295 assert((!VT.isVector() || VT.getVectorElementCount() ==
7297 "Vector element count mismatch!");
7298 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7299
7300 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7301 OpOpcode == ISD::ANY_EXTEND) {
7302 SDNodeFlags Flags;
7303 if (OpOpcode == ISD::ZERO_EXTEND)
7304 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7305 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7306 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7307 }
7308 if (N1.isUndef())
7309 return getUNDEF(VT);
7310
7311 // (ext (trunc x)) -> x
7312 if (OpOpcode == ISD::TRUNCATE) {
7313 SDValue OpOp = N1.getOperand(0);
7314 if (OpOp.getValueType() == VT) {
7315 transferDbgValues(N1, OpOp);
7316 return OpOp;
7317 }
7318 }
7319 break;
7320 case ISD::TRUNCATE:
7321 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7322 "Invalid TRUNCATE!");
7323 assert(VT.isVector() == N1.getValueType().isVector() &&
7324 "TRUNCATE result type type should be vector iff the operand "
7325 "type is vector!");
7326 if (N1.getValueType() == VT) return N1; // noop truncate
7327 assert((!VT.isVector() || VT.getVectorElementCount() ==
7329 "Vector element count mismatch!");
7330 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7331 if (OpOpcode == ISD::TRUNCATE)
7332 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7333 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7334 OpOpcode == ISD::ANY_EXTEND) {
7335 // If the source is smaller than the dest, we still need an extend.
7337 VT.getScalarType())) {
7338 SDNodeFlags Flags;
7339 if (OpOpcode == ISD::ZERO_EXTEND)
7340 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7341 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7342 }
7343 if (N1.getOperand(0).getValueType().bitsGT(VT))
7344 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7345 return N1.getOperand(0);
7346 }
7347 if (N1.isUndef())
7348 return getUNDEF(VT);
7349 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7350 return getVScale(DL, VT,
7352 break;
7356 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7357 assert(N1.getValueType().bitsLE(VT) &&
7358 "The input must be the same size or smaller than the result.");
7361 "The destination vector type must have fewer lanes than the input.");
7362 break;
7363 case ISD::ABS:
7364 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7365 if (N1.isUndef())
7366 return getConstant(0, DL, VT);
7367 break;
7369 assert(VT.isInteger() && VT == N1.getValueType() &&
7370 "Invalid ABS_MIN_POISON!");
7371 if (N1.isUndef())
7372 return getConstant(0, DL, VT);
7373 break;
7374 case ISD::BSWAP:
7375 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7376 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7377 "BSWAP types must be a multiple of 16 bits!");
7378 if (N1.isUndef())
7379 return getUNDEF(VT);
7380 // bswap(bswap(X)) -> X.
7381 if (OpOpcode == ISD::BSWAP)
7382 return N1.getOperand(0);
7383 break;
7384 case ISD::BITREVERSE:
7385 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7386 if (N1.isUndef())
7387 return getUNDEF(VT);
7388 break;
7389 case ISD::BITCAST:
7391 "Cannot BITCAST between types of different sizes!");
7392 if (VT == N1.getValueType()) return N1; // noop conversion.
7393 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7394 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7395 if (N1.isUndef())
7396 return getUNDEF(VT);
7397 break;
7399 assert(VT.isVector() && !N1.getValueType().isVector() &&
7400 (VT.getVectorElementType() == N1.getValueType() ||
7402 N1.getValueType().isInteger() &&
7404 "Illegal SCALAR_TO_VECTOR node!");
7405 if (N1.isUndef())
7406 return getUNDEF(VT);
7407 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7408 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7410 N1.getConstantOperandVal(1) == 0 &&
7411 N1.getOperand(0).getValueType() == VT)
7412 return N1.getOperand(0);
7413 break;
7414 case ISD::FNEG:
7415 // Negation of an unknown bag of bits is still completely undefined.
7416 if (N1.isUndef())
7417 return getUNDEF(VT);
7418
7419 if (OpOpcode == ISD::FNEG) // --X -> X
7420 return N1.getOperand(0);
7421 break;
7422 case ISD::FABS:
7423 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7424 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7425 break;
7426 case ISD::VSCALE:
7427 assert(VT == N1.getValueType() && "Unexpected VT!");
7428 break;
7429 case ISD::CTPOP:
7430 if (N1.getValueType().getScalarType() == MVT::i1)
7431 return N1;
7432 break;
7433 case ISD::CTLZ:
7434 case ISD::CTTZ:
7435 if (N1.getValueType().getScalarType() == MVT::i1)
7436 return getNOT(DL, N1, N1.getValueType());
7437 break;
7438 case ISD::CTLS:
7439 if (N1.getValueType().getScalarType() == MVT::i1)
7440 return getConstant(0, DL, VT);
7441 break;
7442 case ISD::VECREDUCE_ADD:
7443 if (N1.getValueType().getScalarType() == MVT::i1)
7444 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7445 break;
7448 if (N1.getValueType().getScalarType() == MVT::i1)
7449 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7450 break;
7453 if (N1.getValueType().getScalarType() == MVT::i1)
7454 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7455 break;
7456 case ISD::SPLAT_VECTOR:
7457 assert(VT.isVector() && "Wrong return type!");
7458 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7459 // that for now.
7461 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7463 N1.getValueType().isInteger() &&
7465 "Wrong operand type!");
7466 break;
7467 }
7468
7469 SDNode *N;
7470 SDVTList VTs = getVTList(VT);
7471 SDValue Ops[] = {N1};
7472 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7474 AddNodeIDNode(ID, Opcode, VTs, Ops);
7475 void *IP = nullptr;
7476 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7477 E->intersectFlagsWith(Flags);
7478 return SDValue(E, 0);
7479 }
7480
7481 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7482 N->setFlags(Flags);
7483 createOperands(N, Ops);
7484 CSEMap.InsertNode(N, IP);
7485 } else {
7486 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7487 createOperands(N, Ops);
7488 }
7489
7490 InsertNode(N);
7491 SDValue V = SDValue(N, 0);
7492 NewSDValueDbgMsg(V, "Creating new node: ", this);
7493 return V;
7494}
7495
7496static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth) {
7497 switch (Opcode) {
7498 default:
7499 llvm_unreachable("Unexpected integer identity opcode");
7500 case ISD::ADD:
7501 case ISD::OR:
7502 case ISD::XOR:
7503 case ISD::UMAX:
7504 return APInt::getZero(BitWidth);
7505 case ISD::MUL:
7506 return APInt(BitWidth, 1);
7507 case ISD::AND:
7508 case ISD::UMIN:
7510 case ISD::SMAX:
7512 case ISD::SMIN:
7514 }
7515}
7516
7517static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7518 const APInt &C2) {
7519 switch (Opcode) {
7520 case ISD::ADD: return C1 + C2;
7521 case ISD::SUB: return C1 - C2;
7522 case ISD::MUL: return C1 * C2;
7523 case ISD::AND: return C1 & C2;
7524 case ISD::OR: return C1 | C2;
7525 case ISD::XOR: return C1 ^ C2;
7526 case ISD::SHL: return C1 << C2;
7527 case ISD::SRL: return C1.lshr(C2);
7528 case ISD::SRA: return C1.ashr(C2);
7529 case ISD::ROTL: return C1.rotl(C2);
7530 case ISD::ROTR: return C1.rotr(C2);
7531 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7532 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7533 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7534 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7535 case ISD::SADDSAT: return C1.sadd_sat(C2);
7536 case ISD::UADDSAT: return C1.uadd_sat(C2);
7537 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7538 case ISD::USUBSAT: return C1.usub_sat(C2);
7539 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7540 case ISD::USHLSAT: return C1.ushl_sat(C2);
7541 case ISD::UDIV:
7542 if (!C2.getBoolValue())
7543 break;
7544 return C1.udiv(C2);
7545 case ISD::UREM:
7546 if (!C2.getBoolValue())
7547 break;
7548 return C1.urem(C2);
7549 case ISD::SDIV:
7550 if (!C2.getBoolValue())
7551 break;
7552 return C1.sdiv(C2);
7553 case ISD::SREM:
7554 if (!C2.getBoolValue())
7555 break;
7556 return C1.srem(C2);
7557 case ISD::AVGFLOORS:
7558 return APIntOps::avgFloorS(C1, C2);
7559 case ISD::AVGFLOORU:
7560 return APIntOps::avgFloorU(C1, C2);
7561 case ISD::AVGCEILS:
7562 return APIntOps::avgCeilS(C1, C2);
7563 case ISD::AVGCEILU:
7564 return APIntOps::avgCeilU(C1, C2);
7565 case ISD::ABDS:
7566 return APIntOps::abds(C1, C2);
7567 case ISD::ABDU:
7568 return APIntOps::abdu(C1, C2);
7569 case ISD::MULHS:
7570 return APIntOps::mulhs(C1, C2);
7571 case ISD::MULHU:
7572 return APIntOps::mulhu(C1, C2);
7573 case ISD::CLMUL:
7574 return APIntOps::clmul(C1, C2);
7575 case ISD::CLMULR:
7576 return APIntOps::clmulr(C1, C2);
7577 case ISD::CLMULH:
7578 return APIntOps::clmulh(C1, C2);
7579 case ISD::PEXT:
7580 return APIntOps::pext(C1, C2);
7581 case ISD::PDEP:
7582 return APIntOps::pdep(C1, C2);
7583 }
7584 return std::nullopt;
7585}
7586// Handle constant folding with UNDEF.
7587// TODO: Handle more cases.
7588static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7589 bool IsUndef1, const APInt &C2,
7590 bool IsUndef2) {
7591 if (!(IsUndef1 || IsUndef2))
7592 return FoldValue(Opcode, C1, C2);
7593
7594 // Fold and(x, undef) -> 0
7595 // Fold mul(x, undef) -> 0
7596 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7597 return APInt::getZero(C1.getBitWidth());
7598
7599 return std::nullopt;
7600}
7601
7603 const GlobalAddressSDNode *GA,
7604 const SDNode *N2) {
7605 if (GA->getOpcode() != ISD::GlobalAddress)
7606 return SDValue();
7607 if (!TLI->isOffsetFoldingLegal(GA))
7608 return SDValue();
7609 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7610 if (!C2)
7611 return SDValue();
7612 int64_t Offset = C2->getSExtValue();
7613 switch (Opcode) {
7614 case ISD::ADD:
7615 case ISD::PTRADD:
7616 break;
7617 case ISD::SUB: Offset = -uint64_t(Offset); break;
7618 default: return SDValue();
7619 }
7620 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7621 GA->getOffset() + uint64_t(Offset));
7622}
7623
7625 switch (Opcode) {
7626 case ISD::SDIV:
7627 case ISD::UDIV:
7628 case ISD::SREM:
7629 case ISD::UREM: {
7630 // If a divisor is zero/undef or any element of a divisor vector is
7631 // zero/undef, the whole op is undef.
7632 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7633 SDValue Divisor = Ops[1];
7634 if (Divisor.isUndef() || isNullConstant(Divisor))
7635 return true;
7636
7637 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7638 llvm::any_of(Divisor->op_values(),
7639 [](SDValue V) { return V.isUndef() ||
7640 isNullConstant(V); });
7641 // TODO: Handle signed overflow.
7642 }
7643 // TODO: Handle oversized shifts.
7644 default:
7645 return false;
7646 }
7647}
7648
7651 SDNodeFlags Flags) {
7652 // If the opcode is a target-specific ISD node, there's nothing we can
7653 // do here and the operand rules may not line up with the below, so
7654 // bail early.
7655 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7656 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7657 // foldCONCAT_VECTORS in getNode before this is called.
7658 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7659 return SDValue();
7660
7661 unsigned NumOps = Ops.size();
7662 if (NumOps == 0)
7663 return SDValue();
7664
7665 if (isUndef(Opcode, Ops))
7666 return getUNDEF(VT);
7667
7668 // Handle unary special cases.
7669 if (NumOps == 1) {
7670 SDValue N1 = Ops[0];
7671
7672 // Constant fold unary operations with an integer constant operand. Even
7673 // opaque constant will be folded, because the folding of unary operations
7674 // doesn't create new constants with different values. Nevertheless, the
7675 // opaque flag is preserved during folding to prevent future folding with
7676 // other constants.
7677 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7678 const APInt &Val = C->getAPIntValue();
7679 switch (Opcode) {
7680 case ISD::SIGN_EXTEND:
7681 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7682 C->isTargetOpcode(), C->isOpaque());
7683 case ISD::TRUNCATE:
7684 if (C->isOpaque())
7685 break;
7686 [[fallthrough]];
7687 case ISD::ZERO_EXTEND:
7688 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7689 C->isTargetOpcode(), C->isOpaque());
7690 case ISD::ANY_EXTEND:
7691 // Some targets like RISCV prefer to sign extend some types.
7692 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7693 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7694 C->isTargetOpcode(), C->isOpaque());
7695 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7696 C->isTargetOpcode(), C->isOpaque());
7697 case ISD::ABS:
7698 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7699 C->isOpaque());
7701 if (Val.isMinSignedValue())
7702 return getPOISON(VT);
7703 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7704 C->isOpaque());
7705 case ISD::BITREVERSE:
7706 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7707 C->isOpaque());
7708 case ISD::BSWAP:
7709 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7710 C->isOpaque());
7711 case ISD::CTPOP:
7712 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7713 C->isOpaque());
7714 case ISD::CTLZ:
7716 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7717 C->isOpaque());
7718 case ISD::CTTZ:
7720 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7721 C->isOpaque());
7722 case ISD::CTLS:
7723 // CTLS returns the number of extra sign bits so subtract one.
7724 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7725 C->isTargetOpcode(), C->isOpaque());
7726 case ISD::UINT_TO_FP:
7727 case ISD::SINT_TO_FP: {
7729 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7731 return getConstantFP(FPV, DL, VT);
7732 }
7733 case ISD::FP16_TO_FP:
7734 case ISD::BF16_TO_FP: {
7735 bool Ignored;
7736 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7737 : APFloat::BFloat(),
7738 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7739
7740 // This can return overflow, underflow, or inexact; we don't care.
7741 // FIXME need to be more flexible about rounding mode.
7743 &Ignored);
7744 return getConstantFP(FPV, DL, VT);
7745 }
7746 case ISD::STEP_VECTOR:
7747 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7748 return V;
7749 break;
7750 case ISD::BITCAST:
7751 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7752 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7753 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7754 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7755 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7756 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7757 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7758 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7759 break;
7760 }
7761 }
7762
7763 // Constant fold unary operations with a floating point constant operand.
7764 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7765 APFloat V = C->getValueAPF(); // make copy
7766 switch (Opcode) {
7767 case ISD::FNEG:
7768 V.changeSign();
7769 return getConstantFP(V, DL, VT);
7770 case ISD::FABS:
7771 V.clearSign();
7772 return getConstantFP(V, DL, VT);
7773 case ISD::FCEIL: {
7774 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7776 return getConstantFP(V, DL, VT);
7777 return SDValue();
7778 }
7779 case ISD::FTRUNC: {
7780 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7782 return getConstantFP(V, DL, VT);
7783 return SDValue();
7784 }
7785 case ISD::FFLOOR: {
7786 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7788 return getConstantFP(V, DL, VT);
7789 return SDValue();
7790 }
7791 case ISD::FP_EXTEND: {
7792 bool ignored;
7793 // This can return overflow, underflow, or inexact; we don't care.
7794 // FIXME need to be more flexible about rounding mode.
7795 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7796 &ignored);
7797 return getConstantFP(V, DL, VT);
7798 }
7799 case ISD::FP_TO_SINT:
7800 case ISD::FP_TO_UINT: {
7801 bool ignored;
7802 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7803 // FIXME need to be more flexible about rounding mode.
7805 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7806 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7807 break;
7808 return getConstant(IntVal, DL, VT);
7809 }
7810 case ISD::FP_TO_FP16:
7811 case ISD::FP_TO_BF16: {
7812 bool Ignored;
7813 // This can return overflow, underflow, or inexact; we don't care.
7814 // FIXME need to be more flexible about rounding mode.
7815 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7816 : APFloat::BFloat(),
7818 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7819 }
7820 case ISD::BITCAST:
7821 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7822 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7823 VT);
7824 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7825 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7826 VT);
7827 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7828 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7829 VT);
7830 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7831 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7832 break;
7833 }
7834 }
7835
7836 // Early-out if we failed to constant fold a bitcast.
7837 if (Opcode == ISD::BITCAST)
7838 return SDValue();
7839
7840 // Constant fold integer vector reductions with constant BUILD_VECTORs.
7841 if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
7842 Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
7843 Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL ||
7844 Opcode == ISD::VECREDUCE_OR || Opcode == ISD::VECREDUCE_XOR ||
7845 Opcode == ISD::VECREDUCE_AND) &&
7847 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7848 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
7849 APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
7850 for (SDValue Elt : N1->op_values()) {
7851 if (Elt.getOpcode() == ISD::POISON)
7852 return getPOISON(VT);
7853 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7854 return SDValue();
7855 APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7856 std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
7857 assert(Folded &&
7858 "Expected vector reduction base opcode to be foldable");
7859 Acc = *Folded;
7860 }
7861 EVT EltVT = N1.getValueType().getScalarType();
7862 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7863 }
7864 }
7865
7866 // Handle binops special cases.
7867 if (NumOps == 2) {
7868 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7869 return CFP;
7870
7871 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7872 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7873 if (C1->isOpaque() || C2->isOpaque())
7874 return SDValue();
7875
7876 std::optional<APInt> FoldAttempt =
7877 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7878 if (!FoldAttempt)
7879 return SDValue();
7880
7881 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7882 assert((!Folded || !VT.isVector()) &&
7883 "Can't fold vectors ops with scalar operands");
7884 return Folded;
7885 }
7886 }
7887
7888 // fold (add Sym, c) -> Sym+c
7890 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7891 if (TLI->isCommutativeBinOp(Opcode))
7893 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7894
7895 // fold (sext_in_reg c1) -> c2
7896 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7897 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7898
7899 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7900 unsigned FromBits = EVT.getScalarSizeInBits();
7901 Val <<= Val.getBitWidth() - FromBits;
7902 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7903 return getConstant(Val, DL, ConstantVT);
7904 };
7905
7906 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7907 const APInt &Val = C1->getAPIntValue();
7908 return SignExtendInReg(Val, VT);
7909 }
7910
7912 SmallVector<SDValue, 8> ScalarOps;
7913 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7914 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7915 SDValue Op = Ops[0].getOperand(I);
7916 if (Op.isUndef()) {
7917 ScalarOps.push_back(getUNDEF(OpVT));
7918 continue;
7919 }
7920 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7921 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7922 }
7923 return getBuildVector(VT, DL, ScalarOps);
7924 }
7925
7926 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7927 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7928 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7929 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7930 Ops[0].getOperand(0).getValueType()));
7931 }
7932 }
7933
7934 // Handle fshl/fshr special cases.
7935 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7936 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7937 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7938 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7939
7940 if (C1 && C2 && C3) {
7941 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7942 return SDValue();
7943 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7944 &V3 = C3->getAPIntValue();
7945
7946 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7947 : APIntOps::fshr(V1, V2, V3);
7948 return getConstant(FoldedVal, DL, VT);
7949 }
7950 }
7951
7952 // Handle fma/fmad special cases.
7953 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7954 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7955 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7956 Ops[2].getValueType() == VT && "FMA types must match!");
7960 if (C1 && C2 && C3) {
7961 APFloat V1 = C1->getValueAPF();
7962 const APFloat &V2 = C2->getValueAPF();
7963 const APFloat &V3 = C3->getValueAPF();
7964 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7965 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7967 } else
7968 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7969 return getConstantFP(V1, DL, VT);
7970 }
7971 }
7972
7973 // This is for vector folding only from here on.
7974 if (!VT.isVector())
7975 return SDValue();
7976
7977 ElementCount NumElts = VT.getVectorElementCount();
7978
7979 // See if we can fold through any bitcasted integer ops.
7980 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7981 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7982 (Ops[0].getOpcode() == ISD::BITCAST ||
7983 Ops[1].getOpcode() == ISD::BITCAST)) {
7986 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7987 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7988 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7989 N2.getValueType().isInteger()) {
7990 bool IsLE = getDataLayout().isLittleEndian();
7991 unsigned EltBits = VT.getScalarSizeInBits();
7992 SmallVector<APInt> RawBits1, RawBits2;
7993 BitVector UndefElts1, UndefElts2;
7994 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7995 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7996 SmallVector<APInt> RawBits;
7997 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7998 std::optional<APInt> Fold = FoldValueWithUndef(
7999 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
8000 if (!Fold)
8001 break;
8002 RawBits.push_back(*Fold);
8003 }
8004 if (RawBits.size() == NumElts.getFixedValue()) {
8005 // We have constant folded, but we might need to cast this again back
8006 // to the original (possibly legalized) type.
8007 EVT BVVT, BVEltVT;
8008 if (N1.getValueType() == VT) {
8009 BVVT = N1.getValueType();
8010 BVEltVT = BV1->getOperand(0).getValueType();
8011 } else {
8012 BVVT = N2.getValueType();
8013 BVEltVT = BV2->getOperand(0).getValueType();
8014 }
8015 unsigned BVEltBits = BVEltVT.getSizeInBits();
8016 SmallVector<APInt> DstBits;
8017 BitVector DstUndefs;
8019 DstBits, RawBits, DstUndefs,
8020 BitVector(RawBits.size(), false));
8021 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
8022 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
8023 if (DstUndefs[I])
8024 continue;
8025 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
8026 }
8027 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
8028 }
8029 }
8030 }
8031 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
8032 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
8033 isa<ConstantSDNode>(N2)) {
8034 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
8035 {N1, N2}, Flags))
8036 return getBitcast(VT, Res);
8037 }
8038 }
8039
8040 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
8041 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
8042 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
8043 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
8044 APInt RHSVal;
8045 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8046 APInt NewStep = Opcode == ISD::MUL
8047 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8048 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8049 return getStepVector(DL, VT, NewStep);
8050 }
8051 }
8052
8053 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8054 return !Op.getValueType().isVector() ||
8055 Op.getValueType().getVectorElementCount() == NumElts;
8056 };
8057
8058 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8059 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8060 Op.getOpcode() == ISD::BUILD_VECTOR ||
8061 Op.getOpcode() == ISD::SPLAT_VECTOR;
8062 };
8063
8064 // All operands must be vector types with the same number of elements as
8065 // the result type and must be either UNDEF or a build/splat vector
8066 // or UNDEF scalars.
8067 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8068 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8069 return SDValue();
8070
8071 // If we are comparing vectors, then the result needs to be a i1 boolean that
8072 // is then extended back to the legal result type depending on how booleans
8073 // are represented.
8074 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8075 ISD::NodeType ExtendCode =
8076 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8077 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8079
8080 // Find legal integer scalar type for constant promotion and
8081 // ensure that its scalar size is at least as large as source.
8082 EVT LegalSVT = VT.getScalarType();
8083 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8084 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8085 if (LegalSVT.bitsLT(VT.getScalarType()))
8086 return SDValue();
8087 }
8088
8089 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8090 // only have one operand to check. For fixed-length vector types we may have
8091 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8092 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8093
8094 // Constant fold each scalar lane separately.
8095 SmallVector<SDValue, 4> ScalarResults;
8096 for (unsigned I = 0; I != NumVectorElts; I++) {
8097 SmallVector<SDValue, 4> ScalarOps;
8098 for (SDValue Op : Ops) {
8099 EVT InSVT = Op.getValueType().getScalarType();
8100 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8101 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8102 if (Op.isUndef())
8103 ScalarOps.push_back(getUNDEF(InSVT));
8104 else
8105 ScalarOps.push_back(Op);
8106 continue;
8107 }
8108
8109 SDValue ScalarOp =
8110 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8111 EVT ScalarVT = ScalarOp.getValueType();
8112
8113 // Build vector (integer) scalar operands may need implicit
8114 // truncation - do this before constant folding.
8115 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8116 // Don't create illegally-typed nodes unless they're constants or undef
8117 // - if we fail to constant fold we can't guarantee the (dead) nodes
8118 // we're creating will be cleaned up before being visited for
8119 // legalization.
8120 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8121 !isa<ConstantSDNode>(ScalarOp) &&
8122 TLI->getTypeAction(*getContext(), InSVT) !=
8124 return SDValue();
8125 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8126 }
8127
8128 ScalarOps.push_back(ScalarOp);
8129 }
8130
8131 // Constant fold the scalar operands.
8132 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8133
8134 // Scalar folding only succeeded if the result is a constant or UNDEF.
8135 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8136 ScalarResult.getOpcode() != ISD::ConstantFP)
8137 return SDValue();
8138
8139 // Legalize the (integer) scalar constant if necessary. We only do
8140 // this once we know the folding succeeded, since otherwise we would
8141 // get a node with illegal type which has a user.
8142 if (LegalSVT != SVT)
8143 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8144
8145 ScalarResults.push_back(ScalarResult);
8146 }
8147
8148 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8149 : getBuildVector(VT, DL, ScalarResults);
8150 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8151 return V;
8152}
8153
8156 // TODO: Add support for unary/ternary fp opcodes.
8157 if (Ops.size() != 2)
8158 return SDValue();
8159
8160 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8161 // should. That will require dealing with a potentially non-default
8162 // rounding mode, checking the "opStatus" return value from the APFloat
8163 // math calculations, and possibly other variations.
8164 SDValue N1 = Ops[0];
8165 SDValue N2 = Ops[1];
8166 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8167 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8168 if (N1CFP && N2CFP) {
8169 APFloat C1 = N1CFP->getValueAPF(); // make copy
8170 const APFloat &C2 = N2CFP->getValueAPF();
8171 switch (Opcode) {
8172 case ISD::FADD:
8174 return getConstantFP(C1, DL, VT);
8175 case ISD::FSUB:
8177 return getConstantFP(C1, DL, VT);
8178 case ISD::FMUL:
8180 return getConstantFP(C1, DL, VT);
8181 case ISD::FDIV:
8183 return getConstantFP(C1, DL, VT);
8184 case ISD::FREM:
8185 C1.mod(C2);
8186 return getConstantFP(C1, DL, VT);
8187 case ISD::FCOPYSIGN:
8188 C1.copySign(C2);
8189 return getConstantFP(C1, DL, VT);
8190 case ISD::FMINNUM:
8191 return getConstantFP(minnum(C1, C2), DL, VT);
8192 case ISD::FMAXNUM:
8193 return getConstantFP(maxnum(C1, C2), DL, VT);
8194 case ISD::FMINIMUM:
8195 return getConstantFP(minimum(C1, C2), DL, VT);
8196 case ISD::FMAXIMUM:
8197 return getConstantFP(maximum(C1, C2), DL, VT);
8198 case ISD::FMINIMUMNUM:
8199 return getConstantFP(minimumnum(C1, C2), DL, VT);
8200 case ISD::FMAXIMUMNUM:
8201 return getConstantFP(maximumnum(C1, C2), DL, VT);
8202 default: break;
8203 }
8204 }
8205 if (N1CFP && Opcode == ISD::FP_ROUND) {
8206 APFloat C1 = N1CFP->getValueAPF(); // make copy
8207 bool Unused;
8208 // This can return overflow, underflow, or inexact; we don't care.
8209 // FIXME need to be more flexible about rounding mode.
8211 &Unused);
8212 return getConstantFP(C1, DL, VT);
8213 }
8214
8215 switch (Opcode) {
8216 case ISD::FSUB:
8217 // -0.0 - undef --> undef (consistent with "fneg undef")
8218 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8219 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8220 return getUNDEF(VT);
8221 [[fallthrough]];
8222
8223 case ISD::FADD:
8224 case ISD::FMUL:
8225 case ISD::FDIV:
8226 case ISD::FREM:
8227 // If both operands are undef, the result is undef. If 1 operand is undef,
8228 // the result is NaN. This should match the behavior of the IR optimizer.
8229 if (N1.isUndef() && N2.isUndef())
8230 return getUNDEF(VT);
8231 if (N1.isUndef() || N2.isUndef())
8233 }
8234 return SDValue();
8235}
8236
8238 const SDLoc &DL, EVT DstEltVT) {
8239 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8240
8241 // If this is already the right type, we're done.
8242 if (SrcEltVT == DstEltVT)
8243 return SDValue(BV, 0);
8244
8245 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8246 unsigned DstBitSize = DstEltVT.getSizeInBits();
8247
8248 // If this is a conversion of N elements of one type to N elements of another
8249 // type, convert each element. This handles FP<->INT cases.
8250 if (SrcBitSize == DstBitSize) {
8252 for (SDValue Op : BV->op_values()) {
8253 // If the vector element type is not legal, the BUILD_VECTOR operands
8254 // are promoted and implicitly truncated. Make that explicit here.
8255 if (Op.getValueType() != SrcEltVT)
8256 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8257 Ops.push_back(getBitcast(DstEltVT, Op));
8258 }
8259 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8261 return getBuildVector(VT, DL, Ops);
8262 }
8263
8264 // Otherwise, we're growing or shrinking the elements. To avoid having to
8265 // handle annoying details of growing/shrinking FP values, we convert them to
8266 // int first.
8267 if (SrcEltVT.isFloatingPoint()) {
8268 // Convert the input float vector to a int vector where the elements are the
8269 // same sizes.
8270 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8271 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8273 DstEltVT);
8274 return SDValue();
8275 }
8276
8277 // Now we know the input is an integer vector. If the output is a FP type,
8278 // convert to integer first, then to FP of the right size.
8279 if (DstEltVT.isFloatingPoint()) {
8280 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8281 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8283 DstEltVT);
8284 return SDValue();
8285 }
8286
8287 // Okay, we know the src/dst types are both integers of differing types.
8288 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8289
8290 // Extract the constant raw bit data.
8291 BitVector UndefElements;
8292 SmallVector<APInt> RawBits;
8293 bool IsLE = getDataLayout().isLittleEndian();
8294 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8295 return SDValue();
8296
8298 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8299 if (UndefElements[I])
8300 Ops.push_back(getUNDEF(DstEltVT));
8301 else
8302 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8303 }
8304
8305 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8306 return getBuildVector(VT, DL, Ops);
8307}
8308
8310 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8311
8312 // There's no need to assert on a byte-aligned pointer. All pointers are at
8313 // least byte aligned.
8314 if (A == Align(1))
8315 return Val;
8316
8317 SDVTList VTs = getVTList(Val.getValueType());
8319 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
8320 ID.AddInteger(A.value());
8321
8322 void *IP = nullptr;
8323 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
8324 return SDValue(E, 0);
8325
8326 auto *N =
8327 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8328 createOperands(N, {Val});
8329
8330 CSEMap.InsertNode(N, IP);
8331 InsertNode(N);
8332
8333 SDValue V(N, 0);
8334 NewSDValueDbgMsg(V, "Creating new node: ", this);
8335 return V;
8336}
8337
8338SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8339 SDValue N1, SDValue N2) {
8340 SDNodeFlags Flags;
8341 if (Inserter)
8342 Flags = Inserter->getFlags();
8343 return getNode(Opcode, DL, VT, N1, N2, Flags);
8344}
8345
8347 SDValue &N2) const {
8348 if (!TLI->isCommutativeBinOp(Opcode))
8349 return;
8350
8351 // Canonicalize:
8352 // binop(const, nonconst) -> binop(nonconst, const)
8355 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8356 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8357 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8358 std::swap(N1, N2);
8359
8360 // Canonicalize:
8361 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8362 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8364 std::swap(N1, N2);
8365}
8366
8367SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8368 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8370 N2.getOpcode() != ISD::DELETED_NODE &&
8371 "Operand is DELETED_NODE!");
8372
8373 canonicalizeCommutativeBinop(Opcode, N1, N2);
8374
8375 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8376 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8377
8378 // Don't allow undefs in vector splats - we might be returning N2 when folding
8379 // to zero etc.
8380 ConstantSDNode *N2CV =
8381 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8382
8383 switch (Opcode) {
8384 default: break;
8385 case ISD::TokenFactor:
8386 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8387 N2.getValueType() == MVT::Other && "Invalid token factor!");
8388 // Fold trivial token factors.
8389 if (N1.getOpcode() == ISD::EntryToken) return N2;
8390 if (N2.getOpcode() == ISD::EntryToken) return N1;
8391 if (N1 == N2) return N1;
8392 break;
8393 case ISD::BUILD_VECTOR: {
8394 // Attempt to simplify BUILD_VECTOR.
8395 SDValue Ops[] = {N1, N2};
8396 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8397 return V;
8398 break;
8399 }
8400 case ISD::CONCAT_VECTORS: {
8401 SDValue Ops[] = {N1, N2};
8402 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8403 return V;
8404 break;
8405 }
8406 case ISD::AND:
8407 assert(VT.isInteger() && "This operator does not apply to FP types!");
8408 assert(N1.getValueType() == N2.getValueType() &&
8409 N1.getValueType() == VT && "Binary operator types must match!");
8410 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8411 // worth handling here.
8412 if (N2CV && N2CV->isZero())
8413 return N2;
8414 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8415 return N1;
8416 break;
8417 case ISD::OR:
8418 case ISD::XOR:
8419 case ISD::ADD:
8420 case ISD::PTRADD:
8421 case ISD::SUB:
8422 assert(VT.isInteger() && "This operator does not apply to FP types!");
8423 assert(N1.getValueType() == N2.getValueType() &&
8424 N1.getValueType() == VT && "Binary operator types must match!");
8425 // The equal operand types requirement is unnecessarily strong for PTRADD.
8426 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8427 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8428 // logic everywhere where PTRADDs may be folded or combined to properly
8429 // support them. If/when we introduce pointer types to the SDAG, we will
8430 // need to relax this constraint.
8431
8432 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8433 // it's worth handling here.
8434 if (N2CV && N2CV->isZero())
8435 return N1;
8436 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8437 VT.getScalarType() == MVT::i1)
8438 return getNode(ISD::XOR, DL, VT, N1, N2);
8439 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8440 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8441 N2.getOpcode() == ISD::VSCALE) {
8442 const APInt &C1 = N1->getConstantOperandAPInt(0);
8443 const APInt &C2 = N2->getConstantOperandAPInt(0);
8444 return getVScale(DL, VT, C1 + C2);
8445 }
8446 break;
8447 case ISD::MUL:
8448 assert(VT.isInteger() && "This operator does not apply to FP types!");
8449 assert(N1.getValueType() == N2.getValueType() &&
8450 N1.getValueType() == VT && "Binary operator types must match!");
8451 if (VT.getScalarType() == MVT::i1)
8452 return getNode(ISD::AND, DL, VT, N1, N2);
8453 if (N2CV && N2CV->isZero())
8454 return N2;
8455 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8456 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8457 const APInt &N2CImm = N2C->getAPIntValue();
8458 return getVScale(DL, VT, MulImm * N2CImm);
8459 }
8460 break;
8461 case ISD::UDIV:
8462 case ISD::UREM:
8463 case ISD::MULHU:
8464 case ISD::MULHS:
8465 case ISD::SDIV:
8466 case ISD::SREM:
8467 case ISD::SADDSAT:
8468 case ISD::SSUBSAT:
8469 case ISD::UADDSAT:
8470 case ISD::USUBSAT:
8471 assert(VT.isInteger() && "This operator does not apply to FP types!");
8472 assert(N1.getValueType() == N2.getValueType() &&
8473 N1.getValueType() == VT && "Binary operator types must match!");
8474 if (VT.getScalarType() == MVT::i1) {
8475 // fold (add_sat x, y) -> (or x, y) for bool types.
8476 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8477 return getNode(ISD::OR, DL, VT, N1, N2);
8478 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8479 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8480 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8481 }
8482 break;
8483 case ISD::SCMP:
8484 case ISD::UCMP:
8485 assert(N1.getValueType() == N2.getValueType() &&
8486 "Types of operands of UCMP/SCMP must match");
8487 assert(N1.getValueType().isVector() == VT.isVector() &&
8488 "Operands and return type of must both be scalars or vectors");
8489 if (VT.isVector())
8492 "Result and operands must have the same number of elements");
8493 break;
8494 case ISD::AVGFLOORS:
8495 case ISD::AVGFLOORU:
8496 case ISD::AVGCEILS:
8497 case ISD::AVGCEILU:
8498 assert(VT.isInteger() && "This operator does not apply to FP types!");
8499 assert(N1.getValueType() == N2.getValueType() &&
8500 N1.getValueType() == VT && "Binary operator types must match!");
8501 break;
8502 case ISD::ABDS:
8503 case ISD::ABDU:
8504 assert(VT.isInteger() && "This operator does not apply to FP types!");
8505 assert(N1.getValueType() == N2.getValueType() &&
8506 N1.getValueType() == VT && "Binary operator types must match!");
8507 if (VT.getScalarType() == MVT::i1)
8508 return getNode(ISD::XOR, DL, VT, N1, N2);
8509 break;
8510 case ISD::SMIN:
8511 case ISD::UMAX:
8512 assert(VT.isInteger() && "This operator does not apply to FP types!");
8513 assert(N1.getValueType() == N2.getValueType() &&
8514 N1.getValueType() == VT && "Binary operator types must match!");
8515 if (VT.getScalarType() == MVT::i1)
8516 return getNode(ISD::OR, DL, VT, N1, N2);
8517 break;
8518 case ISD::SMAX:
8519 case ISD::UMIN:
8520 assert(VT.isInteger() && "This operator does not apply to FP types!");
8521 assert(N1.getValueType() == N2.getValueType() &&
8522 N1.getValueType() == VT && "Binary operator types must match!");
8523 if (VT.getScalarType() == MVT::i1)
8524 return getNode(ISD::AND, DL, VT, N1, N2);
8525 break;
8526 case ISD::FADD:
8527 case ISD::FSUB:
8528 case ISD::FMUL:
8529 case ISD::FDIV:
8530 case ISD::FREM:
8531 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8532 assert(N1.getValueType() == N2.getValueType() &&
8533 N1.getValueType() == VT && "Binary operator types must match!");
8534 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8535 return V;
8536 break;
8537 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8538 assert(N1.getValueType() == VT &&
8541 "Invalid FCOPYSIGN!");
8542 break;
8543 case ISD::SHL:
8544 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8545 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8546 const APInt &ShiftImm = N2C->getAPIntValue();
8547 return getVScale(DL, VT, MulImm << ShiftImm);
8548 }
8549 [[fallthrough]];
8550 case ISD::SRA:
8551 case ISD::SRL:
8552 if (SDValue V = simplifyShift(N1, N2))
8553 return V;
8554 [[fallthrough]];
8555 case ISD::ROTL:
8556 case ISD::ROTR:
8557 case ISD::SSHLSAT:
8558 case ISD::USHLSAT:
8559 assert(VT == N1.getValueType() &&
8560 "Shift operators return type must be the same as their first arg");
8561 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8562 "Shifts only work on integers");
8563 assert((!VT.isVector() || VT == N2.getValueType()) &&
8564 "Vector shift amounts must be in the same as their first arg");
8565 // Verify that the shift amount VT is big enough to hold valid shift
8566 // amounts. This catches things like trying to shift an i1024 value by an
8567 // i8, which is easy to fall into in generic code that uses
8568 // TLI.getShiftAmount().
8571 "Invalid use of small shift amount with oversized value!");
8572
8573 // Always fold shifts of i1 values so the code generator doesn't need to
8574 // handle them. Since we know the size of the shift has to be less than the
8575 // size of the value, the shift/rotate count is guaranteed to be zero.
8576 if (VT == MVT::i1)
8577 return N1;
8578 if (N2CV && N2CV->isZero())
8579 return N1;
8580 break;
8581 case ISD::FP_ROUND:
8583 VT.bitsLE(N1.getValueType()) && N2C &&
8584 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8585 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8586 if (N1.getValueType() == VT) return N1; // noop conversion.
8587 break;
8588 case ISD::IS_FPCLASS: {
8590 "IS_FPCLASS is used for a non-floating type");
8591 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8592 // is.fpclass(poison, mask) -> poison
8593 if (N1.getOpcode() == ISD::POISON)
8594 return getPOISON(VT);
8595 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8596 // If all tests are made, it doesn't matter what the value is.
8597 if ((Mask & fcAllFlags) == fcAllFlags)
8598 return getBoolConstant(true, DL, VT, N1.getValueType());
8599 if ((Mask & fcAllFlags) == 0)
8600 return getBoolConstant(false, DL, VT, N1.getValueType());
8601 break;
8602 }
8603 case ISD::AssertNoFPClass: {
8605 "AssertNoFPClass is used for a non-floating type");
8606 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8607 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8608 assert(llvm::to_underlying(NoFPClass) <=
8610 "FPClassTest value too large");
8611 (void)NoFPClass;
8612 break;
8613 }
8614 case ISD::AssertSext:
8615 case ISD::AssertZext: {
8616 EVT EVT = cast<VTSDNode>(N2)->getVT();
8617 assert(VT == N1.getValueType() && "Not an inreg extend!");
8618 assert(VT.isInteger() && EVT.isInteger() &&
8619 "Cannot *_EXTEND_INREG FP types");
8620 assert(!EVT.isVector() &&
8621 "AssertSExt/AssertZExt type should be the vector element type "
8622 "rather than the vector type!");
8623 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8624 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8625 break;
8626 }
8628 EVT EVT = cast<VTSDNode>(N2)->getVT();
8629 assert(VT == N1.getValueType() && "Not an inreg extend!");
8630 assert(VT.isInteger() && EVT.isInteger() &&
8631 "Cannot *_EXTEND_INREG FP types");
8632 assert(EVT.isVector() == VT.isVector() &&
8633 "SIGN_EXTEND_INREG type should be vector iff the operand "
8634 "type is vector!");
8635 assert((!EVT.isVector() ||
8637 "Vector element counts must match in SIGN_EXTEND_INREG");
8638 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8639 if (EVT == VT) return N1; // Not actually extending
8640 break;
8641 }
8643 case ISD::FP_TO_UINT_SAT: {
8644 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8645 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8646 assert(N1.getValueType().isVector() == VT.isVector() &&
8647 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8648 "vector!");
8649 assert((!VT.isVector() || VT.getVectorElementCount() ==
8651 "Vector element counts must match in FP_TO_*INT_SAT");
8652 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8653 "Type to saturate to must be a scalar.");
8654 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8655 "Not extending!");
8656 break;
8657 }
8660 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8661 element type of the vector.");
8662
8663 // Extract from an undefined value or using an undefined index is undefined.
8664 if (N1.isUndef() || N2.isUndef())
8665 return getUNDEF(VT);
8666
8667 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8668 // vectors. For scalable vectors we will provide appropriate support for
8669 // dealing with arbitrary indices.
8670 if (N2C && N1.getValueType().isFixedLengthVector() &&
8671 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8672 return getPOISON(VT);
8673
8674 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8675 // expanding copies of large vectors from registers. This only works for
8676 // fixed length vectors, since we need to know the exact number of
8677 // elements.
8678 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8680 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8681 return getExtractVectorElt(DL, VT,
8682 N1.getOperand(N2C->getZExtValue() / Factor),
8683 N2C->getZExtValue() % Factor);
8684 }
8685
8686 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8687 // lowering is expanding large vector constants.
8688 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8689 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8692 "BUILD_VECTOR used for scalable vectors");
8693 unsigned Index =
8694 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8695 SDValue Elt = N1.getOperand(Index);
8696
8697 if (VT != Elt.getValueType())
8698 // If the vector element type is not legal, the BUILD_VECTOR operands
8699 // are promoted and implicitly truncated, and the result implicitly
8700 // extended. Make that explicit here.
8701 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8702
8703 return Elt;
8704 }
8705
8706 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8707 // operations are lowered to scalars.
8708 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8709 // If the indices are the same, return the inserted element else
8710 // if the indices are known different, extract the element from
8711 // the original vector.
8712 SDValue N1Op2 = N1.getOperand(2);
8714
8715 if (N1Op2C && N2C) {
8716 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8717 if (VT == N1.getOperand(1).getValueType())
8718 return N1.getOperand(1);
8719 if (VT.isFloatingPoint()) {
8721 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8722 }
8723 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8724 }
8725 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8726 }
8727 }
8728
8729 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8730 // when vector types are scalarized and v1iX is legal.
8731 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8732 // Here we are completely ignoring the extract element index (N2),
8733 // which is fine for fixed width vectors, since any index other than 0
8734 // is undefined anyway. However, this cannot be ignored for scalable
8735 // vectors - in theory we could support this, but we don't want to do this
8736 // without a profitability check.
8737 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8739 N1.getValueType().getVectorNumElements() == 1) {
8740 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8741 N1.getOperand(1));
8742 }
8743 break;
8745 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8746 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8747 (N1.getValueType().isInteger() == VT.isInteger()) &&
8748 N1.getValueType() != VT &&
8749 "Wrong types for EXTRACT_ELEMENT!");
8750
8751 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8752 // 64-bit integers into 32-bit parts. Instead of building the extract of
8753 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8754 if (N1.getOpcode() == ISD::BUILD_PAIR)
8755 return N1.getOperand(N2C->getZExtValue());
8756
8757 // EXTRACT_ELEMENT of a constant int is also very common.
8758 if (N1C) {
8759 unsigned ElementSize = VT.getSizeInBits();
8760 unsigned Shift = ElementSize * N2C->getZExtValue();
8761 const APInt &Val = N1C->getAPIntValue();
8762 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8763 }
8764 break;
8766 EVT N1VT = N1.getValueType();
8767 assert(VT.isVector() && N1VT.isVector() &&
8768 "Extract subvector VTs must be vectors!");
8770 "Extract subvector VTs must have the same element type!");
8771 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8772 "Cannot extract a scalable vector from a fixed length vector!");
8773 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8775 "Extract subvector must be from larger vector to smaller vector!");
8776 assert(N2C && "Extract subvector index must be a constant");
8777 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8778 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8779 N1VT.getVectorMinNumElements()) &&
8780 "Extract subvector overflow!");
8781 assert(N2C->getAPIntValue().getBitWidth() ==
8782 TLI->getVectorIdxWidth(getDataLayout()) &&
8783 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8784 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8785 "Extract index is not a multiple of the output vector length");
8786
8787 // Trivial extraction.
8788 if (VT == N1VT)
8789 return N1;
8790
8791 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8792 if (N1.isUndef())
8793 return getUNDEF(VT);
8794
8795 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8796 // the concat have the same type as the extract.
8797 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8798 VT == N1.getOperand(0).getValueType()) {
8799 unsigned Factor = VT.getVectorMinNumElements();
8800 return N1.getOperand(N2C->getZExtValue() / Factor);
8801 }
8802
8803 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8804 // during shuffle legalization.
8805 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8806 VT == N1.getOperand(1).getValueType())
8807 return N1.getOperand(1);
8808 break;
8809 }
8810 }
8811
8812 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8813 switch (Opcode) {
8814 case ISD::XOR:
8815 case ISD::ADD:
8816 case ISD::PTRADD:
8817 case ISD::SUB:
8819 case ISD::UDIV:
8820 case ISD::SDIV:
8821 case ISD::UREM:
8822 case ISD::SREM:
8823 case ISD::MUL:
8824 case ISD::AND:
8825 case ISD::SSUBSAT:
8826 case ISD::USUBSAT:
8827 case ISD::UMIN:
8828 case ISD::OR:
8829 case ISD::SADDSAT:
8830 case ISD::UADDSAT:
8831 case ISD::UMAX:
8832 case ISD::SMAX:
8833 case ISD::SMIN:
8834 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8835 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8836 }
8837 }
8838
8839 // Canonicalize an UNDEF to the RHS, even over a constant.
8840 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8841 if (TLI->isCommutativeBinOp(Opcode)) {
8842 std::swap(N1, N2);
8843 } else {
8844 switch (Opcode) {
8845 case ISD::PTRADD:
8846 case ISD::SUB:
8847 // fold op(undef, non_undef_arg2) -> undef.
8848 return N1;
8850 case ISD::UDIV:
8851 case ISD::SDIV:
8852 case ISD::UREM:
8853 case ISD::SREM:
8854 case ISD::SSUBSAT:
8855 case ISD::USUBSAT:
8856 // fold op(undef, non_undef_arg2) -> 0.
8857 return getConstant(0, DL, VT);
8858 }
8859 }
8860 }
8861
8862 // Fold a bunch of operators when the RHS is undef.
8863 if (N2.getOpcode() == ISD::UNDEF) {
8864 switch (Opcode) {
8865 case ISD::XOR:
8866 if (N1.getOpcode() == ISD::UNDEF)
8867 // Handle undef ^ undef -> 0 special case. This is a common
8868 // idiom (misuse).
8869 return getConstant(0, DL, VT);
8870 [[fallthrough]];
8871 case ISD::ADD:
8872 case ISD::PTRADD:
8873 case ISD::SUB:
8874 // fold op(arg1, undef) -> undef.
8875 return N2;
8876 case ISD::UDIV:
8877 case ISD::SDIV:
8878 case ISD::UREM:
8879 case ISD::SREM:
8880 // fold op(arg1, undef) -> poison.
8881 return getPOISON(VT);
8882 case ISD::MUL:
8883 case ISD::AND:
8884 case ISD::SSUBSAT:
8885 case ISD::USUBSAT:
8886 case ISD::UMIN:
8887 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8888 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8889 case ISD::OR:
8890 case ISD::SADDSAT:
8891 case ISD::UADDSAT:
8892 case ISD::UMAX:
8893 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8894 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8895 case ISD::SMAX:
8896 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8897 return N1.getOpcode() == ISD::UNDEF
8898 ? N2
8899 : getConstant(
8901 VT);
8902 case ISD::SMIN:
8903 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8904 return N1.getOpcode() == ISD::UNDEF
8905 ? N2
8906 : getConstant(
8908 VT);
8909 }
8910 }
8911
8912 // Perform trivial constant folding.
8913 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8914 return SV;
8915
8916 // Memoize this node if possible.
8917 SDNode *N;
8918 SDVTList VTs = getVTList(VT);
8919 SDValue Ops[] = {N1, N2};
8920 if (VT != MVT::Glue) {
8922 AddNodeIDNode(ID, Opcode, VTs, Ops);
8923 void *IP = nullptr;
8924 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8925 E->intersectFlagsWith(Flags);
8926 return SDValue(E, 0);
8927 }
8928
8929 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8930 N->setFlags(Flags);
8931 createOperands(N, Ops);
8932 CSEMap.InsertNode(N, IP);
8933 } else {
8934 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8935 createOperands(N, Ops);
8936 }
8937
8938 InsertNode(N);
8939 SDValue V = SDValue(N, 0);
8940 NewSDValueDbgMsg(V, "Creating new node: ", this);
8941 return V;
8942}
8943
8944SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8945 SDValue N1, SDValue N2, SDValue N3) {
8946 SDNodeFlags Flags;
8947 if (Inserter)
8948 Flags = Inserter->getFlags();
8949 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8950}
8951
8952SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8953 SDValue N1, SDValue N2, SDValue N3,
8954 const SDNodeFlags Flags) {
8956 N2.getOpcode() != ISD::DELETED_NODE &&
8957 N3.getOpcode() != ISD::DELETED_NODE &&
8958 "Operand is DELETED_NODE!");
8959 // Perform various simplifications.
8960 switch (Opcode) {
8961 case ISD::BUILD_VECTOR: {
8962 // Attempt to simplify BUILD_VECTOR.
8963 SDValue Ops[] = {N1, N2, N3};
8964 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8965 return V;
8966 break;
8967 }
8968 case ISD::CONCAT_VECTORS: {
8969 SDValue Ops[] = {N1, N2, N3};
8970 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8971 return V;
8972 break;
8973 }
8974 case ISD::SETCC: {
8975 assert(VT.isInteger() && "SETCC result type must be an integer!");
8976 assert(N1.getValueType() == N2.getValueType() &&
8977 "SETCC operands must have the same type!");
8978 assert(VT.isVector() == N1.getValueType().isVector() &&
8979 "SETCC type should be vector iff the operand type is vector!");
8980 assert((!VT.isVector() || VT.getVectorElementCount() ==
8982 "SETCC vector element counts must match!");
8983 // Use FoldSetCC to simplify SETCC's.
8984 if (SDValue V =
8985 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8986 return V;
8987 break;
8988 }
8989 case ISD::SELECT:
8990 case ISD::VSELECT:
8991 if (SDValue V = simplifySelect(N1, N2, N3))
8992 return V;
8993 break;
8995 llvm_unreachable("should use getVectorShuffle constructor!");
8997 if (isNullConstant(N3))
8998 return N1;
8999 break;
9001 if (isNullConstant(N3))
9002 return N2;
9003 break;
9005 assert(VT.isVector() && VT == N1.getValueType() &&
9006 "INSERT_VECTOR_ELT vector type mismatch");
9008 "INSERT_VECTOR_ELT scalar fp/int mismatch");
9009 assert((!VT.isFloatingPoint() ||
9010 VT.getVectorElementType() == N2.getValueType()) &&
9011 "INSERT_VECTOR_ELT fp scalar type mismatch");
9012 assert((!VT.isInteger() ||
9014 "INSERT_VECTOR_ELT int scalar size mismatch");
9015
9016 auto *N3C = dyn_cast<ConstantSDNode>(N3);
9017 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
9018 // for scalable vectors where we will generate appropriate code to
9019 // deal with out-of-bounds cases correctly.
9020 if (N3C && VT.isFixedLengthVector() &&
9021 N3C->getZExtValue() >= VT.getVectorNumElements())
9022 return getUNDEF(VT);
9023
9024 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
9025 if (N3.isUndef())
9026 return getUNDEF(VT);
9027
9028 // If inserting poison, just use the input vector.
9029 if (N2.getOpcode() == ISD::POISON)
9030 return N1;
9031
9032 // Inserting undef into undef/poison is still undef.
9033 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9034 return getUNDEF(VT);
9035
9036 // If the inserted element is an UNDEF, just use the input vector.
9037 // But not if skipping the insert could make the result more poisonous.
9038 if (N2.isUndef()) {
9039 if (N3C && VT.isFixedLengthVector()) {
9040 APInt EltMask =
9041 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
9042 if (isGuaranteedNotToBePoison(N1, EltMask))
9043 return N1;
9044 } else if (isGuaranteedNotToBePoison(N1))
9045 return N1;
9046 }
9047 break;
9048 }
9049 case ISD::INSERT_SUBVECTOR: {
9050 // If inserting poison, just use the input vector,
9051 if (N2.getOpcode() == ISD::POISON)
9052 return N1;
9053
9054 // Inserting undef into undef/poison is still undef.
9055 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9056 return getUNDEF(VT);
9057
9058 EVT N2VT = N2.getValueType();
9059 assert(VT == N1.getValueType() &&
9060 "Dest and insert subvector source types must match!");
9061 assert(VT.isVector() && N2VT.isVector() &&
9062 "Insert subvector VTs must be vectors!");
9064 "Insert subvector VTs must have the same element type!");
9065 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9066 "Cannot insert a scalable vector into a fixed length vector!");
9067 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9069 "Insert subvector must be from smaller vector to larger vector!");
9071 "Insert subvector index must be constant");
9072 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9073 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9075 "Insert subvector overflow!");
9077 TLI->getVectorIdxWidth(getDataLayout()) &&
9078 "Constant index for INSERT_SUBVECTOR has an invalid size");
9079
9080 // Trivial insertion.
9081 if (VT == N2VT)
9082 return N2;
9083
9084 // If this is an insert of an extracted vector into an undef/poison vector,
9085 // we can just use the input to the extract. But not if skipping the
9086 // extract+insert could make the result more poisonous.
9087 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9088 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9089 if (N1.getOpcode() == ISD::POISON)
9090 return N2.getOperand(0);
9091 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9092 unsigned LoBit = N3->getAsZExtVal();
9093 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9094 APInt EltMask =
9095 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9096 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9097 return N2.getOperand(0);
9098 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9099 return N2.getOperand(0);
9100 }
9101
9102 // If the inserted subvector is UNDEF, just use the input vector.
9103 // But not if skipping the insert could make the result more poisonous.
9104 if (N2.isUndef()) {
9105 if (VT.isFixedLengthVector()) {
9106 unsigned LoBit = N3->getAsZExtVal();
9107 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9108 APInt EltMask =
9109 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9110 if (isGuaranteedNotToBePoison(N1, EltMask))
9111 return N1;
9112 } else if (isGuaranteedNotToBePoison(N1))
9113 return N1;
9114 }
9115 break;
9116 }
9117 case ISD::BITCAST:
9118 // Fold bit_convert nodes from a type to themselves.
9119 if (N1.getValueType() == VT)
9120 return N1;
9121 break;
9122 case ISD::VP_TRUNCATE:
9123 case ISD::VP_SIGN_EXTEND:
9124 case ISD::VP_ZERO_EXTEND:
9125 // Don't create noop casts.
9126 if (N1.getValueType() == VT)
9127 return N1;
9128 break;
9129 case ISD::VECTOR_COMPRESS: {
9130 [[maybe_unused]] EVT VecVT = N1.getValueType();
9131 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9132 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9133 assert(VT == VecVT && "Vector and result type don't match.");
9134 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9135 "All inputs must be vectors.");
9136 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9138 "Vector and mask must have same number of elements.");
9139
9140 if (N1.isUndef() || N2.isUndef())
9141 return N3;
9142
9143 break;
9144 }
9149 [[maybe_unused]] EVT AccVT = N1.getValueType();
9150 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9151 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9152 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9153 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9154 "node to have the same type!");
9155 assert(VT.isVector() && VT == AccVT &&
9156 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9157 "the same type as its result!");
9159 AccVT.getVectorElementCount()) &&
9160 "Expected the element count of the second and third operands of the "
9161 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9162 "element count of the first operand and the result!");
9164 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9165 "node to have an element type which is the same as or smaller than "
9166 "the element type of the first operand and result!");
9167 break;
9168 }
9169 }
9170
9171 // Perform trivial constant folding for arithmetic operators.
9172 switch (Opcode) {
9173 case ISD::FMA:
9174 case ISD::FMAD:
9175 case ISD::SETCC:
9176 case ISD::FSHL:
9177 case ISD::FSHR:
9178 if (SDValue SV =
9179 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9180 return SV;
9181 break;
9182 }
9183
9184 // Memoize node if it doesn't produce a glue result.
9185 SDNode *N;
9186 SDVTList VTs = getVTList(VT);
9187 SDValue Ops[] = {N1, N2, N3};
9188 if (VT != MVT::Glue) {
9190 AddNodeIDNode(ID, Opcode, VTs, Ops);
9191 void *IP = nullptr;
9192 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9193 E->intersectFlagsWith(Flags);
9194 return SDValue(E, 0);
9195 }
9196
9197 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9198 N->setFlags(Flags);
9199 createOperands(N, Ops);
9200 CSEMap.InsertNode(N, IP);
9201 } else {
9202 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9203 createOperands(N, Ops);
9204 }
9205
9206 InsertNode(N);
9207 SDValue V = SDValue(N, 0);
9208 NewSDValueDbgMsg(V, "Creating new node: ", this);
9209 return V;
9210}
9211
9212SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9213 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9214 const SDNodeFlags Flags) {
9215 SDValue Ops[] = { N1, N2, N3, N4 };
9216 return getNode(Opcode, DL, VT, Ops, Flags);
9217}
9218
9219SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9220 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9221 SDNodeFlags Flags;
9222 if (Inserter)
9223 Flags = Inserter->getFlags();
9224 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9225}
9226
9227SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9228 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9229 SDValue N5, const SDNodeFlags Flags) {
9230 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9231 return getNode(Opcode, DL, VT, Ops, Flags);
9232}
9233
9234SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9235 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9236 SDValue N5) {
9237 SDNodeFlags Flags;
9238 if (Inserter)
9239 Flags = Inserter->getFlags();
9240 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9241}
9242
9243/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9244/// the incoming stack arguments to be loaded from the stack.
9246 SmallVector<SDValue, 8> ArgChains;
9247
9248 // Include the original chain at the beginning of the list. When this is
9249 // used by target LowerCall hooks, this helps legalize find the
9250 // CALLSEQ_BEGIN node.
9251 ArgChains.push_back(Chain);
9252
9253 // Add a chain value for each stack argument.
9254 for (SDNode *U : getEntryNode().getNode()->users())
9255 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9256 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9257 if (FI->getIndex() < 0)
9258 ArgChains.push_back(SDValue(L, 1));
9259
9260 // Build a tokenfactor for all the chains.
9261 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9262}
9263
9264/// getMemsetValue - Vectorized representation of the memset value
9265/// operand.
9267 const SDLoc &dl) {
9268 assert(!Value.isUndef());
9269
9270 unsigned NumBits = VT.getScalarSizeInBits();
9272 assert(C->getAPIntValue().getBitWidth() == 8);
9273 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9274 if (VT.isInteger()) {
9275 bool IsOpaque = VT.getSizeInBits() > 64 ||
9276 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9277 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9278 }
9279 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9280 }
9281
9282 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9283 EVT IntVT = VT.getScalarType();
9284 if (!IntVT.isInteger())
9285 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9286
9287 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9288 if (NumBits > 8) {
9289 // Use a multiplication with 0x010101... to extend the input to the
9290 // required length.
9291 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9292 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9293 DAG.getConstant(Magic, dl, IntVT));
9294 }
9295
9296 if (VT != Value.getValueType() && !VT.isInteger())
9297 Value = DAG.getBitcast(VT.getScalarType(), Value);
9298 if (VT != Value.getValueType())
9299 Value = DAG.getSplatBuildVector(VT, dl, Value);
9300
9301 return Value;
9302}
9303
9304/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9305/// used when a memcpy is turned into a memset when the source is a constant
9306/// string ptr.
9308 const TargetLowering &TLI,
9309 const ConstantDataArraySlice &Slice) {
9310 // Handle vector with all elements zero.
9311 if (Slice.Array == nullptr) {
9312 if (VT.isInteger())
9313 return DAG.getConstant(0, dl, VT);
9314 return DAG.getNode(ISD::BITCAST, dl, VT,
9315 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9316 }
9317
9318 assert(!VT.isVector() && "Can't handle vector type here!");
9319 unsigned NumVTBits = VT.getSizeInBits();
9320 unsigned NumVTBytes = NumVTBits / 8;
9321 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9322
9323 APInt Val(NumVTBits, 0);
9324 if (DAG.getDataLayout().isLittleEndian()) {
9325 for (unsigned i = 0; i != NumBytes; ++i)
9326 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9327 } else {
9328 for (unsigned i = 0; i != NumBytes; ++i)
9329 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9330 }
9331
9332 // If the "cost" of materializing the integer immediate is less than the cost
9333 // of a load, then it is cost effective to turn the load into the immediate.
9334 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9335 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9336 return DAG.getConstant(Val, dl, VT);
9337 return SDValue();
9338}
9339
9341 const SDLoc &DL,
9342 const SDNodeFlags Flags) {
9343 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9344 return getMemBasePlusOffset(Base, Index, DL, Flags);
9345}
9346
9348 const SDLoc &DL,
9349 const SDNodeFlags Flags) {
9350 assert(Offset.getValueType().isInteger());
9351 EVT BasePtrVT = Ptr.getValueType();
9352 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9353 BasePtrVT))
9354 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9355 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9356 SDNodeFlags AddFlags = Flags;
9357 AddFlags.setInBounds(false);
9358 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9359}
9360
9361/// Returns true if memcpy source is constant data.
9363 uint64_t SrcDelta = 0;
9364 GlobalAddressSDNode *G = nullptr;
9365 if (Src.getOpcode() == ISD::GlobalAddress)
9367 else if (Src->isAnyAdd() &&
9368 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9369 Src.getOperand(1).getOpcode() == ISD::Constant) {
9370 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9371 SrcDelta = Src.getConstantOperandVal(1);
9372 }
9373 if (!G)
9374 return false;
9375
9376 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9377 SrcDelta + G->getOffset());
9378}
9379
9381 SelectionDAG &DAG) {
9382 // On Darwin, -Os means optimize for size without hurting performance, so
9383 // only really optimize for size when -Oz (MinSize) is used.
9385 return MF.getFunction().hasMinSize();
9386 return DAG.shouldOptForSize();
9387}
9388
9390 SmallVector<SDValue, 32> &OutChains, unsigned From,
9391 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9392 SmallVector<SDValue, 16> &OutStoreChains) {
9393 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9394 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9395 SmallVector<SDValue, 16> GluedLoadChains;
9396 for (unsigned i = From; i < To; ++i) {
9397 OutChains.push_back(OutLoadChains[i]);
9398 GluedLoadChains.push_back(OutLoadChains[i]);
9399 }
9400
9401 // Chain for all loads.
9402 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9403 GluedLoadChains);
9404
9405 for (unsigned i = From; i < To; ++i) {
9406 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9407 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9408 ST->getBasePtr(), ST->getMemoryVT(),
9409 ST->getMemOperand());
9410 OutChains.push_back(NewStore);
9411 }
9412}
9413
9414static SDValue
9416 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9417 Align SrcAlign, bool isVol, bool AlwaysInline,
9418 MachinePointerInfo DstPtrInfo,
9419 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9420 BatchAAResults *BatchAA) {
9421 // Turn a memcpy of undef to nop.
9422 // FIXME: We need to honor volatile even is Src is undef.
9423 if (Src.isUndef())
9424 return Chain;
9425
9426 // Expand memcpy to a series of load and store ops if the size operand falls
9427 // below a certain threshold.
9428 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9429 // rather than maybe a humongous number of loads and stores.
9430 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9431 const DataLayout &DL = DAG.getDataLayout();
9432 LLVMContext &C = *DAG.getContext();
9433 std::vector<EVT> MemOps;
9434 bool DstAlignCanChange = false;
9436 MachineFrameInfo &MFI = MF.getFrameInfo();
9437 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9439 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9440 DstAlignCanChange = true;
9441 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9443 // If marked as volatile, perform a copy even when marked as constant.
9444 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9445 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9446 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9447 const MemOp Op = isZeroConstant
9448 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9449 /*IsZeroMemset*/ true, isVol)
9450 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9451 SrcAlign, isVol, CopyFromConstant);
9452 if (!TLI.findOptimalMemOpLowering(
9453 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9454 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9455 return SDValue();
9456
9457 if (DstAlignCanChange) {
9458 Type *Ty = MemOps[0].getTypeForEVT(C);
9459 Align NewDstAlign = DL.getABITypeAlign(Ty);
9460
9461 // Don't promote to an alignment that would require dynamic stack
9462 // realignment which may conflict with optimizations such as tail call
9463 // optimization.
9465 if (!TRI->hasStackRealignment(MF))
9466 if (MaybeAlign StackAlign = DL.getStackAlignment())
9467 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9468
9469 if (NewDstAlign > DstAlign) {
9470 // Give the stack frame object a larger alignment if needed.
9471 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9472 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9473 DstAlign = NewDstAlign;
9474 }
9475 }
9476
9477 // Prepare AAInfo for loads/stores after lowering this memcpy.
9478 AAMDNodes NewAAInfo = AAInfo;
9479 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9480
9481 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9482 bool isConstant =
9483 BatchAA && SrcVal &&
9484 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9485
9486 MachineMemOperand::Flags MMOFlags =
9488 SmallVector<SDValue, 16> OutLoadChains;
9489 SmallVector<SDValue, 16> OutStoreChains;
9490 SmallVector<SDValue, 32> OutChains;
9491 unsigned NumMemOps = MemOps.size();
9492 uint64_t SrcOff = 0, DstOff = 0;
9493 for (unsigned i = 0; i != NumMemOps; ++i) {
9494 EVT VT = MemOps[i];
9495 unsigned VTSize = VT.getSizeInBits() / 8;
9497
9498 if (VTSize > Size) {
9499 // Issuing an unaligned load / store pair that overlaps with the previous
9500 // pair. Adjust the offset accordingly.
9501 assert(i == NumMemOps-1 && i != 0);
9502 SrcOff -= VTSize - Size;
9503 DstOff -= VTSize - Size;
9504 }
9505
9506 if (CopyFromConstant &&
9507 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9508 // It's unlikely a store of a vector immediate can be done in a single
9509 // instruction. It would require a load from a constantpool first.
9510 // We only handle zero vectors here.
9511 // FIXME: Handle other cases where store of vector immediate is done in
9512 // a single instruction.
9513 ConstantDataArraySlice SubSlice;
9514 if (SrcOff < Slice.Length) {
9515 SubSlice = Slice;
9516 SubSlice.move(SrcOff);
9517 } else {
9518 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9519 SubSlice.Array = nullptr;
9520 SubSlice.Offset = 0;
9521 SubSlice.Length = VTSize;
9522 }
9523 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9524 if (Value.getNode()) {
9525 Store = DAG.getStore(
9526 Chain, dl, Value,
9527 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9528 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags, NewAAInfo);
9529 OutChains.push_back(Store);
9530 }
9531 }
9532
9533 if (!Store.getNode()) {
9534 // The type might not be legal for the target. This should only happen
9535 // if the type is smaller than a legal type, as on PPC, so the right
9536 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9537 // to Load/Store if NVT==VT.
9538 // FIXME does the case above also need this?
9539 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9540 assert(NVT.bitsGE(VT));
9541
9542 bool isDereferenceable =
9543 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9544 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9545 if (isDereferenceable)
9547 if (isConstant)
9548 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9549
9550 Value = DAG.getExtLoad(
9551 ISD::EXTLOAD, dl, NVT, Chain,
9552 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9553 SrcPtrInfo.getWithOffset(SrcOff), VT,
9554 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9555 OutLoadChains.push_back(Value.getValue(1));
9556
9557 Store = DAG.getTruncStore(
9558 Chain, dl, Value,
9559 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9560 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags, NewAAInfo);
9561 OutStoreChains.push_back(Store);
9562 }
9563 SrcOff += VTSize;
9564 DstOff += VTSize;
9565 Size -= VTSize;
9566 }
9567
9568 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9570 unsigned NumLdStInMemcpy = OutStoreChains.size();
9571
9572 if (NumLdStInMemcpy) {
9573 // It may be that memcpy might be converted to memset if it's memcpy
9574 // of constants. In such a case, we won't have loads and stores, but
9575 // just stores. In the absence of loads, there is nothing to gang up.
9576 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9577 // If target does not care, just leave as it.
9578 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9579 OutChains.push_back(OutLoadChains[i]);
9580 OutChains.push_back(OutStoreChains[i]);
9581 }
9582 } else {
9583 // Ld/St less than/equal limit set by target.
9584 if (NumLdStInMemcpy <= GluedLdStLimit) {
9585 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9586 NumLdStInMemcpy, OutLoadChains,
9587 OutStoreChains);
9588 } else {
9589 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9590 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9591 unsigned GlueIter = 0;
9592
9593 // Residual ld/st.
9594 if (RemainingLdStInMemcpy) {
9596 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9597 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9598 }
9599
9600 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9601 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9602 GlueIter - GluedLdStLimit;
9603 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9604 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9605 OutLoadChains, OutStoreChains);
9606 GlueIter += GluedLdStLimit;
9607 }
9608 }
9609 }
9610 }
9611 return DAG.getTokenFactor(dl, OutChains);
9612}
9613
9615 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9616 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9617 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9618 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9619 // Turn a memmove of undef to nop.
9620 // FIXME: We need to honor volatile even is Src is undef.
9621 if (Src.isUndef())
9622 return Chain;
9623
9624 // Expand memmove to a series of load and store ops if the size operand falls
9625 // below a certain threshold.
9626 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9627 const DataLayout &DL = DAG.getDataLayout();
9628 LLVMContext &C = *DAG.getContext();
9629 std::vector<EVT> MemOps;
9630 bool DstAlignCanChange = false;
9632 MachineFrameInfo &MFI = MF.getFrameInfo();
9633 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9635 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9636 DstAlignCanChange = true;
9637 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9638 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9639 if (!TLI.findOptimalMemOpLowering(
9640 C, MemOps, Limit,
9641 MemOp::Move(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9642 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9643 MF.getFunction().getAttributes(), nullptr))
9644 return SDValue();
9645
9646 if (DstAlignCanChange) {
9647 Type *Ty = MemOps[0].getTypeForEVT(C);
9648 Align NewDstAlign = DL.getABITypeAlign(Ty);
9649
9650 // Don't promote to an alignment that would require dynamic stack
9651 // realignment which may conflict with optimizations such as tail call
9652 // optimization.
9654 if (!TRI->hasStackRealignment(MF))
9655 if (MaybeAlign StackAlign = DL.getStackAlignment())
9656 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9657
9658 if (NewDstAlign > DstAlign) {
9659 // Give the stack frame object a larger alignment if needed.
9660 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9661 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9662 DstAlign = NewDstAlign;
9663 }
9664 }
9665
9666 // Prepare AAInfo for loads/stores after lowering this memmove.
9667 AAMDNodes NewAAInfo = AAInfo;
9668 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9669
9670 MachineMemOperand::Flags MMOFlags =
9672 uint64_t SrcOff = 0;
9673 SmallVector<SDValue, 8> LoadValues;
9674 SmallVector<SDValue, 8> LoadChains;
9675 SmallVector<SDValue, 8> OutChains;
9676 unsigned NumMemOps = MemOps.size();
9677 for (unsigned i = 0; i < NumMemOps; i++) {
9678 EVT VT = MemOps[i];
9679 unsigned VTSize = VT.getSizeInBits() / 8;
9680 SDValue Value;
9681 bool IsOverlapping = false;
9682
9683 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9684 // Issuing an unaligned load / store pair that overlaps with the previous
9685 // pair. Adjust the offset accordingly.
9686 SrcOff = Size - VTSize;
9687 IsOverlapping = true;
9688 }
9689
9690 // Calculate the actual alignment at the current offset. The alignment at
9691 // SrcOff may be lower than the base alignment, especially when using
9692 // overlapping loads.
9693 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9694 if (IsOverlapping) {
9695 // Verify that the target allows misaligned memory accesses at the
9696 // adjusted offset when using overlapping loads.
9697 unsigned Fast;
9698 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9699 SrcAlignAtOffset, MMOFlags,
9700 &Fast) ||
9701 !Fast) {
9702 // This should have been caught by findOptimalMemOpLowering, but verify
9703 // here for safety.
9704 return SDValue();
9705 }
9706 }
9707
9708 bool isDereferenceable =
9709 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9710 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9711 if (isDereferenceable)
9713 Value =
9714 DAG.getLoad(VT, dl, Chain,
9715 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9716 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9717 SrcMMOFlags, NewAAInfo);
9718 LoadValues.push_back(Value);
9719 LoadChains.push_back(Value.getValue(1));
9720 SrcOff += VTSize;
9721 }
9722 Chain = DAG.getTokenFactor(dl, LoadChains);
9723 OutChains.clear();
9724 uint64_t DstOff = 0;
9725 for (unsigned i = 0; i < NumMemOps; i++) {
9726 EVT VT = MemOps[i];
9727 unsigned VTSize = VT.getSizeInBits() / 8;
9728 SDValue Store;
9729 bool IsOverlapping = false;
9730
9731 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9732 // Issuing an unaligned load / store pair that overlaps with the previous
9733 // pair. Adjust the offset accordingly.
9734 DstOff = Size - VTSize;
9735 IsOverlapping = true;
9736 }
9737
9738 // Calculate the actual alignment at the current offset. The alignment at
9739 // DstOff may be lower than the base alignment, especially when using
9740 // overlapping stores.
9741 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9742 if (IsOverlapping) {
9743 // Verify that the target allows misaligned memory accesses at the
9744 // adjusted offset when using overlapping stores.
9745 unsigned Fast;
9746 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9747 DstAlignAtOffset, MMOFlags,
9748 &Fast) ||
9749 !Fast) {
9750 // This should have been caught by findOptimalMemOpLowering, but verify
9751 // here for safety.
9752 return SDValue();
9753 }
9754 }
9755 Store = DAG.getStore(
9756 Chain, dl, LoadValues[i],
9757 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9758 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9759 NewAAInfo);
9760 OutChains.push_back(Store);
9761 DstOff += VTSize;
9762 }
9763
9764 return DAG.getTokenFactor(dl, OutChains);
9765}
9766
9767/// Lower the call to 'memset' intrinsic function into a series of store
9768/// operations.
9769///
9770/// \param DAG Selection DAG where lowered code is placed.
9771/// \param dl Link to corresponding IR location.
9772/// \param Chain Control flow dependency.
9773/// \param Dst Pointer to destination memory location.
9774/// \param Src Value of byte to write into the memory.
9775/// \param Size Number of bytes to write.
9776/// \param Alignment Alignment of the destination in bytes.
9777/// \param isVol True if destination is volatile.
9778/// \param AlwaysInline Makes sure no function call is generated.
9779/// \param DstPtrInfo IR information on the memory pointer.
9780/// \returns New head in the control flow, if lowering was successful, empty
9781/// SDValue otherwise.
9782///
9783/// The function tries to replace 'llvm.memset' intrinsic with several store
9784/// operations and value calculation code. This is usually profitable for small
9785/// memory size or when the semantic requires inlining.
9787 SDValue Chain, SDValue Dst, SDValue Src,
9788 uint64_t Size, Align Alignment, bool isVol,
9789 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9790 const AAMDNodes &AAInfo) {
9791 // Turn a memset of undef to nop.
9792 // FIXME: We need to honor volatile even is Src is undef.
9793 if (Src.isUndef())
9794 return Chain;
9795
9796 // Expand memset to a series of load/store ops if the size operand
9797 // falls below a certain threshold.
9798 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9799 std::vector<EVT> MemOps;
9800 bool DstAlignCanChange = false;
9801 LLVMContext &C = *DAG.getContext();
9803 MachineFrameInfo &MFI = MF.getFrameInfo();
9804 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9806 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9807 DstAlignCanChange = true;
9808 bool IsZeroVal = isNullConstant(Src);
9809 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9810
9811 EVT LargestVT;
9812 if (!TLI.findOptimalMemOpLowering(
9813 C, MemOps, Limit,
9814 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9815 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9816 &LargestVT))
9817 return SDValue();
9818
9819 if (DstAlignCanChange) {
9820 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9821 const DataLayout &DL = DAG.getDataLayout();
9822 Align NewAlign = DL.getABITypeAlign(Ty);
9823
9824 // Don't promote to an alignment that would require dynamic stack
9825 // realignment which may conflict with optimizations such as tail call
9826 // optimization.
9828 if (!TRI->hasStackRealignment(MF))
9829 if (MaybeAlign StackAlign = DL.getStackAlignment())
9830 NewAlign = std::min(NewAlign, *StackAlign);
9831
9832 if (NewAlign > Alignment) {
9833 // Give the stack frame object a larger alignment if needed.
9834 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9835 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9836 Alignment = NewAlign;
9837 }
9838 }
9839
9840 SmallVector<SDValue, 8> OutChains;
9841 uint64_t DstOff = 0;
9842 unsigned NumMemOps = MemOps.size();
9843
9844 // Find the largest store and generate the bit pattern for it.
9845 // If target didn't set LargestVT, compute it from MemOps.
9846 if (!LargestVT.isSimple()) {
9847 LargestVT = MemOps[0];
9848 for (unsigned i = 1; i < NumMemOps; i++)
9849 if (MemOps[i].bitsGT(LargestVT))
9850 LargestVT = MemOps[i];
9851 }
9852 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9853
9854 // Prepare AAInfo for loads/stores after lowering this memset.
9855 AAMDNodes NewAAInfo = AAInfo;
9856 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9857
9858 for (unsigned i = 0; i < NumMemOps; i++) {
9859 EVT VT = MemOps[i];
9860 unsigned VTSize = VT.getSizeInBits() / 8;
9861 // The target should specify store types that exactly cover the memset size
9862 // (with the last store potentially being oversized for overlapping stores).
9863 assert(Size > 0 && "Target specified more stores than needed in "
9864 "findOptimalMemOpLowering");
9865 if (VTSize > Size) {
9866 // Issuing an unaligned load / store pair that overlaps with the previous
9867 // pair. Adjust the offset accordingly.
9868 assert(i == NumMemOps-1 && i != 0);
9869 DstOff -= VTSize - Size;
9870 }
9871
9872 // If this store is smaller than the largest store see whether we can get
9873 // the smaller value for free with a truncate or extract vector element and
9874 // then store.
9875 SDValue Value = MemSetValue;
9876 if (VT.bitsLT(LargestVT)) {
9877 unsigned Index;
9878 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9879 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9880 if (!LargestVT.isVector() && !VT.isVector() &&
9881 TLI.isTruncateFree(LargestVT, VT))
9882 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9883 else if (LargestVT.isVector() && !VT.isVector() &&
9885 LargestVT.getTypeForEVT(*DAG.getContext()),
9886 VT.getSizeInBits(), Index) &&
9887 TLI.isTypeLegal(SVT) &&
9888 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9889 // Target which can combine store(extractelement VectorTy, Idx) can get
9890 // the smaller value for free.
9891 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9892 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9893 } else
9894 Value = getMemsetValue(Src, VT, DAG, dl);
9895 }
9896 assert(Value.getValueType() == VT && "Value with wrong type.");
9897 SDValue Store = DAG.getStore(
9898 Chain, dl, Value,
9899 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9900 DstPtrInfo.getWithOffset(DstOff), Alignment,
9902 NewAAInfo);
9903 OutChains.push_back(Store);
9904 DstOff += VT.getSizeInBits() / 8;
9905 // For oversized overlapping stores, only subtract the remaining bytes.
9906 // For normal stores, subtract the full store size.
9907 if (VTSize > Size) {
9908 Size = 0;
9909 } else {
9910 Size -= VTSize;
9911 }
9912 }
9913
9914 // After processing all stores, Size should be exactly 0. Any remaining bytes
9915 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9916 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9917 "stores that exactly cover the memset size");
9918
9919 return DAG.getTokenFactor(dl, OutChains);
9920}
9921
9923 unsigned AS) {
9924 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9925 // pointer operands can be losslessly bitcasted to pointers of address space 0
9926 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9927 report_fatal_error("cannot lower memory intrinsic in address space " +
9928 Twine(AS));
9929 }
9930}
9931
9933 const SelectionDAG *SelDAG,
9934 bool AllowReturnsFirstArg) {
9935 if (!CI || !CI->isTailCall())
9936 return false;
9937 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9938 // helper symbol we lower to.
9939 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9940 AllowReturnsFirstArg &&
9942}
9943
9944static std::pair<SDValue, SDValue>
9947 const CallInst *CI, RTLIB::Libcall Call,
9948 SelectionDAG *DAG, const TargetLowering *TLI) {
9949 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9950
9951 if (LCImpl == RTLIB::Unsupported)
9952 return {};
9953
9955 bool IsTailCall =
9956 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9957 SDValue Callee =
9958 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9959
9960 CLI.setDebugLoc(dl)
9961 .setChain(Chain)
9963 CI->getType(), Callee, std::move(Args))
9964 .setTailCall(IsTailCall);
9965
9966 return TLI->LowerCallTo(CLI);
9967}
9968
9969std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9970 const SDLoc &dl, SDValue S1,
9971 SDValue S2,
9972 const CallInst *CI) {
9974 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9975 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9976 RTLIB::STRCMP, this, TLI);
9977}
9978
9979std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9980 const SDLoc &dl, SDValue S1,
9981 SDValue S2,
9982 const CallInst *CI) {
9984 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9985 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9986 RTLIB::STRSTR, this, TLI);
9987}
9988
9989std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9990 const SDLoc &dl,
9991 SDValue Dst, SDValue Src,
9993 const CallInst *CI) {
9995
9997 {Dst, PT},
9998 {Src, PT},
10001 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10002 RTLIB::MEMCCPY, this, TLI);
10003}
10004
10005std::pair<SDValue, SDValue>
10007 SDValue Mem1, SDValue Size, const CallInst *CI) {
10010 {Mem0, PT},
10011 {Mem1, PT},
10013 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10014 RTLIB::MEMCMP, this, TLI);
10015}
10016
10017std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
10018 const SDLoc &dl,
10019 SDValue Dst, SDValue Src,
10020 const CallInst *CI) {
10022 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
10023 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10024 RTLIB::STRCPY, this, TLI);
10025}
10026
10027std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
10028 const SDLoc &dl,
10029 SDValue Src,
10030 const CallInst *CI) {
10031 // Emit a library call.
10034 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10035 RTLIB::STRLEN, this, TLI);
10036}
10037
10039 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
10040 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
10041 const CallInst *CI, std::optional<bool> OverrideTailCall,
10042 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
10043 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
10044 // Check to see if we should lower the memcpy to loads and stores first.
10045 // For cases within the target-specified limits, this is the best choice.
10047 if (ConstantSize) {
10048 // Memcpy with size zero? Just return the original chain.
10049 if (ConstantSize->isZero())
10050 return Chain;
10051
10053 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10054 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
10055 if (Result.getNode())
10056 return Result;
10057 }
10058
10059 // Then check to see if we should lower the memcpy with target-specific
10060 // code. If the target chooses to do this, this is the next best.
10061 if (TSI) {
10062 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10063 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10064 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10065 if (Result.getNode())
10066 return Result;
10067 }
10068
10069 // If we really need inline code and the target declined to provide it,
10070 // use a (potentially long) sequence of loads and stores.
10071 if (AlwaysInline) {
10072 assert(ConstantSize && "AlwaysInline requires a constant size!");
10074 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10075 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
10076 }
10077
10080
10081 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10082 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10083 // respect volatile, so they may do things like read or write memory
10084 // beyond the given memory regions. But fixing this isn't easy, and most
10085 // people don't care.
10086
10087 // Emit a library call.
10090 Args.emplace_back(Dst, PtrTy);
10091 Args.emplace_back(Src, PtrTy);
10092 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10093 // FIXME: pass in SDLoc
10095 bool IsTailCall = false;
10096 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10097
10098 if (OverrideTailCall.has_value()) {
10099 IsTailCall = *OverrideTailCall;
10100 } else {
10101 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10102 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10103 }
10104
10105 CLI.setDebugLoc(dl)
10106 .setChain(Chain)
10107 .setLibCallee(
10108 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10109 Dst.getValueType().getTypeForEVT(*getContext()),
10110 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10111 std::move(Args))
10113 .setTailCall(IsTailCall);
10114
10115 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10116 return CallResult.second;
10117}
10118
10120 SDValue Dst, SDValue Src, SDValue Size,
10121 Type *SizeTy, unsigned ElemSz,
10122 bool isTailCall,
10123 MachinePointerInfo DstPtrInfo,
10124 MachinePointerInfo SrcPtrInfo) {
10125 // Emit a library call.
10128 Args.emplace_back(Dst, ArgTy);
10129 Args.emplace_back(Src, ArgTy);
10130 Args.emplace_back(Size, SizeTy);
10131
10132 RTLIB::Libcall LibraryCall =
10134 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10135 if (LibcallImpl == RTLIB::Unsupported)
10136 report_fatal_error("Unsupported element size");
10137
10139 CLI.setDebugLoc(dl)
10140 .setChain(Chain)
10141 .setLibCallee(
10142 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10144 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10145 std::move(Args))
10147 .setTailCall(isTailCall);
10148
10149 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10150 return CallResult.second;
10151}
10152
10154 SDValue Src, SDValue Size, Align DstAlign,
10155 Align SrcAlign, bool isVol, const CallInst *CI,
10156 std::optional<bool> OverrideTailCall,
10157 MachinePointerInfo DstPtrInfo,
10158 MachinePointerInfo SrcPtrInfo,
10159 const AAMDNodes &AAInfo,
10160 BatchAAResults *BatchAA) {
10161 // Check to see if we should lower the memmove to loads and stores first.
10162 // For cases within the target-specified limits, this is the best choice.
10164 if (ConstantSize) {
10165 // Memmove with size zero? Just return the original chain.
10166 if (ConstantSize->isZero())
10167 return Chain;
10168
10170 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10171 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10172 if (Result.getNode())
10173 return Result;
10174 }
10175
10176 // Then check to see if we should lower the memmove with target-specific
10177 // code. If the target chooses to do this, this is the next best.
10178 if (TSI) {
10179 SDValue Result = TSI->EmitTargetCodeForMemmove(
10180 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10181 SrcPtrInfo);
10182 if (Result.getNode())
10183 return Result;
10184 }
10185
10188
10189 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10190 // not be safe. See memcpy above for more details.
10191
10192 // Emit a library call.
10195 Args.emplace_back(Dst, PtrTy);
10196 Args.emplace_back(Src, PtrTy);
10197 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10198 // FIXME: pass in SDLoc
10200
10201 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10202
10203 bool IsTailCall = false;
10204 if (OverrideTailCall.has_value()) {
10205 IsTailCall = *OverrideTailCall;
10206 } else {
10207 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10208 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10209 }
10210
10211 CLI.setDebugLoc(dl)
10212 .setChain(Chain)
10213 .setLibCallee(
10214 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10215 Dst.getValueType().getTypeForEVT(*getContext()),
10216 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10217 std::move(Args))
10219 .setTailCall(IsTailCall);
10220
10221 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10222 return CallResult.second;
10223}
10224
10226 SDValue Dst, SDValue Src, SDValue Size,
10227 Type *SizeTy, unsigned ElemSz,
10228 bool isTailCall,
10229 MachinePointerInfo DstPtrInfo,
10230 MachinePointerInfo SrcPtrInfo) {
10231 // Emit a library call.
10234 Args.emplace_back(Dst, IntPtrTy);
10235 Args.emplace_back(Src, IntPtrTy);
10236 Args.emplace_back(Size, SizeTy);
10237
10238 RTLIB::Libcall LibraryCall =
10240 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10241 if (LibcallImpl == RTLIB::Unsupported)
10242 report_fatal_error("Unsupported element size");
10243
10245 CLI.setDebugLoc(dl)
10246 .setChain(Chain)
10247 .setLibCallee(
10248 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10250 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10251 std::move(Args))
10253 .setTailCall(isTailCall);
10254
10255 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10256 return CallResult.second;
10257}
10258
10260 SDValue Src, SDValue Size, Align Alignment,
10261 bool isVol, bool AlwaysInline,
10262 const CallInst *CI,
10263 MachinePointerInfo DstPtrInfo,
10264 const AAMDNodes &AAInfo) {
10265 // Check to see if we should lower the memset to stores first.
10266 // For cases within the target-specified limits, this is the best choice.
10268 if (ConstantSize) {
10269 // Memset with size zero? Just return the original chain.
10270 if (ConstantSize->isZero())
10271 return Chain;
10272
10273 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10274 ConstantSize->getZExtValue(), Alignment,
10275 isVol, false, DstPtrInfo, AAInfo);
10276
10277 if (Result.getNode())
10278 return Result;
10279 }
10280
10281 // Then check to see if we should lower the memset with target-specific
10282 // code. If the target chooses to do this, this is the next best.
10283 if (TSI) {
10284 SDValue Result = TSI->EmitTargetCodeForMemset(
10285 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10286 if (Result.getNode())
10287 return Result;
10288 }
10289
10290 // If we really need inline code and the target declined to provide it,
10291 // use a (potentially long) sequence of loads and stores.
10292 if (AlwaysInline) {
10293 assert(ConstantSize && "AlwaysInline requires a constant size!");
10294 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10295 ConstantSize->getZExtValue(), Alignment,
10296 isVol, true, DstPtrInfo, AAInfo);
10297 assert(Result &&
10298 "getMemsetStores must return a valid sequence when AlwaysInline");
10299 return Result;
10300 }
10301
10303
10304 // Emit a library call.
10305 auto &Ctx = *getContext();
10306 const auto& DL = getDataLayout();
10307
10309 // FIXME: pass in SDLoc
10310 CLI.setDebugLoc(dl).setChain(Chain);
10311
10312 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10313 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10314
10315 // If zeroing out and bzero is present, use it.
10316 if (UseBZero) {
10318 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10319 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10320 CLI.setLibCallee(
10321 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10322 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10323 } else {
10324 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10325
10327 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10328 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10329 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10330 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10331 Dst.getValueType().getTypeForEVT(Ctx),
10332 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10333 std::move(Args));
10334 }
10335
10336 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10337 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10338
10339 // If we're going to use bzero, make sure not to tail call unless the
10340 // subsequent return doesn't need a value, as bzero doesn't return the first
10341 // arg unlike memset.
10342 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10343 bool IsTailCall =
10344 CI && CI->isTailCall() &&
10345 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
10346 CLI.setDiscardResult().setTailCall(IsTailCall);
10347
10348 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10349 return CallResult.second;
10350}
10351
10354 Type *SizeTy, unsigned ElemSz,
10355 bool isTailCall,
10356 MachinePointerInfo DstPtrInfo) {
10357 // Emit a library call.
10359 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10360 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10361 Args.emplace_back(Size, SizeTy);
10362
10363 RTLIB::Libcall LibraryCall =
10365 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10366 if (LibcallImpl == RTLIB::Unsupported)
10367 report_fatal_error("Unsupported element size");
10368
10370 CLI.setDebugLoc(dl)
10371 .setChain(Chain)
10372 .setLibCallee(
10373 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10375 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10376 std::move(Args))
10378 .setTailCall(isTailCall);
10379
10380 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10381 return CallResult.second;
10382}
10383
10384SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10386 MachineMemOperand *MMO,
10387 ISD::LoadExtType ExtType) {
10389 AddNodeIDNode(ID, Opcode, VTList, Ops);
10390 ID.AddInteger(MemVT.getRawBits());
10391 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10392 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10393 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10394 ID.AddInteger(MMO->getFlags());
10395 void* IP = nullptr;
10396 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10397 E->refineAlignment(MMO);
10398 E->refineRanges(MMO);
10399 return SDValue(E, 0);
10400 }
10401
10402 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10403 VTList, MemVT, MMO, ExtType);
10404 createOperands(N, Ops);
10405
10406 CSEMap.InsertNode(N, IP);
10407 InsertNode(N);
10408 SDValue V(N, 0);
10409 NewSDValueDbgMsg(V, "Creating new node: ", this);
10410 return V;
10411}
10412
10414 EVT MemVT, SDVTList VTs, SDValue Chain,
10415 SDValue Ptr, SDValue Cmp, SDValue Swp,
10416 MachineMemOperand *MMO) {
10417 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10419 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10420
10421 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10422 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10423}
10424
10425SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10426 SDValue Chain, SDValue Ptr, SDValue Val,
10427 MachineMemOperand *MMO) {
10428 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10429 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10430 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10431 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10432 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10433 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10434 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10435 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10436 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10437 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10438 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10439 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10440 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10441 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10442 Opcode == ISD::ATOMIC_STORE) &&
10443 "Invalid Atomic Op");
10444
10445 EVT VT = Val.getValueType();
10446
10447 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10448 getVTList(VT, MVT::Other);
10449 SDValue Ops[] = {Chain, Ptr, Val};
10450 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10451}
10452
10454 EVT MemVT, EVT VT, SDValue Chain,
10455 SDValue Ptr, MachineMemOperand *MMO) {
10456 SDVTList VTs = getVTList(VT, MVT::Other);
10457 SDValue Ops[] = {Chain, Ptr};
10458 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10459}
10460
10461/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10463 if (Ops.size() == 1)
10464 return Ops[0];
10465
10467 VTs.reserve(Ops.size());
10468 for (const SDValue &Op : Ops)
10469 VTs.push_back(Op.getValueType());
10470 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10471}
10472
10474 SDValue Chain, const SDLoc &dl) {
10475 SmallVector<SDValue, 4> RetValues;
10476 RetValues.reserve(ResultTypes.size());
10477 for (EVT VT : ResultTypes)
10478 RetValues.push_back(VT == MVT::Other ? Chain : getPOISON(VT));
10479 return getMergeValues(RetValues, dl);
10480}
10481
10483 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10484 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10486 const AAMDNodes &AAInfo) {
10487 if (Size.hasValue() && !Size.getValue())
10489
10491 MachineMemOperand *MMO =
10492 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10493
10494 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10495}
10496
10498 SDVTList VTList,
10499 ArrayRef<SDValue> Ops, EVT MemVT,
10500 MachineMemOperand *MMO) {
10501 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10502}
10503
10505 SDVTList VTList,
10506 ArrayRef<SDValue> Ops, EVT MemVT,
10508 assert(!MMOs.empty() && "Must have at least one MMO");
10509 assert(
10510 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10511 Opcode == ISD::PREFETCH ||
10512 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10513 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10514 "Opcode is not a memory-accessing opcode!");
10515
10517 if (MMOs.size() == 1) {
10518 MemRefs = MMOs[0];
10519 } else {
10520 // Allocate: [size_t count][MMO*][MMO*]...
10521 size_t AllocSize =
10522 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10523 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10524 size_t *CountPtr = static_cast<size_t *>(Buffer);
10525 *CountPtr = MMOs.size();
10526 MachineMemOperand **Array =
10527 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10528 llvm::copy(MMOs, Array);
10529 MemRefs = Array;
10530 }
10531
10532 // Memoize the node unless it returns a glue result.
10534 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10536 AddNodeIDNode(ID, Opcode, VTList, Ops);
10537 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10538 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10539 ID.AddInteger(MemVT.getRawBits());
10540 for (const MachineMemOperand *MMO : MMOs) {
10541 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10542 ID.AddInteger(MMO->getFlags());
10543 }
10544 void *IP = nullptr;
10545 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10546 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10547 return SDValue(E, 0);
10548 }
10549
10550 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10551 VTList, MemVT, MemRefs);
10552 createOperands(N, Ops);
10553 CSEMap.InsertNode(N, IP);
10554 } else {
10555 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10556 VTList, MemVT, MemRefs);
10557 createOperands(N, Ops);
10558 }
10559 InsertNode(N);
10560 SDValue V(N, 0);
10561 NewSDValueDbgMsg(V, "Creating new node: ", this);
10562 return V;
10563}
10564
10566 SDValue Chain, int FrameIndex) {
10567 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10568 const auto VTs = getVTList(MVT::Other);
10569 SDValue Ops[2] = {
10570 Chain,
10571 getFrameIndex(FrameIndex,
10572 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10573 true)};
10574
10576 AddNodeIDNode(ID, Opcode, VTs, Ops);
10577 ID.AddInteger(FrameIndex);
10578 void *IP = nullptr;
10579 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10580 return SDValue(E, 0);
10581
10582 LifetimeSDNode *N =
10583 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10584 createOperands(N, Ops);
10585 CSEMap.InsertNode(N, IP);
10586 InsertNode(N);
10587 SDValue V(N, 0);
10588 NewSDValueDbgMsg(V, "Creating new node: ", this);
10589 return V;
10590}
10591
10593 uint64_t Guid, uint64_t Index,
10594 uint32_t Attr) {
10595 const unsigned Opcode = ISD::PSEUDO_PROBE;
10596 const auto VTs = getVTList(MVT::Other);
10597 SDValue Ops[] = {Chain};
10599 AddNodeIDNode(ID, Opcode, VTs, Ops);
10600 ID.AddInteger(Guid);
10601 ID.AddInteger(Index);
10602 void *IP = nullptr;
10603 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10604 return SDValue(E, 0);
10605
10606 auto *N = newSDNode<PseudoProbeSDNode>(
10607 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10608 createOperands(N, Ops);
10609 CSEMap.InsertNode(N, IP);
10610 InsertNode(N);
10611 SDValue V(N, 0);
10612 NewSDValueDbgMsg(V, "Creating new node: ", this);
10613 return V;
10614}
10615
10616/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10617/// MachinePointerInfo record from it. This is particularly useful because the
10618/// code generator has many cases where it doesn't bother passing in a
10619/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10621 SelectionDAG &DAG, SDValue Ptr,
10622 int64_t Offset = 0) {
10623 // If this is FI+Offset, we can model it.
10624 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10626 FI->getIndex(), Offset);
10627
10628 // If this is (FI+Offset1)+Offset2, we can model it.
10629 if (Ptr.getOpcode() != ISD::ADD ||
10632 return Info;
10633
10634 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10636 DAG.getMachineFunction(), FI,
10637 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10638}
10639
10640/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10641/// MachinePointerInfo record from it. This is particularly useful because the
10642/// code generator has many cases where it doesn't bother passing in a
10643/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10645 SelectionDAG &DAG, SDValue Ptr,
10646 SDValue OffsetOp) {
10647 // If the 'Offset' value isn't a constant, we can't handle this.
10649 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10650 if (OffsetOp.isUndef())
10651 return InferPointerInfo(Info, DAG, Ptr);
10652 return Info;
10653}
10654
10656 EVT VT, const SDLoc &dl, SDValue Chain,
10657 SDValue Ptr, SDValue Offset,
10658 MachinePointerInfo PtrInfo, EVT MemVT,
10659 Align Alignment,
10660 MachineMemOperand::Flags MMOFlags,
10661 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10662 assert(Chain.getValueType() == MVT::Other &&
10663 "Invalid chain type");
10664
10665 MMOFlags |= MachineMemOperand::MOLoad;
10666 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10667 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10668 // clients.
10669 if (PtrInfo.V.isNull())
10670 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10671
10672 TypeSize Size = MemVT.getStoreSize();
10674 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10675 Alignment, AAInfo, Ranges);
10676 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10677}
10678
10680 EVT VT, const SDLoc &dl, SDValue Chain,
10681 SDValue Ptr, SDValue Offset, EVT MemVT,
10682 MachineMemOperand *MMO) {
10683 if (VT == MemVT) {
10684 ExtType = ISD::NON_EXTLOAD;
10685 } else if (ExtType == ISD::NON_EXTLOAD) {
10686 assert(VT == MemVT && "Non-extending load from different memory type!");
10687 } else {
10688 // Extending load.
10689 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10690 "Should only be an extending load, not truncating!");
10691 assert(VT.isInteger() == MemVT.isInteger() &&
10692 "Cannot convert from FP to Int or Int -> FP!");
10693 assert(VT.isVector() == MemVT.isVector() &&
10694 "Cannot use an ext load to convert to or from a vector!");
10695 assert((!VT.isVector() ||
10697 "Cannot use an ext load to change the number of vector elements!");
10698 }
10699
10700 assert((!MMO->getRanges() ||
10702 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10703 MemVT.isInteger())) &&
10704 "Range metadata and load type must match!");
10705
10706 bool Indexed = AM != ISD::UNINDEXED;
10707 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10708
10709 SDVTList VTs = Indexed ?
10710 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10711 SDValue Ops[] = { Chain, Ptr, Offset };
10713 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10714 ID.AddInteger(MemVT.getRawBits());
10715 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10716 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10717 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10718 ID.AddInteger(MMO->getFlags());
10719 void *IP = nullptr;
10720 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10721 E->refineAlignment(MMO);
10722 E->refineRanges(MMO);
10723 return SDValue(E, 0);
10724 }
10725 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10726 ExtType, MemVT, MMO);
10727 createOperands(N, Ops);
10728
10729 CSEMap.InsertNode(N, IP);
10730 InsertNode(N);
10731 SDValue V(N, 0);
10732 NewSDValueDbgMsg(V, "Creating new node: ", this);
10733 return V;
10734}
10735
10737 SDValue Ptr, MachinePointerInfo PtrInfo,
10738 MaybeAlign Alignment,
10739 MachineMemOperand::Flags MMOFlags,
10740 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10742 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10743 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10744}
10745
10747 SDValue Ptr, MachineMemOperand *MMO) {
10749 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10750 VT, MMO);
10751}
10752
10754 EVT VT, SDValue Chain, SDValue Ptr,
10755 MachinePointerInfo PtrInfo, EVT MemVT,
10756 MaybeAlign Alignment,
10757 MachineMemOperand::Flags MMOFlags,
10758 const AAMDNodes &AAInfo) {
10760 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10761 MemVT, Alignment, MMOFlags, AAInfo);
10762}
10763
10765 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10766 MachineMemOperand *MMO) {
10768 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10769 MemVT, MMO);
10770}
10771
10775 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10776 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10777 // Don't propagate the invariant or dereferenceable flags.
10778 auto MMOFlags =
10779 LD->getMemOperand()->getFlags() &
10781 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10782 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10783 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10784}
10785
10787 SDValue Ptr, MachinePointerInfo PtrInfo,
10788 Align Alignment,
10789 MachineMemOperand::Flags MMOFlags,
10790 const AAMDNodes &AAInfo) {
10791 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10792
10793 MMOFlags |= MachineMemOperand::MOStore;
10794 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10795
10796 if (PtrInfo.V.isNull())
10797 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10798
10801 MachineMemOperand *MMO =
10802 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10803 return getStore(Chain, dl, Val, Ptr, MMO);
10804}
10805
10807 SDValue Ptr, MachineMemOperand *MMO) {
10809 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10811}
10812
10814 SDValue Ptr, SDValue Offset, EVT SVT,
10816 bool IsTruncating) {
10817 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10818 EVT VT = Val.getValueType();
10819 if (VT == SVT) {
10820 IsTruncating = false;
10821 } else if (!IsTruncating) {
10822 assert(VT == SVT && "No-truncating store from different memory type!");
10823 } else {
10825 "Should only be a truncating store, not extending!");
10826 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10827 assert(VT.isVector() == SVT.isVector() &&
10828 "Cannot use trunc store to convert to or from a vector!");
10829 assert((!VT.isVector() ||
10831 "Cannot use trunc store to change the number of vector elements!");
10832 }
10833
10834 bool Indexed = AM != ISD::UNINDEXED;
10835 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10836 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10837 : getVTList(MVT::Other);
10838 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10841 ID.AddInteger(SVT.getRawBits());
10842 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10843 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10844 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10845 ID.AddInteger(MMO->getFlags());
10846 void *IP = nullptr;
10847 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10848 cast<StoreSDNode>(E)->refineAlignment(MMO);
10849 return SDValue(E, 0);
10850 }
10851 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10852 IsTruncating, SVT, MMO);
10853 createOperands(N, Ops);
10854
10855 CSEMap.InsertNode(N, IP);
10856 InsertNode(N);
10857 SDValue V(N, 0);
10858 NewSDValueDbgMsg(V, "Creating new node: ", this);
10859 return V;
10860}
10861
10863 SDValue Ptr, MachinePointerInfo PtrInfo,
10864 EVT SVT, Align Alignment,
10865 MachineMemOperand::Flags MMOFlags,
10866 const AAMDNodes &AAInfo) {
10867 assert(Chain.getValueType() == MVT::Other &&
10868 "Invalid chain type");
10869
10870 MMOFlags |= MachineMemOperand::MOStore;
10871 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10872
10873 if (PtrInfo.V.isNull())
10874 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10875
10877 MachineMemOperand *MMO = MF.getMachineMemOperand(
10878 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10879 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10880}
10881
10883 SDValue Ptr, EVT SVT,
10884 MachineMemOperand *MMO) {
10886 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10887}
10888
10892 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10893 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10894 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10895 ST->getMemoryVT(), ST->getMemOperand(), AM,
10896 ST->isTruncatingStore());
10897}
10898
10900 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10901 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10902 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10903 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10904 const MDNode *Ranges, bool IsExpanding) {
10905 MMOFlags |= MachineMemOperand::MOLoad;
10906 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10907 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10908 // clients.
10909 if (PtrInfo.V.isNull())
10910 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10911
10912 TypeSize Size = MemVT.getStoreSize();
10914 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10915 Alignment, AAInfo, Ranges);
10916 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10917 MMO, IsExpanding);
10918}
10919
10921 ISD::LoadExtType ExtType, EVT VT,
10922 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10923 SDValue Offset, SDValue Mask, SDValue EVL,
10924 EVT MemVT, MachineMemOperand *MMO,
10925 bool IsExpanding) {
10926 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10927 assert(Mask.getValueType().getVectorElementCount() ==
10928 VT.getVectorElementCount() &&
10929 "Vector width mismatch between mask and data");
10930
10931 bool Indexed = AM != ISD::UNINDEXED;
10932 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10933
10934 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10935 : getVTList(VT, MVT::Other);
10936 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10938 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10939 ID.AddInteger(MemVT.getRawBits());
10940 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10941 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10942 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10943 ID.AddInteger(MMO->getFlags());
10944 void *IP = nullptr;
10945 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10946 E->refineAlignment(MMO);
10947 E->refineRanges(MMO);
10948 return SDValue(E, 0);
10949 }
10950 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10951 ExtType, IsExpanding, MemVT, MMO);
10952 createOperands(N, Ops);
10953
10954 CSEMap.InsertNode(N, IP);
10955 InsertNode(N);
10956 SDValue V(N, 0);
10957 NewSDValueDbgMsg(V, "Creating new node: ", this);
10958 return V;
10959}
10960
10962 SDValue Ptr, SDValue Mask, SDValue EVL,
10963 MachinePointerInfo PtrInfo,
10964 MaybeAlign Alignment,
10965 MachineMemOperand::Flags MMOFlags,
10966 const AAMDNodes &AAInfo, const MDNode *Ranges,
10967 bool IsExpanding) {
10969 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10970 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10971 IsExpanding);
10972}
10973
10975 SDValue Ptr, SDValue Mask, SDValue EVL,
10976 MachineMemOperand *MMO, bool IsExpanding) {
10978 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10979 Mask, EVL, VT, MMO, IsExpanding);
10980}
10981
10983 EVT VT, SDValue Chain, SDValue Ptr,
10984 SDValue Mask, SDValue EVL,
10985 MachinePointerInfo PtrInfo, EVT MemVT,
10986 MaybeAlign Alignment,
10987 MachineMemOperand::Flags MMOFlags,
10988 const AAMDNodes &AAInfo, bool IsExpanding) {
10990 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10991 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10992 IsExpanding);
10993}
10994
10996 EVT VT, SDValue Chain, SDValue Ptr,
10997 SDValue Mask, SDValue EVL, EVT MemVT,
10998 MachineMemOperand *MMO, bool IsExpanding) {
11000 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
11001 EVL, MemVT, MMO, IsExpanding);
11002}
11003
11007 auto *LD = cast<VPLoadSDNode>(OrigLoad);
11008 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
11009 // Don't propagate the invariant or dereferenceable flags.
11010 auto MMOFlags =
11011 LD->getMemOperand()->getFlags() &
11013 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
11014 LD->getChain(), Base, Offset, LD->getMask(),
11015 LD->getVectorLength(), LD->getPointerInfo(),
11016 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
11017 nullptr, LD->isExpandingLoad());
11018}
11019
11021 SDValue Ptr, SDValue Offset, SDValue Mask,
11022 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
11023 ISD::MemIndexedMode AM, bool IsTruncating,
11024 bool IsCompressing) {
11025 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11026 assert(Mask.getValueType().getVectorElementCount() ==
11028 "Vector width mismatch between mask and data");
11029
11030 bool Indexed = AM != ISD::UNINDEXED;
11031 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11032 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11033 : getVTList(MVT::Other);
11034 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
11036 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11037 ID.AddInteger(MemVT.getRawBits());
11038 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11039 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11040 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11041 ID.AddInteger(MMO->getFlags());
11042 void *IP = nullptr;
11043 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11044 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11045 return SDValue(E, 0);
11046 }
11047 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11048 IsTruncating, IsCompressing, MemVT, MMO);
11049 createOperands(N, Ops);
11050
11051 CSEMap.InsertNode(N, IP);
11052 InsertNode(N);
11053 SDValue V(N, 0);
11054 NewSDValueDbgMsg(V, "Creating new node: ", this);
11055 return V;
11056}
11057
11059 SDValue Val, SDValue Ptr, SDValue Mask,
11060 SDValue EVL, MachinePointerInfo PtrInfo,
11061 EVT SVT, Align Alignment,
11062 MachineMemOperand::Flags MMOFlags,
11063 const AAMDNodes &AAInfo,
11064 bool IsCompressing) {
11065 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11066
11067 MMOFlags |= MachineMemOperand::MOStore;
11068 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11069
11070 if (PtrInfo.V.isNull())
11071 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11072
11074 MachineMemOperand *MMO = MF.getMachineMemOperand(
11075 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11076 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11077 IsCompressing);
11078}
11079
11081 SDValue Val, SDValue Ptr, SDValue Mask,
11082 SDValue EVL, EVT SVT,
11083 MachineMemOperand *MMO,
11084 bool IsCompressing) {
11085 EVT VT = Val.getValueType();
11086
11087 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11088 if (VT == SVT)
11089 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
11090 EVL, VT, MMO, ISD::UNINDEXED,
11091 /*IsTruncating*/ false, IsCompressing);
11092
11094 "Should only be a truncating store, not extending!");
11095 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11096 assert(VT.isVector() == SVT.isVector() &&
11097 "Cannot use trunc store to convert to or from a vector!");
11098 assert((!VT.isVector() ||
11100 "Cannot use trunc store to change the number of vector elements!");
11101
11102 SDVTList VTs = getVTList(MVT::Other);
11104 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11106 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11107 ID.AddInteger(SVT.getRawBits());
11108 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11109 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11110 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11111 ID.AddInteger(MMO->getFlags());
11112 void *IP = nullptr;
11113 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11114 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11115 return SDValue(E, 0);
11116 }
11117 auto *N =
11118 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11119 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11120 createOperands(N, Ops);
11121
11122 CSEMap.InsertNode(N, IP);
11123 InsertNode(N);
11124 SDValue V(N, 0);
11125 NewSDValueDbgMsg(V, "Creating new node: ", this);
11126 return V;
11127}
11128
11132 auto *ST = cast<VPStoreSDNode>(OrigStore);
11133 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
11134 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
11135 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
11136 Offset, ST->getMask(), ST->getVectorLength()};
11138 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11139 ID.AddInteger(ST->getMemoryVT().getRawBits());
11140 ID.AddInteger(ST->getRawSubclassData());
11141 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
11142 ID.AddInteger(ST->getMemOperand()->getFlags());
11143 void *IP = nullptr;
11144 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11145 return SDValue(E, 0);
11146
11147 auto *N = newSDNode<VPStoreSDNode>(
11148 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
11149 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
11150 createOperands(N, Ops);
11151
11152 CSEMap.InsertNode(N, IP);
11153 InsertNode(N);
11154 SDValue V(N, 0);
11155 NewSDValueDbgMsg(V, "Creating new node: ", this);
11156 return V;
11157}
11158
11160 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11161 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11162 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11163 bool Indexed = AM != ISD::UNINDEXED;
11164 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
11165
11166 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11167 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11168 : getVTList(VT, MVT::Other);
11170 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11171 ID.AddInteger(VT.getRawBits());
11172 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11173 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11174 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11175
11176 void *IP = nullptr;
11177 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11178 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11179 return SDValue(E, 0);
11180 }
11181
11182 auto *N =
11183 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11184 ExtType, IsExpanding, MemVT, MMO);
11185 createOperands(N, Ops);
11186 CSEMap.InsertNode(N, IP);
11187 InsertNode(N);
11188 SDValue V(N, 0);
11189 NewSDValueDbgMsg(V, "Creating new node: ", this);
11190 return V;
11191}
11192
11194 SDValue Ptr, SDValue Stride,
11195 SDValue Mask, SDValue EVL,
11196 MachineMemOperand *MMO,
11197 bool IsExpanding) {
11199 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11200 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11201}
11202
11204 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11205 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11206 MachineMemOperand *MMO, bool IsExpanding) {
11208 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11209 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11210}
11211
11213 SDValue Val, SDValue Ptr,
11214 SDValue Offset, SDValue Stride,
11215 SDValue Mask, SDValue EVL, EVT MemVT,
11216 MachineMemOperand *MMO,
11218 bool IsTruncating, bool IsCompressing) {
11219 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11220 bool Indexed = AM != ISD::UNINDEXED;
11221 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11222 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11223 : getVTList(MVT::Other);
11224 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11226 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11227 ID.AddInteger(MemVT.getRawBits());
11228 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11229 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11230 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11231 void *IP = nullptr;
11232 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11233 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11234 return SDValue(E, 0);
11235 }
11236 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11237 VTs, AM, IsTruncating,
11238 IsCompressing, MemVT, MMO);
11239 createOperands(N, Ops);
11240
11241 CSEMap.InsertNode(N, IP);
11242 InsertNode(N);
11243 SDValue V(N, 0);
11244 NewSDValueDbgMsg(V, "Creating new node: ", this);
11245 return V;
11246}
11247
11249 SDValue Val, SDValue Ptr,
11250 SDValue Stride, SDValue Mask,
11251 SDValue EVL, EVT SVT,
11252 MachineMemOperand *MMO,
11253 bool IsCompressing) {
11254 EVT VT = Val.getValueType();
11255
11256 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11257 if (VT == SVT)
11258 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
11259 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
11260 /*IsTruncating*/ false, IsCompressing);
11261
11263 "Should only be a truncating store, not extending!");
11264 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11265 assert(VT.isVector() == SVT.isVector() &&
11266 "Cannot use trunc store to convert to or from a vector!");
11267 assert((!VT.isVector() ||
11269 "Cannot use trunc store to change the number of vector elements!");
11270
11271 SDVTList VTs = getVTList(MVT::Other);
11273 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
11275 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11276 ID.AddInteger(SVT.getRawBits());
11277 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11278 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11279 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11280 void *IP = nullptr;
11281 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11282 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11283 return SDValue(E, 0);
11284 }
11285 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11286 VTs, ISD::UNINDEXED, true,
11287 IsCompressing, SVT, MMO);
11288 createOperands(N, Ops);
11289
11290 CSEMap.InsertNode(N, IP);
11291 InsertNode(N);
11292 SDValue V(N, 0);
11293 NewSDValueDbgMsg(V, "Creating new node: ", this);
11294 return V;
11295}
11296
11299 ISD::MemIndexType IndexType) {
11300 assert(Ops.size() == 6 && "Incompatible number of operands");
11301
11303 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
11304 ID.AddInteger(VT.getRawBits());
11305 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11306 dl.getIROrder(), VTs, VT, MMO, IndexType));
11307 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11308 ID.AddInteger(MMO->getFlags());
11309 void *IP = nullptr;
11310 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11311 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11312 return SDValue(E, 0);
11313 }
11314
11315 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11316 VT, MMO, IndexType);
11317 createOperands(N, Ops);
11318
11319 assert(N->getMask().getValueType().getVectorElementCount() ==
11320 N->getValueType(0).getVectorElementCount() &&
11321 "Vector width mismatch between mask and data");
11322 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11323 N->getValueType(0).getVectorElementCount().isScalable() &&
11324 "Scalable flags of index and data do not match");
11326 N->getIndex().getValueType().getVectorElementCount(),
11327 N->getValueType(0).getVectorElementCount()) &&
11328 "Vector width mismatch between index and data");
11329 assert(isa<ConstantSDNode>(N->getScale()) &&
11330 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11331 "Scale should be a constant power of 2");
11332
11333 CSEMap.InsertNode(N, IP);
11334 InsertNode(N);
11335 SDValue V(N, 0);
11336 NewSDValueDbgMsg(V, "Creating new node: ", this);
11337 return V;
11338}
11339
11342 MachineMemOperand *MMO,
11343 ISD::MemIndexType IndexType) {
11344 assert(Ops.size() == 7 && "Incompatible number of operands");
11345
11347 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
11348 ID.AddInteger(VT.getRawBits());
11349 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11350 dl.getIROrder(), VTs, VT, MMO, IndexType));
11351 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11352 ID.AddInteger(MMO->getFlags());
11353 void *IP = nullptr;
11354 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11355 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11356 return SDValue(E, 0);
11357 }
11358 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11359 VT, MMO, IndexType);
11360 createOperands(N, Ops);
11361
11362 assert(N->getMask().getValueType().getVectorElementCount() ==
11363 N->getValue().getValueType().getVectorElementCount() &&
11364 "Vector width mismatch between mask and data");
11365 assert(
11366 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11367 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11368 "Scalable flags of index and data do not match");
11370 N->getIndex().getValueType().getVectorElementCount(),
11371 N->getValue().getValueType().getVectorElementCount()) &&
11372 "Vector width mismatch between index and data");
11373 assert(isa<ConstantSDNode>(N->getScale()) &&
11374 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11375 "Scale should be a constant power of 2");
11376
11377 CSEMap.InsertNode(N, IP);
11378 InsertNode(N);
11379 SDValue V(N, 0);
11380 NewSDValueDbgMsg(V, "Creating new node: ", this);
11381 return V;
11382}
11383
11386 SDValue PassThru, EVT MemVT,
11387 MachineMemOperand *MMO,
11389 ISD::LoadExtType ExtTy, bool isExpanding) {
11390 bool Indexed = AM != ISD::UNINDEXED;
11391 assert((Indexed || Offset.isUndef()) &&
11392 "Unindexed masked load with an offset!");
11393 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11394 : getVTList(VT, MVT::Other);
11395 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11398 ID.AddInteger(MemVT.getRawBits());
11399 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11400 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11401 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11402 ID.AddInteger(MMO->getFlags());
11403 void *IP = nullptr;
11404 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11405 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11406 return SDValue(E, 0);
11407 }
11408 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11409 AM, ExtTy, isExpanding, MemVT, MMO);
11410 createOperands(N, Ops);
11411
11412 CSEMap.InsertNode(N, IP);
11413 InsertNode(N);
11414 SDValue V(N, 0);
11415 NewSDValueDbgMsg(V, "Creating new node: ", this);
11416 return V;
11417}
11418
11423 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
11424 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11425 Offset, LD->getMask(), LD->getPassThru(),
11426 LD->getMemoryVT(), LD->getMemOperand(), AM,
11427 LD->getExtensionType(), LD->isExpandingLoad());
11428}
11429
11432 SDValue Mask, EVT MemVT,
11433 MachineMemOperand *MMO,
11434 ISD::MemIndexedMode AM, bool IsTruncating,
11435 bool IsCompressing) {
11436 assert(Chain.getValueType() == MVT::Other &&
11437 "Invalid chain type");
11438 bool Indexed = AM != ISD::UNINDEXED;
11439 assert((Indexed || Offset.isUndef()) &&
11440 "Unindexed masked store with an offset!");
11441 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11442 : getVTList(MVT::Other);
11443 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11446 ID.AddInteger(MemVT.getRawBits());
11447 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11448 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11449 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11450 ID.AddInteger(MMO->getFlags());
11451 void *IP = nullptr;
11452 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11453 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11454 return SDValue(E, 0);
11455 }
11456 auto *N =
11457 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11458 IsTruncating, IsCompressing, MemVT, MMO);
11459 createOperands(N, Ops);
11460
11461 CSEMap.InsertNode(N, IP);
11462 InsertNode(N);
11463 SDValue V(N, 0);
11464 NewSDValueDbgMsg(V, "Creating new node: ", this);
11465 return V;
11466}
11467
11472 assert(ST->getOffset().isUndef() &&
11473 "Masked store is already a indexed store!");
11474 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11475 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11476 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11477}
11478
11481 MachineMemOperand *MMO,
11482 ISD::MemIndexType IndexType,
11483 ISD::LoadExtType ExtTy) {
11484 assert(Ops.size() == 6 && "Incompatible number of operands");
11485
11488 ID.AddInteger(MemVT.getRawBits());
11489 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11490 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11491 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11492 ID.AddInteger(MMO->getFlags());
11493 void *IP = nullptr;
11494 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11495 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11496 return SDValue(E, 0);
11497 }
11498
11499 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11500 VTs, MemVT, MMO, IndexType, ExtTy);
11501 createOperands(N, Ops);
11502
11503 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11504 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11505 assert(N->getMask().getValueType().getVectorElementCount() ==
11506 N->getValueType(0).getVectorElementCount() &&
11507 "Vector width mismatch between mask and data");
11508 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11509 N->getValueType(0).getVectorElementCount().isScalable() &&
11510 "Scalable flags of index and data do not match");
11512 N->getIndex().getValueType().getVectorElementCount(),
11513 N->getValueType(0).getVectorElementCount()) &&
11514 "Vector width mismatch between index and data");
11515 assert(isa<ConstantSDNode>(N->getScale()) &&
11516 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11517 "Scale should be a constant power of 2");
11518
11519 CSEMap.InsertNode(N, IP);
11520 InsertNode(N);
11521 SDValue V(N, 0);
11522 NewSDValueDbgMsg(V, "Creating new node: ", this);
11523 return V;
11524}
11525
11528 MachineMemOperand *MMO,
11529 ISD::MemIndexType IndexType,
11530 bool IsTrunc) {
11531 assert(Ops.size() == 6 && "Incompatible number of operands");
11532
11535 ID.AddInteger(MemVT.getRawBits());
11536 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11537 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11538 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11539 ID.AddInteger(MMO->getFlags());
11540 void *IP = nullptr;
11541 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11542 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11543 return SDValue(E, 0);
11544 }
11545
11546 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11547 VTs, MemVT, MMO, IndexType, IsTrunc);
11548 createOperands(N, Ops);
11549
11550 assert(N->getMask().getValueType().getVectorElementCount() ==
11551 N->getValue().getValueType().getVectorElementCount() &&
11552 "Vector width mismatch between mask and data");
11553 assert(
11554 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11555 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11556 "Scalable flags of index and data do not match");
11558 N->getIndex().getValueType().getVectorElementCount(),
11559 N->getValue().getValueType().getVectorElementCount()) &&
11560 "Vector width mismatch between index and data");
11561 assert(isa<ConstantSDNode>(N->getScale()) &&
11562 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11563 "Scale should be a constant power of 2");
11564
11565 CSEMap.InsertNode(N, IP);
11566 InsertNode(N);
11567 SDValue V(N, 0);
11568 NewSDValueDbgMsg(V, "Creating new node: ", this);
11569 return V;
11570}
11571
11573 const SDLoc &dl, ArrayRef<SDValue> Ops,
11574 MachineMemOperand *MMO,
11575 ISD::MemIndexType IndexType) {
11576 assert(Ops.size() == 7 && "Incompatible number of operands");
11577
11580 ID.AddInteger(MemVT.getRawBits());
11581 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11582 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11583 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11584 ID.AddInteger(MMO->getFlags());
11585 void *IP = nullptr;
11586 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11587 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11588 return SDValue(E, 0);
11589 }
11590
11591 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11592 VTs, MemVT, MMO, IndexType);
11593 createOperands(N, Ops);
11594
11595 assert(N->getMask().getValueType().getVectorElementCount() ==
11596 N->getIndex().getValueType().getVectorElementCount() &&
11597 "Vector width mismatch between mask and data");
11598 assert(isa<ConstantSDNode>(N->getScale()) &&
11599 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11600 "Scale should be a constant power of 2");
11601 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11602
11603 CSEMap.InsertNode(N, IP);
11604 InsertNode(N);
11605 SDValue V(N, 0);
11606 NewSDValueDbgMsg(V, "Creating new node: ", this);
11607 return V;
11608}
11609
11611 SDValue Ptr, SDValue Mask, SDValue EVL,
11612 MachineMemOperand *MMO) {
11613 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11614 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11616 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11617 ID.AddInteger(VT.getRawBits());
11618 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11619 VTs, VT, MMO));
11620 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11621 ID.AddInteger(MMO->getFlags());
11622 void *IP = nullptr;
11623 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11624 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11625 return SDValue(E, 0);
11626 }
11627 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11628 VT, MMO);
11629 createOperands(N, Ops);
11630
11631 CSEMap.InsertNode(N, IP);
11632 InsertNode(N);
11633 SDValue V(N, 0);
11634 NewSDValueDbgMsg(V, "Creating new node: ", this);
11635 return V;
11636}
11637
11639 EVT MemVT, MachineMemOperand *MMO) {
11640 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11641 SDVTList VTs = getVTList(MVT::Other);
11642 SDValue Ops[] = {Chain, Ptr};
11645 ID.AddInteger(MemVT.getRawBits());
11646 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11647 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11648 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11649 ID.AddInteger(MMO->getFlags());
11650 void *IP = nullptr;
11651 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11652 return SDValue(E, 0);
11653
11654 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11655 dl.getDebugLoc(), VTs, MemVT, MMO);
11656 createOperands(N, Ops);
11657
11658 CSEMap.InsertNode(N, IP);
11659 InsertNode(N);
11660 SDValue V(N, 0);
11661 NewSDValueDbgMsg(V, "Creating new node: ", this);
11662 return V;
11663}
11664
11666 EVT MemVT, MachineMemOperand *MMO) {
11667 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11668 SDVTList VTs = getVTList(MVT::Other);
11669 SDValue Ops[] = {Chain, Ptr};
11672 ID.AddInteger(MemVT.getRawBits());
11673 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11674 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11675 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11676 ID.AddInteger(MMO->getFlags());
11677 void *IP = nullptr;
11678 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11679 return SDValue(E, 0);
11680
11681 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11682 dl.getDebugLoc(), VTs, MemVT, MMO);
11683 createOperands(N, Ops);
11684
11685 CSEMap.InsertNode(N, IP);
11686 InsertNode(N);
11687 SDValue V(N, 0);
11688 NewSDValueDbgMsg(V, "Creating new node: ", this);
11689 return V;
11690}
11691
11693 // select undef, T, F --> T (if T is a constant), otherwise F
11694 // select, ?, undef, F --> F
11695 // select, ?, T, undef --> T
11696 if (Cond.isUndef())
11697 return isConstantValueOfAnyType(T) ? T : F;
11698 if (T.isUndef())
11700 if (F.isUndef())
11702
11703 // select true, T, F --> T
11704 // select false, T, F --> F
11705 if (auto C = isBoolConstant(Cond))
11706 return *C ? T : F;
11707
11708 // select ?, T, T --> T
11709 if (T == F)
11710 return T;
11711
11712 return SDValue();
11713}
11714
11716 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11717 if (X.isUndef())
11718 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11719 // shift X, undef --> undef (because it may shift by the bitwidth)
11720 if (Y.isUndef())
11721 return getUNDEF(X.getValueType());
11722
11723 // shift 0, Y --> 0
11724 // shift X, 0 --> X
11726 return X;
11727
11728 // shift X, C >= bitwidth(X) --> undef
11729 // All vector elements must be too big (or undef) to avoid partial undefs.
11730 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11731 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11732 };
11733 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11734 return getUNDEF(X.getValueType());
11735
11736 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11737 if (X.getValueType().getScalarType() == MVT::i1)
11738 return X;
11739
11740 return SDValue();
11741}
11742
11744 SDNodeFlags Flags) {
11745 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11746 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11747 // operation is poison. That result can be relaxed to undef.
11748 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11749 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11750 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11751 (YC && YC->getValueAPF().isNaN());
11752 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11753 (YC && YC->getValueAPF().isInfinity());
11754
11755 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11756 return getUNDEF(X.getValueType());
11757
11758 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11759 return getUNDEF(X.getValueType());
11760
11761 if (!YC)
11762 return SDValue();
11763
11764 // X + -0.0 --> X
11765 if (Opcode == ISD::FADD)
11766 if (YC->getValueAPF().isNegZero())
11767 return X;
11768
11769 // X - +0.0 --> X
11770 if (Opcode == ISD::FSUB)
11771 if (YC->getValueAPF().isPosZero())
11772 return X;
11773
11774 // X * 1.0 --> X
11775 // X / 1.0 --> X
11776 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11777 if (YC->getValueAPF().isOne())
11778 return X;
11779
11780 // X * 0.0 --> 0.0
11781 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11782 if (YC->getValueAPF().isZero())
11783 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11784
11785 return SDValue();
11786}
11787
11789 SDValue Ptr, SDValue SV, unsigned Align) {
11790 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11791 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11792}
11793
11794SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11796 switch (Ops.size()) {
11797 case 0: return getNode(Opcode, DL, VT);
11798 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11799 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11800 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11801 default: break;
11802 }
11803
11804 // Copy from an SDUse array into an SDValue array for use with
11805 // the regular getNode logic.
11807 return getNode(Opcode, DL, VT, NewOps);
11808}
11809
11810SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11812 SDNodeFlags Flags;
11813 if (Inserter)
11814 Flags = Inserter->getFlags();
11815 return getNode(Opcode, DL, VT, Ops, Flags);
11816}
11817
11818SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11819 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11820 unsigned NumOps = Ops.size();
11821 switch (NumOps) {
11822 case 0: return getNode(Opcode, DL, VT);
11823 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11824 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11825 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11826 default: break;
11827 }
11828
11829#ifndef NDEBUG
11830 for (const auto &Op : Ops)
11831 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11832 "Operand is DELETED_NODE!");
11833#endif
11834
11835 switch (Opcode) {
11836 default: break;
11837 case ISD::BUILD_VECTOR:
11838 // Attempt to simplify BUILD_VECTOR.
11839 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11840 return V;
11841 break;
11843 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11844 return V;
11845 break;
11846 case ISD::SELECT_CC:
11847 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11848 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11849 "LHS and RHS of condition must have same type!");
11850 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11851 "True and False arms of SelectCC must have same type!");
11852 assert(Ops[2].getValueType() == VT &&
11853 "select_cc node must be of same type as true and false value!");
11854 assert((!Ops[0].getValueType().isVector() ||
11855 Ops[0].getValueType().getVectorElementCount() ==
11856 VT.getVectorElementCount()) &&
11857 "Expected select_cc with vector result to have the same sized "
11858 "comparison type!");
11859 break;
11860 case ISD::BR_CC:
11861 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11862 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11863 "LHS/RHS of comparison should match types!");
11864 break;
11865 case ISD::VP_ADD:
11866 case ISD::VP_SUB:
11867 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11868 if (VT.getScalarType() == MVT::i1)
11869 Opcode = ISD::VP_XOR;
11870 break;
11871 case ISD::VP_MUL:
11872 // If it is VP_MUL mask operation then turn it to VP_AND
11873 if (VT.getScalarType() == MVT::i1)
11874 Opcode = ISD::VP_AND;
11875 break;
11876 case ISD::VP_REDUCE_MUL:
11877 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11878 if (VT == MVT::i1)
11879 Opcode = ISD::VP_REDUCE_AND;
11880 break;
11881 case ISD::VP_REDUCE_ADD:
11882 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11883 if (VT == MVT::i1)
11884 Opcode = ISD::VP_REDUCE_XOR;
11885 break;
11886 case ISD::VP_REDUCE_SMAX:
11887 case ISD::VP_REDUCE_UMIN:
11888 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11889 // VP_REDUCE_AND.
11890 if (VT == MVT::i1)
11891 Opcode = ISD::VP_REDUCE_AND;
11892 break;
11893 case ISD::VP_REDUCE_SMIN:
11894 case ISD::VP_REDUCE_UMAX:
11895 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11896 // VP_REDUCE_OR.
11897 if (VT == MVT::i1)
11898 Opcode = ISD::VP_REDUCE_OR;
11899 break;
11900 }
11901
11902 // Memoize nodes.
11903 SDNode *N;
11904 SDVTList VTs = getVTList(VT);
11905
11906 if (VT != MVT::Glue) {
11908 AddNodeIDNode(ID, Opcode, VTs, Ops);
11909 void *IP = nullptr;
11910
11911 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11912 E->intersectFlagsWith(Flags);
11913 return SDValue(E, 0);
11914 }
11915
11916 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11917 createOperands(N, Ops);
11918
11919 CSEMap.InsertNode(N, IP);
11920 } else {
11921 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11922 createOperands(N, Ops);
11923 }
11924
11925 N->setFlags(Flags);
11926 InsertNode(N);
11927 SDValue V(N, 0);
11928 NewSDValueDbgMsg(V, "Creating new node: ", this);
11929 return V;
11930}
11931
11932SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11933 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11934 SDNodeFlags Flags;
11935 if (Inserter)
11936 Flags = Inserter->getFlags();
11937 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11938}
11939
11940SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11942 const SDNodeFlags Flags) {
11943 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11944}
11945
11946SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11948 SDNodeFlags Flags;
11949 if (Inserter)
11950 Flags = Inserter->getFlags();
11951 return getNode(Opcode, DL, VTList, Ops, Flags);
11952}
11953
11954SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11955 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11956 if (VTList.NumVTs == 1)
11957 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11958
11959#ifndef NDEBUG
11960 for (const auto &Op : Ops)
11961 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11962 "Operand is DELETED_NODE!");
11963#endif
11964
11965 switch (Opcode) {
11966 case ISD::SADDO:
11967 case ISD::UADDO:
11968 case ISD::SSUBO:
11969 case ISD::USUBO: {
11970 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11971 "Invalid add/sub overflow op!");
11972 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11973 Ops[0].getValueType() == Ops[1].getValueType() &&
11974 Ops[0].getValueType() == VTList.VTs[0] &&
11975 "Binary operator types must match!");
11976 SDValue N1 = Ops[0], N2 = Ops[1];
11977 canonicalizeCommutativeBinop(Opcode, N1, N2);
11978
11979 // (X +- 0) -> X with zero-overflow.
11980 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11981 /*AllowTruncation*/ true);
11982 if (N2CV && N2CV->isZero()) {
11983 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11984 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11985 }
11986
11987 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11988 VTList.VTs[1].getScalarType() == MVT::i1) {
11989 SDValue F1 = getFreeze(N1);
11990 SDValue F2 = getFreeze(N2);
11991 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11992 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11993 return getNode(ISD::MERGE_VALUES, DL, VTList,
11994 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11995 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11996 Flags);
11997 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11998 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11999 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
12000 return getNode(ISD::MERGE_VALUES, DL, VTList,
12001 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
12002 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
12003 Flags);
12004 }
12005 }
12006 break;
12007 }
12008 case ISD::SADDO_CARRY:
12009 case ISD::UADDO_CARRY:
12010 case ISD::SSUBO_CARRY:
12011 case ISD::USUBO_CARRY:
12012 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
12013 "Invalid add/sub overflow op!");
12014 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12015 Ops[0].getValueType() == Ops[1].getValueType() &&
12016 Ops[0].getValueType() == VTList.VTs[0] &&
12017 Ops[2].getValueType() == VTList.VTs[1] &&
12018 "Binary operator types must match!");
12019 break;
12020 case ISD::SMUL_LOHI:
12021 case ISD::UMUL_LOHI: {
12022 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
12023 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
12024 VTList.VTs[0] == Ops[0].getValueType() &&
12025 VTList.VTs[0] == Ops[1].getValueType() &&
12026 "Binary operator types must match!");
12027 // Constant fold.
12030 if (LHS && RHS) {
12031 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
12032 unsigned OutWidth = Width * 2;
12033 APInt Val = LHS->getAPIntValue();
12034 APInt Mul = RHS->getAPIntValue();
12035 if (Opcode == ISD::SMUL_LOHI) {
12036 Val = Val.sext(OutWidth);
12037 Mul = Mul.sext(OutWidth);
12038 } else {
12039 Val = Val.zext(OutWidth);
12040 Mul = Mul.zext(OutWidth);
12041 }
12042 Val *= Mul;
12043
12044 SDValue Hi =
12045 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
12046 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
12047 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
12048 }
12049 break;
12050 }
12051 case ISD::FFREXP: {
12052 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
12053 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12054 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12055
12057 int FrexpExp;
12058 APFloat FrexpMant =
12059 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12060 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12061 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12062 DL, VTList.VTs[1]);
12063 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12064 }
12065
12066 break;
12067 }
12069 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12070 "Invalid STRICT_FP_EXTEND!");
12071 assert(VTList.VTs[0].isFloatingPoint() &&
12072 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12073 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12074 "STRICT_FP_EXTEND result type should be vector iff the operand "
12075 "type is vector!");
12076 assert((!VTList.VTs[0].isVector() ||
12077 VTList.VTs[0].getVectorElementCount() ==
12078 Ops[1].getValueType().getVectorElementCount()) &&
12079 "Vector element count mismatch!");
12080 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12081 "Invalid fpext node, dst <= src!");
12082 break;
12084 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12085 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12086 "STRICT_FP_ROUND result type should be vector iff the operand "
12087 "type is vector!");
12088 assert((!VTList.VTs[0].isVector() ||
12089 VTList.VTs[0].getVectorElementCount() ==
12090 Ops[1].getValueType().getVectorElementCount()) &&
12091 "Vector element count mismatch!");
12092 assert(VTList.VTs[0].isFloatingPoint() &&
12093 Ops[1].getValueType().isFloatingPoint() &&
12094 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12095 Ops[2].getOpcode() == ISD::TargetConstant &&
12096 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12097 "Invalid STRICT_FP_ROUND!");
12098 break;
12099 }
12100
12101 // Memoize the node unless it returns a glue result.
12102 SDNode *N;
12103 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12105 AddNodeIDNode(ID, Opcode, VTList, Ops);
12106 void *IP = nullptr;
12107 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12108 E->intersectFlagsWith(Flags);
12109 return SDValue(E, 0);
12110 }
12111
12112 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12113 createOperands(N, Ops);
12114 CSEMap.InsertNode(N, IP);
12115 } else {
12116 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12117 createOperands(N, Ops);
12118 }
12119
12120 N->setFlags(Flags);
12121 InsertNode(N);
12122 SDValue V(N, 0);
12123 NewSDValueDbgMsg(V, "Creating new node: ", this);
12124 return V;
12125}
12126
12127SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12128 SDVTList VTList) {
12129 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12130}
12131
12132SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12133 SDValue N1) {
12134 SDValue Ops[] = { N1 };
12135 return getNode(Opcode, DL, VTList, Ops);
12136}
12137
12138SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12139 SDValue N1, SDValue N2) {
12140 SDValue Ops[] = { N1, N2 };
12141 return getNode(Opcode, DL, VTList, Ops);
12142}
12143
12144SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12145 SDValue N1, SDValue N2, SDValue N3) {
12146 SDValue Ops[] = { N1, N2, N3 };
12147 return getNode(Opcode, DL, VTList, Ops);
12148}
12149
12150SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12151 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12152 SDValue Ops[] = { N1, N2, N3, N4 };
12153 return getNode(Opcode, DL, VTList, Ops);
12154}
12155
12156SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12157 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12158 SDValue N5) {
12159 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12160 return getNode(Opcode, DL, VTList, Ops);
12161}
12162
12164 if (!VT.isExtended())
12165 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12166
12167 return makeVTList(&(*EVTs.insert(VT).first), 1);
12168}
12169
12172 ID.AddInteger(2U);
12173 ID.AddInteger(VT1.getRawBits());
12174 ID.AddInteger(VT2.getRawBits());
12175
12176 void *IP = nullptr;
12177 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12178 if (!Result) {
12179 EVT *Array = Allocator.Allocate<EVT>(2);
12180 Array[0] = VT1;
12181 Array[1] = VT2;
12182 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
12183 VTListMap.InsertNode(Result, IP);
12184 }
12185 return Result->getSDVTList();
12186}
12187
12190 ID.AddInteger(3U);
12191 ID.AddInteger(VT1.getRawBits());
12192 ID.AddInteger(VT2.getRawBits());
12193 ID.AddInteger(VT3.getRawBits());
12194
12195 void *IP = nullptr;
12196 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12197 if (!Result) {
12198 EVT *Array = Allocator.Allocate<EVT>(3);
12199 Array[0] = VT1;
12200 Array[1] = VT2;
12201 Array[2] = VT3;
12202 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
12203 VTListMap.InsertNode(Result, IP);
12204 }
12205 return Result->getSDVTList();
12206}
12207
12210 ID.AddInteger(4U);
12211 ID.AddInteger(VT1.getRawBits());
12212 ID.AddInteger(VT2.getRawBits());
12213 ID.AddInteger(VT3.getRawBits());
12214 ID.AddInteger(VT4.getRawBits());
12215
12216 void *IP = nullptr;
12217 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12218 if (!Result) {
12219 EVT *Array = Allocator.Allocate<EVT>(4);
12220 Array[0] = VT1;
12221 Array[1] = VT2;
12222 Array[2] = VT3;
12223 Array[3] = VT4;
12224 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
12225 VTListMap.InsertNode(Result, IP);
12226 }
12227 return Result->getSDVTList();
12228}
12229
12231 unsigned NumVTs = VTs.size();
12233 ID.AddInteger(NumVTs);
12234 for (unsigned index = 0; index < NumVTs; index++) {
12235 ID.AddInteger(VTs[index].getRawBits());
12236 }
12237
12238 void *IP = nullptr;
12239 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12240 if (!Result) {
12241 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
12242 llvm::copy(VTs, Array);
12243 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
12244 VTListMap.InsertNode(Result, IP);
12245 }
12246 return Result->getSDVTList();
12247}
12248
12249
12250/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12251/// specified operands. If the resultant node already exists in the DAG,
12252/// this does not modify the specified node, instead it returns the node that
12253/// already exists. If the resultant node does not exist in the DAG, the
12254/// input node is returned. As a degenerate case, if you specify the same
12255/// input operands as the node already has, the input node is returned.
12257 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12258
12259 // Check to see if there is no change.
12260 if (Op == N->getOperand(0)) return N;
12261
12262 // See if the modified node already exists.
12263 void *InsertPos = nullptr;
12264 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
12265 return Existing;
12266
12267 // Nope it doesn't. Remove the node from its current place in the maps.
12268 if (InsertPos)
12269 if (!RemoveNodeFromCSEMaps(N))
12270 InsertPos = nullptr;
12271
12272 // Now we update the operands.
12273 N->OperandList[0].set(Op);
12274
12276 // If this gets put into a CSE map, add it.
12277 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12278 return N;
12279}
12280
12282 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12283
12284 // Check to see if there is no change.
12285 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12286 return N; // No operands changed, just return the input node.
12287
12288 // See if the modified node already exists.
12289 void *InsertPos = nullptr;
12290 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
12291 return Existing;
12292
12293 // Nope it doesn't. Remove the node from its current place in the maps.
12294 if (InsertPos)
12295 if (!RemoveNodeFromCSEMaps(N))
12296 InsertPos = nullptr;
12297
12298 // Now we update the operands.
12299 if (N->OperandList[0] != Op1)
12300 N->OperandList[0].set(Op1);
12301 if (N->OperandList[1] != Op2)
12302 N->OperandList[1].set(Op2);
12303
12305 // If this gets put into a CSE map, add it.
12306 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12307 return N;
12308}
12309
12312 SDValue Ops[] = { Op1, Op2, Op3 };
12313 return UpdateNodeOperands(N, Ops);
12314}
12315
12318 SDValue Op3, SDValue Op4) {
12319 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12320 return UpdateNodeOperands(N, Ops);
12321}
12322
12325 SDValue Op3, SDValue Op4, SDValue Op5) {
12326 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12327 return UpdateNodeOperands(N, Ops);
12328}
12329
12332 unsigned NumOps = Ops.size();
12333 assert(N->getNumOperands() == NumOps &&
12334 "Update with wrong number of operands");
12335
12336 // If no operands changed just return the input node.
12337 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12338 return N;
12339
12340 // See if the modified node already exists.
12341 void *InsertPos = nullptr;
12342 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
12343 return Existing;
12344
12345 // Nope it doesn't. Remove the node from its current place in the maps.
12346 if (InsertPos)
12347 if (!RemoveNodeFromCSEMaps(N))
12348 InsertPos = nullptr;
12349
12350 // Now we update the operands.
12351 for (unsigned i = 0; i != NumOps; ++i)
12352 if (N->OperandList[i] != Ops[i])
12353 N->OperandList[i].set(Ops[i]);
12354
12356 // If this gets put into a CSE map, add it.
12357 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12358 return N;
12359}
12360
12361/// DropOperands - Release the operands and set this node to have
12362/// zero operands.
12364 // Unlike the code in MorphNodeTo that does this, we don't need to
12365 // watch for dead nodes here.
12366 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12367 SDUse &Use = *I++;
12368 Use.set(SDValue());
12369 }
12370}
12371
12373 ArrayRef<MachineMemOperand *> NewMemRefs) {
12374 if (NewMemRefs.empty()) {
12375 N->clearMemRefs();
12376 return;
12377 }
12378
12379 // Check if we can avoid allocating by storing a single reference directly.
12380 if (NewMemRefs.size() == 1) {
12381 N->MemRefs = NewMemRefs[0];
12382 N->NumMemRefs = 1;
12383 return;
12384 }
12385
12386 MachineMemOperand **MemRefsBuffer =
12387 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12388 llvm::copy(NewMemRefs, MemRefsBuffer);
12389 N->MemRefs = MemRefsBuffer;
12390 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12391}
12392
12393/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12394/// machine opcode.
12395///
12397 EVT VT) {
12398 SDVTList VTs = getVTList(VT);
12399 return SelectNodeTo(N, MachineOpc, VTs, {});
12400}
12401
12403 EVT VT, SDValue Op1) {
12404 SDVTList VTs = getVTList(VT);
12405 SDValue Ops[] = { Op1 };
12406 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12407}
12408
12410 EVT VT, SDValue Op1,
12411 SDValue Op2) {
12412 SDVTList VTs = getVTList(VT);
12413 SDValue Ops[] = { Op1, Op2 };
12414 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12415}
12416
12418 EVT VT, SDValue Op1,
12419 SDValue Op2, SDValue Op3) {
12420 SDVTList VTs = getVTList(VT);
12421 SDValue Ops[] = { Op1, Op2, Op3 };
12422 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12423}
12424
12427 SDVTList VTs = getVTList(VT);
12428 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12429}
12430
12432 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12433 SDVTList VTs = getVTList(VT1, VT2);
12434 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12435}
12436
12438 EVT VT1, EVT VT2) {
12439 SDVTList VTs = getVTList(VT1, VT2);
12440 return SelectNodeTo(N, MachineOpc, VTs, {});
12441}
12442
12444 EVT VT1, EVT VT2, EVT VT3,
12446 SDVTList VTs = getVTList(VT1, VT2, VT3);
12447 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12448}
12449
12451 EVT VT1, EVT VT2,
12452 SDValue Op1, SDValue Op2) {
12453 SDVTList VTs = getVTList(VT1, VT2);
12454 SDValue Ops[] = { Op1, Op2 };
12455 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12456}
12457
12460 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12461 // Reset the NodeID to -1.
12462 New->setNodeId(-1);
12463 if (New != N) {
12464 ReplaceAllUsesWith(N, New);
12466 }
12467 return New;
12468}
12469
12470/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12471/// the line number information on the merged node since it is not possible to
12472/// preserve the information that operation is associated with multiple lines.
12473/// This will make the debugger working better at -O0, were there is a higher
12474/// probability having other instructions associated with that line.
12475///
12476/// For IROrder, we keep the smaller of the two
12477SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12478 DebugLoc NLoc = N->getDebugLoc();
12479 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12480 N->setDebugLoc(DebugLoc());
12481 }
12482 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12483 N->setIROrder(Order);
12484 return N;
12485}
12486
12487/// MorphNodeTo - This *mutates* the specified node to have the specified
12488/// return type, opcode, and operands.
12489///
12490/// Note that MorphNodeTo returns the resultant node. If there is already a
12491/// node of the specified opcode and operands, it returns that node instead of
12492/// the current one. Note that the SDLoc need not be the same.
12493///
12494/// Using MorphNodeTo is faster than creating a new node and swapping it in
12495/// with ReplaceAllUsesWith both because it often avoids allocating a new
12496/// node, and because it doesn't require CSE recalculation for any of
12497/// the node's users.
12498///
12499/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12500/// As a consequence it isn't appropriate to use from within the DAG combiner or
12501/// the legalizer which maintain worklists that would need to be updated when
12502/// deleting things.
12505 // If an identical node already exists, use it.
12506 void *IP = nullptr;
12507 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12509 AddNodeIDNode(ID, Opc, VTs, Ops);
12510 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
12511 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12512 }
12513
12514 if (!RemoveNodeFromCSEMaps(N))
12515 IP = nullptr;
12516
12517 // Start the morphing.
12518 N->NodeType = Opc;
12519 N->ValueList = VTs.VTs;
12520 N->NumValues = VTs.NumVTs;
12521
12522 // Clear the operands list, updating used nodes to remove this from their
12523 // use list. Keep track of any operands that become dead as a result.
12524 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12525 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12526 SDUse &Use = *I++;
12527 SDNode *Used = Use.getNode();
12528 Use.set(SDValue());
12529 if (Used->use_empty())
12530 DeadNodeSet.insert(Used);
12531 }
12532
12533 // For MachineNode, initialize the memory references information.
12535 MN->clearMemRefs();
12536
12537 // Swap for an appropriately sized array from the recycler.
12538 removeOperands(N);
12539 createOperands(N, Ops);
12540
12541 // Delete any nodes that are still dead after adding the uses for the
12542 // new operands.
12543 if (!DeadNodeSet.empty()) {
12544 SmallVector<SDNode *, 16> DeadNodes;
12545 for (SDNode *N : DeadNodeSet)
12546 if (N->use_empty())
12547 DeadNodes.push_back(N);
12548 RemoveDeadNodes(DeadNodes);
12549 }
12550
12551 if (IP)
12552 CSEMap.InsertNode(N, IP); // Memoize the new node.
12553 return N;
12554}
12555
12557 unsigned OrigOpc = Node->getOpcode();
12558 unsigned NewOpc;
12559 switch (OrigOpc) {
12560 default:
12561 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12562#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12563 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12564#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12565 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12566#include "llvm/IR/ConstrainedOps.def"
12567 }
12568
12569 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12570
12571 // We're taking this node out of the chain, so we need to re-link things.
12572 SDValue InputChain = Node->getOperand(0);
12573 SDValue OutputChain = SDValue(Node, 1);
12574 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12575
12577 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12578 Ops.push_back(Node->getOperand(i));
12579
12580 SDVTList VTs = getVTList(Node->getValueType(0));
12581 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12582
12583 // MorphNodeTo can operate in two ways: if an existing node with the
12584 // specified operands exists, it can just return it. Otherwise, it
12585 // updates the node in place to have the requested operands.
12586 if (Res == Node) {
12587 // If we updated the node in place, reset the node ID. To the isel,
12588 // this should be just like a newly allocated machine node.
12589 Res->setNodeId(-1);
12590 } else {
12593 }
12594
12595 return Res;
12596}
12597
12598/// getMachineNode - These are used for target selectors to create a new node
12599/// with specified return type(s), MachineInstr opcode, and operands.
12600///
12601/// Note that getMachineNode returns the resultant node. If there is already a
12602/// node of the specified opcode and operands, it returns that node instead of
12603/// the current one.
12605 EVT VT) {
12606 SDVTList VTs = getVTList(VT);
12607 return getMachineNode(Opcode, dl, VTs, {});
12608}
12609
12611 EVT VT, SDValue Op1) {
12612 SDVTList VTs = getVTList(VT);
12613 SDValue Ops[] = { Op1 };
12614 return getMachineNode(Opcode, dl, VTs, Ops);
12615}
12616
12618 EVT VT, SDValue Op1, SDValue Op2) {
12619 SDVTList VTs = getVTList(VT);
12620 SDValue Ops[] = { Op1, Op2 };
12621 return getMachineNode(Opcode, dl, VTs, Ops);
12622}
12623
12625 EVT VT, SDValue Op1, SDValue Op2,
12626 SDValue Op3) {
12627 SDVTList VTs = getVTList(VT);
12628 SDValue Ops[] = { Op1, Op2, Op3 };
12629 return getMachineNode(Opcode, dl, VTs, Ops);
12630}
12631
12634 SDVTList VTs = getVTList(VT);
12635 return getMachineNode(Opcode, dl, VTs, Ops);
12636}
12637
12639 EVT VT1, EVT VT2, SDValue Op1,
12640 SDValue Op2) {
12641 SDVTList VTs = getVTList(VT1, VT2);
12642 SDValue Ops[] = { Op1, Op2 };
12643 return getMachineNode(Opcode, dl, VTs, Ops);
12644}
12645
12647 EVT VT1, EVT VT2, SDValue Op1,
12648 SDValue Op2, SDValue Op3) {
12649 SDVTList VTs = getVTList(VT1, VT2);
12650 SDValue Ops[] = { Op1, Op2, Op3 };
12651 return getMachineNode(Opcode, dl, VTs, Ops);
12652}
12653
12655 EVT VT1, EVT VT2,
12657 SDVTList VTs = getVTList(VT1, VT2);
12658 return getMachineNode(Opcode, dl, VTs, Ops);
12659}
12660
12662 EVT VT1, EVT VT2, EVT VT3,
12663 SDValue Op1, SDValue Op2) {
12664 SDVTList VTs = getVTList(VT1, VT2, VT3);
12665 SDValue Ops[] = { Op1, Op2 };
12666 return getMachineNode(Opcode, dl, VTs, Ops);
12667}
12668
12670 EVT VT1, EVT VT2, EVT VT3,
12671 SDValue Op1, SDValue Op2,
12672 SDValue Op3) {
12673 SDVTList VTs = getVTList(VT1, VT2, VT3);
12674 SDValue Ops[] = { Op1, Op2, Op3 };
12675 return getMachineNode(Opcode, dl, VTs, Ops);
12676}
12677
12679 EVT VT1, EVT VT2, EVT VT3,
12681 SDVTList VTs = getVTList(VT1, VT2, VT3);
12682 return getMachineNode(Opcode, dl, VTs, Ops);
12683}
12684
12686 ArrayRef<EVT> ResultTys,
12688 SDVTList VTs = getVTList(ResultTys);
12689 return getMachineNode(Opcode, dl, VTs, Ops);
12690}
12691
12693 SDVTList VTs,
12695 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12697 void *IP = nullptr;
12698
12699 if (DoCSE) {
12701 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12702 IP = nullptr;
12703 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12704 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12705 }
12706 }
12707
12708 // Allocate a new MachineSDNode.
12709 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12710 createOperands(N, Ops);
12711
12712 if (DoCSE)
12713 CSEMap.InsertNode(N, IP);
12714
12715 InsertNode(N);
12716 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12717 return N;
12718}
12719
12720/// getTargetExtractSubreg - A convenience function for creating
12721/// TargetOpcode::EXTRACT_SUBREG nodes.
12723 SDValue Operand) {
12724 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12725 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12726 VT, Operand, SRIdxVal);
12727 return SDValue(Subreg, 0);
12728}
12729
12730/// getTargetInsertSubreg - A convenience function for creating
12731/// TargetOpcode::INSERT_SUBREG nodes.
12733 SDValue Operand, SDValue Subreg) {
12734 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12735 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12736 VT, Operand, Subreg, SRIdxVal);
12737 return SDValue(Result, 0);
12738}
12739
12740/// getNodeIfExists - Get the specified node if it's already available, or
12741/// else return NULL.
12744 bool AllowCommute) {
12745 SDNodeFlags Flags;
12746 if (Inserter)
12747 Flags = Inserter->getFlags();
12748 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12749}
12750
12753 const SDNodeFlags Flags,
12754 bool AllowCommute) {
12755 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12756 return nullptr;
12757
12758 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12760 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12761 void *IP = nullptr;
12762 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12763 E->intersectFlagsWith(Flags);
12764 return E;
12765 }
12766 return nullptr;
12767 };
12768
12769 if (SDNode *Existing = Lookup(Ops))
12770 return Existing;
12771
12772 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12773 return Lookup({Ops[1], Ops[0]});
12774
12775 return nullptr;
12776}
12777
12778/// doesNodeExist - Check if a node exists without modifying its flags.
12779bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12781 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12783 AddNodeIDNode(ID, Opcode, VTList, Ops);
12784 void *IP = nullptr;
12785 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12786 return true;
12787 }
12788 return false;
12789}
12790
12791/// getDbgValue - Creates a SDDbgValue node.
12792///
12793/// SDNode
12795 SDNode *N, unsigned R, bool IsIndirect,
12796 const DebugLoc &DL, unsigned O) {
12797 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12798 "Expected inlined-at fields to agree");
12799 return new (DbgInfo->getAlloc())
12800 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12801 {}, IsIndirect, DL, O,
12802 /*IsVariadic=*/false);
12803}
12804
12805/// Constant
12807 DIExpression *Expr,
12808 const Value *C,
12809 const DebugLoc &DL, unsigned O) {
12810 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12811 "Expected inlined-at fields to agree");
12812 return new (DbgInfo->getAlloc())
12813 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12814 /*IsIndirect=*/false, DL, O,
12815 /*IsVariadic=*/false);
12816}
12817
12818/// FrameIndex
12820 DIExpression *Expr, unsigned FI,
12821 bool IsIndirect,
12822 const DebugLoc &DL,
12823 unsigned O) {
12824 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12825 "Expected inlined-at fields to agree");
12826 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12827}
12828
12829/// FrameIndex with dependencies
12831 DIExpression *Expr, unsigned FI,
12832 ArrayRef<SDNode *> Dependencies,
12833 bool IsIndirect,
12834 const DebugLoc &DL,
12835 unsigned O) {
12836 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12837 "Expected inlined-at fields to agree");
12838 return new (DbgInfo->getAlloc())
12839 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12840 Dependencies, IsIndirect, DL, O,
12841 /*IsVariadic=*/false);
12842}
12843
12844/// VReg
12846 Register VReg, bool IsIndirect,
12847 const DebugLoc &DL, unsigned O) {
12848 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12849 "Expected inlined-at fields to agree");
12850 return new (DbgInfo->getAlloc())
12851 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12852 {}, IsIndirect, DL, O,
12853 /*IsVariadic=*/false);
12854}
12855
12858 ArrayRef<SDNode *> Dependencies,
12859 bool IsIndirect, const DebugLoc &DL,
12860 unsigned O, bool IsVariadic) {
12861 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12862 "Expected inlined-at fields to agree");
12863 return new (DbgInfo->getAlloc())
12864 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12865 DL, O, IsVariadic);
12866}
12867
12869 unsigned OffsetInBits, unsigned SizeInBits,
12870 bool InvalidateDbg) {
12871 SDNode *FromNode = From.getNode();
12872 SDNode *ToNode = To.getNode();
12873 assert(FromNode && ToNode && "Can't modify dbg values");
12874
12875 // PR35338
12876 // TODO: assert(From != To && "Redundant dbg value transfer");
12877 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12878 if (From == To || FromNode == ToNode)
12879 return;
12880
12881 if (!FromNode->getHasDebugValue())
12882 return;
12883
12884 SDDbgOperand FromLocOp =
12885 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12887
12889 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12890 if (Dbg->isInvalidated())
12891 continue;
12892
12893 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12894
12895 // Create a new location ops vector that is equal to the old vector, but
12896 // with each instance of FromLocOp replaced with ToLocOp.
12897 bool Changed = false;
12898 auto NewLocOps = Dbg->copyLocationOps();
12899 std::replace_if(
12900 NewLocOps.begin(), NewLocOps.end(),
12901 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12902 bool Match = Op == FromLocOp;
12903 Changed |= Match;
12904 return Match;
12905 },
12906 ToLocOp);
12907 // Ignore this SDDbgValue if we didn't find a matching location.
12908 if (!Changed)
12909 continue;
12910
12911 DIVariable *Var = Dbg->getVariable();
12912 auto *Expr = Dbg->getExpression();
12913 // If a fragment is requested, update the expression.
12914 if (SizeInBits) {
12915 // When splitting a larger (e.g., sign-extended) value whose
12916 // lower bits are described with an SDDbgValue, do not attempt
12917 // to transfer the SDDbgValue to the upper bits.
12918 if (auto FI = Expr->getFragmentInfo())
12919 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12920 continue;
12921 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12922 SizeInBits);
12923 if (!Fragment)
12924 continue;
12925 Expr = *Fragment;
12926 }
12927
12928 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12929 // Clone the SDDbgValue and move it to To.
12930 SDDbgValue *Clone = getDbgValueList(
12931 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12932 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12933 Dbg->isVariadic());
12934 ClonedDVs.push_back(Clone);
12935
12936 if (InvalidateDbg) {
12937 // Invalidate value and indicate the SDDbgValue should not be emitted.
12938 Dbg->setIsInvalidated();
12939 Dbg->setIsEmitted();
12940 }
12941 }
12942
12943 for (SDDbgValue *Dbg : ClonedDVs) {
12944 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12945 "Transferred DbgValues should depend on the new SDNode");
12946 AddDbgValue(Dbg, false);
12947 }
12948}
12949
12951 if (!N.getHasDebugValue())
12952 return;
12953
12954 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12955 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12956 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12957 return SDDbgOperand::fromNode(Node, ResNo);
12958 };
12959
12961 for (auto *DV : GetDbgValues(&N)) {
12962 if (DV->isInvalidated())
12963 continue;
12964 switch (N.getOpcode()) {
12965 default:
12966 break;
12967 case ISD::ADD: {
12968 SDValue N0 = N.getOperand(0);
12969 SDValue N1 = N.getOperand(1);
12970 if (!isa<ConstantSDNode>(N0)) {
12971 bool RHSConstant = isa<ConstantSDNode>(N1);
12973 if (RHSConstant)
12974 Offset = N.getConstantOperandVal(1);
12975 // We are not allowed to turn indirect debug values variadic, so
12976 // don't salvage those.
12977 if (!RHSConstant && DV->isIndirect())
12978 continue;
12979
12980 // Rewrite an ADD constant node into a DIExpression. Since we are
12981 // performing arithmetic to compute the variable's *value* in the
12982 // DIExpression, we need to mark the expression with a
12983 // DW_OP_stack_value.
12984 auto *DIExpr = DV->getExpression();
12985 auto NewLocOps = DV->copyLocationOps();
12986 bool Changed = false;
12987 size_t OrigLocOpsSize = NewLocOps.size();
12988 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12989 // We're not given a ResNo to compare against because the whole
12990 // node is going away. We know that any ISD::ADD only has one
12991 // result, so we can assume any node match is using the result.
12992 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12993 NewLocOps[i].getSDNode() != &N)
12994 continue;
12995 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12996 if (RHSConstant) {
12999 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
13000 } else {
13001 // Convert to a variadic expression (if not already).
13002 // convertToVariadicExpression() returns a const pointer, so we use
13003 // a temporary const variable here.
13004 const auto *TmpDIExpr =
13008 ExprOps.push_back(NewLocOps.size());
13009 ExprOps.push_back(dwarf::DW_OP_plus);
13010 SDDbgOperand RHS =
13012 NewLocOps.push_back(RHS);
13013 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
13014 }
13015 Changed = true;
13016 }
13017 (void)Changed;
13018 assert(Changed && "Salvage target doesn't use N");
13019
13020 bool IsVariadic =
13021 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
13022
13023 auto AdditionalDependencies = DV->getAdditionalDependencies();
13024 SDDbgValue *Clone = getDbgValueList(
13025 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
13026 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
13027 ClonedDVs.push_back(Clone);
13028 DV->setIsInvalidated();
13029 DV->setIsEmitted();
13030 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
13031 N0.getNode()->dumprFull(this);
13032 dbgs() << " into " << *DIExpr << '\n');
13033 }
13034 break;
13035 }
13036 case ISD::TRUNCATE: {
13037 SDValue N0 = N.getOperand(0);
13038 TypeSize FromSize = N0.getValueSizeInBits();
13039 TypeSize ToSize = N.getValueSizeInBits(0);
13040
13041 DIExpression *DbgExpression = DV->getExpression();
13042 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
13043 auto NewLocOps = DV->copyLocationOps();
13044 bool Changed = false;
13045 for (size_t i = 0; i < NewLocOps.size(); ++i) {
13046 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
13047 NewLocOps[i].getSDNode() != &N)
13048 continue;
13049
13050 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13051 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
13052 Changed = true;
13053 }
13054 assert(Changed && "Salvage target doesn't use N");
13055 (void)Changed;
13056
13057 SDDbgValue *Clone =
13058 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13059 DV->getAdditionalDependencies(), DV->isIndirect(),
13060 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13061
13062 ClonedDVs.push_back(Clone);
13063 DV->setIsInvalidated();
13064 DV->setIsEmitted();
13065 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13066 dbgs() << " into " << *DbgExpression << '\n');
13067 break;
13068 }
13069 }
13070 }
13071
13072 for (SDDbgValue *Dbg : ClonedDVs) {
13073 assert((!Dbg->getSDNodes().empty() ||
13074 llvm::any_of(Dbg->getLocationOps(),
13075 [&](const SDDbgOperand &Op) {
13076 return Op.getKind() == SDDbgOperand::FRAMEIX;
13077 })) &&
13078 "Salvaged DbgValue should depend on a new SDNode");
13079 AddDbgValue(Dbg, false);
13080 }
13081}
13082
13083/// Creates a SDDbgLabel node.
13085 const DebugLoc &DL, unsigned O) {
13086 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13087 "Expected inlined-at fields to agree");
13088 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13089}
13090
13091namespace {
13092
13093/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13094/// pointed to by a use iterator is deleted, increment the use iterator
13095/// so that it doesn't dangle.
13096///
13097class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13100
13101 void NodeDeleted(SDNode *N, SDNode *E) override {
13102 // Increment the iterator as needed.
13103 while (UI != UE && N == UI->getUser())
13104 ++UI;
13105 }
13106
13107public:
13108 RAUWUpdateListener(SelectionDAG &d,
13111 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13112};
13113
13114} // end anonymous namespace
13115
13116/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13117/// This can cause recursive merging of nodes in the DAG.
13118///
13119/// This version assumes From has a single result value.
13120///
13122 SDNode *From = FromN.getNode();
13123 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13124 "Cannot replace with this method!");
13125 assert(From != To.getNode() && "Cannot replace uses of with self");
13126
13127 // Preserve Debug Values
13128 transferDbgValues(FromN, To);
13129 // Preserve extra info.
13130 copyExtraInfo(From, To.getNode());
13131
13132 // Iterate over all the existing uses of From. New uses will be added
13133 // to the beginning of the use list, which we avoid visiting.
13134 // This specifically avoids visiting uses of From that arise while the
13135 // replacement is happening, because any such uses would be the result
13136 // of CSE: If an existing node looks like From after one of its operands
13137 // is replaced by To, we don't want to replace of all its users with To
13138 // too. See PR3018 for more info.
13139 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13140 RAUWUpdateListener Listener(*this, UI, UE);
13141 while (UI != UE) {
13142 SDNode *User = UI->getUser();
13143
13144 // This node is about to morph, remove its old self from the CSE maps.
13145 RemoveNodeFromCSEMaps(User);
13146
13147 // A user can appear in a use list multiple times, and when this
13148 // happens the uses are usually next to each other in the list.
13149 // To help reduce the number of CSE recomputations, process all
13150 // the uses of this user that we can find this way.
13151 do {
13152 SDUse &Use = *UI;
13153 ++UI;
13154 Use.set(To);
13155 if (To->isDivergent() != From->isDivergent())
13157 } while (UI != UE && UI->getUser() == User);
13158 // Now that we have modified User, add it back to the CSE maps. If it
13159 // already exists there, recursively merge the results together.
13160 AddModifiedNodeToCSEMaps(User);
13161 }
13162
13163 // If we just RAUW'd the root, take note.
13164 if (FromN == getRoot())
13165 setRoot(To);
13166}
13167
13168/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13169/// This can cause recursive merging of nodes in the DAG.
13170///
13171/// This version assumes that for each value of From, there is a
13172/// corresponding value in To in the same position with the same type.
13173///
13175#ifndef NDEBUG
13176 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13177 assert((!From->hasAnyUseOfValue(i) ||
13178 From->getValueType(i) == To->getValueType(i)) &&
13179 "Cannot use this version of ReplaceAllUsesWith!");
13180#endif
13181
13182 // Handle the trivial case.
13183 if (From == To)
13184 return;
13185
13186 // Preserve Debug Info. Only do this if there's a use.
13187 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13188 if (From->hasAnyUseOfValue(i)) {
13189 assert((i < To->getNumValues()) && "Invalid To location");
13190 transferDbgValues(SDValue(From, i), SDValue(To, i));
13191 }
13192 // Preserve extra info.
13193 copyExtraInfo(From, To);
13194
13195 // Iterate over just the existing users of From. See the comments in
13196 // the ReplaceAllUsesWith above.
13197 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13198 RAUWUpdateListener Listener(*this, UI, UE);
13199 while (UI != UE) {
13200 SDNode *User = UI->getUser();
13201
13202 // This node is about to morph, remove its old self from the CSE maps.
13203 RemoveNodeFromCSEMaps(User);
13204
13205 // A user can appear in a use list multiple times, and when this
13206 // happens the uses are usually next to each other in the list.
13207 // To help reduce the number of CSE recomputations, process all
13208 // the uses of this user that we can find this way.
13209 do {
13210 SDUse &Use = *UI;
13211 ++UI;
13212 Use.setNode(To);
13213 if (To->isDivergent() != From->isDivergent())
13215 } while (UI != UE && UI->getUser() == User);
13216
13217 // Now that we have modified User, add it back to the CSE maps. If it
13218 // already exists there, recursively merge the results together.
13219 AddModifiedNodeToCSEMaps(User);
13220 }
13221
13222 // If we just RAUW'd the root, take note.
13223 if (From == getRoot().getNode())
13224 setRoot(SDValue(To, getRoot().getResNo()));
13225}
13226
13227/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13228/// This can cause recursive merging of nodes in the DAG.
13229///
13230/// This version can replace From with any result values. To must match the
13231/// number and types of values returned by From.
13233 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13234 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13235
13236 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13237 // Preserve Debug Info.
13238 transferDbgValues(SDValue(From, i), To[i]);
13239 // Preserve extra info.
13240 copyExtraInfo(From, To[i].getNode());
13241 }
13242
13243 // Iterate over just the existing users of From. See the comments in
13244 // the ReplaceAllUsesWith above.
13245 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13246 RAUWUpdateListener Listener(*this, UI, UE);
13247 while (UI != UE) {
13248 SDNode *User = UI->getUser();
13249
13250 // This node is about to morph, remove its old self from the CSE maps.
13251 RemoveNodeFromCSEMaps(User);
13252
13253 // A user can appear in a use list multiple times, and when this happens the
13254 // uses are usually next to each other in the list. To help reduce the
13255 // number of CSE and divergence recomputations, process all the uses of this
13256 // user that we can find this way.
13257 bool To_IsDivergent = false;
13258 do {
13259 SDUse &Use = *UI;
13260 const SDValue &ToOp = To[Use.getResNo()];
13261 ++UI;
13262 Use.set(ToOp);
13263 if (ToOp.getValueType() != MVT::Other)
13264 To_IsDivergent |= ToOp->isDivergent();
13265 } while (UI != UE && UI->getUser() == User);
13266
13267 if (To_IsDivergent != From->isDivergent())
13269
13270 // Now that we have modified User, add it back to the CSE maps. If it
13271 // already exists there, recursively merge the results together.
13272 AddModifiedNodeToCSEMaps(User);
13273 }
13274
13275 // If we just RAUW'd the root, take note.
13276 if (From == getRoot().getNode())
13277 setRoot(SDValue(To[getRoot().getResNo()]));
13278}
13279
13280/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13281/// uses of other values produced by From.getNode() alone. The Deleted
13282/// vector is handled the same way as for ReplaceAllUsesWith.
13284 // Handle the really simple, really trivial case efficiently.
13285 if (From == To) return;
13286
13287 // Handle the simple, trivial, case efficiently.
13288 if (From.getNode()->getNumValues() == 1) {
13289 ReplaceAllUsesWith(From, To);
13290 return;
13291 }
13292
13293 // Preserve Debug Info.
13294 transferDbgValues(From, To);
13295 copyExtraInfo(From.getNode(), To.getNode());
13296
13297 // Iterate over just the existing users of From. See the comments in
13298 // the ReplaceAllUsesWith above.
13299 SDNode::use_iterator UI = From.getNode()->use_begin(),
13300 UE = From.getNode()->use_end();
13301 RAUWUpdateListener Listener(*this, UI, UE);
13302 while (UI != UE) {
13303 SDNode *User = UI->getUser();
13304 bool UserRemovedFromCSEMaps = false;
13305
13306 // A user can appear in a use list multiple times, and when this
13307 // happens the uses are usually next to each other in the list.
13308 // To help reduce the number of CSE recomputations, process all
13309 // the uses of this user that we can find this way.
13310 do {
13311 SDUse &Use = *UI;
13312
13313 // Skip uses of different values from the same node.
13314 if (Use.getResNo() != From.getResNo()) {
13315 ++UI;
13316 continue;
13317 }
13318
13319 // If this node hasn't been modified yet, it's still in the CSE maps,
13320 // so remove its old self from the CSE maps.
13321 if (!UserRemovedFromCSEMaps) {
13322 RemoveNodeFromCSEMaps(User);
13323 UserRemovedFromCSEMaps = true;
13324 }
13325
13326 ++UI;
13327 Use.set(To);
13328 if (To->isDivergent() != From->isDivergent())
13330 } while (UI != UE && UI->getUser() == User);
13331 // We are iterating over all uses of the From node, so if a use
13332 // doesn't use the specific value, no changes are made.
13333 if (!UserRemovedFromCSEMaps)
13334 continue;
13335
13336 // Now that we have modified User, add it back to the CSE maps. If it
13337 // already exists there, recursively merge the results together.
13338 AddModifiedNodeToCSEMaps(User);
13339 }
13340
13341 // If we just RAUW'd the root, take note.
13342 if (From == getRoot())
13343 setRoot(To);
13344}
13345
13346namespace {
13347
13348/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13349/// to record information about a use.
13350struct UseMemo {
13351 SDNode *User;
13352 unsigned Index;
13353 SDUse *Use;
13354};
13355
13356/// operator< - Sort Memos by User.
13357bool operator<(const UseMemo &L, const UseMemo &R) {
13358 return (intptr_t)L.User < (intptr_t)R.User;
13359}
13360
13361/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13362/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13363/// the node already has been taken care of recursively.
13364class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13365 SmallVectorImpl<UseMemo> &Uses;
13366
13367 void NodeDeleted(SDNode *N, SDNode *E) override {
13368 for (UseMemo &Memo : Uses)
13369 if (Memo.User == N)
13370 Memo.User = nullptr;
13371 }
13372
13373public:
13374 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13375 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13376};
13377
13378} // end anonymous namespace
13379
13380/// Return true if a glue output should propagate divergence information.
13382 switch (Node->getOpcode()) {
13383 case ISD::CopyFromReg:
13384 case ISD::CopyToReg:
13385 return false;
13386 default:
13387 return true;
13388 }
13389
13390 llvm_unreachable("covered opcode switch");
13391}
13392
13394 if (TLI->isSDNodeAlwaysUniform(N)) {
13395 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13396 "Conflicting divergence information!");
13397 return false;
13398 }
13399 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13400 return true;
13401 for (const auto &Op : N->ops()) {
13402 EVT VT = Op.getValueType();
13403
13404 // Skip Chain. It does not carry divergence.
13405 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13406 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13407 return true;
13408 }
13409 return false;
13410}
13411
13413 SmallVector<SDNode *, 16> Worklist(1, N);
13414 do {
13415 N = Worklist.pop_back_val();
13416 bool IsDivergent = calculateDivergence(N);
13417 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13418 N->SDNodeBits.IsDivergent = IsDivergent;
13419 llvm::append_range(Worklist, N->users());
13420 }
13421 } while (!Worklist.empty());
13422}
13423
13424void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13426 Order.reserve(AllNodes.size());
13427 for (auto &N : allnodes()) {
13428 unsigned NOps = N.getNumOperands();
13429 Degree[&N] = NOps;
13430 if (0 == NOps)
13431 Order.push_back(&N);
13432 }
13433 for (size_t I = 0; I != Order.size(); ++I) {
13434 SDNode *N = Order[I];
13435 for (auto *U : N->users()) {
13436 unsigned &UnsortedOps = Degree[U];
13437 if (0 == --UnsortedOps)
13438 Order.push_back(U);
13439 }
13440 }
13441}
13442
13443#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13444void SelectionDAG::VerifyDAGDivergence() {
13445 std::vector<SDNode *> TopoOrder;
13446 CreateTopologicalOrder(TopoOrder);
13447 for (auto *N : TopoOrder) {
13448 assert(calculateDivergence(N) == N->isDivergent() &&
13449 "Divergence bit inconsistency detected");
13450 }
13451}
13452#endif
13453
13454/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13455/// uses of other values produced by From.getNode() alone. The same value
13456/// may appear in both the From and To list. The Deleted vector is
13457/// handled the same way as for ReplaceAllUsesWith.
13459 const SDValue *To,
13460 unsigned Num){
13461 // Handle the simple, trivial case efficiently.
13462 if (Num == 1)
13463 return ReplaceAllUsesOfValueWith(*From, *To);
13464
13465 transferDbgValues(*From, *To);
13466 copyExtraInfo(From->getNode(), To->getNode());
13467
13468 // Read up all the uses and make records of them. This helps
13469 // processing new uses that are introduced during the
13470 // replacement process.
13472 for (unsigned i = 0; i != Num; ++i) {
13473 unsigned FromResNo = From[i].getResNo();
13474 SDNode *FromNode = From[i].getNode();
13475 for (SDUse &Use : FromNode->uses()) {
13476 if (Use.getResNo() == FromResNo) {
13477 UseMemo Memo = {Use.getUser(), i, &Use};
13478 Uses.push_back(Memo);
13479 }
13480 }
13481 }
13482
13483 // Sort the uses, so that all the uses from a given User are together.
13485 RAUOVWUpdateListener Listener(*this, Uses);
13486
13487 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13488 UseIndex != UseIndexEnd; ) {
13489 // We know that this user uses some value of From. If it is the right
13490 // value, update it.
13491 SDNode *User = Uses[UseIndex].User;
13492 // If the node has been deleted by recursive CSE updates when updating
13493 // another node, then just skip this entry.
13494 if (User == nullptr) {
13495 ++UseIndex;
13496 continue;
13497 }
13498
13499 // This node is about to morph, remove its old self from the CSE maps.
13500 RemoveNodeFromCSEMaps(User);
13501
13502 // The Uses array is sorted, so all the uses for a given User
13503 // are next to each other in the list.
13504 // To help reduce the number of CSE recomputations, process all
13505 // the uses of this user that we can find this way.
13506 do {
13507 unsigned i = Uses[UseIndex].Index;
13508 SDUse &Use = *Uses[UseIndex].Use;
13509 ++UseIndex;
13510
13511 Use.set(To[i]);
13512 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13513
13514 // Now that we have modified User, add it back to the CSE maps. If it
13515 // already exists there, recursively merge the results together.
13516 AddModifiedNodeToCSEMaps(User);
13517 }
13518}
13519
13520/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13521/// based on their topological order. It returns the maximum id and a vector
13522/// of the SDNodes* in assigned order by reference.
13524 unsigned DAGSize = 0;
13525
13526 // SortedPos tracks the progress of the algorithm. Nodes before it are
13527 // sorted, nodes after it are unsorted. When the algorithm completes
13528 // it is at the end of the list.
13529 allnodes_iterator SortedPos = allnodes_begin();
13530
13531 // Visit all the nodes. Move nodes with no operands to the front of
13532 // the list immediately. Annotate nodes that do have operands with their
13533 // operand count. Before we do this, the Node Id fields of the nodes
13534 // may contain arbitrary values. After, the Node Id fields for nodes
13535 // before SortedPos will contain the topological sort index, and the
13536 // Node Id fields for nodes At SortedPos and after will contain the
13537 // count of outstanding operands.
13539 checkForCycles(&N, this);
13540 unsigned Degree = N.getNumOperands();
13541 if (Degree == 0) {
13542 // A node with no uses, add it to the result array immediately.
13543 N.setNodeId(DAGSize++);
13544 allnodes_iterator Q(&N);
13545 if (Q != SortedPos)
13546 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13547 assert(SortedPos != AllNodes.end() && "Overran node list");
13548 ++SortedPos;
13549 } else {
13550 // Temporarily use the Node Id as scratch space for the degree count.
13551 N.setNodeId(Degree);
13552 }
13553 }
13554
13555 // Visit all the nodes. As we iterate, move nodes into sorted order,
13556 // such that by the time the end is reached all nodes will be sorted.
13557 for (SDNode &Node : allnodes()) {
13558 SDNode *N = &Node;
13559 checkForCycles(N, this);
13560 // N is in sorted position, so all its uses have one less operand
13561 // that needs to be sorted.
13562 for (SDNode *P : N->users()) {
13563 unsigned Degree = P->getNodeId();
13564 assert(Degree != 0 && "Invalid node degree");
13565 --Degree;
13566 if (Degree == 0) {
13567 // All of P's operands are sorted, so P may sorted now.
13568 P->setNodeId(DAGSize++);
13569 if (P->getIterator() != SortedPos)
13570 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13571 assert(SortedPos != AllNodes.end() && "Overran node list");
13572 ++SortedPos;
13573 } else {
13574 // Update P's outstanding operand count.
13575 P->setNodeId(Degree);
13576 }
13577 }
13578 if (Node.getIterator() == SortedPos) {
13579#ifndef NDEBUG
13581 SDNode *S = &*++I;
13582 dbgs() << "Overran sorted position:\n";
13583 S->dumprFull(this); dbgs() << "\n";
13584 dbgs() << "Checking if this is due to cycles\n";
13585 checkForCycles(this, true);
13586#endif
13587 llvm_unreachable(nullptr);
13588 }
13589 }
13590
13591 assert(SortedPos == AllNodes.end() &&
13592 "Topological sort incomplete!");
13593 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13594 "First node in topological sort is not the entry token!");
13595 assert(AllNodes.front().getNodeId() == 0 &&
13596 "First node in topological sort has non-zero id!");
13597 assert(AllNodes.front().getNumOperands() == 0 &&
13598 "First node in topological sort has operands!");
13599 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13600 "Last node in topologic sort has unexpected id!");
13601 assert(AllNodes.back().use_empty() &&
13602 "Last node in topologic sort has users!");
13603 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13604 return DAGSize;
13605}
13606
13608 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13609 SortedNodes.clear();
13610 // Node -> remaining number of outstanding operands.
13611 DenseMap<const SDNode *, unsigned> RemainingOperands;
13612
13613 // Put nodes without any operands into SortedNodes first.
13614 for (const SDNode &N : allnodes()) {
13615 checkForCycles(&N, this);
13616 unsigned NumOperands = N.getNumOperands();
13617 if (NumOperands == 0)
13618 SortedNodes.push_back(&N);
13619 else
13620 // Record their total number of outstanding operands.
13621 RemainingOperands[&N] = NumOperands;
13622 }
13623
13624 // A node is pushed into SortedNodes when all of its operands (predecessors in
13625 // the graph) are also in SortedNodes.
13626 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13627 const SDNode *N = SortedNodes[i];
13628 for (const SDNode *U : N->users()) {
13629 // HandleSDNode is never part of a DAG and therefore has no entry in
13630 // RemainingOperands.
13631 if (U->getOpcode() == ISD::HANDLENODE)
13632 continue;
13633 unsigned &NumRemOperands = RemainingOperands[U];
13634 assert(NumRemOperands && "Invalid number of remaining operands");
13635 --NumRemOperands;
13636 if (!NumRemOperands)
13637 SortedNodes.push_back(U);
13638 }
13639 }
13640
13641 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13642 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13643 "First node in topological sort is not the entry token");
13644 assert(SortedNodes.front()->getNumOperands() == 0 &&
13645 "First node in topological sort has operands");
13646}
13647
13648/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13649/// value is produced by SD.
13650void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13651 for (SDNode *SD : DB->getSDNodes()) {
13652 if (!SD)
13653 continue;
13654 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13655 SD->setHasDebugValue(true);
13656 }
13657 DbgInfo->add(DB, isParameter);
13658}
13659
13660void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13661
13663 SDValue NewMemOpChain) {
13664 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13665 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13666 // The new memory operation must have the same position as the old load in
13667 // terms of memory dependency. Create a TokenFactor for the old load and new
13668 // memory operation and update uses of the old load's output chain to use that
13669 // TokenFactor.
13670 if (OldChain == NewMemOpChain || OldChain.use_empty())
13671 return NewMemOpChain;
13672
13673 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13674 OldChain, NewMemOpChain);
13675 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13676 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13677 return TokenFactor;
13678}
13679
13681 SDValue NewMemOp) {
13682 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13683 SDValue OldChain = SDValue(OldLoad, 1);
13684 SDValue NewMemOpChain = NewMemOp.getValue(1);
13685 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13686}
13687
13689 Function **OutFunction) {
13690 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13691
13692 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13693 auto *Module = MF->getFunction().getParent();
13694 auto *Function = Module->getFunction(Symbol);
13695
13696 if (OutFunction != nullptr)
13697 *OutFunction = Function;
13698
13699 if (Function != nullptr) {
13700 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13701 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13702 }
13703
13704 std::string ErrorStr;
13705 raw_string_ostream ErrorFormatter(ErrorStr);
13706 ErrorFormatter << "Undefined external symbol ";
13707 ErrorFormatter << '"' << Symbol << '"';
13708 report_fatal_error(Twine(ErrorStr));
13709}
13710
13711//===----------------------------------------------------------------------===//
13712// SDNode Class
13713//===----------------------------------------------------------------------===//
13714
13717 return Const != nullptr && Const->isZero();
13718}
13719
13721 return V.isUndef() || isNullConstant(V);
13722}
13723
13726 return Const != nullptr && Const->isZero() && !Const->isNegative();
13727}
13728
13731 return Const != nullptr && Const->isAllOnes();
13732}
13733
13736 return Const != nullptr && Const->isOne();
13737}
13738
13741 return Const != nullptr && Const->isMinSignedValue();
13742}
13743
13745 SDValue V, unsigned OperandNo,
13746 unsigned Depth) const {
13747 APInt DemandedElts = getDemandAllEltsMask(V);
13748 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13749}
13750
13752 SDValue V, const APInt &DemandedElts,
13753 unsigned OperandNo, unsigned Depth) const {
13754 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13755 // TODO: Target-specific opcodes could be added.
13756 if (V.getValueType().isInteger()) {
13757 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13758 if (Known.isConstant()) {
13759 const APInt &Const = Known.getConstant();
13760 switch (Opcode) {
13761 case ISD::ADD:
13762 case ISD::OR:
13763 case ISD::XOR:
13764 case ISD::UMAX:
13765 return Const.isZero();
13766 case ISD::MUL:
13767 return Const.isOne();
13768 case ISD::AND:
13769 case ISD::UMIN:
13770 return Const.isAllOnes();
13771 case ISD::SMAX:
13772 return Const.isMinSignedValue();
13773 case ISD::SMIN:
13774 return Const.isMaxSignedValue();
13775 case ISD::SUB:
13776 case ISD::SHL:
13777 case ISD::SRA:
13778 case ISD::SRL:
13779 return OperandNo == 1 && Const.isZero();
13780 case ISD::UDIV:
13781 case ISD::SDIV:
13782 return OperandNo == 1 && Const.isOne();
13783 }
13784 }
13785 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13786 switch (Opcode) {
13787 case ISD::FADD:
13788 return ConstFP->isZero() &&
13789 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13790 case ISD::FSUB:
13791 return OperandNo == 1 && ConstFP->isZero() &&
13792 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13793 case ISD::FMUL:
13794 return ConstFP->isOne();
13795 case ISD::FDIV:
13796 return OperandNo == 1 && ConstFP->isOne();
13797 case ISD::FMINNUM:
13798 case ISD::FMAXNUM: {
13799 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13800 EVT VT = V.getValueType();
13801 const fltSemantics &Semantics = VT.getFltSemantics();
13802 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13803 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13804 : APFloat::getLargest(Semantics);
13805 if (Opcode == ISD::FMAXNUM)
13806 NeutralAF.changeSign();
13807
13808 return ConstFP->isExactlyValue(NeutralAF);
13809 }
13810 }
13811 }
13812 return false;
13813}
13814
13816 while (V.getOpcode() == ISD::BITCAST)
13817 V = V.getOperand(0);
13818 return V;
13819}
13820
13822 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13823 V = V.getOperand(0);
13824 return V;
13825}
13826
13828 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13829 V = V.getOperand(0);
13830 return V;
13831}
13832
13834 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13835 SDValue InVec = V.getOperand(0);
13836 SDValue EltNo = V.getOperand(2);
13837 EVT VT = InVec.getValueType();
13838 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13839 if (IndexC && VT.isFixedLengthVector() &&
13840 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13841 !DemandedElts[IndexC->getZExtValue()]) {
13842 V = InVec;
13843 continue;
13844 }
13845 break;
13846 }
13847 return V;
13848}
13849
13851 while (V.getOpcode() == ISD::TRUNCATE)
13852 V = V.getOperand(0);
13853 return V;
13854}
13855
13856bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13857 if (V.getOpcode() != ISD::XOR)
13858 return false;
13859 V = peekThroughBitcasts(V.getOperand(1));
13860 unsigned NumBits = V.getScalarValueSizeInBits();
13861 ConstantSDNode *C =
13862 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13863 return C && (C->getAPIntValue().countr_one() >= NumBits);
13864}
13865
13867 bool AllowTruncation) {
13868 APInt DemandedElts = getDemandAllEltsMask(N);
13869 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13870}
13871
13873 bool AllowUndefs,
13874 bool AllowTruncation) {
13876 return CN;
13877
13878 // SplatVectors can truncate their operands. Ignore that case here unless
13879 // AllowTruncation is set.
13880 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13881 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13882 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13883 EVT CVT = CN->getValueType(0);
13884 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13885 if (AllowTruncation || CVT == VecEltVT)
13886 return CN;
13887 }
13888 }
13889
13891 BitVector UndefElements;
13892 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13893
13894 // BuildVectors can truncate their operands. Ignore that case here unless
13895 // AllowTruncation is set.
13896 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13897 if (CN && (UndefElements.none() || AllowUndefs)) {
13898 EVT CVT = CN->getValueType(0);
13899 EVT NSVT = N.getValueType().getScalarType();
13900 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13901 if (AllowTruncation || (CVT == NSVT))
13902 return CN;
13903 }
13904 }
13905
13906 return nullptr;
13907}
13908
13910 APInt DemandedElts = getDemandAllEltsMask(N);
13911 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13912}
13913
13915 const APInt &DemandedElts,
13916 bool AllowUndefs) {
13918 return CN;
13919
13921 BitVector UndefElements;
13922 ConstantFPSDNode *CN =
13923 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13924 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13925 if (CN && (UndefElements.none() || AllowUndefs))
13926 return CN;
13927 }
13928
13929 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13930 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13931 return CN;
13932
13933 return nullptr;
13934}
13935
13936bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13937 // TODO: may want to use peekThroughBitcast() here.
13938 ConstantSDNode *C =
13939 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13940 return C && C->isZero();
13941}
13942
13943bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13944 ConstantSDNode *C =
13945 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13946 return C && C->isOne();
13947}
13948
13949bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13950 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13951 return C && C->isOne();
13952}
13953
13954bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13956 unsigned BitWidth = N.getScalarValueSizeInBits();
13957 ConstantSDNode *C =
13958 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13959 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13960}
13961
13962bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13963 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13964 return C && APInt::isSameValue(C->getAPIntValue(),
13965 APInt(C->getAPIntValue().getBitWidth(), 1));
13966}
13967
13968bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13970 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13971 return C && C->isZero();
13972}
13973
13974bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13975 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13976 return C && C->isZero();
13977}
13978
13982
13984 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13986 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13987 bool IsVolatile = false;
13988 bool IsNonTemporal = false;
13989 bool IsDereferenceable = true;
13990 bool IsInvariant = true;
13991 for (const MachineMemOperand *MMO : memoperands()) {
13992 IsVolatile |= MMO->isVolatile();
13993 IsNonTemporal |= MMO->isNonTemporal();
13994 IsDereferenceable &= MMO->isDereferenceable();
13995 IsInvariant &= MMO->isInvariant();
13996 }
13997 MemSDNodeBits.IsVolatile = IsVolatile;
13998 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13999 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
14000 MemSDNodeBits.IsInvariant = IsInvariant;
14001
14002 // For the single-MMO case, we check here that the size of the memory operand
14003 // fits within the size of the MMO. This is because the MMO might indicate
14004 // only a possible address range instead of specifying the affected memory
14005 // addresses precisely.
14008 getMemOperand()->getSize().getValue())) &&
14009 "Size mismatch!");
14010}
14011
14012/// Profile - Gather unique data for the node.
14013///
14015 AddNodeIDNode(ID, this);
14016}
14017
14018namespace {
14019
14020 struct EVTArray {
14021 std::vector<EVT> VTs;
14022
14023 EVTArray() {
14024 VTs.reserve(MVT::VALUETYPE_SIZE);
14025 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
14026 VTs.push_back(MVT((MVT::SimpleValueType)i));
14027 }
14028 };
14029
14030} // end anonymous namespace
14031
14032/// getValueTypeList - Return a pointer to the specified value type.
14033///
14034const EVT *SDNode::getValueTypeList(MVT VT) {
14035 static EVTArray SimpleVTArray;
14036
14037 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
14038 return &SimpleVTArray.VTs[VT.SimpleTy];
14039}
14040
14041/// hasAnyUseOfValue - Return true if there are any use of the indicated
14042/// value. This method ignores uses of other values defined by this operation.
14043bool SDNode::hasAnyUseOfValue(unsigned Value) const {
14044 assert(Value < getNumValues() && "Bad value!");
14045
14046 for (SDUse &U : uses())
14047 if (U.getResNo() == Value)
14048 return true;
14049
14050 return false;
14051}
14052
14053/// isOnlyUserOf - Return true if this node is the only use of N.
14054bool SDNode::isOnlyUserOf(const SDNode *N) const {
14055 bool Seen = false;
14056 for (const SDNode *User : N->users()) {
14057 if (User == this)
14058 Seen = true;
14059 else
14060 return false;
14061 }
14062
14063 return Seen;
14064}
14065
14066/// Return true if the only users of N are contained in Nodes.
14068 bool Seen = false;
14069 for (const SDNode *User : N->users()) {
14070 if (llvm::is_contained(Nodes, User))
14071 Seen = true;
14072 else
14073 return false;
14074 }
14075
14076 return Seen;
14077}
14078
14079/// Return true if the referenced return value is an operand of N.
14080bool SDValue::isOperandOf(const SDNode *N) const {
14081 return is_contained(N->op_values(), *this);
14082}
14083
14084bool SDNode::isOperandOf(const SDNode *N) const {
14085 return any_of(N->op_values(),
14086 [this](SDValue Op) { return this == Op.getNode(); });
14087}
14088
14089/// reachesChainWithoutSideEffects - Return true if this operand (which must
14090/// be a chain) reaches the specified operand without crossing any
14091/// side-effecting instructions on any chain path. In practice, this looks
14092/// through token factors and non-volatile loads. In order to remain efficient,
14093/// this only looks a couple of nodes in, it does not do an exhaustive search.
14094///
14095/// Note that we only need to examine chains when we're searching for
14096/// side-effects; SelectionDAG requires that all side-effects are represented
14097/// by chains, even if another operand would force a specific ordering. This
14098/// constraint is necessary to allow transformations like splitting loads.
14100 unsigned Depth) const {
14101 if (*this == Dest) return true;
14102
14103 // Don't search too deeply, we just want to be able to see through
14104 // TokenFactor's etc.
14105 if (Depth == 0) return false;
14106
14107 // If this is a token factor, all inputs to the TF happen in parallel.
14108 if (getOpcode() == ISD::TokenFactor) {
14109 // First, try a shallow search.
14110 if (is_contained((*this)->ops(), Dest)) {
14111 // We found the chain we want as an operand of this TokenFactor.
14112 // Essentially, we reach the chain without side-effects if we could
14113 // serialize the TokenFactor into a simple chain of operations with
14114 // Dest as the last operation. This is automatically true if the
14115 // chain has one use: there are no other ordering constraints.
14116 // If the chain has more than one use, we give up: some other
14117 // use of Dest might force a side-effect between Dest and the current
14118 // node.
14119 if (Dest.hasOneUse())
14120 return true;
14121 }
14122 // Next, try a deep search: check whether every operand of the TokenFactor
14123 // reaches Dest.
14124 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14125 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14126 });
14127 }
14128
14129 // Loads don't have side effects, look through them.
14130 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14131 if (Ld->isUnordered())
14132 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14133 }
14134 return false;
14135}
14136
14137bool SDNode::hasPredecessor(const SDNode *N) const {
14140 Worklist.push_back(this);
14141 return hasPredecessorHelper(N, Visited, Worklist);
14142}
14143
14145 this->Flags &= Flags;
14146}
14147
14148SDValue
14150 ArrayRef<ISD::NodeType> CandidateBinOps,
14151 bool AllowPartials) {
14152 // The pattern must end in an extract from index 0.
14153 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14154 !isNullConstant(Extract->getOperand(1)))
14155 return SDValue();
14156
14157 // Match against one of the candidate binary ops.
14158 SDValue Op = Extract->getOperand(0);
14159 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14160 return Op.getOpcode() == unsigned(BinOp);
14161 }))
14162 return SDValue();
14163
14164 // Floating-point reductions may require relaxed constraints on the final step
14165 // of the reduction because they may reorder intermediate operations.
14166 unsigned CandidateBinOp = Op.getOpcode();
14167 if (Op.getValueType().isFloatingPoint()) {
14168 SDNodeFlags Flags = Op->getFlags();
14169 switch (CandidateBinOp) {
14170 case ISD::FADD:
14171 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14172 return SDValue();
14173 break;
14174 default:
14175 llvm_unreachable("Unhandled FP opcode for binop reduction");
14176 }
14177 }
14178
14179 // Matching failed - attempt to see if we did enough stages that a partial
14180 // reduction from a subvector is possible.
14181 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14182 if (!AllowPartials || !Op)
14183 return SDValue();
14184 EVT OpVT = Op.getValueType();
14185 EVT OpSVT = OpVT.getScalarType();
14186 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14187 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
14188 return SDValue();
14189 BinOp = (ISD::NodeType)CandidateBinOp;
14190 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14191 };
14192
14193 // At each stage, we're looking for something that looks like:
14194 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14195 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14196 // i32 undef, i32 undef, i32 undef, i32 undef>
14197 // %a = binop <8 x i32> %op, %s
14198 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14199 // we expect something like:
14200 // <4,5,6,7,u,u,u,u>
14201 // <2,3,u,u,u,u,u,u>
14202 // <1,u,u,u,u,u,u,u>
14203 // While a partial reduction match would be:
14204 // <2,3,u,u,u,u,u,u>
14205 // <1,u,u,u,u,u,u,u>
14206 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14207 SDValue PrevOp;
14208 for (unsigned i = 0; i < Stages; ++i) {
14209 unsigned MaskEnd = (1 << i);
14210
14211 if (Op.getOpcode() != CandidateBinOp)
14212 return PartialReduction(PrevOp, MaskEnd);
14213
14214 SDValue Op0 = Op.getOperand(0);
14215 SDValue Op1 = Op.getOperand(1);
14216
14218 if (Shuffle) {
14219 Op = Op1;
14220 } else {
14221 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14222 Op = Op0;
14223 }
14224
14225 // The first operand of the shuffle should be the same as the other operand
14226 // of the binop.
14227 if (!Shuffle || Shuffle->getOperand(0) != Op)
14228 return PartialReduction(PrevOp, MaskEnd);
14229
14230 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14231 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14232 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14233 return PartialReduction(PrevOp, MaskEnd);
14234
14235 PrevOp = Op;
14236 }
14237
14238 // Handle subvector reductions, which tend to appear after the shuffle
14239 // reduction stages.
14240 while (Op.getOpcode() == CandidateBinOp) {
14241 unsigned NumElts = Op.getValueType().getVectorNumElements();
14242 SDValue Op0 = Op.getOperand(0);
14243 SDValue Op1 = Op.getOperand(1);
14244 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14246 Op0.getOperand(0) != Op1.getOperand(0))
14247 break;
14248 SDValue Src = Op0.getOperand(0);
14249 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14250 if (NumSrcElts != (2 * NumElts))
14251 break;
14252 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14253 Op1.getConstantOperandAPInt(1) == NumElts) &&
14254 !(Op1.getConstantOperandAPInt(1) == 0 &&
14255 Op0.getConstantOperandAPInt(1) == NumElts))
14256 break;
14257 Op = Src;
14258 }
14259
14260 BinOp = (ISD::NodeType)CandidateBinOp;
14261 return Op;
14262}
14263
14265 EVT VT = N->getValueType(0);
14266 EVT EltVT = VT.getVectorElementType();
14267 unsigned NE = VT.getVectorNumElements();
14268
14269 SDLoc dl(N);
14270
14271 // If ResNE is 0, fully unroll the vector op.
14272 if (ResNE == 0)
14273 ResNE = NE;
14274 else if (NE > ResNE)
14275 NE = ResNE;
14276
14277 if (N->getNumValues() == 2) {
14278 SmallVector<SDValue, 8> Scalars0, Scalars1;
14279 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14280 EVT VT1 = N->getValueType(1);
14281 EVT EltVT1 = VT1.getVectorElementType();
14282
14283 unsigned i;
14284 for (i = 0; i != NE; ++i) {
14285 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14286 SDValue Operand = N->getOperand(j);
14287 EVT OperandVT = Operand.getValueType();
14288
14289 // A vector operand; extract a single element.
14290 EVT OperandEltVT = OperandVT.getVectorElementType();
14291 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14292 }
14293
14294 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14295 Scalars0.push_back(EltOp);
14296 Scalars1.push_back(EltOp.getValue(1));
14297 }
14298
14299 for (; i < ResNE; ++i) {
14300 Scalars0.push_back(getUNDEF(EltVT));
14301 Scalars1.push_back(getUNDEF(EltVT1));
14302 }
14303
14304 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14305 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
14306 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
14307 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
14308 return getMergeValues({Vec0, Vec1}, dl);
14309 }
14310
14311 assert(N->getNumValues() == 1 &&
14312 "Can't unroll a vector with multiple results!");
14313
14315 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14316
14317 unsigned i;
14318 for (i= 0; i != NE; ++i) {
14319 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14320 SDValue Operand = N->getOperand(j);
14321 EVT OperandVT = Operand.getValueType();
14322 if (OperandVT.isVector()) {
14323 // A vector operand; extract a single element.
14324 EVT OperandEltVT = OperandVT.getVectorElementType();
14325 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14326 } else {
14327 // A scalar operand; just use it as is.
14328 Operands[j] = Operand;
14329 }
14330 }
14331
14332 switch (N->getOpcode()) {
14333 default: {
14334 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14335 N->getFlags()));
14336 break;
14337 }
14338 case ISD::VSELECT:
14339 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
14340 break;
14341 case ISD::SHL:
14342 case ISD::SRA:
14343 case ISD::SRL:
14344 case ISD::ROTL:
14345 case ISD::ROTR:
14346 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14347 getShiftAmountOperand(Operands[0].getValueType(),
14348 Operands[1])));
14349 break;
14351 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14352 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14353 Operands[0],
14354 getValueType(ExtVT)));
14355 break;
14356 }
14357 case ISD::ADDRSPACECAST: {
14358 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14359 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
14360 ASC->getSrcAddressSpace(),
14361 ASC->getDestAddressSpace()));
14362 break;
14363 }
14364 }
14365 }
14366
14367 for (; i < ResNE; ++i)
14368 Scalars.push_back(getUNDEF(EltVT));
14369
14370 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14371 return getBuildVector(VecVT, dl, Scalars);
14372}
14373
14374std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14375 SDNode *N, unsigned ResNE) {
14376 unsigned Opcode = N->getOpcode();
14377 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14378 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14379 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14380 "Expected an overflow opcode");
14381
14382 EVT ResVT = N->getValueType(0);
14383 EVT OvVT = N->getValueType(1);
14384 EVT ResEltVT = ResVT.getVectorElementType();
14385 EVT OvEltVT = OvVT.getVectorElementType();
14386 SDLoc dl(N);
14387
14388 // If ResNE is 0, fully unroll the vector op.
14389 unsigned NE = ResVT.getVectorNumElements();
14390 if (ResNE == 0)
14391 ResNE = NE;
14392 else if (NE > ResNE)
14393 NE = ResNE;
14394
14395 SmallVector<SDValue, 8> LHSScalars;
14396 SmallVector<SDValue, 8> RHSScalars;
14397 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14398 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14399
14400 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14401 SDVTList VTs = getVTList(ResEltVT, SVT);
14402 SmallVector<SDValue, 8> ResScalars;
14403 SmallVector<SDValue, 8> OvScalars;
14404 for (unsigned i = 0; i < NE; ++i) {
14405 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14406 SDValue Ov =
14407 getSelect(dl, OvEltVT, Res.getValue(1),
14408 getBoolConstant(true, dl, OvEltVT, ResVT),
14409 getConstant(0, dl, OvEltVT));
14410
14411 ResScalars.push_back(Res);
14412 OvScalars.push_back(Ov);
14413 }
14414
14415 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14416 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14417
14418 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14419 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14420 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14421 getBuildVector(NewOvVT, dl, OvScalars));
14422}
14423
14426 unsigned Bytes,
14427 int Dist) const {
14428 if (LD->isVolatile() || Base->isVolatile())
14429 return false;
14430 // TODO: probably too restrictive for atomics, revisit
14431 if (!LD->isSimple())
14432 return false;
14433 if (LD->isIndexed() || Base->isIndexed())
14434 return false;
14435 if (LD->getChain() != Base->getChain())
14436 return false;
14437 EVT VT = LD->getMemoryVT();
14438 if (VT.getSizeInBits() / 8 != Bytes)
14439 return false;
14440
14441 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
14442 auto LocDecomp = BaseIndexOffset::match(LD, *this);
14443
14444 int64_t Offset = 0;
14445 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
14446 return (Dist * (int64_t)Bytes == Offset);
14447 return false;
14448}
14449
14450/// InferPtrAlignment - Infer alignment of a load / store address. Return
14451/// std::nullopt if it cannot be inferred.
14453 // If this is a GlobalAddress + cst, return the alignment.
14454 const GlobalValue *GV = nullptr;
14455 int64_t GVOffset = 0;
14456 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14457 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14458 KnownBits Known(PtrWidth);
14460 unsigned AlignBits = Known.countMinTrailingZeros();
14461 if (AlignBits)
14462 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14463 }
14464
14465 // If this is a direct reference to a stack slot, use information about the
14466 // stack slot's alignment.
14467 int FrameIdx = INT_MIN;
14468 int64_t FrameOffset = 0;
14470 FrameIdx = FI->getIndex();
14471 } else if (isBaseWithConstantOffset(Ptr) &&
14473 // Handle FI+Cst
14474 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14475 FrameOffset = Ptr.getConstantOperandVal(1);
14476 }
14477
14478 if (FrameIdx != INT_MIN) {
14480 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14481 }
14482
14483 return std::nullopt;
14484}
14485
14486/// Split the scalar node with EXTRACT_ELEMENT using the provided
14487/// VTs and return the low/high part.
14488std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14489 const SDLoc &DL,
14490 const EVT &LoVT,
14491 const EVT &HiVT) {
14492 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14493 "Split node must be a scalar type");
14494 SDValue Lo =
14496 SDValue Hi =
14498 return std::make_pair(Lo, Hi);
14499}
14500
14501/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14502/// which is split (or expanded) into two not necessarily identical pieces.
14503std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14504 // Currently all types are split in half.
14505 EVT LoVT, HiVT;
14506 if (!VT.isVector())
14507 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14508 else
14509 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14510
14511 return std::make_pair(LoVT, HiVT);
14512}
14513
14514/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14515/// type, dependent on an enveloping VT that has been split into two identical
14516/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14517std::pair<EVT, EVT>
14519 bool *HiIsEmpty) const {
14520 EVT EltTp = VT.getVectorElementType();
14521 // Examples:
14522 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14523 // custom VL=9 with enveloping VL=8/8 yields 8/1
14524 // custom VL=10 with enveloping VL=8/8 yields 8/2
14525 // etc.
14526 ElementCount VTNumElts = VT.getVectorElementCount();
14527 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14528 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14529 "Mixing fixed width and scalable vectors when enveloping a type");
14530 EVT LoVT, HiVT;
14531 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14532 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14533 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14534 *HiIsEmpty = false;
14535 } else {
14536 // Flag that hi type has zero storage size, but return split envelop type
14537 // (this would be easier if vector types with zero elements were allowed).
14538 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14539 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14540 *HiIsEmpty = true;
14541 }
14542 return std::make_pair(LoVT, HiVT);
14543}
14544
14545/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14546/// low/high part.
14547std::pair<SDValue, SDValue>
14548SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14549 const EVT &HiVT) {
14550 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14551 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14552 "Splitting vector with an invalid mixture of fixed and scalable "
14553 "vector types");
14555 N.getValueType().getVectorMinNumElements() &&
14556 "More vector elements requested than available!");
14557 SDValue Lo, Hi;
14558 Lo = getExtractSubvector(DL, LoVT, N, 0);
14559 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14560 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14561 // IDX with the runtime scaling factor of the result vector type. For
14562 // fixed-width result vectors, that runtime scaling factor is 1.
14564 return std::make_pair(Lo, Hi);
14565}
14566
14567std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14568 const SDLoc &DL) {
14569 // Split the vector length parameter.
14570 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14571 EVT VT = N.getValueType();
14573 "Expecting the mask to be an evenly-sized vector");
14574 SDValue HalfNumElts = getElementCount(
14576 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14577 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14578 return std::make_pair(Lo, Hi);
14579}
14580
14581/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14583 EVT VT = N.getValueType();
14586 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14587}
14588
14591 unsigned Start, unsigned Count,
14592 EVT EltVT) {
14593 EVT VT = Op.getValueType();
14594 if (Count == 0)
14596 if (EltVT == EVT())
14597 EltVT = VT.getVectorElementType();
14598 SDLoc SL(Op);
14599 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14600 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14601 }
14602}
14603
14604// getAddressSpace - Return the address space this GlobalAddress belongs to.
14606 return getGlobal()->getType()->getAddressSpace();
14607}
14608
14611 return Val.MachineCPVal->getType();
14612 return Val.ConstVal->getType();
14613}
14614
14615bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14616 unsigned &SplatBitSize,
14617 bool &HasAnyUndefs,
14618 unsigned MinSplatBits,
14619 bool IsBigEndian) const {
14620 EVT VT = getValueType(0);
14621 assert(VT.isVector() && "Expected a vector type");
14622 unsigned VecWidth = VT.getSizeInBits();
14623 if (MinSplatBits > VecWidth)
14624 return false;
14625
14626 // FIXME: The widths are based on this node's type, but build vectors can
14627 // truncate their operands.
14628 SplatValue = APInt(VecWidth, 0);
14629 SplatUndef = APInt(VecWidth, 0);
14630
14631 // Get the bits. Bits with undefined values (when the corresponding element
14632 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14633 // in SplatValue. If any of the values are not constant, give up and return
14634 // false.
14635 unsigned int NumOps = getNumOperands();
14636 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14637 unsigned EltWidth = VT.getScalarSizeInBits();
14638
14639 for (unsigned j = 0; j < NumOps; ++j) {
14640 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14641 SDValue OpVal = getOperand(i);
14642 unsigned BitPos = j * EltWidth;
14643
14644 if (OpVal.isUndef())
14645 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14646 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14647 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14648 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14649 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14650 else
14651 return false;
14652 }
14653
14654 // The build_vector is all constants or undefs. Find the smallest element
14655 // size that splats the vector.
14656 HasAnyUndefs = (SplatUndef != 0);
14657
14658 // FIXME: This does not work for vectors with elements less than 8 bits.
14659 while (VecWidth > 8) {
14660 // If we can't split in half, stop here.
14661 if (VecWidth & 1)
14662 break;
14663
14664 unsigned HalfSize = VecWidth / 2;
14665 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14666 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14667 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14668 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14669
14670 // If the two halves do not match (ignoring undef bits), stop here.
14671 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14672 MinSplatBits > HalfSize)
14673 break;
14674
14675 SplatValue = HighValue | LowValue;
14676 SplatUndef = HighUndef & LowUndef;
14677
14678 VecWidth = HalfSize;
14679 }
14680
14681 // FIXME: The loop above only tries to split in halves. But if the input
14682 // vector for example is <3 x i16> it wouldn't be able to detect a
14683 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14684 // optimizations. I guess that back in the days when this helper was created
14685 // vectors normally was power-of-2 sized.
14686
14687 SplatBitSize = VecWidth;
14688 return true;
14689}
14690
14692 BitVector *UndefElements) const {
14693 unsigned NumOps = getNumOperands();
14694 if (UndefElements) {
14695 UndefElements->clear();
14696 UndefElements->resize(NumOps);
14697 }
14698 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14699 if (!DemandedElts)
14700 return SDValue();
14701 SDValue Splatted;
14702 for (unsigned i = 0; i != NumOps; ++i) {
14703 if (!DemandedElts[i])
14704 continue;
14705 SDValue Op = getOperand(i);
14706 if (Op.isUndef()) {
14707 if (UndefElements)
14708 (*UndefElements)[i] = true;
14709 } else if (!Splatted) {
14710 Splatted = Op;
14711 } else if (Splatted != Op) {
14712 return SDValue();
14713 }
14714 }
14715
14716 if (!Splatted) {
14717 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14718 assert(getOperand(FirstDemandedIdx).isUndef() &&
14719 "Can only have a splat without a constant for all undefs.");
14720 return getOperand(FirstDemandedIdx);
14721 }
14722
14723 return Splatted;
14724}
14725
14727 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14728 return getSplatValue(DemandedElts, UndefElements);
14729}
14730
14732 SmallVectorImpl<SDValue> &Sequence,
14733 BitVector *UndefElements) const {
14734 unsigned NumOps = getNumOperands();
14735 Sequence.clear();
14736 if (UndefElements) {
14737 UndefElements->clear();
14738 UndefElements->resize(NumOps);
14739 }
14740 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14741 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14742 return false;
14743
14744 // Set the undefs even if we don't find a sequence (like getSplatValue).
14745 if (UndefElements)
14746 for (unsigned I = 0; I != NumOps; ++I)
14747 if (DemandedElts[I] && getOperand(I).isUndef())
14748 (*UndefElements)[I] = true;
14749
14750 // Iteratively widen the sequence length looking for repetitions.
14751 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14752 Sequence.append(SeqLen, SDValue());
14753 for (unsigned I = 0; I != NumOps; ++I) {
14754 if (!DemandedElts[I])
14755 continue;
14756 SDValue &SeqOp = Sequence[I % SeqLen];
14758 if (Op.isUndef()) {
14759 if (!SeqOp)
14760 SeqOp = Op;
14761 continue;
14762 }
14763 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14764 Sequence.clear();
14765 break;
14766 }
14767 SeqOp = Op;
14768 }
14769 if (!Sequence.empty())
14770 return true;
14771 }
14772
14773 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14774 return false;
14775}
14776
14778 BitVector *UndefElements) const {
14779 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14780 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14781}
14782
14785 BitVector *UndefElements) const {
14787 getSplatValue(DemandedElts, UndefElements));
14788}
14789
14792 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14793}
14794
14797 BitVector *UndefElements) const {
14799 getSplatValue(DemandedElts, UndefElements));
14800}
14801
14806
14807int32_t
14809 uint32_t BitWidth) const {
14810 if (ConstantFPSDNode *CN =
14812 bool IsExact;
14813 APSInt IntVal(BitWidth);
14814 const APFloat &APF = CN->getValueAPF();
14815 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14816 APFloat::opOK ||
14817 !IsExact)
14818 return -1;
14819
14820 return IntVal.exactLogBase2();
14821 }
14822 return -1;
14823}
14824
14826 bool IsLittleEndian, unsigned DstEltSizeInBits,
14827 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14828 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14829 if (!isConstant())
14830 return false;
14831
14832 unsigned NumSrcOps = getNumOperands();
14833 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14834 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14835 "Invalid bitcast scale");
14836
14837 // Extract raw src bits.
14838 SmallVector<APInt> SrcBitElements(NumSrcOps,
14839 APInt::getZero(SrcEltSizeInBits));
14840 BitVector SrcUndeElements(NumSrcOps, false);
14841
14842 for (unsigned I = 0; I != NumSrcOps; ++I) {
14844 if (Op.isUndef()) {
14845 SrcUndeElements.set(I);
14846 continue;
14847 }
14848 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14849 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14850 assert((CInt || CFP) && "Unknown constant");
14851 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14852 : CFP->getValueAPF().bitcastToAPInt();
14853 }
14854
14855 // Recast to dst width.
14856 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14857 SrcBitElements, UndefElements, SrcUndeElements);
14858 return true;
14859}
14860
14861void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14862 unsigned DstEltSizeInBits,
14863 SmallVectorImpl<APInt> &DstBitElements,
14864 ArrayRef<APInt> SrcBitElements,
14865 BitVector &DstUndefElements,
14866 const BitVector &SrcUndefElements) {
14867 unsigned NumSrcOps = SrcBitElements.size();
14868 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14869 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14870 "Invalid bitcast scale");
14871 assert(NumSrcOps == SrcUndefElements.size() &&
14872 "Vector size mismatch");
14873
14874 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14875 DstUndefElements.clear();
14876 DstUndefElements.resize(NumDstOps, false);
14877 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14878
14879 // Concatenate src elements constant bits together into dst element.
14880 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14881 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14882 for (unsigned I = 0; I != NumDstOps; ++I) {
14883 DstUndefElements.set(I);
14884 APInt &DstBits = DstBitElements[I];
14885 for (unsigned J = 0; J != Scale; ++J) {
14886 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14887 if (SrcUndefElements[Idx])
14888 continue;
14889 DstUndefElements.reset(I);
14890 const APInt &SrcBits = SrcBitElements[Idx];
14891 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14892 "Illegal constant bitwidths");
14893 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14894 }
14895 }
14896 return;
14897 }
14898
14899 // Split src element constant bits into dst elements.
14900 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14901 for (unsigned I = 0; I != NumSrcOps; ++I) {
14902 if (SrcUndefElements[I]) {
14903 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14904 continue;
14905 }
14906 const APInt &SrcBits = SrcBitElements[I];
14907 for (unsigned J = 0; J != Scale; ++J) {
14908 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14909 APInt &DstBits = DstBitElements[Idx];
14910 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14911 }
14912 }
14913}
14914
14916 for (const SDValue &Op : op_values()) {
14917 unsigned Opc = Op.getOpcode();
14918 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14919 return false;
14920 }
14921 return true;
14922}
14923
14924std::optional<std::pair<APInt, APInt>>
14926 unsigned NumOps = getNumOperands();
14927 if (NumOps < 2)
14928 return std::nullopt;
14929
14930 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14931 APInt Start, Stride;
14932 int FirstIdx = -1, SecondIdx = -1;
14933
14934 // Find the first two non-undef constant elements to determine Start and
14935 // Stride, then verify all remaining elements match the sequence.
14936 for (unsigned I = 0; I < NumOps; ++I) {
14938 if (Op->isUndef())
14939 continue;
14940 if (!isa<ConstantSDNode>(Op))
14941 return std::nullopt;
14942
14943 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14944 if (FirstIdx < 0) {
14945 FirstIdx = I;
14946 Start = Val;
14947 } else if (SecondIdx < 0) {
14948 SecondIdx = I;
14949 // Compute stride using modular arithmetic. Simple division would handle
14950 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14951 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14952 // Note that modular arithmetic is agnostic to signed/unsigned.
14953 unsigned IdxDiff = I - FirstIdx;
14954 APInt ValDiff = Val - Start;
14955
14956 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14957 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14958 if (ValDiff.countr_zero() < CommonPow2Bits)
14959 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14960 IdxDiff >>= CommonPow2Bits;
14961 ValDiff.lshrInPlace(CommonPow2Bits);
14962
14963 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14964 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14965 // one, but we could try all candidates to handle more cases.
14966 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14967 if (Stride.isZero())
14968 return std::nullopt;
14969
14970 // Step 3: Adjust Start based on the first defined element's index.
14971 Start -= Stride * FirstIdx;
14972 } else {
14973 // Verify this element matches the sequence.
14974 if (Val != Start + Stride * I)
14975 return std::nullopt;
14976 }
14977 }
14978
14979 // Need at least two defined elements.
14980 if (SecondIdx < 0)
14981 return std::nullopt;
14982
14983 return std::make_pair(Start, Stride);
14984}
14985
14987 // Find the first non-undef value in the shuffle mask.
14988 unsigned i, e;
14989 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14990 /* search */;
14991
14992 // If all elements are undefined, this shuffle can be considered a splat
14993 // (although it should eventually get simplified away completely).
14994 if (i == e)
14995 return true;
14996
14997 // Make sure all remaining elements are either undef or the same as the first
14998 // non-undef value.
14999 for (int Idx = Mask[i]; i != e; ++i)
15000 if (Mask[i] >= 0 && Mask[i] != Idx)
15001 return false;
15002 return true;
15003}
15004
15005// Returns true if it is a constant integer BuildVector or constant integer,
15006// possibly hidden by a bitcast.
15008 SDValue N, bool AllowOpaques) const {
15010
15011 if (auto *C = dyn_cast<ConstantSDNode>(N))
15012 return AllowOpaques || !C->isOpaque();
15013
15015 return true;
15016
15017 // Treat a GlobalAddress supporting constant offset folding as a
15018 // constant integer.
15019 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
15020 if (GA->getOpcode() == ISD::GlobalAddress &&
15021 TLI->isOffsetFoldingLegal(GA))
15022 return true;
15023
15024 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15025 isa<ConstantSDNode>(N.getOperand(0)))
15026 return true;
15027 return false;
15028}
15029
15030// Returns true if it is a constant float BuildVector or constant float.
15033 return true;
15034
15036 return true;
15037
15038 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15039 isa<ConstantFPSDNode>(N.getOperand(0)))
15040 return true;
15041
15042 return false;
15043}
15044
15045std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
15046 ConstantSDNode *Const =
15047 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
15048 if (!Const)
15049 return std::nullopt;
15050
15051 EVT VT = N->getValueType(0);
15052 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
15053 switch (TLI->getBooleanContents(N.getValueType())) {
15055 if (CVal.isOne())
15056 return true;
15057 if (CVal.isZero())
15058 return false;
15059 return std::nullopt;
15061 if (CVal.isAllOnes())
15062 return true;
15063 if (CVal.isZero())
15064 return false;
15065 return std::nullopt;
15067 return CVal[0];
15068 }
15069 llvm_unreachable("Unknown BooleanContent enum");
15070}
15071
15072void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15073 assert(!Node->OperandList && "Node already has operands");
15075 "too many operands to fit into SDNode");
15076 SDUse *Ops = OperandRecycler.allocate(
15077 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15078
15079 bool IsDivergent = false;
15080 for (unsigned I = 0; I != Vals.size(); ++I) {
15081 Ops[I].setUser(Node);
15082 Ops[I].setInitial(Vals[I]);
15083 EVT VT = Ops[I].getValueType();
15084
15085 // Skip Chain. It does not carry divergence.
15086 if (VT != MVT::Other &&
15087 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15088 Ops[I].getNode()->isDivergent()) {
15089 IsDivergent = true;
15090 }
15091 }
15092 Node->NumOperands = Vals.size();
15093 Node->OperandList = Ops;
15094 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15095 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15096 Node->SDNodeBits.IsDivergent = IsDivergent;
15097 }
15098 checkForCycles(Node);
15099}
15100
15103 size_t Limit = SDNode::getMaxNumOperands();
15104 while (Vals.size() > Limit) {
15105 unsigned SliceIdx = Vals.size() - Limit;
15106 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15107 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15108 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15109 Vals.emplace_back(NewTF);
15110 }
15111 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15112}
15113
15115 EVT VT, SDNodeFlags Flags) {
15116 switch (Opcode) {
15117 default:
15118 return SDValue();
15119 case ISD::ADD:
15120 case ISD::OR:
15121 case ISD::XOR:
15122 case ISD::UMAX:
15123 case ISD::MUL:
15124 case ISD::AND:
15125 case ISD::UMIN:
15126 case ISD::SMAX:
15127 case ISD::SMIN:
15129 VT);
15130 case ISD::FADD:
15131 // If flags allow, prefer positive zero since it's generally cheaper
15132 // to materialize on most targets.
15133 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15134 case ISD::FMUL:
15135 return getConstantFP(1.0, DL, VT);
15136 case ISD::FMINNUM:
15137 case ISD::FMAXNUM: {
15138 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
15139 const fltSemantics &Semantics = VT.getFltSemantics();
15140 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15141 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15142 APFloat::getLargest(Semantics);
15143 if (Opcode == ISD::FMAXNUM)
15144 NeutralAF.changeSign();
15145
15146 return getConstantFP(NeutralAF, DL, VT);
15147 }
15148 case ISD::FMINIMUM:
15149 case ISD::FMAXIMUM: {
15150 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15151 const fltSemantics &Semantics = VT.getFltSemantics();
15152 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15153 : APFloat::getLargest(Semantics);
15154 if (Opcode == ISD::FMAXIMUM)
15155 NeutralAF.changeSign();
15156
15157 return getConstantFP(NeutralAF, DL, VT);
15158 }
15159
15160 }
15161}
15162
15164 SDValue Acc, SDValue LHS,
15165 SDValue RHS) {
15166 EVT AccVT = Acc.getValueType();
15167 if (AccVT.isFloatingPoint()) {
15168 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15169 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15170 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15171 }
15173 "Unexpected opcode");
15174 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15175 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15176 return getNegative(MLA, DL, AccVT);
15177}
15178
15179/// Helper used to make a call to a library function that has one argument of
15180/// pointer type.
15181///
15182/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15183/// used to get or set floating-point state. They have one argument of pointer
15184/// type, which points to the memory region containing bits of the
15185/// floating-point state. The value returned by such function is ignored in the
15186/// created call.
15187///
15188/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15189/// \param Ptr Pointer used to save/load state.
15190/// \param InChain Ingoing token chain.
15191/// \returns Outgoing chain token.
15193 SDValue InChain,
15194 const SDLoc &DLoc) {
15195 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15197 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15198 RTLIB::LibcallImpl LibcallImpl =
15199 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15200 if (LibcallImpl == RTLIB::Unsupported)
15201 reportFatalUsageError("emitting call to unsupported libcall");
15202
15203 SDValue Callee =
15204 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15206 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15207 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15208 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15209 return TLI->LowerCallTo(CLI).second;
15210}
15211
15213 assert(From && To && "Invalid SDNode; empty source SDValue?");
15214 auto I = SDEI.find(From);
15215 if (I == SDEI.end())
15216 return;
15217
15218 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15219 // the iterator, hence the need to make a copy to prevent a use-after-free.
15220 NodeExtraInfo NEI = I->second;
15221 if (LLVM_LIKELY(!NEI.PCSections)) {
15222 // No deep copy required for the types of extra info set.
15223 //
15224 // FIXME: Investigate if other types of extra info also need deep copy. This
15225 // depends on the types of nodes they can be attached to: if some extra info
15226 // is only ever attached to nodes where a replacement To node is always the
15227 // node where later use and propagation of the extra info has the intended
15228 // semantics, no deep copy is required.
15229 SDEI[To] = std::move(NEI);
15230 return;
15231 }
15232
15233 const SDNode *EntrySDN = getEntryNode().getNode();
15234
15235 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15236 // through the replacement of From with To. Otherwise, replacements of a node
15237 // (From) with more complex nodes (To and its operands) may result in lost
15238 // extra info where the root node (To) is insignificant in further propagating
15239 // and using extra info when further lowering to MIR.
15240 //
15241 // In the first step pre-populate the visited set with the nodes reachable
15242 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15243 // DAG that is not new and should be left untouched.
15244 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15245 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15246 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15247 if (MaxDepth == 0) {
15248 // Remember this node in case we need to increase MaxDepth and continue
15249 // populating FromReach from this node.
15250 Leafs.emplace_back(N);
15251 return;
15252 }
15253 if (!FromReach.insert(N).second)
15254 return;
15255 for (const SDValue &Op : N->op_values())
15256 Self(Self, Op.getNode(), MaxDepth - 1);
15257 };
15258
15259 // Copy extra info to To and all its transitive operands (that are new).
15261 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15262 if (FromReach.contains(N))
15263 return true;
15264 if (!Visited.insert(N).second)
15265 return true;
15266 if (EntrySDN == N)
15267 return false;
15268 for (const SDValue &Op : N->op_values()) {
15269 if (N == To && Op.getNode() == EntrySDN) {
15270 // Special case: New node's operand is the entry node; just need to
15271 // copy extra info to new node.
15272 break;
15273 }
15274 if (!Self(Self, Op.getNode()))
15275 return false;
15276 }
15277 // Copy only if entry node was not reached.
15278 SDEI[N] = std::move(NEI);
15279 return true;
15280 };
15281
15282 // We first try with a lower MaxDepth, assuming that the path to common
15283 // operands between From and To is relatively short. This significantly
15284 // improves performance in the common case. The initial MaxDepth is big
15285 // enough to avoid retry in the common case; the last MaxDepth is large
15286 // enough to avoid having to use the fallback below (and protects from
15287 // potential stack exhaustion from recursion).
15288 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15289 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15290 // StartFrom is the previous (or initial) set of leafs reachable at the
15291 // previous maximum depth.
15293 std::swap(StartFrom, Leafs);
15294 for (const SDNode *N : StartFrom)
15295 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15296 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15297 return;
15298 // This should happen very rarely (reached the entry node).
15299 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15300 assert(!Leafs.empty());
15301 }
15302
15303 // This should not happen - but if it did, that means the subgraph reachable
15304 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15305 // could not visit all reachable common operands. Consequently, we were able
15306 // to reach the entry node.
15307 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15308 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15309 // Best-effort fallback if assertions disabled.
15310 SDEI[To] = std::move(NEI);
15311}
15312
15313#ifndef NDEBUG
15314static void checkForCyclesHelper(const SDNode *N,
15317 const llvm::SelectionDAG *DAG) {
15318 // If this node has already been checked, don't check it again.
15319 if (Checked.count(N))
15320 return;
15321
15322 // If a node has already been visited on this depth-first walk, reject it as
15323 // a cycle.
15324 if (!Visited.insert(N).second) {
15325 errs() << "Detected cycle in SelectionDAG\n";
15326 dbgs() << "Offending node:\n";
15327 N->dumprFull(DAG); dbgs() << "\n";
15328 abort();
15329 }
15330
15331 for (const SDValue &Op : N->op_values())
15332 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15333
15334 Checked.insert(N);
15335 Visited.erase(N);
15336}
15337#endif
15338
15340 const llvm::SelectionDAG *DAG,
15341 bool force) {
15342#ifndef NDEBUG
15343 bool check = force;
15344#ifdef EXPENSIVE_CHECKS
15345 check = true;
15346#endif // EXPENSIVE_CHECKS
15347 if (check) {
15348 assert(N && "Checking nonexistent SDNode");
15351 checkForCyclesHelper(N, visited, checked, DAG);
15352 }
15353#endif // !NDEBUG
15354}
15355
15356void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15357 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15358}
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
constexpr LLT S1
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition Compiler.h:603
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:337
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static MaybeAlign getAlign(Value *Ptr)
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static constexpr Value * getValue(Ty &ValueOrUse)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
static bool isConstantSplatVector(SDValue N, APInt &SplatValue, unsigned MinSizeInBits)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
const char * Msg
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF, SelectionDAG &DAG)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth)
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:297
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:335
static constexpr roundingMode rmTowardZero
Definition APFloat.h:349
static const fltSemantics & BFloat()
Definition APFloat.h:296
static const fltSemantics & IEEEquad()
Definition APFloat.h:299
static const fltSemantics & IEEEdouble()
Definition APFloat.h:298
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:348
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:345
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:347
static const fltSemantics & IEEEhalf()
Definition APFloat.h:295
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:361
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1206
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1294
void copySign(const APFloat &RHS)
Definition APFloat.h:1388
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5920
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1276
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1267
bool isFinite() const
Definition APFloat.h:1570
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1433
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1285
bool isZero() const
Definition APFloat.h:1561
LLVM_READONLY bool isOne() const
Definition APFloat.h:1643
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1224
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1418
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1184
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1312
bool isPosZero() const
Definition APFloat.h:1576
bool isNegZero() const
Definition APFloat.h:1577
void changeSign()
Definition APFloat.h:1383
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1195
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2006
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2090
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1431
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1695
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1076
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1537
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1355
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2061
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1191
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1692
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1120
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1670
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1197
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:790
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1175
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1653
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1623
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:652
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2121
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2135
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1084
static bool isSameValue(const APInt &I1, const APInt &I2, bool SignedCompare=false)
Determine if two APInts have the same value, after zero-extending or sign-extending (if SignedCompare...
Definition APInt.h:555
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition APInt.cpp:1184
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:398
unsigned logBase2() const
Definition APInt.h:1786
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2071
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1300
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1771
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1159
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1028
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1392
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:768
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1266
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1442
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:483
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1246
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1230
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2080
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
This is an SDNode representing atomic operations.
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Reset all bits in the bitvector.
Definition BitVector.h:409
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
bool none() const
Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1088
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static LLVM_ABI void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:126
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
const char * getSymbol() const
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:208
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:688
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:328
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
LLVM_ABI void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
LLVM_ABI bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
LLVM_ABI void Profile(FoldingSetNodeID &ID) const
Gather unique data for the node.
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
LLVM_ABI void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
static LLVM_ABI bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
std::optional< APInt > bitcastToAPInt() const
LLVM_ABI bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
LLVM_ABI bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool isUndef() const
Returns true if the node type is UNDEF or POISON.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
LLVM_ABI void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
Represents a use of a SDNode.
SDNode * getUser()
This returns the SDNode that contains this Use.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI std::pair< SDValue, SDValue > getMemccpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI)
Lower a memccpy operation into a target library call and return the resulting chain and call result a...
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI std::optional< bool > isBoolConstant(SDValue N) const
Check if a value \op N is a constant using the target's BooleanContent for its type.
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, MachineModuleInfo &MMI, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue getIdentityElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) identity element for the given opcode, if it exists.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
LLVM_ABI std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
allnodes_const_iterator allnodes_begin() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getPartialReduceMLS(unsigned Opc, const SDLoc &DL, SDValue Acc, SDValue LHS, SDValue RHS)
Get an expression that implements a partial multiply-subtract reduction.
LLVM_ABI SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
LLVM_ABI SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(SDValue Op, bool ForSigned, unsigned Depth=0) const
Combine constant ranges from computeConstantRange() and computeKnownBits().
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getLoadFFVP(EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachineMemOperand *MMO)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
LLVM_ABI std::pair< SDValue, SDValue > getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, const CallInst *CI)
Lower a memcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getIndexedLoadVP(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
LLVM_ABI MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
LLVM_ABI void dump() const
Dump the textual format of this DAG.
LLVM_ABI bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
LLVM_ABI SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
LLVM_ABI SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, Register VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
LLVM_ABI KnownFPClass computeKnownFPClass(SDValue Op, FPClassTest InterestedClasses, unsigned Depth=0) const
Determine floating-point class information about Op.
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask, SDValue EVL, EVT VT)
Create a vector-predicated logical NOT operation as (VP_XOR Val, BooleanOne, Mask,...
LLVM_ABI SDValue getMaskFromElementCount(const SDLoc &DL, EVT VT, ElementCount Len)
Return a vector with the first 'Len' lanes set to true and remaining lanes set to false.
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
iterator_range< allnodes_iterator > allnodes()
LLVM_ABI SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
LLVM_ABI OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getErrorMergeValues(ArrayRef< EVT > ResultTypes, SDValue Chain, const SDLoc &dl)
Return poison values for each of ResultTypes, substituting Chain for any result of type MVT::Other,...
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getTruncStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT SVT, MachineMemOperand *MMO, bool IsCompressing=false)
LLVM_ABI void canonicalizeCommutativeBinop(unsigned Opcode, SDValue &N1, SDValue &N2) const
Swap N1 and N2 if Opcode is a commutative binary opcode and the canonical form expects the opposite o...
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
LLVM_ABI bool isKnownToBeAPowerOfTwoFP(SDValue Val, unsigned Depth=0) const
Test if the given fp value is known to be an integer power-of-2, either positive or negative.
LLVM_ABI OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y, SDNodeFlags Flags)
Try to simplify a floating-point binary operation into 1 of its operands or a constant.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue getDeactivationSymbol(const GlobalValue *GV)
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
LLVM_ABI bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
LLVM_ABI std::pair< EVT, EVT > GetDependentSplitDestVTs(const EVT &VT, const EVT &EnvVT, bool *HiIsEmpty) const
Compute the VTs needed for the low/hi parts of a type, dependent on an enveloping VT that has been sp...
LLVM_ABI SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
LLVM_ABI std::optional< ConstantRange > getValidShiftAmountRange(SDValue V, const APInt &DemandedElts, unsigned Depth) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
LLVM_ABI SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
LLVM_ABI SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
DenormalMode getDenormalMode(EVT VT) const
Return the current function's default denormal handling kind for the given floating point type.
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp, ArrayRef< ISD::NodeType > CandidateBinOps, bool AllowPartials=false)
Match a binop + shuffle pyramid that represents a horizontal reduction over the elements of a vector ...
LLVM_ABI bool isADDLike(SDValue Op, bool NoWrap=false) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
LLVM_ABI SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
LLVM_ABI void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits=0, unsigned SizeInBits=0, bool InvalidateDbg=true)
Transfer debug values from one node to another, while optionally generating fragment expressions for ...
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
ilist< SDNode >::iterator allnodes_iterator
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
int getMaskElt(unsigned Idx) const
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
static LLVM_ABI bool isSplatMask(ArrayRef< int > Mask)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
virtual bool shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
BooleanContent
Enum that describes how the target represents true/false values.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
std::vector< ArgListEntry > ArgListTy
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
Primary interface to the complete machine description for the target machine.
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:720
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:36
LLVM_ABI void set(Value *Val)
Definition Value.h:874
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Value * getOperand(unsigned i) const
Definition User.h:207
This class is used to represent an VP_GATHER node.
This class is used to represent a VP_LOAD node.
This class is used to represent an VP_SCATTER node.
This class is used to represent a VP_STORE node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3232
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3162
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3149
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3139
LLVM_ABI APInt pext(const APInt &Val, const APInt &Mask)
Perform a "compress" operation, also known as pext or bext.
Definition APInt.cpp:3242
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3213
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3154
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
Definition APInt.cpp:3222
LLVM_ABI APInt pdep(const APInt &Val, const APInt &Mask)
Perform an "expand" operation, also known as pdep or bdep.
Definition APInt.cpp:3252
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2299
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3204
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3040
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3237
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2304
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3134
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3144
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:24
LLVM_ABI CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:829
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:513
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:540
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:602
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:524
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:749
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:920
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:530
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:717
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:667
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:883
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:837
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:693
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:802
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:706
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:651
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:616
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:821
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:655
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:909
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:898
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:785
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:502
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:507
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:737
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:683
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:701
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:931
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:955
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:843
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:881
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:885
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isBitwiseLogicOp(unsigned Opcode)
Whether this is bitwise logic opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
LLVM_ABI CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:383
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:345
@ Offset
Definition DWP.cpp:578
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
LLVM_ABI ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1557
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
@ Store
The extracted value is stored (ExtractElement only).
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1783
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:244
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1539
LLVM_ABI bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition APFloat.h:1695
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1738
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:332
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:280
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1769
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
bool includesPoison(UndefPoisonKind Kind)
Returns true if Kind includes the Poison bit.
Definition UndefPoison.h:27
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool includesUndef(UndefPoisonKind Kind)
Returns true if Kind includes the Undef bit.
Definition UndefPoison.h:33
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1719
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
IntPtrTy
Definition InstrProf.h:82
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
constexpr unsigned BitWidth
LLVM_ABI bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:573
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1756
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1796
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:374
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:783
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:543
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:176
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits pdep(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pdep(Val, Mask).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
static LLVM_ABI KnownBits pext(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pext(Val, Mask).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static MemOp Move(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
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)