LLVM 23.0.0git
SelectionDAG.cpp
Go to the documentation of this file.
1//===- SelectionDAG.cpp - Implement the SelectionDAG data structures ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the SelectionDAG class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseSet.h"
21#include "llvm/ADT/FoldingSet.h"
22#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/Twine.h"
51#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugLoc.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/GlobalValue.h"
59#include "llvm/IR/Metadata.h"
60#include "llvm/IR/Type.h"
64#include "llvm/Support/Debug.h"
74#include <algorithm>
75#include <cassert>
76#include <cstdint>
77#include <cstdlib>
78#include <limits>
79#include <optional>
80#include <string>
81#include <utility>
82#include <vector>
83
84using namespace llvm;
85using namespace llvm::SDPatternMatch;
86
87/// makeVTList - Return an instance of the SDVTList struct initialized with the
88/// specified members.
89static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
90 SDVTList Res = {VTs, NumVTs};
91 return Res;
92}
93
94// Default null implementations of the callbacks.
98
99void SelectionDAG::DAGNodeDeletedListener::anchor() {}
100void SelectionDAG::DAGNodeInsertedListener::anchor() {}
101
102#define DEBUG_TYPE "selectiondag"
103
104static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
105 cl::Hidden, cl::init(true),
106 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
107
108static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
109 cl::desc("Number limit for gluing ld/st of memcpy."),
110 cl::Hidden, cl::init(0));
111
113 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
114 cl::desc("DAG combiner limit number of steps when searching DAG "
115 "for predecessor nodes"));
116
118 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
119}
120
122
123//===----------------------------------------------------------------------===//
124// ConstantFPSDNode Class
125//===----------------------------------------------------------------------===//
126
127/// isExactlyValue - We don't rely on operator== working on double values, as
128/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
129/// As such, this method can be used to do an exact bit-for-bit comparison of
130/// two floating point values.
132 return getValueAPF().bitwiseIsEqual(V);
133}
134
136 const APFloat& Val) {
137 assert(VT.isFloatingPoint() && "Can only convert between FP types");
138
139 // convert modifies in place, so make a copy.
140 APFloat Val2 = APFloat(Val);
141 bool losesInfo;
143 &losesInfo);
144 return !losesInfo;
145}
146
147//===----------------------------------------------------------------------===//
148// ISD Namespace
149//===----------------------------------------------------------------------===//
150
151bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
152 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
153 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
154 unsigned EltSize =
155 N->getValueType(0).getVectorElementType().getSizeInBits();
156 SplatVal = OptAPInt->trunc(EltSize);
157 return true;
158 }
159 }
160
161 auto *BV = dyn_cast<BuildVectorSDNode>(N);
162 if (!BV)
163 return false;
164
165 APInt SplatUndef;
166 unsigned SplatBitSize;
167 bool HasUndefs;
168 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
169 // Endianness does not matter here. We are checking for a splat given the
170 // element size of the vector, and if we find such a splat for little endian
171 // layout, then that should be valid also for big endian (as the full vector
172 // size is known to be a multiple of the element size).
173 const bool IsBigEndian = false;
174 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
175 EltSize, IsBigEndian) &&
176 EltSize == SplatBitSize;
177}
178
179// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
180// specializations of the more general isConstantSplatVector()?
181
182bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
183 // Look through a bit convert.
184 while (N->getOpcode() == ISD::BITCAST)
185 N = N->getOperand(0).getNode();
186
187 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
188 APInt SplatVal;
189 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
190 }
191
192 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
193
194 unsigned i = 0, e = N->getNumOperands();
195
196 // Skip over all of the undef values.
197 while (i != e && N->getOperand(i).isUndef())
198 ++i;
199
200 // Do not accept an all-undef vector.
201 if (i == e) return false;
202
203 // Do not accept build_vectors that aren't all constants or which have non-~0
204 // elements. We have to be a bit careful here, as the type of the constant
205 // may not be the same as the type of the vector elements due to type
206 // legalization (the elements are promoted to a legal type for the target and
207 // a vector of a type may be legal when the base element type is not).
208 // We only want to check enough bits to cover the vector elements, because
209 // we care if the resultant vector is all ones, not whether the individual
210 // constants are.
211 SDValue NotZero = N->getOperand(i);
212 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
213 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
214 if (OptAPInt->countr_one() < EltSize)
215 return false;
216 } else
217 return false;
218
219 // Okay, we have at least one ~0 value, check to see if the rest match or are
220 // undefs. Even with the above element type twiddling, this should be OK, as
221 // the same type legalization should have applied to all the elements.
222 for (++i; i != e; ++i)
223 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
224 return false;
225 return true;
226}
227
228bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
229 // Look through a bit convert.
230 while (N->getOpcode() == ISD::BITCAST)
231 N = N->getOperand(0).getNode();
232
233 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
234 APInt SplatVal;
235 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
236 }
237
238 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
239
240 bool IsAllUndef = true;
241 for (const SDValue &Op : N->op_values()) {
242 if (Op.isUndef())
243 continue;
244 IsAllUndef = false;
245 // Do not accept build_vectors that aren't all constants or which have non-0
246 // elements. We have to be a bit careful here, as the type of the constant
247 // may not be the same as the type of the vector elements due to type
248 // legalization (the elements are promoted to a legal type for the target
249 // and a vector of a type may be legal when the base element type is not).
250 // We only want to check enough bits to cover the vector elements, because
251 // we care if the resultant vector is all zeros, not whether the individual
252 // constants are.
253 if (auto OptAPInt = Op->bitcastToAPInt()) {
254 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
255 if (OptAPInt->countr_zero() < EltSize)
256 return false;
257 } else
258 return false;
259 }
260
261 // Do not accept an all-undef vector.
262 if (IsAllUndef)
263 return false;
264 return true;
265}
266
268 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
269}
270
272 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
273}
274
276 if (N->getOpcode() != ISD::BUILD_VECTOR)
277 return false;
278
279 for (const SDValue &Op : N->op_values()) {
280 if (Op.isUndef())
281 continue;
283 return false;
284 }
285 return true;
286}
287
289 if (N->getOpcode() != ISD::BUILD_VECTOR)
290 return false;
291
292 for (const SDValue &Op : N->op_values()) {
293 if (Op.isUndef())
294 continue;
296 return false;
297 }
298 return true;
299}
300
301bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
302 bool Signed) {
303 assert(N->getValueType(0).isVector() && "Expected a vector!");
304
305 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
306 if (EltSize <= NewEltSize)
307 return false;
308
309 if (N->getOpcode() == ISD::ZERO_EXTEND) {
310 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
311 NewEltSize) &&
312 !Signed;
313 }
314 if (N->getOpcode() == ISD::SIGN_EXTEND) {
315 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
316 NewEltSize) &&
317 Signed;
318 }
319 if (N->getOpcode() != ISD::BUILD_VECTOR)
320 return false;
321
322 for (const SDValue &Op : N->op_values()) {
323 if (Op.isUndef())
324 continue;
326 return false;
327
328 APInt C = Op->getAsAPIntVal().trunc(EltSize);
329 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
330 return false;
331 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
332 return false;
333 }
334
335 return true;
336}
337
339 // Return false if the node has no operands.
340 // This is "logically inconsistent" with the definition of "all" but
341 // is probably the desired behavior.
342 if (N->getNumOperands() == 0)
343 return false;
344 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
345}
346
348 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
349}
350
351template <typename ConstNodeType>
353 std::function<bool(ConstNodeType *)> Match,
354 bool AllowUndefs, bool AllowTruncation) {
355 // FIXME: Add support for scalar UNDEF cases?
356 if (auto *C = dyn_cast<ConstNodeType>(Op))
357 return Match(C);
358
359 // FIXME: Add support for vector UNDEF cases?
360 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
361 ISD::SPLAT_VECTOR != Op.getOpcode())
362 return false;
363
364 EVT SVT = Op.getValueType().getScalarType();
365 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
366 if (AllowUndefs && Op.getOperand(i).isUndef()) {
367 if (!Match(nullptr))
368 return false;
369 continue;
370 }
371
372 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
373 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
374 !Match(Cst))
375 return false;
376 }
377 return true;
378}
379// Build used template types.
381 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
383 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
384
386 SDValue LHS, SDValue RHS,
387 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
388 bool AllowUndefs, bool AllowTypeMismatch) {
389 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
390 return false;
391
392 // TODO: Add support for scalar UNDEF cases?
393 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
394 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
395 return Match(LHSCst, RHSCst);
396
397 // TODO: Add support for vector UNDEF cases?
398 if (LHS.getOpcode() != RHS.getOpcode() ||
399 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
400 LHS.getOpcode() != ISD::SPLAT_VECTOR))
401 return false;
402
403 EVT SVT = LHS.getValueType().getScalarType();
404 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
405 SDValue LHSOp = LHS.getOperand(i);
406 SDValue RHSOp = RHS.getOperand(i);
407 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
408 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
409 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
410 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
411 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
412 return false;
413 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
414 LHSOp.getValueType() != RHSOp.getValueType()))
415 return false;
416 if (!Match(LHSCst, RHSCst))
417 return false;
418 }
419 return true;
420}
421
423 switch (MinMaxOpc) {
424 default:
425 llvm_unreachable("unrecognized opcode");
426 case ISD::UMIN:
427 return ISD::UMAX;
428 case ISD::UMAX:
429 return ISD::UMIN;
430 case ISD::SMIN:
431 return ISD::SMAX;
432 case ISD::SMAX:
433 return ISD::SMIN;
434 }
435}
436
438 switch (MinMaxOpc) {
439 default:
440 llvm_unreachable("unrecognized min/max opcode");
441 case ISD::SMIN:
442 return ISD::UMIN;
443 case ISD::SMAX:
444 return ISD::UMAX;
445 case ISD::UMIN:
446 return ISD::SMIN;
447 case ISD::UMAX:
448 return ISD::SMAX;
449 }
450}
451
453 switch (VecReduceOpcode) {
454 default:
455 llvm_unreachable("Expected VECREDUCE opcode");
458 case ISD::VP_REDUCE_FADD:
459 case ISD::VP_REDUCE_SEQ_FADD:
460 return ISD::FADD;
463 case ISD::VP_REDUCE_FMUL:
464 case ISD::VP_REDUCE_SEQ_FMUL:
465 return ISD::FMUL;
467 case ISD::VP_REDUCE_ADD:
468 return ISD::ADD;
470 case ISD::VP_REDUCE_MUL:
471 return ISD::MUL;
473 case ISD::VP_REDUCE_AND:
474 return ISD::AND;
476 case ISD::VP_REDUCE_OR:
477 return ISD::OR;
479 case ISD::VP_REDUCE_XOR:
480 return ISD::XOR;
482 case ISD::VP_REDUCE_SMAX:
483 return ISD::SMAX;
485 case ISD::VP_REDUCE_SMIN:
486 return ISD::SMIN;
488 case ISD::VP_REDUCE_UMAX:
489 return ISD::UMAX;
491 case ISD::VP_REDUCE_UMIN:
492 return ISD::UMIN;
494 case ISD::VP_REDUCE_FMAX:
495 return ISD::FMAXNUM;
497 case ISD::VP_REDUCE_FMIN:
498 return ISD::FMINNUM;
500 case ISD::VP_REDUCE_FMAXIMUM:
501 return ISD::FMAXIMUM;
503 case ISD::VP_REDUCE_FMINIMUM:
504 return ISD::FMINIMUM;
505 }
506}
507
509 switch (MaskedOpc) {
510 case ISD::MASKED_UDIV:
511 return ISD::UDIV;
512 case ISD::MASKED_SDIV:
513 return ISD::SDIV;
514 case ISD::MASKED_UREM:
515 return ISD::UREM;
516 case ISD::MASKED_SREM:
517 return ISD::SREM;
518 default:
519 llvm_unreachable("Expected masked binop opcode");
520 }
521}
522
523bool ISD::isVPOpcode(unsigned Opcode) {
524 switch (Opcode) {
525 default:
526 return false;
527#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
528 case ISD::VPSD: \
529 return true;
530#include "llvm/IR/VPIntrinsics.def"
531 }
532}
533
534bool ISD::isVPBinaryOp(unsigned Opcode) {
535 switch (Opcode) {
536 default:
537 break;
538#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
539#define VP_PROPERTY_BINARYOP return true;
540#define END_REGISTER_VP_SDNODE(VPSD) break;
541#include "llvm/IR/VPIntrinsics.def"
542 }
543 return false;
544}
545
546bool ISD::isVPReduction(unsigned Opcode) {
547 switch (Opcode) {
548 default:
549 return false;
550 case ISD::VP_REDUCE_ADD:
551 case ISD::VP_REDUCE_MUL:
552 case ISD::VP_REDUCE_AND:
553 case ISD::VP_REDUCE_OR:
554 case ISD::VP_REDUCE_XOR:
555 case ISD::VP_REDUCE_SMAX:
556 case ISD::VP_REDUCE_SMIN:
557 case ISD::VP_REDUCE_UMAX:
558 case ISD::VP_REDUCE_UMIN:
559 case ISD::VP_REDUCE_FMAX:
560 case ISD::VP_REDUCE_FMIN:
561 case ISD::VP_REDUCE_FMAXIMUM:
562 case ISD::VP_REDUCE_FMINIMUM:
563 case ISD::VP_REDUCE_FADD:
564 case ISD::VP_REDUCE_FMUL:
565 case ISD::VP_REDUCE_SEQ_FADD:
566 case ISD::VP_REDUCE_SEQ_FMUL:
567 return true;
568 }
569}
570
571/// The operand position of the vector mask.
572std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
573 switch (Opcode) {
574 default:
575 return std::nullopt;
576#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
577 case ISD::VPSD: \
578 return MASKPOS;
579#include "llvm/IR/VPIntrinsics.def"
580 }
581}
582
583/// The operand position of the explicit vector length parameter.
584std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
585 switch (Opcode) {
586 default:
587 return std::nullopt;
588#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
589 case ISD::VPSD: \
590 return EVLPOS;
591#include "llvm/IR/VPIntrinsics.def"
592 }
593}
594
595std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
596 bool hasFPExcept) {
597 // FIXME: Return strict opcodes in case of fp exceptions.
598 switch (VPOpcode) {
599 default:
600 return std::nullopt;
601#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
602#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
603#define END_REGISTER_VP_SDNODE(VPOPC) break;
604#include "llvm/IR/VPIntrinsics.def"
605 }
606 return std::nullopt;
607}
608
609std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
610 switch (Opcode) {
611 default:
612 return std::nullopt;
613#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
614#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
615#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
616#include "llvm/IR/VPIntrinsics.def"
617 }
618}
619
621 switch (ExtType) {
622 case ISD::EXTLOAD:
623 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
624 case ISD::SEXTLOAD:
625 return ISD::SIGN_EXTEND;
626 case ISD::ZEXTLOAD:
627 return ISD::ZERO_EXTEND;
628 default:
629 break;
630 }
631
632 llvm_unreachable("Invalid LoadExtType");
633}
634
636 // To perform this operation, we just need to swap the L and G bits of the
637 // operation.
638 unsigned OldL = (Operation >> 2) & 1;
639 unsigned OldG = (Operation >> 1) & 1;
640 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
641 (OldL << 1) | // New G bit
642 (OldG << 2)); // New L bit.
643}
644
646 unsigned Operation = Op;
647 if (isIntegerLike)
648 Operation ^= 7; // Flip L, G, E bits, but not U.
649 else
650 Operation ^= 15; // Flip all of the condition bits.
651
653 Operation &= ~8; // Don't let N and U bits get set.
654
655 return ISD::CondCode(Operation);
656}
657
661
663 bool isIntegerLike) {
664 return getSetCCInverseImpl(Op, isIntegerLike);
665}
666
667/// For an integer comparison, return 1 if the comparison is a signed operation
668/// and 2 if the result is an unsigned comparison. Return zero if the operation
669/// does not depend on the sign of the input (setne and seteq).
670static int isSignedOp(ISD::CondCode Opcode) {
671 switch (Opcode) {
672 default: llvm_unreachable("Illegal integer setcc operation!");
673 case ISD::SETEQ:
674 case ISD::SETNE: return 0;
675 case ISD::SETLT:
676 case ISD::SETLE:
677 case ISD::SETGT:
678 case ISD::SETGE: return 1;
679 case ISD::SETULT:
680 case ISD::SETULE:
681 case ISD::SETUGT:
682 case ISD::SETUGE: return 2;
683 }
684}
685
687 EVT Type) {
688 bool IsInteger = Type.isInteger();
689 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
690 // Cannot fold a signed integer setcc with an unsigned integer setcc.
691 return ISD::SETCC_INVALID;
692
693 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
694
695 // If the N and U bits get set, then the resultant comparison DOES suddenly
696 // care about orderedness, and it is true when ordered.
697 if (Op > ISD::SETTRUE2)
698 Op &= ~16; // Clear the U bit if the N bit is set.
699
700 // Canonicalize illegal integer setcc's.
701 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
702 Op = ISD::SETNE;
703
704 return ISD::CondCode(Op);
705}
706
708 EVT Type) {
709 bool IsInteger = Type.isInteger();
710 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
711 // Cannot fold a signed setcc with an unsigned setcc.
712 return ISD::SETCC_INVALID;
713
714 // Combine all of the condition bits.
715 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
716
717 // Canonicalize illegal integer setcc's.
718 if (IsInteger) {
719 switch (Result) {
720 default: break;
721 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
722 case ISD::SETOEQ: // SETEQ & SETU[LG]E
723 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
724 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
725 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
726 }
727 }
728
729 return Result;
730}
731
732//===----------------------------------------------------------------------===//
733// SDNode Profile Support
734//===----------------------------------------------------------------------===//
735
736/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
737static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
738 ID.AddInteger(OpC);
739}
740
741/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
742/// solely with their pointer.
744 ID.AddPointer(VTList.VTs);
745}
746
747/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
750 for (const auto &Op : Ops) {
751 ID.AddPointer(Op.getNode());
752 ID.AddInteger(Op.getResNo());
753 }
754}
755
756/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
759 for (const auto &Op : Ops) {
760 ID.AddPointer(Op.getNode());
761 ID.AddInteger(Op.getResNo());
762 }
763}
764
765static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
766 SDVTList VTList, ArrayRef<SDValue> OpList) {
767 AddNodeIDOpcode(ID, OpC);
768 AddNodeIDValueTypes(ID, VTList);
769 AddNodeIDOperands(ID, OpList);
770}
771
772/// If this is an SDNode with special info, add this info to the NodeID data.
774 switch (N->getOpcode()) {
777 case ISD::MCSymbol:
778 llvm_unreachable("Should only be used on nodes with operands");
779 default: break; // Normal nodes don't need extra info.
781 case ISD::Constant: {
783 ID.AddPointer(C->getConstantIntValue());
784 ID.AddBoolean(C->isOpaque());
785 break;
786 }
788 case ISD::ConstantFP:
789 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
790 break;
796 ID.AddPointer(GA->getGlobal());
797 ID.AddInteger(GA->getOffset());
798 ID.AddInteger(GA->getTargetFlags());
799 break;
800 }
801 case ISD::BasicBlock:
803 break;
804 case ISD::Register:
805 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
806 break;
808 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
809 break;
810 case ISD::SRCVALUE:
811 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
812 break;
813 case ISD::FrameIndex:
815 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
816 break;
818 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
819 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
820 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
821 break;
822 case ISD::JumpTable:
824 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
825 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
826 break;
830 ID.AddInteger(CP->getAlign().value());
831 ID.AddInteger(CP->getOffset());
834 else
835 ID.AddPointer(CP->getConstVal());
836 ID.AddInteger(CP->getTargetFlags());
837 break;
838 }
839 case ISD::TargetIndex: {
841 ID.AddInteger(TI->getIndex());
842 ID.AddInteger(TI->getOffset());
843 ID.AddInteger(TI->getTargetFlags());
844 break;
845 }
846 case ISD::LOAD: {
847 const LoadSDNode *LD = cast<LoadSDNode>(N);
848 ID.AddInteger(LD->getMemoryVT().getRawBits());
849 ID.AddInteger(LD->getRawSubclassData());
850 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(LD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::STORE: {
855 const StoreSDNode *ST = cast<StoreSDNode>(N);
856 ID.AddInteger(ST->getMemoryVT().getRawBits());
857 ID.AddInteger(ST->getRawSubclassData());
858 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
859 ID.AddInteger(ST->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_LOAD: {
863 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
864 ID.AddInteger(ELD->getMemoryVT().getRawBits());
865 ID.AddInteger(ELD->getRawSubclassData());
866 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
867 ID.AddInteger(ELD->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::VP_LOAD_FF: {
871 const auto *LD = cast<VPLoadFFSDNode>(N);
872 ID.AddInteger(LD->getMemoryVT().getRawBits());
873 ID.AddInteger(LD->getRawSubclassData());
874 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
875 ID.AddInteger(LD->getMemOperand()->getFlags());
876 break;
877 }
878 case ISD::VP_STORE: {
879 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
880 ID.AddInteger(EST->getMemoryVT().getRawBits());
881 ID.AddInteger(EST->getRawSubclassData());
882 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
883 ID.AddInteger(EST->getMemOperand()->getFlags());
884 break;
885 }
886 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
888 ID.AddInteger(SLD->getMemoryVT().getRawBits());
889 ID.AddInteger(SLD->getRawSubclassData());
890 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
891 break;
892 }
893 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
895 ID.AddInteger(SST->getMemoryVT().getRawBits());
896 ID.AddInteger(SST->getRawSubclassData());
897 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
898 break;
899 }
900 case ISD::VP_GATHER: {
902 ID.AddInteger(EG->getMemoryVT().getRawBits());
903 ID.AddInteger(EG->getRawSubclassData());
904 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
905 ID.AddInteger(EG->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::VP_SCATTER: {
910 ID.AddInteger(ES->getMemoryVT().getRawBits());
911 ID.AddInteger(ES->getRawSubclassData());
912 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
913 ID.AddInteger(ES->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MLOAD: {
918 ID.AddInteger(MLD->getMemoryVT().getRawBits());
919 ID.AddInteger(MLD->getRawSubclassData());
920 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MLD->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSTORE: {
926 ID.AddInteger(MST->getMemoryVT().getRawBits());
927 ID.AddInteger(MST->getRawSubclassData());
928 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MST->getMemOperand()->getFlags());
930 break;
931 }
932 case ISD::MGATHER: {
934 ID.AddInteger(MG->getMemoryVT().getRawBits());
935 ID.AddInteger(MG->getRawSubclassData());
936 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
937 ID.AddInteger(MG->getMemOperand()->getFlags());
938 break;
939 }
940 case ISD::MSCATTER: {
942 ID.AddInteger(MS->getMemoryVT().getRawBits());
943 ID.AddInteger(MS->getRawSubclassData());
944 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
945 ID.AddInteger(MS->getMemOperand()->getFlags());
946 break;
947 }
950 case ISD::ATOMIC_SWAP:
962 case ISD::ATOMIC_LOAD:
963 case ISD::ATOMIC_STORE: {
964 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
965 ID.AddInteger(AT->getMemoryVT().getRawBits());
966 ID.AddInteger(AT->getRawSubclassData());
967 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
968 ID.AddInteger(AT->getMemOperand()->getFlags());
969 break;
970 }
971 case ISD::VECTOR_SHUFFLE: {
972 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
973 for (int M : Mask)
974 ID.AddInteger(M);
975 break;
976 }
977 case ISD::ADDRSPACECAST: {
979 ID.AddInteger(ASC->getSrcAddressSpace());
980 ID.AddInteger(ASC->getDestAddressSpace());
981 break;
982 }
984 case ISD::BlockAddress: {
986 ID.AddPointer(BA->getBlockAddress());
987 ID.AddInteger(BA->getOffset());
988 ID.AddInteger(BA->getTargetFlags());
989 break;
990 }
991 case ISD::AssertAlign:
992 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
993 break;
994 case ISD::PREFETCH:
997 // Handled by MemIntrinsicSDNode check after the switch.
998 break;
1000 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
1001 break;
1002 } // end switch (N->getOpcode())
1003
1004 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
1005 // to check.
1006 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
1007 ID.AddInteger(MN->getRawSubclassData());
1008 ID.AddInteger(MN->getMemoryVT().getRawBits());
1009 for (const MachineMemOperand *MMO : MN->memoperands()) {
1010 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
1011 ID.AddInteger(MMO->getFlags());
1012 }
1013 }
1014}
1015
1016/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1017/// data.
1019 AddNodeIDOpcode(ID, N->getOpcode());
1020 // Add the return value info.
1021 AddNodeIDValueTypes(ID, N->getVTList());
1022 // Add the operand info.
1023 AddNodeIDOperands(ID, N->ops());
1024
1025 // Handle SDNode leafs with special info.
1027}
1028
1029//===----------------------------------------------------------------------===//
1030// SelectionDAG Class
1031//===----------------------------------------------------------------------===//
1032
1033/// doNotCSE - Return true if CSE should not be performed for this node.
1034static bool doNotCSE(SDNode *N) {
1035 if (N->getValueType(0) == MVT::Glue)
1036 return true; // Never CSE anything that produces a glue result.
1037
1038 switch (N->getOpcode()) {
1039 default: break;
1040 case ISD::HANDLENODE:
1041 case ISD::EH_LABEL:
1042 return true; // Never CSE these nodes.
1043 }
1044
1045 // Check that remaining values produced are not flags.
1046 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1047 if (N->getValueType(i) == MVT::Glue)
1048 return true; // Never CSE anything that produces a glue result.
1049
1050 return false;
1051}
1052
1053/// Construct a DemandedElts mask which demands all elements of \p V.
1054/// If \p V is not a fixed-length vector, then this will return a single bit.
1056 EVT VT = V.getValueType();
1057 // Since the number of lanes in a scalable vector is unknown at compile time,
1058 // we track one bit which is implicitly broadcast to all lanes. This means
1059 // that all lanes in a scalable vector are considered demanded.
1061 : APInt(1, 1);
1062}
1063
1064/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1065/// SelectionDAG.
1067 // Create a dummy node (which is not added to allnodes), that adds a reference
1068 // to the root node, preventing it from being deleted.
1069 HandleSDNode Dummy(getRoot());
1070
1071 SmallVector<SDNode*, 128> DeadNodes;
1072
1073 // Add all obviously-dead nodes to the DeadNodes worklist.
1074 for (SDNode &Node : allnodes())
1075 if (Node.use_empty())
1076 DeadNodes.push_back(&Node);
1077
1078 RemoveDeadNodes(DeadNodes);
1079
1080 // If the root changed (e.g. it was a dead load, update the root).
1081 setRoot(Dummy.getValue());
1082}
1083
1084/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1085/// given list, and any nodes that become unreachable as a result.
1087
1088 // Process the worklist, deleting the nodes and adding their uses to the
1089 // worklist.
1090 while (!DeadNodes.empty()) {
1091 SDNode *N = DeadNodes.pop_back_val();
1092 // Skip to next node if we've already managed to delete the node. This could
1093 // happen if replacing a node causes a node previously added to the node to
1094 // be deleted.
1095 if (N->getOpcode() == ISD::DELETED_NODE)
1096 continue;
1097
1098 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1099 DUL->NodeDeleted(N, nullptr);
1100
1101 // Take the node out of the appropriate CSE map.
1102 RemoveNodeFromCSEMaps(N);
1103
1104 // Next, brutally remove the operand list. This is safe to do, as there are
1105 // no cycles in the graph.
1106 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1107 SDUse &Use = *I++;
1108 SDNode *Operand = Use.getNode();
1109 Use.set(SDValue());
1110
1111 // Now that we removed this operand, see if there are no uses of it left.
1112 if (Operand->use_empty())
1113 DeadNodes.push_back(Operand);
1114 }
1115
1116 DeallocateNode(N);
1117 }
1118}
1119
1121 SmallVector<SDNode*, 16> DeadNodes(1, N);
1122
1123 // Create a dummy node that adds a reference to the root node, preventing
1124 // it from being deleted. (This matters if the root is an operand of the
1125 // dead node.)
1126 HandleSDNode Dummy(getRoot());
1127
1128 RemoveDeadNodes(DeadNodes);
1129}
1130
1132 // First take this out of the appropriate CSE map.
1133 RemoveNodeFromCSEMaps(N);
1134
1135 // Finally, remove uses due to operands of this node, remove from the
1136 // AllNodes list, and delete the node.
1137 DeleteNodeNotInCSEMaps(N);
1138}
1139
1140void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1141 assert(N->getIterator() != AllNodes.begin() &&
1142 "Cannot delete the entry node!");
1143 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1144
1145 // Drop all of the operands and decrement used node's use counts.
1146 N->DropOperands();
1147
1148 DeallocateNode(N);
1149}
1150
1151void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1152 assert(!(V->isVariadic() && isParameter));
1153 if (isParameter)
1154 ByvalParmDbgValues.push_back(V);
1155 else
1156 DbgValues.push_back(V);
1157 for (const SDNode *Node : V->getSDNodes())
1158 if (Node)
1159 DbgValMap[Node].push_back(V);
1160}
1161
1163 DbgValMapType::iterator I = DbgValMap.find(Node);
1164 if (I == DbgValMap.end())
1165 return;
1166 for (auto &Val: I->second)
1167 Val->setIsInvalidated();
1168 DbgValMap.erase(I);
1169}
1170
1171void SelectionDAG::DeallocateNode(SDNode *N) {
1172 // If we have operands, deallocate them.
1174
1175 NodeAllocator.Deallocate(AllNodes.remove(N));
1176
1177 // Set the opcode to DELETED_NODE to help catch bugs when node
1178 // memory is reallocated.
1179 // FIXME: There are places in SDag that have grown a dependency on the opcode
1180 // value in the released node.
1181 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1182 N->NodeType = ISD::DELETED_NODE;
1183
1184 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1185 // them and forget about that node.
1186 DbgInfo->erase(N);
1187
1188 // Invalidate extra info.
1189 SDEI.erase(N);
1190}
1191
1192#ifndef NDEBUG
1193/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1194void SelectionDAG::verifyNode(SDNode *N) const {
1195 switch (N->getOpcode()) {
1196 default:
1197 if (N->isTargetOpcode())
1199 break;
1200 case ISD::BUILD_PAIR: {
1201 EVT VT = N->getValueType(0);
1202 assert(N->getNumValues() == 1 && "Too many results!");
1203 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1204 "Wrong return type!");
1205 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1206 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1207 "Mismatched operand types!");
1208 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1209 "Wrong operand type!");
1210 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1211 "Wrong return type size");
1212 break;
1213 }
1214 case ISD::BUILD_VECTOR: {
1215 assert(N->getNumValues() == 1 && "Too many results!");
1216 assert(N->getValueType(0).isVector() && "Wrong return type!");
1217 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1218 "Wrong number of operands!");
1219 EVT EltVT = N->getValueType(0).getVectorElementType();
1220 for (const SDUse &Op : N->ops()) {
1221 assert((Op.getValueType() == EltVT ||
1222 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1223 EltVT.bitsLE(Op.getValueType()))) &&
1224 "Wrong operand type!");
1225 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1226 "Operands must all have the same type");
1227 }
1228 break;
1229 }
1230 case ISD::SADDO:
1231 case ISD::UADDO:
1232 case ISD::SSUBO:
1233 case ISD::USUBO:
1234 assert(N->getNumValues() == 2 && "Wrong number of results!");
1235 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1236 "Invalid add/sub overflow op!");
1237 assert(N->getVTList().VTs[0].isInteger() &&
1238 N->getVTList().VTs[1].isInteger() &&
1239 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1240 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1241 "Binary operator types must match!");
1242 break;
1243 }
1244}
1245#endif // NDEBUG
1246
1247/// Insert a newly allocated node into the DAG.
1248///
1249/// Handles insertion into the all nodes list and CSE map, as well as
1250/// verification and other common operations when a new node is allocated.
1251void SelectionDAG::InsertNode(SDNode *N) {
1252 AllNodes.push_back(N);
1253#ifndef NDEBUG
1254 N->PersistentId = NextPersistentId++;
1255 verifyNode(N);
1256#endif
1257 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1258 DUL->NodeInserted(N);
1259}
1260
1261/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1262/// correspond to it. This is useful when we're about to delete or repurpose
1263/// the node. We don't want future request for structurally identical nodes
1264/// to return N anymore.
1265bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1266 bool Erased = false;
1267 switch (N->getOpcode()) {
1268 case ISD::HANDLENODE: return false; // noop.
1269 case ISD::CONDCODE:
1270 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1271 "Cond code doesn't exist!");
1272 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1273 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1274 break;
1276 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1277 break;
1279 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1280 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1281 ESN->getSymbol(), ESN->getTargetFlags()));
1282 break;
1283 }
1284 case ISD::MCSymbol: {
1285 auto *MCSN = cast<MCSymbolSDNode>(N);
1286 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1287 break;
1288 }
1289 case ISD::VALUETYPE: {
1290 EVT VT = cast<VTSDNode>(N)->getVT();
1291 if (VT.isExtended()) {
1292 Erased = ExtendedValueTypeNodes.erase(VT);
1293 } else {
1294 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1295 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1296 }
1297 break;
1298 }
1299 default:
1300 // Remove it from the CSE Map.
1301 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1302 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1303 Erased = CSEMap.RemoveNode(N);
1304 break;
1305 }
1306#ifndef NDEBUG
1307 // Verify that the node was actually in one of the CSE maps, unless it has a
1308 // glue result (which cannot be CSE'd) or is one of the special cases that are
1309 // not subject to CSE.
1310 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1311 !N->isMachineOpcode() && !doNotCSE(N)) {
1312 N->dump(this);
1313 dbgs() << "\n";
1314 llvm_unreachable("Node is not in map!");
1315 }
1316#endif
1317 return Erased;
1318}
1319
1320/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1321/// maps and modified in place. Add it back to the CSE maps, unless an identical
1322/// node already exists, in which case transfer all its users to the existing
1323/// node. This transfer can potentially trigger recursive merging.
1324void
1325SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1326 // For node types that aren't CSE'd, just act as if no identical node
1327 // already exists.
1328 if (!doNotCSE(N)) {
1329 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1330 if (Existing != N) {
1331 // If there was already an existing matching node, use ReplaceAllUsesWith
1332 // to replace the dead one with the existing one. This can cause
1333 // recursive merging of other unrelated nodes down the line.
1334 Existing->intersectFlagsWith(N->getFlags());
1335 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1336 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1337 ReplaceAllUsesWith(N, Existing);
1338
1339 // N is now dead. Inform the listeners and delete it.
1340 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1341 DUL->NodeDeleted(N, Existing);
1342 DeleteNodeNotInCSEMaps(N);
1343 return;
1344 }
1345 }
1346
1347 // If the node doesn't already exist, we updated it. Inform listeners.
1348 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1349 DUL->NodeUpdated(N);
1350}
1351
1352/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1353/// were replaced with those specified. If this node is never memoized,
1354/// return null, otherwise return a pointer to the slot it would take. If a
1355/// node already exists with these operands, the slot will be non-null.
1356SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1357 void *&InsertPos) {
1358 if (doNotCSE(N))
1359 return nullptr;
1360
1361 SDValue Ops[] = { Op };
1362 FoldingSetNodeID ID;
1363 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1365 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1366 if (Node)
1367 Node->intersectFlagsWith(N->getFlags());
1368 return Node;
1369}
1370
1371/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1372/// were replaced with those specified. If this node is never memoized,
1373/// return null, otherwise return a pointer to the slot it would take. If a
1374/// node already exists with these operands, the slot will be non-null.
1375SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1376 SDValue Op1, SDValue Op2,
1377 void *&InsertPos) {
1378 if (doNotCSE(N))
1379 return nullptr;
1380
1381 SDValue Ops[] = { Op1, Op2 };
1382 FoldingSetNodeID ID;
1383 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1385 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1386 if (Node)
1387 Node->intersectFlagsWith(N->getFlags());
1388 return Node;
1389}
1390
1391/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1392/// were replaced with those specified. If this node is never memoized,
1393/// return null, otherwise return a pointer to the slot it would take. If a
1394/// node already exists with these operands, the slot will be non-null.
1395SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1396 void *&InsertPos) {
1397 if (doNotCSE(N))
1398 return nullptr;
1399
1400 FoldingSetNodeID ID;
1401 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1403 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1404 if (Node)
1405 Node->intersectFlagsWith(N->getFlags());
1406 return Node;
1407}
1408
1410 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1411 : VT.getTypeForEVT(*getContext());
1412
1413 return getDataLayout().getABITypeAlign(Ty);
1414}
1415
1416// EntryNode could meaningfully have debug info if we can find it...
1418 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1419 getVTList(MVT::Other, MVT::Glue)),
1420 Root(getEntryNode()) {
1421 InsertNode(&EntryNode);
1422 DbgInfo = new SDDbgInfo();
1423}
1424
1426 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1427 const TargetLibraryInfo *LibraryInfo,
1428 const LibcallLoweringInfo *LibcallsInfo,
1429 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1431 FunctionVarLocs const *VarLocs) {
1432 MF = &NewMF;
1433 SDAGISelPass = PassPtr;
1434 ORE = &NewORE;
1437 LibInfo = LibraryInfo;
1438 Libcalls = LibcallsInfo;
1439 Context = &MF->getFunction().getContext();
1440 UA = NewUA;
1441 PSI = PSIin;
1442 BFI = BFIin;
1443 MMI = &MMIin;
1444 FnVarLocs = VarLocs;
1445}
1446
1448 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1449 allnodes_clear();
1450 OperandRecycler.clear(OperandAllocator);
1451 delete DbgInfo;
1452}
1453
1455 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1456}
1457
1458void SelectionDAG::allnodes_clear() {
1459 assert(&*AllNodes.begin() == &EntryNode);
1460 AllNodes.remove(AllNodes.begin());
1461 while (!AllNodes.empty())
1462 DeallocateNode(&AllNodes.front());
1463#ifndef NDEBUG
1464 NextPersistentId = 0;
1465#endif
1466}
1467
1468SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1469 void *&InsertPos) {
1470 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1471 if (N) {
1472 switch (N->getOpcode()) {
1473 default: break;
1474 case ISD::Constant:
1475 case ISD::ConstantFP:
1476 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1477 "debug location. Use another overload.");
1478 }
1479 }
1480 return N;
1481}
1482
1483SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1484 const SDLoc &DL, void *&InsertPos) {
1485 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1486 if (N) {
1487 switch (N->getOpcode()) {
1488 case ISD::Constant:
1489 case ISD::ConstantFP:
1490 // Erase debug location from the node if the node is used at several
1491 // different places. Do not propagate one location to all uses as it
1492 // will cause a worse single stepping debugging experience.
1493 if (N->getDebugLoc() != DL.getDebugLoc())
1494 N->setDebugLoc(DebugLoc());
1495 break;
1496 default:
1497 // When the node's point of use is located earlier in the instruction
1498 // sequence than its prior point of use, update its debug info to the
1499 // earlier location.
1500 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1501 N->setDebugLoc(DL.getDebugLoc());
1502 break;
1503 }
1504 }
1505 return N;
1506}
1507
1509 allnodes_clear();
1510 OperandRecycler.clear(OperandAllocator);
1511 OperandAllocator.Reset();
1512 CSEMap.clear();
1513
1514 ExtendedValueTypeNodes.clear();
1515 ExternalSymbols.clear();
1516 TargetExternalSymbols.clear();
1517 MCSymbols.clear();
1518 SDEI.clear();
1519 llvm::fill(CondCodeNodes, nullptr);
1520 llvm::fill(ValueTypeNodes, nullptr);
1521
1522 EntryNode.UseList = nullptr;
1523 InsertNode(&EntryNode);
1524 Root = getEntryNode();
1525 DbgInfo->clear();
1526}
1527
1529 return VT.bitsGT(Op.getValueType())
1530 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1531 : getNode(ISD::FP_ROUND, DL, VT, Op,
1532 getIntPtrConstant(0, DL, /*isTarget=*/true));
1533}
1534
1535std::pair<SDValue, SDValue>
1537 const SDLoc &DL, EVT VT) {
1538 assert(!VT.bitsEq(Op.getValueType()) &&
1539 "Strict no-op FP extend/round not allowed.");
1540 SDValue Res =
1541 VT.bitsGT(Op.getValueType())
1542 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1543 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1544 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1545
1546 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1547}
1548
1550 return VT.bitsGT(Op.getValueType()) ?
1551 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1552 getNode(ISD::TRUNCATE, DL, VT, Op);
1553}
1554
1556 return VT.bitsGT(Op.getValueType()) ?
1557 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1558 getNode(ISD::TRUNCATE, DL, VT, Op);
1559}
1560
1562 return VT.bitsGT(Op.getValueType()) ?
1563 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1564 getNode(ISD::TRUNCATE, DL, VT, Op);
1565}
1566
1568 EVT VT) {
1569 assert(!VT.isVector());
1570 auto Type = Op.getValueType();
1571 SDValue DestOp;
1572 if (Type == VT)
1573 return Op;
1574 auto Size = Op.getValueSizeInBits();
1575 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1576 if (DestOp.getValueType() == VT)
1577 return DestOp;
1578
1579 return getAnyExtOrTrunc(DestOp, DL, VT);
1580}
1581
1583 EVT VT) {
1584 assert(!VT.isVector());
1585 auto Type = Op.getValueType();
1586 SDValue DestOp;
1587 if (Type == VT)
1588 return Op;
1589 auto Size = Op.getValueSizeInBits();
1590 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1591 if (DestOp.getValueType() == VT)
1592 return DestOp;
1593
1594 return getSExtOrTrunc(DestOp, DL, VT);
1595}
1596
1598 EVT VT) {
1599 assert(!VT.isVector());
1600 auto Type = Op.getValueType();
1601 SDValue DestOp;
1602 if (Type == VT)
1603 return Op;
1604 auto Size = Op.getValueSizeInBits();
1605 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1606 if (DestOp.getValueType() == VT)
1607 return DestOp;
1608
1609 return getZExtOrTrunc(DestOp, DL, VT);
1610}
1611
1613 EVT OpVT) {
1614 if (VT.bitsLE(Op.getValueType()))
1615 return getNode(ISD::TRUNCATE, SL, VT, Op);
1616
1617 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1618 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1619}
1620
1622 EVT OpVT = Op.getValueType();
1623 assert(VT.isInteger() && OpVT.isInteger() &&
1624 "Cannot getZeroExtendInReg FP types");
1625 assert(VT.isVector() == OpVT.isVector() &&
1626 "getZeroExtendInReg type should be vector iff the operand "
1627 "type is vector!");
1628 assert((!VT.isVector() ||
1630 "Vector element counts must match in getZeroExtendInReg");
1631 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1632 if (OpVT == VT)
1633 return Op;
1634 // TODO: Use computeKnownBits instead of AssertZext.
1635 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1636 ->getVT()
1637 .getScalarType()
1638 .bitsLE(VT.getScalarType()))
1639 return Op;
1641 VT.getScalarSizeInBits());
1642 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1643}
1644
1646 SDValue EVL, const SDLoc &DL,
1647 EVT VT) {
1648 EVT OpVT = Op.getValueType();
1649 assert(VT.isInteger() && OpVT.isInteger() &&
1650 "Cannot getVPZeroExtendInReg FP types");
1651 assert(VT.isVector() && OpVT.isVector() &&
1652 "getVPZeroExtendInReg type and operand type should be vector!");
1654 "Vector element counts must match in getZeroExtendInReg");
1655 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1656 if (OpVT == VT)
1657 return Op;
1659 VT.getScalarSizeInBits());
1660 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1661 EVL);
1662}
1663
1665 // Only unsigned pointer semantics are supported right now. In the future this
1666 // might delegate to TLI to check pointer signedness.
1667 return getZExtOrTrunc(Op, DL, VT);
1668}
1669
1671 // Only unsigned pointer semantics are supported right now. In the future this
1672 // might delegate to TLI to check pointer signedness.
1673 return getZeroExtendInReg(Op, DL, VT);
1674}
1675
1677 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1678}
1679
1680/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1682 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1683}
1684
1686 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1687 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1688}
1689
1691 SDValue Mask, SDValue EVL, EVT VT) {
1692 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1693 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1694}
1695
1697 SDValue Mask, SDValue EVL) {
1698 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1699}
1700
1702 SDValue Mask, SDValue EVL) {
1703 if (VT.bitsGT(Op.getValueType()))
1704 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1705 if (VT.bitsLT(Op.getValueType()))
1706 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1707 return Op;
1708}
1709
1711 EVT OpVT) {
1712 if (!V)
1713 return getConstant(0, DL, VT);
1714
1715 switch (TLI->getBooleanContents(OpVT)) {
1718 return getConstant(1, DL, VT);
1720 return getAllOnesConstant(DL, VT);
1721 }
1722 llvm_unreachable("Unexpected boolean content enum!");
1723}
1724
1726 bool isT, bool isO) {
1727 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1728 DL, VT, isT, isO);
1729}
1730
1732 bool isT, bool isO) {
1733 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1734}
1735
1737 EVT VT, bool isT, bool isO) {
1738 assert(VT.isInteger() && "Cannot create FP integer constant!");
1739
1740 EVT EltVT = VT.getScalarType();
1741 const ConstantInt *Elt = &Val;
1742
1743 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1744 // to-be-splatted scalar ConstantInt.
1745 if (isa<VectorType>(Elt->getType()))
1746 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1747
1748 // In some cases the vector type is legal but the element type is illegal and
1749 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1750 // inserted value (the type does not need to match the vector element type).
1751 // Any extra bits introduced will be truncated away.
1752 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1754 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1755 APInt NewVal;
1756 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1757 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1758 else
1759 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1760 Elt = ConstantInt::get(*getContext(), NewVal);
1761 }
1762 // In other cases the element type is illegal and needs to be expanded, for
1763 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1764 // the value into n parts and use a vector type with n-times the elements.
1765 // Then bitcast to the type requested.
1766 // Legalizing constants too early makes the DAGCombiner's job harder so we
1767 // only legalize if the DAG tells us we must produce legal types.
1768 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1769 TLI->getTypeAction(*getContext(), EltVT) ==
1771 const APInt &NewVal = Elt->getValue();
1772 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1773 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1774
1775 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1776 if (VT.isScalableVector() ||
1777 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1778 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1779 "Can only handle an even split!");
1780 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1781
1782 SmallVector<SDValue, 2> ScalarParts;
1783 for (unsigned i = 0; i != Parts; ++i)
1784 ScalarParts.push_back(getConstant(
1785 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1786 ViaEltVT, isT, isO));
1787
1788 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1789 }
1790
1791 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1792 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1793
1794 // Check the temporary vector is the correct size. If this fails then
1795 // getTypeToTransformTo() probably returned a type whose size (in bits)
1796 // isn't a power-of-2 factor of the requested type size.
1797 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1798
1799 SmallVector<SDValue, 2> EltParts;
1800 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1801 EltParts.push_back(getConstant(
1802 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1803 ViaEltVT, isT, isO));
1804
1805 // EltParts is currently in little endian order. If we actually want
1806 // big-endian order then reverse it now.
1807 if (getDataLayout().isBigEndian())
1808 std::reverse(EltParts.begin(), EltParts.end());
1809
1810 // The elements must be reversed when the element order is different
1811 // to the endianness of the elements (because the BITCAST is itself a
1812 // vector shuffle in this situation). However, we do not need any code to
1813 // perform this reversal because getConstant() is producing a vector
1814 // splat.
1815 // This situation occurs in MIPS MSA.
1816
1818 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1819 llvm::append_range(Ops, EltParts);
1820
1821 SDValue V =
1822 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1823 return V;
1824 }
1825
1826 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1827 "APInt size does not match type size!");
1828 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1829 SDVTList VTs = getVTList(EltVT);
1831 AddNodeIDNode(ID, Opc, VTs, {});
1832 ID.AddPointer(Elt);
1833 ID.AddBoolean(isO);
1834 void *IP = nullptr;
1835 SDNode *N = nullptr;
1836 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1837 if (!VT.isVector())
1838 return SDValue(N, 0);
1839
1840 if (!N) {
1841 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1842 CSEMap.InsertNode(N, IP);
1843 InsertNode(N);
1844 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1845 }
1846
1847 SDValue Result(N, 0);
1848 if (VT.isVector())
1849 Result = getSplat(VT, DL, Result);
1850 return Result;
1851}
1852
1854 bool isT, bool isO) {
1855 unsigned Size = VT.getScalarSizeInBits();
1856 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1857}
1858
1860 bool IsOpaque) {
1862 IsTarget, IsOpaque);
1863}
1864
1866 bool isTarget) {
1867 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1868}
1869
1871 const SDLoc &DL) {
1872 assert(VT.isInteger() && "Shift amount is not an integer type!");
1873 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1874 return getConstant(Val, DL, ShiftVT);
1875}
1876
1878 const SDLoc &DL) {
1879 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1880 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1881}
1882
1884 bool isTarget) {
1885 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1886}
1887
1889 bool isTarget) {
1890 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1891}
1892
1894 EVT VT, bool isTarget) {
1895 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1896
1897 EVT EltVT = VT.getScalarType();
1898 const ConstantFP *Elt = &V;
1899
1900 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1901 // the to-be-splatted scalar ConstantFP.
1902 if (isa<VectorType>(Elt->getType()))
1903 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1904
1905 // Do the map lookup using the actual bit pattern for the floating point
1906 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1907 // we don't have issues with SNANs.
1908 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1909 SDVTList VTs = getVTList(EltVT);
1911 AddNodeIDNode(ID, Opc, VTs, {});
1912 ID.AddPointer(Elt);
1913 void *IP = nullptr;
1914 SDNode *N = nullptr;
1915 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1916 if (!VT.isVector())
1917 return SDValue(N, 0);
1918
1919 if (!N) {
1920 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1921 CSEMap.InsertNode(N, IP);
1922 InsertNode(N);
1923 }
1924
1925 SDValue Result(N, 0);
1926 if (VT.isVector())
1927 Result = getSplat(VT, DL, Result);
1928 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1929 return Result;
1930}
1931
1933 bool isTarget) {
1934 EVT EltVT = VT.getScalarType();
1935 if (EltVT == MVT::f32)
1936 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1937 if (EltVT == MVT::f64)
1938 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1939 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1940 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1941 bool Ignored;
1942 APFloat APF = APFloat(Val);
1944 &Ignored);
1945 return getConstantFP(APF, DL, VT, isTarget);
1946 }
1947 llvm_unreachable("Unsupported type in getConstantFP");
1948}
1949
1951 EVT VT, int64_t Offset, bool isTargetGA,
1952 unsigned TargetFlags) {
1953 assert((TargetFlags == 0 || isTargetGA) &&
1954 "Cannot set target flags on target-independent globals");
1955
1956 // Truncate (with sign-extension) the offset value to the pointer size.
1958 if (BitWidth < 64)
1960
1961 unsigned Opc;
1962 if (GV->isThreadLocal())
1964 else
1966
1967 SDVTList VTs = getVTList(VT);
1969 AddNodeIDNode(ID, Opc, VTs, {});
1970 ID.AddPointer(GV);
1971 ID.AddInteger(Offset);
1972 ID.AddInteger(TargetFlags);
1973 void *IP = nullptr;
1974 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1975 return SDValue(E, 0);
1976
1977 auto *N = newSDNode<GlobalAddressSDNode>(
1978 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1979 CSEMap.InsertNode(N, IP);
1980 InsertNode(N);
1981 return SDValue(N, 0);
1982}
1983
1985 SDVTList VTs = getVTList(MVT::Untyped);
1988 ID.AddPointer(GV);
1989 void *IP = nullptr;
1990 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1991 return SDValue(E, 0);
1992
1993 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1994 CSEMap.InsertNode(N, IP);
1995 InsertNode(N);
1996 return SDValue(N, 0);
1997}
1998
1999SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
2000 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
2001 SDVTList VTs = getVTList(VT);
2003 AddNodeIDNode(ID, Opc, VTs, {});
2004 ID.AddInteger(FI);
2005 void *IP = nullptr;
2006 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2007 return SDValue(E, 0);
2008
2009 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
2010 CSEMap.InsertNode(N, IP);
2011 InsertNode(N);
2012 return SDValue(N, 0);
2013}
2014
2015SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
2016 unsigned TargetFlags) {
2017 assert((TargetFlags == 0 || isTarget) &&
2018 "Cannot set target flags on target-independent jump tables");
2019 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
2020 SDVTList VTs = getVTList(VT);
2022 AddNodeIDNode(ID, Opc, VTs, {});
2023 ID.AddInteger(JTI);
2024 ID.AddInteger(TargetFlags);
2025 void *IP = nullptr;
2026 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2027 return SDValue(E, 0);
2028
2029 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2030 CSEMap.InsertNode(N, IP);
2031 InsertNode(N);
2032 return SDValue(N, 0);
2033}
2034
2036 const SDLoc &DL) {
2038 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2039 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2040}
2041
2043 MaybeAlign Alignment, int Offset,
2044 bool isTarget, unsigned TargetFlags) {
2045 assert((TargetFlags == 0 || isTarget) &&
2046 "Cannot set target flags on target-independent globals");
2047 if (!Alignment)
2048 Alignment = shouldOptForSize()
2049 ? getDataLayout().getABITypeAlign(C->getType())
2050 : getDataLayout().getPrefTypeAlign(C->getType());
2051 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2052 SDVTList VTs = getVTList(VT);
2054 AddNodeIDNode(ID, Opc, VTs, {});
2055 ID.AddInteger(Alignment->value());
2056 ID.AddInteger(Offset);
2057 ID.AddPointer(C);
2058 ID.AddInteger(TargetFlags);
2059 void *IP = nullptr;
2060 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2061 return SDValue(E, 0);
2062
2063 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2064 TargetFlags);
2065 CSEMap.InsertNode(N, IP);
2066 InsertNode(N);
2067 SDValue V = SDValue(N, 0);
2068 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2069 return V;
2070}
2071
2073 MaybeAlign Alignment, int Offset,
2074 bool isTarget, unsigned TargetFlags) {
2075 assert((TargetFlags == 0 || isTarget) &&
2076 "Cannot set target flags on target-independent globals");
2077 if (!Alignment)
2078 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2079 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2080 SDVTList VTs = getVTList(VT);
2082 AddNodeIDNode(ID, Opc, VTs, {});
2083 ID.AddInteger(Alignment->value());
2084 ID.AddInteger(Offset);
2085 C->addSelectionDAGCSEId(ID);
2086 ID.AddInteger(TargetFlags);
2087 void *IP = nullptr;
2088 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2089 return SDValue(E, 0);
2090
2091 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2092 TargetFlags);
2093 CSEMap.InsertNode(N, IP);
2094 InsertNode(N);
2095 return SDValue(N, 0);
2096}
2097
2100 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2101 ID.AddPointer(MBB);
2102 void *IP = nullptr;
2103 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2104 return SDValue(E, 0);
2105
2106 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2107 CSEMap.InsertNode(N, IP);
2108 InsertNode(N);
2109 return SDValue(N, 0);
2110}
2111
2113 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2114 ValueTypeNodes.size())
2115 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2116
2117 SDNode *&N = VT.isExtended() ?
2118 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2119
2120 if (N) return SDValue(N, 0);
2121 N = newSDNode<VTSDNode>(VT);
2122 InsertNode(N);
2123 return SDValue(N, 0);
2124}
2125
2127 SDNode *&N = ExternalSymbols[Sym];
2128 if (N) return SDValue(N, 0);
2129 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2130 InsertNode(N);
2131 return SDValue(N, 0);
2132}
2133
2134SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2136 return getExternalSymbol(SymName.data(), VT);
2137}
2138
2140 SDNode *&N = MCSymbols[Sym];
2141 if (N)
2142 return SDValue(N, 0);
2143 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2144 InsertNode(N);
2145 return SDValue(N, 0);
2146}
2147
2149 unsigned TargetFlags) {
2150 SDNode *&N =
2151 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2152 if (N) return SDValue(N, 0);
2153 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2154 InsertNode(N);
2155 return SDValue(N, 0);
2156}
2157
2159 EVT VT, unsigned TargetFlags) {
2161 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2162}
2163
2165 if ((unsigned)Cond >= CondCodeNodes.size())
2166 CondCodeNodes.resize(Cond+1);
2167
2168 if (!CondCodeNodes[Cond]) {
2169 auto *N = newSDNode<CondCodeSDNode>(Cond);
2170 CondCodeNodes[Cond] = N;
2171 InsertNode(N);
2172 }
2173
2174 return SDValue(CondCodeNodes[Cond], 0);
2175}
2176
2178 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2179 "APInt size does not match type size!");
2180
2181 if (MulImm == 0)
2182 return getConstant(0, DL, VT);
2183
2184 const MachineFunction &MF = getMachineFunction();
2185 const Function &F = MF.getFunction();
2186 ConstantRange CR = getVScaleRange(&F, 64);
2187 if (const APInt *C = CR.getSingleElement())
2188 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2189
2190 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2191}
2192
2193/// \returns a value of type \p VT that represents the runtime value of \p
2194/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2195/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2196/// or TypeSize.
2197template <typename Ty>
2199 EVT VT, Ty Quantity) {
2200 if (Quantity.isScalable())
2201 return DAG.getVScale(
2202 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2203
2204 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2205}
2206
2208 ElementCount EC) {
2209 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2210}
2211
2213 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2214}
2215
2217 ElementCount EC) {
2218 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2219 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2220 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2221 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2222}
2223
2225 APInt One(ResVT.getScalarSizeInBits(), 1);
2226 return getStepVector(DL, ResVT, One);
2227}
2228
2230 const APInt &StepVal) {
2231 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2232 if (ResVT.isScalableVector())
2233 return getNode(
2234 ISD::STEP_VECTOR, DL, ResVT,
2235 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2236
2237 SmallVector<SDValue, 16> OpsStepConstants;
2238 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2239 OpsStepConstants.push_back(
2240 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2241 return getBuildVector(ResVT, DL, OpsStepConstants);
2242}
2243
2244/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2245/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2250
2252 SDValue N2, ArrayRef<int> Mask) {
2253 assert(VT.getVectorNumElements() == Mask.size() &&
2254 "Must have the same number of vector elements as mask elements!");
2255 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2256 "Invalid VECTOR_SHUFFLE");
2257
2258 // Canonicalize shuffle undef, undef -> undef
2259 if (N1.isUndef() && N2.isUndef())
2260 return getUNDEF(VT);
2261
2262 // Validate that all indices in Mask are within the range of the elements
2263 // input to the shuffle.
2264 int NElts = Mask.size();
2265 assert(llvm::all_of(Mask,
2266 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2267 "Index out of range");
2268
2269 // Copy the mask so we can do any needed cleanup.
2270 SmallVector<int, 8> MaskVec(Mask);
2271
2272 // Canonicalize shuffle v, v -> v, undef
2273 if (N1 == N2) {
2274 N2 = getUNDEF(VT);
2275 for (int i = 0; i != NElts; ++i)
2276 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2277 }
2278
2279 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2280 if (N1.isUndef())
2281 commuteShuffle(N1, N2, MaskVec);
2282
2283 if (TLI->hasVectorBlend()) {
2284 // If shuffling a splat, try to blend the splat instead. We do this here so
2285 // that even when this arises during lowering we don't have to re-handle it.
2286 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2287 BitVector UndefElements;
2288 SDValue Splat = BV->getSplatValue(&UndefElements);
2289 if (!Splat)
2290 return;
2291
2292 for (int i = 0; i < NElts; ++i) {
2293 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2294 continue;
2295
2296 // If this input comes from undef, mark it as such.
2297 if (UndefElements[MaskVec[i] - Offset]) {
2298 MaskVec[i] = -1;
2299 continue;
2300 }
2301
2302 // If we can blend a non-undef lane, use that instead.
2303 if (!UndefElements[i])
2304 MaskVec[i] = i + Offset;
2305 }
2306 };
2307 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2308 BlendSplat(N1BV, 0);
2309 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2310 BlendSplat(N2BV, NElts);
2311 }
2312
2313 // Canonicalize all index into lhs, -> shuffle lhs, undef
2314 // Canonicalize all index into rhs, -> shuffle rhs, undef
2315 bool AllLHS = true, AllRHS = true;
2316 bool N2Undef = N2.isUndef();
2317 for (int i = 0; i != NElts; ++i) {
2318 if (MaskVec[i] >= NElts) {
2319 if (N2Undef)
2320 MaskVec[i] = -1;
2321 else
2322 AllLHS = false;
2323 } else if (MaskVec[i] >= 0) {
2324 AllRHS = false;
2325 }
2326 }
2327 if (AllLHS && AllRHS)
2328 return getUNDEF(VT);
2329 if (AllLHS && !N2Undef)
2330 N2 = getUNDEF(VT);
2331 if (AllRHS) {
2332 N1 = getUNDEF(VT);
2333 commuteShuffle(N1, N2, MaskVec);
2334 }
2335 // Reset our undef status after accounting for the mask.
2336 N2Undef = N2.isUndef();
2337 // Re-check whether both sides ended up undef.
2338 if (N1.isUndef() && N2Undef)
2339 return getUNDEF(VT);
2340
2341 // If Identity shuffle return that node.
2342 bool Identity = true, AllSame = true;
2343 for (int i = 0; i != NElts; ++i) {
2344 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2345 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2346 }
2347 if (Identity && NElts)
2348 return N1;
2349
2350 // Shuffling a constant splat doesn't change the result.
2351 if (N2Undef) {
2352 SDValue V = N1;
2353
2354 // Look through any bitcasts. We check that these don't change the number
2355 // (and size) of elements and just changes their types.
2356 while (V.getOpcode() == ISD::BITCAST)
2357 V = V->getOperand(0);
2358
2359 // A splat should always show up as a build vector node.
2360 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2361 BitVector UndefElements;
2362 SDValue Splat = BV->getSplatValue(&UndefElements);
2363 // If this is a splat of an undef, shuffling it is also undef.
2364 if (Splat && Splat.isUndef())
2365 return getUNDEF(VT);
2366
2367 bool SameNumElts =
2368 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2369
2370 // We only have a splat which can skip shuffles if there is a splatted
2371 // value and no undef lanes rearranged by the shuffle.
2372 if (Splat && UndefElements.none()) {
2373 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2374 // number of elements match or the value splatted is a zero constant.
2375 if (SameNumElts || isNullConstant(Splat))
2376 return N1;
2377 }
2378
2379 // If the shuffle itself creates a splat, build the vector directly.
2380 if (AllSame && SameNumElts) {
2381 EVT BuildVT = BV->getValueType(0);
2382 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2383 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2384
2385 // We may have jumped through bitcasts, so the type of the
2386 // BUILD_VECTOR may not match the type of the shuffle.
2387 if (BuildVT != VT)
2388 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2389 return NewBV;
2390 }
2391 }
2392 }
2393
2394 SDVTList VTs = getVTList(VT);
2396 SDValue Ops[2] = { N1, N2 };
2398 for (int i = 0; i != NElts; ++i)
2399 ID.AddInteger(MaskVec[i]);
2400
2401 void* IP = nullptr;
2402 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2403 return SDValue(E, 0);
2404
2405 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2406 // SDNode doesn't have access to it. This memory will be "leaked" when
2407 // the node is deallocated, but recovered when the NodeAllocator is released.
2408 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2409 llvm::copy(MaskVec, MaskAlloc);
2410
2411 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2412 dl.getDebugLoc(), MaskAlloc);
2413 createOperands(N, Ops);
2414
2415 CSEMap.InsertNode(N, IP);
2416 InsertNode(N);
2417 SDValue V = SDValue(N, 0);
2418 NewSDValueDbgMsg(V, "Creating new node: ", this);
2419 return V;
2420}
2421
2423 EVT VT = SV.getValueType(0);
2424 SmallVector<int, 8> MaskVec(SV.getMask());
2426
2427 SDValue Op0 = SV.getOperand(0);
2428 SDValue Op1 = SV.getOperand(1);
2429 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2430}
2431
2433 SDVTList VTs = getVTList(VT);
2435 AddNodeIDNode(ID, ISD::Register, VTs, {});
2436 ID.AddInteger(Reg.id());
2437 void *IP = nullptr;
2438 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2439 return SDValue(E, 0);
2440
2441 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2442 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2443 CSEMap.InsertNode(N, IP);
2444 InsertNode(N);
2445 return SDValue(N, 0);
2446}
2447
2450 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2451 ID.AddPointer(RegMask);
2452 void *IP = nullptr;
2453 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2454 return SDValue(E, 0);
2455
2456 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2457 CSEMap.InsertNode(N, IP);
2458 InsertNode(N);
2459 return SDValue(N, 0);
2460}
2461
2463 MCSymbol *Label) {
2464 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2465}
2466
2467SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2468 SDValue Root, MCSymbol *Label) {
2470 SDValue Ops[] = { Root };
2471 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2472 ID.AddPointer(Label);
2473 void *IP = nullptr;
2474 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2475 return SDValue(E, 0);
2476
2477 auto *N =
2478 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2479 createOperands(N, Ops);
2480
2481 CSEMap.InsertNode(N, IP);
2482 InsertNode(N);
2483 return SDValue(N, 0);
2484}
2485
2487 int64_t Offset, bool isTarget,
2488 unsigned TargetFlags) {
2489 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2490 SDVTList VTs = getVTList(VT);
2491
2493 AddNodeIDNode(ID, Opc, VTs, {});
2494 ID.AddPointer(BA);
2495 ID.AddInteger(Offset);
2496 ID.AddInteger(TargetFlags);
2497 void *IP = nullptr;
2498 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2499 return SDValue(E, 0);
2500
2501 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2502 CSEMap.InsertNode(N, IP);
2503 InsertNode(N);
2504 return SDValue(N, 0);
2505}
2506
2509 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2510 ID.AddPointer(V);
2511
2512 void *IP = nullptr;
2513 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2514 return SDValue(E, 0);
2515
2516 auto *N = newSDNode<SrcValueSDNode>(V);
2517 CSEMap.InsertNode(N, IP);
2518 InsertNode(N);
2519 return SDValue(N, 0);
2520}
2521
2524 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2525 ID.AddPointer(MD);
2526
2527 void *IP = nullptr;
2528 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2529 return SDValue(E, 0);
2530
2531 auto *N = newSDNode<MDNodeSDNode>(MD);
2532 CSEMap.InsertNode(N, IP);
2533 InsertNode(N);
2534 return SDValue(N, 0);
2535}
2536
2538 if (VT == V.getValueType())
2539 return V;
2540
2541 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2542}
2543
2545 unsigned SrcAS, unsigned DestAS) {
2546 SDVTList VTs = getVTList(VT);
2547 SDValue Ops[] = {Ptr};
2550 ID.AddInteger(SrcAS);
2551 ID.AddInteger(DestAS);
2552
2553 void *IP = nullptr;
2554 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2555 return SDValue(E, 0);
2556
2557 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2558 VTs, SrcAS, DestAS);
2559 createOperands(N, Ops);
2560
2561 CSEMap.InsertNode(N, IP);
2562 InsertNode(N);
2563 return SDValue(N, 0);
2564}
2565
2567 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2568}
2569
2571 bool PoisonOnly) {
2572 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, PoisonOnly))
2573 return V;
2574 return getFreeze(V);
2575}
2576
2577/// getShiftAmountOperand - Return the specified value casted to
2578/// the target's desired shift amount type.
2580 EVT OpTy = Op.getValueType();
2581 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2582 if (OpTy == ShTy || OpTy.isVector()) return Op;
2583
2584 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2585}
2586
2588 SDLoc dl(Node);
2590 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2591 EVT VT = Node->getValueType(0);
2592 SDValue Tmp1 = Node->getOperand(0);
2593 SDValue Tmp2 = Node->getOperand(1);
2594 const MaybeAlign MA(Node->getConstantOperandVal(3));
2595
2596 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2597 Tmp2, MachinePointerInfo(V));
2598 SDValue VAList = VAListLoad;
2599
2600 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2601 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2602 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2603
2604 VAList = getNode(
2605 ISD::AND, dl, VAList.getValueType(), VAList,
2606 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2607 }
2608
2609 // Increment the pointer, VAList, to the next vaarg
2610 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2611 getConstant(getDataLayout().getTypeAllocSize(
2612 VT.getTypeForEVT(*getContext())),
2613 dl, VAList.getValueType()));
2614 // Store the incremented VAList to the legalized pointer
2615 Tmp1 =
2616 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2617 // Load the actual argument out of the pointer VAList
2618 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2619}
2620
2622 SDLoc dl(Node);
2624 // This defaults to loading a pointer from the input and storing it to the
2625 // output, returning the chain.
2626 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2627 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2628 SDValue Tmp1 =
2629 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2630 Node->getOperand(2), MachinePointerInfo(VS));
2631 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2632 MachinePointerInfo(VD));
2633}
2634
2636 const DataLayout &DL = getDataLayout();
2637 Type *Ty = VT.getTypeForEVT(*getContext());
2638 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2639
2640 if (TLI->isTypeLegal(VT) || !VT.isVector())
2641 return RedAlign;
2642
2643 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2644 const Align StackAlign = TFI->getStackAlign();
2645
2646 // See if we can choose a smaller ABI alignment in cases where it's an
2647 // illegal vector type that will get broken down.
2648 if (RedAlign > StackAlign) {
2649 EVT IntermediateVT;
2650 MVT RegisterVT;
2651 unsigned NumIntermediates;
2652 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2653 NumIntermediates, RegisterVT);
2654 Ty = IntermediateVT.getTypeForEVT(*getContext());
2655 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2656 if (RedAlign2 < RedAlign)
2657 RedAlign = RedAlign2;
2658
2659 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2660 // If the stack is not realignable, the alignment should be limited to the
2661 // StackAlignment
2662 RedAlign = std::min(RedAlign, StackAlign);
2663 }
2664
2665 return RedAlign;
2666}
2667
2669 MachineFrameInfo &MFI = MF->getFrameInfo();
2670 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2671 int StackID = 0;
2672 if (Bytes.isScalable())
2673 StackID = TFI->getStackIDForScalableVectors();
2674 // The stack id gives an indication of whether the object is scalable or
2675 // not, so it's safe to pass in the minimum size here.
2676 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2677 false, nullptr, StackID);
2678 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2679}
2680
2682 Type *Ty = VT.getTypeForEVT(*getContext());
2683 Align StackAlign =
2684 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2685 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2686}
2687
2689 TypeSize VT1Size = VT1.getStoreSize();
2690 TypeSize VT2Size = VT2.getStoreSize();
2691 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2692 "Don't know how to choose the maximum size when creating a stack "
2693 "temporary");
2694 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2695 ? VT1Size
2696 : VT2Size;
2697
2698 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2699 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2700 const DataLayout &DL = getDataLayout();
2701 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2702 return CreateStackTemporary(Bytes, Align);
2703}
2704
2706 ISD::CondCode Cond, const SDLoc &dl,
2707 SDNodeFlags Flags) {
2708 EVT OpVT = N1.getValueType();
2709
2710 auto GetUndefBooleanConstant = [&]() {
2711 if (VT.getScalarType() == MVT::i1 ||
2712 TLI->getBooleanContents(OpVT) ==
2714 return getUNDEF(VT);
2715 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2716 // so we cannot use getUNDEF(). Return zero instead.
2717 return getConstant(0, dl, VT);
2718 };
2719
2720 // These setcc operations always fold.
2721 switch (Cond) {
2722 default: break;
2723 case ISD::SETFALSE:
2724 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2725 case ISD::SETTRUE:
2726 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2727
2728 case ISD::SETOEQ:
2729 case ISD::SETOGT:
2730 case ISD::SETOGE:
2731 case ISD::SETOLT:
2732 case ISD::SETOLE:
2733 case ISD::SETONE:
2734 case ISD::SETO:
2735 case ISD::SETUO:
2736 case ISD::SETUEQ:
2737 case ISD::SETUNE:
2738 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2739 break;
2740 }
2741
2742 if (OpVT.isInteger()) {
2743 // For EQ and NE, we can always pick a value for the undef to make the
2744 // predicate pass or fail, so we can return undef.
2745 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2746 // icmp eq/ne X, undef -> undef.
2747 if ((N1.isUndef() || N2.isUndef()) &&
2748 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2749 return GetUndefBooleanConstant();
2750
2751 // If both operands are undef, we can return undef for int comparison.
2752 // icmp undef, undef -> undef.
2753 if (N1.isUndef() && N2.isUndef())
2754 return GetUndefBooleanConstant();
2755
2756 // icmp X, X -> true/false
2757 // icmp X, undef -> true/false because undef could be X.
2758 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2759 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2760 }
2761
2763 const APInt &C2 = N2C->getAPIntValue();
2765 const APInt &C1 = N1C->getAPIntValue();
2766
2768 dl, VT, OpVT);
2769 }
2770 }
2771
2772 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2773 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2774
2775 if (N1CFP && N2CFP) {
2776 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2777 switch (Cond) {
2778 default: break;
2779 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2780 return GetUndefBooleanConstant();
2781 [[fallthrough]];
2782 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2783 OpVT);
2784 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2785 return GetUndefBooleanConstant();
2786 [[fallthrough]];
2788 R==APFloat::cmpLessThan, dl, VT,
2789 OpVT);
2790 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2791 return GetUndefBooleanConstant();
2792 [[fallthrough]];
2793 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2794 OpVT);
2795 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2796 return GetUndefBooleanConstant();
2797 [[fallthrough]];
2799 VT, OpVT);
2800 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2801 return GetUndefBooleanConstant();
2802 [[fallthrough]];
2804 R==APFloat::cmpEqual, dl, VT,
2805 OpVT);
2806 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2807 return GetUndefBooleanConstant();
2808 [[fallthrough]];
2810 R==APFloat::cmpEqual, dl, VT, OpVT);
2811 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2812 OpVT);
2813 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2814 OpVT);
2816 R==APFloat::cmpEqual, dl, VT,
2817 OpVT);
2818 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2819 OpVT);
2821 R==APFloat::cmpLessThan, dl, VT,
2822 OpVT);
2824 R==APFloat::cmpUnordered, dl, VT,
2825 OpVT);
2827 VT, OpVT);
2828 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2829 OpVT);
2830 }
2831 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2832 // Ensure that the constant occurs on the RHS.
2834 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2835 return SDValue();
2836 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2837 /*IsSignaling=*/false, Flags);
2838 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2839 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2840 // If an operand is known to be a nan (or undef that could be a nan), we can
2841 // fold it.
2842 // Choosing NaN for the undef will always make unordered comparison succeed
2843 // and ordered comparison fails.
2844 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2845 switch (ISD::getUnorderedFlavor(Cond)) {
2846 default:
2847 llvm_unreachable("Unknown flavor!");
2848 case 0: // Known false.
2849 return getBoolConstant(false, dl, VT, OpVT);
2850 case 1: // Known true.
2851 return getBoolConstant(true, dl, VT, OpVT);
2852 case 2: // Undefined.
2853 return GetUndefBooleanConstant();
2854 }
2855 }
2856
2857 // Could not fold it.
2858 return SDValue();
2859}
2860
2861/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2862/// use this predicate to simplify operations downstream.
2864 unsigned BitWidth = Op.getScalarValueSizeInBits();
2866}
2867
2868// TODO: Should have argument to specify if sign bit of nan is ignorable.
2870 if (Depth >= MaxRecursionDepth)
2871 return false; // Limit search depth.
2872
2873 unsigned Opc = Op.getOpcode();
2874 switch (Opc) {
2875 case ISD::FABS:
2876 return true;
2877 case ISD::AssertNoFPClass: {
2878 FPClassTest NoFPClass =
2879 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2880
2881 const FPClassTest TestMask = fcNan | fcNegative;
2882 return (NoFPClass & TestMask) == TestMask;
2883 }
2884 case ISD::ARITH_FENCE:
2885 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2886 case ISD::FEXP:
2887 case ISD::FEXP2:
2888 case ISD::FEXP10:
2889 return Op->getFlags().hasNoNaNs();
2890 case ISD::FMINNUM:
2891 case ISD::FMINNUM_IEEE:
2892 case ISD::FMINIMUM:
2893 case ISD::FMINIMUMNUM:
2894 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2895 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2896 case ISD::FMAXNUM:
2897 case ISD::FMAXNUM_IEEE:
2898 case ISD::FMAXIMUM:
2899 case ISD::FMAXIMUMNUM:
2900 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2901 // is sufficient.
2902 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2903 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2904 default:
2905 return false;
2906 }
2907
2908 llvm_unreachable("covered opcode switch");
2909}
2910
2911/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2912/// this predicate to simplify operations downstream. Mask is known to be zero
2913/// for bits that V cannot have.
2915 unsigned Depth) const {
2916 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2917}
2918
2919/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2920/// DemandedElts. We use this predicate to simplify operations downstream.
2921/// Mask is known to be zero for bits that V cannot have.
2923 const APInt &DemandedElts,
2924 unsigned Depth) const {
2925 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2926}
2927
2928/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2929/// DemandedElts. We use this predicate to simplify operations downstream.
2931 unsigned Depth /* = 0 */) const {
2932 return computeKnownBits(V, DemandedElts, Depth).isZero();
2933}
2934
2935/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2937 unsigned Depth) const {
2938 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2939}
2940
2942 const APInt &DemandedElts,
2943 unsigned Depth) const {
2944 EVT VT = Op.getValueType();
2945 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2946
2947 unsigned NumElts = VT.getVectorNumElements();
2948 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2949
2950 APInt KnownZeroElements = APInt::getZero(NumElts);
2951 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2952 if (!DemandedElts[EltIdx])
2953 continue; // Don't query elements that are not demanded.
2954 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2955 if (MaskedVectorIsZero(Op, Mask, Depth))
2956 KnownZeroElements.setBit(EltIdx);
2957 }
2958 return KnownZeroElements;
2959}
2960
2961/// isSplatValue - Return true if the vector V has the same value
2962/// across all DemandedElts. For scalable vectors, we don't know the
2963/// number of lanes at compile time. Instead, we use a 1 bit APInt
2964/// to represent a conservative value for all lanes; that is, that
2965/// one bit value is implicitly splatted across all lanes.
2966bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2967 APInt &UndefElts, unsigned Depth) const {
2968 unsigned Opcode = V.getOpcode();
2969 EVT VT = V.getValueType();
2970 assert(VT.isVector() && "Vector type expected");
2971 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2972 "scalable demanded bits are ignored");
2973
2974 if (!DemandedElts)
2975 return false; // No demanded elts, better to assume we don't know anything.
2976
2977 if (Depth >= MaxRecursionDepth)
2978 return false; // Limit search depth.
2979
2980 // Deal with some common cases here that work for both fixed and scalable
2981 // vector types.
2982 switch (Opcode) {
2983 case ISD::SPLAT_VECTOR:
2984 UndefElts = V.getOperand(0).isUndef()
2985 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2986 : APInt(DemandedElts.getBitWidth(), 0);
2987 return true;
2988 case ISD::ADD:
2989 case ISD::SUB:
2990 case ISD::AND:
2991 case ISD::XOR:
2992 case ISD::OR: {
2993 APInt UndefLHS, UndefRHS;
2994 SDValue LHS = V.getOperand(0);
2995 SDValue RHS = V.getOperand(1);
2996 // Only recognize splats with the same demanded undef elements for both
2997 // operands, otherwise we might fail to handle binop-specific undef
2998 // handling.
2999 // e.g. (and undef, 0) -> 0 etc.
3000 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
3001 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
3002 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
3003 UndefElts = UndefLHS | UndefRHS;
3004 return true;
3005 }
3006 return false;
3007 }
3008 case ISD::ABS:
3009 case ISD::TRUNCATE:
3010 case ISD::SIGN_EXTEND:
3011 case ISD::ZERO_EXTEND:
3012 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3013 default:
3014 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3015 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3016 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3017 Depth);
3018 break;
3019 }
3020
3021 // We don't support other cases than those above for scalable vectors at
3022 // the moment.
3023 if (VT.isScalableVector())
3024 return false;
3025
3026 unsigned NumElts = VT.getVectorNumElements();
3027 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3028 UndefElts = APInt::getZero(NumElts);
3029
3030 switch (Opcode) {
3031 case ISD::BUILD_VECTOR: {
3032 SDValue Scl;
3033 for (unsigned i = 0; i != NumElts; ++i) {
3034 SDValue Op = V.getOperand(i);
3035 if (Op.isUndef()) {
3036 UndefElts.setBit(i);
3037 continue;
3038 }
3039 if (!DemandedElts[i])
3040 continue;
3041 if (Scl && Scl != Op)
3042 return false;
3043 Scl = Op;
3044 }
3045 return true;
3046 }
3047 case ISD::VECTOR_SHUFFLE: {
3048 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3049 APInt DemandedLHS = APInt::getZero(NumElts);
3050 APInt DemandedRHS = APInt::getZero(NumElts);
3051 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3052 for (int i = 0; i != (int)NumElts; ++i) {
3053 int M = Mask[i];
3054 if (M < 0) {
3055 UndefElts.setBit(i);
3056 continue;
3057 }
3058 if (!DemandedElts[i])
3059 continue;
3060 if (M < (int)NumElts)
3061 DemandedLHS.setBit(M);
3062 else
3063 DemandedRHS.setBit(M - NumElts);
3064 }
3065
3066 // If we aren't demanding either op, assume there's no splat.
3067 // If we are demanding both ops, assume there's no splat.
3068 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3069 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3070 return false;
3071
3072 // See if the demanded elts of the source op is a splat or we only demand
3073 // one element, which should always be a splat.
3074 // TODO: Handle source ops splats with undefs.
3075 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3076 APInt SrcUndefs;
3077 return (SrcElts.popcount() == 1) ||
3078 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3079 (SrcElts & SrcUndefs).isZero());
3080 };
3081 if (!DemandedLHS.isZero())
3082 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3083 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3084 }
3086 // Offset the demanded elts by the subvector index.
3087 SDValue Src = V.getOperand(0);
3088 // We don't support scalable vectors at the moment.
3089 if (Src.getValueType().isScalableVector())
3090 return false;
3091 uint64_t Idx = V.getConstantOperandVal(1);
3092 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3093 APInt UndefSrcElts;
3094 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3095 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3096 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3097 return true;
3098 }
3099 break;
3100 }
3104 // Widen the demanded elts by the src element count.
3105 SDValue Src = V.getOperand(0);
3106 // We don't support scalable vectors at the moment.
3107 if (Src.getValueType().isScalableVector())
3108 return false;
3109 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3110 APInt UndefSrcElts;
3111 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3112 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3113 UndefElts = UndefSrcElts.trunc(NumElts);
3114 return true;
3115 }
3116 break;
3117 }
3118 case ISD::BITCAST: {
3119 SDValue Src = V.getOperand(0);
3120 EVT SrcVT = Src.getValueType();
3121 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3122 unsigned BitWidth = VT.getScalarSizeInBits();
3123
3124 // Ignore bitcasts from unsupported types.
3125 // TODO: Add fp support?
3126 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3127 break;
3128
3129 // Bitcast 'small element' vector to 'large element' vector.
3130 if ((BitWidth % SrcBitWidth) == 0) {
3131 // See if each sub element is a splat.
3132 unsigned Scale = BitWidth / SrcBitWidth;
3133 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3134 APInt ScaledDemandedElts =
3135 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3136 for (unsigned I = 0; I != Scale; ++I) {
3137 APInt SubUndefElts;
3138 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3139 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3140 SubDemandedElts &= ScaledDemandedElts;
3141 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3142 return false;
3143 // TODO: Add support for merging sub undef elements.
3144 if (!SubUndefElts.isZero())
3145 return false;
3146 }
3147 return true;
3148 }
3149 break;
3150 }
3151 }
3152
3153 return false;
3154}
3155
3156/// Helper wrapper to main isSplatValue function.
3157bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3158 EVT VT = V.getValueType();
3159 assert(VT.isVector() && "Vector type expected");
3160
3161 APInt UndefElts;
3162 // Since the number of lanes in a scalable vector is unknown at compile time,
3163 // we track one bit which is implicitly broadcast to all lanes. This means
3164 // that all lanes in a scalable vector are considered demanded.
3165 APInt DemandedElts
3167 return isSplatValue(V, DemandedElts, UndefElts) &&
3168 (AllowUndefs || !UndefElts);
3169}
3170
3173
3174 EVT VT = V.getValueType();
3175 unsigned Opcode = V.getOpcode();
3176 switch (Opcode) {
3177 default: {
3178 APInt UndefElts;
3179 // Since the number of lanes in a scalable vector is unknown at compile time,
3180 // we track one bit which is implicitly broadcast to all lanes. This means
3181 // that all lanes in a scalable vector are considered demanded.
3182 APInt DemandedElts
3184
3185 if (isSplatValue(V, DemandedElts, UndefElts)) {
3186 if (VT.isScalableVector()) {
3187 // DemandedElts and UndefElts are ignored for scalable vectors, since
3188 // the only supported cases are SPLAT_VECTOR nodes.
3189 SplatIdx = 0;
3190 } else {
3191 // Handle case where all demanded elements are UNDEF.
3192 if (DemandedElts.isSubsetOf(UndefElts)) {
3193 SplatIdx = 0;
3194 return getUNDEF(VT);
3195 }
3196 SplatIdx = (UndefElts & DemandedElts).countr_one();
3197 }
3198 return V;
3199 }
3200 break;
3201 }
3202 case ISD::SPLAT_VECTOR:
3203 SplatIdx = 0;
3204 return V;
3205 case ISD::VECTOR_SHUFFLE: {
3206 assert(!VT.isScalableVector());
3207 // Check if this is a shuffle node doing a splat.
3208 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3209 // getTargetVShiftNode currently struggles without the splat source.
3210 auto *SVN = cast<ShuffleVectorSDNode>(V);
3211 if (!SVN->isSplat())
3212 break;
3213 int Idx = SVN->getSplatIndex();
3214 int NumElts = V.getValueType().getVectorNumElements();
3215 SplatIdx = Idx % NumElts;
3216 return V.getOperand(Idx / NumElts);
3217 }
3218 }
3219
3220 return SDValue();
3221}
3222
3224 int SplatIdx;
3225 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3226 EVT SVT = SrcVector.getValueType().getScalarType();
3227 EVT LegalSVT = SVT;
3228 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3229 if (!SVT.isInteger())
3230 return SDValue();
3231 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3232 if (LegalSVT.bitsLT(SVT))
3233 return SDValue();
3234 }
3235 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3236 }
3237 return SDValue();
3238}
3239
3240std::optional<ConstantRange>
3242 unsigned Depth) const {
3243 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3244 V.getOpcode() == ISD::SRA) &&
3245 "Unknown shift node");
3246 // Shifting more than the bitwidth is not valid.
3247 unsigned BitWidth = V.getScalarValueSizeInBits();
3248
3249 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3250 const APInt &ShAmt = Cst->getAPIntValue();
3251 if (ShAmt.uge(BitWidth))
3252 return std::nullopt;
3253 return ConstantRange(ShAmt);
3254 }
3255
3256 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3257 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3258 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3259 if (!DemandedElts[i])
3260 continue;
3261 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3262 if (!SA) {
3263 MinAmt = MaxAmt = nullptr;
3264 break;
3265 }
3266 const APInt &ShAmt = SA->getAPIntValue();
3267 if (ShAmt.uge(BitWidth))
3268 return std::nullopt;
3269 if (!MinAmt || MinAmt->ugt(ShAmt))
3270 MinAmt = &ShAmt;
3271 if (!MaxAmt || MaxAmt->ult(ShAmt))
3272 MaxAmt = &ShAmt;
3273 }
3274 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3275 "Failed to find matching min/max shift amounts");
3276 if (MinAmt && MaxAmt)
3277 return ConstantRange(*MinAmt, *MaxAmt + 1);
3278 }
3279
3280 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3281 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3282 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3283 if (KnownAmt.getMaxValue().ult(BitWidth))
3284 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3285
3286 return std::nullopt;
3287}
3288
3289std::optional<unsigned>
3291 unsigned Depth) const {
3292 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3293 V.getOpcode() == ISD::SRA) &&
3294 "Unknown shift node");
3295 if (std::optional<ConstantRange> AmtRange =
3296 getValidShiftAmountRange(V, DemandedElts, Depth))
3297 if (const APInt *ShAmt = AmtRange->getSingleElement())
3298 return ShAmt->getZExtValue();
3299 return std::nullopt;
3300}
3301
3302std::optional<unsigned>
3304 APInt DemandedElts = getDemandAllEltsMask(V);
3305 return getValidShiftAmount(V, DemandedElts, Depth);
3306}
3307
3308std::optional<unsigned>
3310 unsigned Depth) const {
3311 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3312 V.getOpcode() == ISD::SRA) &&
3313 "Unknown shift node");
3314 if (std::optional<ConstantRange> AmtRange =
3315 getValidShiftAmountRange(V, DemandedElts, Depth))
3316 return AmtRange->getUnsignedMin().getZExtValue();
3317 return std::nullopt;
3318}
3319
3320std::optional<unsigned>
3322 APInt DemandedElts = getDemandAllEltsMask(V);
3323 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3324}
3325
3326std::optional<unsigned>
3328 unsigned Depth) const {
3329 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3330 V.getOpcode() == ISD::SRA) &&
3331 "Unknown shift node");
3332 if (std::optional<ConstantRange> AmtRange =
3333 getValidShiftAmountRange(V, DemandedElts, Depth))
3334 return AmtRange->getUnsignedMax().getZExtValue();
3335 return std::nullopt;
3336}
3337
3338std::optional<unsigned>
3340 APInt DemandedElts = getDemandAllEltsMask(V);
3341 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3342}
3343
3344/// Determine which bits of Op are known to be either zero or one and return
3345/// them in Known. For vectors, the known bits are those that are shared by
3346/// every vector element.
3348 APInt DemandedElts = getDemandAllEltsMask(Op);
3349 return computeKnownBits(Op, DemandedElts, Depth);
3350}
3351
3352/// Determine which bits of Op are known to be either zero or one and return
3353/// them in Known. The DemandedElts argument allows us to only collect the known
3354/// bits that are shared by the requested vector elements.
3356 unsigned Depth) const {
3357 unsigned BitWidth = Op.getScalarValueSizeInBits();
3358
3359 KnownBits Known(BitWidth); // Don't know anything.
3360
3361 if (auto OptAPInt = Op->bitcastToAPInt()) {
3362 // We know all of the bits for a constant!
3363 return KnownBits::makeConstant(*std::move(OptAPInt));
3364 }
3365
3366 if (Depth >= MaxRecursionDepth)
3367 return Known; // Limit search depth.
3368
3369 KnownBits Known2;
3370 unsigned NumElts = DemandedElts.getBitWidth();
3371 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3372 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3373 assert((!Op.getValueType().isFixedLengthVector() ||
3374 NumElts == Op.getValueType().getVectorNumElements()) &&
3375 "Unexpected vector size");
3376
3377 if (!DemandedElts)
3378 return Known; // No demanded elts, better to assume we don't know anything.
3379
3380 unsigned Opcode = Op.getOpcode();
3381 switch (Opcode) {
3382 case ISD::MERGE_VALUES:
3383 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3384 Depth + 1);
3385 case ISD::SPLAT_VECTOR: {
3386 SDValue SrcOp = Op.getOperand(0);
3387 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3388 "Expected SPLAT_VECTOR implicit truncation");
3389 // Implicitly truncate the bits to match the official semantics of
3390 // SPLAT_VECTOR.
3391 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
3392 break;
3393 }
3395 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3396 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3397 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3398 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3399 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3400 }
3401 break;
3402 }
3403 case ISD::STEP_VECTOR: {
3404 const APInt &Step = Op.getConstantOperandAPInt(0);
3405
3406 if (Step.isPowerOf2())
3407 Known.Zero.setLowBits(Step.logBase2());
3408
3410
3411 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3412 break;
3413 const APInt MinNumElts =
3414 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3415
3416 bool Overflow;
3417 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3419 .umul_ov(MinNumElts, Overflow);
3420 if (Overflow)
3421 break;
3422
3423 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3424 if (Overflow)
3425 break;
3426
3427 Known.Zero.setHighBits(MaxValue.countl_zero());
3428 break;
3429 }
3430 case ISD::BUILD_VECTOR:
3431 assert(!Op.getValueType().isScalableVector());
3432 // Collect the known bits that are shared by every demanded vector element.
3433 Known.setAllConflict();
3434 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3435 if (!DemandedElts[i])
3436 continue;
3437
3438 SDValue SrcOp = Op.getOperand(i);
3439 Known2 = computeKnownBits(SrcOp, Depth + 1);
3440
3441 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3442 if (SrcOp.getValueSizeInBits() != BitWidth) {
3443 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3444 "Expected BUILD_VECTOR implicit truncation");
3445 Known2 = Known2.trunc(BitWidth);
3446 }
3447
3448 // Known bits are the values that are shared by every demanded element.
3449 Known = Known.intersectWith(Known2);
3450
3451 // If we don't know any bits, early out.
3452 if (Known.isUnknown())
3453 break;
3454 }
3455 break;
3456 case ISD::VECTOR_COMPRESS: {
3457 SDValue Vec = Op.getOperand(0);
3458 SDValue PassThru = Op.getOperand(2);
3459 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3460 // If we don't know any bits, early out.
3461 if (Known.isUnknown())
3462 break;
3463 Known2 = computeKnownBits(Vec, Depth + 1);
3464 Known = Known.intersectWith(Known2);
3465 break;
3466 }
3467 case ISD::VECTOR_SHUFFLE: {
3468 assert(!Op.getValueType().isScalableVector());
3469 // Collect the known bits that are shared by every vector element referenced
3470 // by the shuffle.
3471 APInt DemandedLHS, DemandedRHS;
3473 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3474 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3475 DemandedLHS, DemandedRHS))
3476 break;
3477
3478 // Known bits are the values that are shared by every demanded element.
3479 Known.setAllConflict();
3480 if (!!DemandedLHS) {
3481 SDValue LHS = Op.getOperand(0);
3482 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3483 Known = Known.intersectWith(Known2);
3484 }
3485 // If we don't know any bits, early out.
3486 if (Known.isUnknown())
3487 break;
3488 if (!!DemandedRHS) {
3489 SDValue RHS = Op.getOperand(1);
3490 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3491 Known = Known.intersectWith(Known2);
3492 }
3493 break;
3494 }
3495 case ISD::VSCALE: {
3497 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3498 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
3499 break;
3500 }
3501 case ISD::CONCAT_VECTORS: {
3502 if (Op.getValueType().isScalableVector())
3503 break;
3504 // Split DemandedElts and test each of the demanded subvectors.
3505 Known.setAllConflict();
3506 EVT SubVectorVT = Op.getOperand(0).getValueType();
3507 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3508 unsigned NumSubVectors = Op.getNumOperands();
3509 for (unsigned i = 0; i != NumSubVectors; ++i) {
3510 APInt DemandedSub =
3511 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3512 if (!!DemandedSub) {
3513 SDValue Sub = Op.getOperand(i);
3514 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3515 Known = Known.intersectWith(Known2);
3516 }
3517 // If we don't know any bits, early out.
3518 if (Known.isUnknown())
3519 break;
3520 }
3521 break;
3522 }
3523 case ISD::INSERT_SUBVECTOR: {
3524 if (Op.getValueType().isScalableVector())
3525 break;
3526 // Demand any elements from the subvector and the remainder from the src its
3527 // inserted into.
3528 SDValue Src = Op.getOperand(0);
3529 SDValue Sub = Op.getOperand(1);
3530 uint64_t Idx = Op.getConstantOperandVal(2);
3531 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3532 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3533 APInt DemandedSrcElts = DemandedElts;
3534 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3535
3536 Known.setAllConflict();
3537 if (!!DemandedSubElts) {
3538 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3539 if (Known.isUnknown())
3540 break; // early-out.
3541 }
3542 if (!!DemandedSrcElts) {
3543 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3544 Known = Known.intersectWith(Known2);
3545 }
3546 break;
3547 }
3549 // Offset the demanded elts by the subvector index.
3550 SDValue Src = Op.getOperand(0);
3551
3552 APInt DemandedSrcElts;
3553 if (Src.getValueType().isScalableVector())
3554 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3555 else {
3556 uint64_t Idx = Op.getConstantOperandVal(1);
3557 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3558 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3559 }
3560 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3561 break;
3562 }
3563 case ISD::SCALAR_TO_VECTOR: {
3564 if (Op.getValueType().isScalableVector())
3565 break;
3566 // We know about scalar_to_vector as much as we know about it source,
3567 // which becomes the first element of otherwise unknown vector.
3568 if (DemandedElts != 1)
3569 break;
3570
3571 SDValue N0 = Op.getOperand(0);
3572 Known = computeKnownBits(N0, Depth + 1);
3573 if (N0.getValueSizeInBits() != BitWidth)
3574 Known = Known.trunc(BitWidth);
3575
3576 break;
3577 }
3578 case ISD::BITCAST: {
3579 if (Op.getValueType().isScalableVector())
3580 break;
3581
3582 SDValue N0 = Op.getOperand(0);
3583 EVT SubVT = N0.getValueType();
3584 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3585
3586 // Ignore bitcasts from unsupported types.
3587 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3588 break;
3589
3590 // Fast handling of 'identity' bitcasts.
3591 if (BitWidth == SubBitWidth) {
3592 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3593 break;
3594 }
3595
3596 bool IsLE = getDataLayout().isLittleEndian();
3597
3598 // Bitcast 'small element' vector to 'large element' scalar/vector.
3599 if ((BitWidth % SubBitWidth) == 0) {
3600 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3601
3602 // Collect known bits for the (larger) output by collecting the known
3603 // bits from each set of sub elements and shift these into place.
3604 // We need to separately call computeKnownBits for each set of
3605 // sub elements as the knownbits for each is likely to be different.
3606 unsigned SubScale = BitWidth / SubBitWidth;
3607 APInt SubDemandedElts(NumElts * SubScale, 0);
3608 for (unsigned i = 0; i != NumElts; ++i)
3609 if (DemandedElts[i])
3610 SubDemandedElts.setBit(i * SubScale);
3611
3612 for (unsigned i = 0; i != SubScale; ++i) {
3613 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3614 Depth + 1);
3615 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3616 Known.insertBits(Known2, SubBitWidth * Shifts);
3617 }
3618 }
3619
3620 // Bitcast 'large element' scalar/vector to 'small element' vector.
3621 if ((SubBitWidth % BitWidth) == 0) {
3622 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3623
3624 // Collect known bits for the (smaller) output by collecting the known
3625 // bits from the overlapping larger input elements and extracting the
3626 // sub sections we actually care about.
3627 unsigned SubScale = SubBitWidth / BitWidth;
3628 APInt SubDemandedElts =
3629 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3630 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3631
3632 Known.setAllConflict();
3633 for (unsigned i = 0; i != NumElts; ++i)
3634 if (DemandedElts[i]) {
3635 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3636 unsigned Offset = (Shifts % SubScale) * BitWidth;
3637 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3638 // If we don't know any bits, early out.
3639 if (Known.isUnknown())
3640 break;
3641 }
3642 }
3643 break;
3644 }
3645 case ISD::AND:
3646 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3647 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3648
3649 Known &= Known2;
3650 break;
3651 case ISD::OR:
3652 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3653 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3654
3655 Known |= Known2;
3656 break;
3657 case ISD::XOR:
3658 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3659 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3660
3661 Known ^= Known2;
3662 break;
3663 case ISD::MUL: {
3664 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3665 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3666 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3667 // TODO: SelfMultiply can be poison, but not undef.
3668 if (SelfMultiply)
3669 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3670 Op.getOperand(0), DemandedElts, false, Depth + 1);
3671 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3672
3673 // If the multiplication is known not to overflow, the product of a number
3674 // with itself is non-negative. Only do this if we didn't already computed
3675 // the opposite value for the sign bit.
3676 if (Op->getFlags().hasNoSignedWrap() &&
3677 Op.getOperand(0) == Op.getOperand(1) &&
3678 !Known.isNegative())
3679 Known.makeNonNegative();
3680 break;
3681 }
3682 case ISD::MULHU: {
3683 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3684 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3685 Known = KnownBits::mulhu(Known, Known2);
3686 break;
3687 }
3688 case ISD::MULHS: {
3689 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3690 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3691 Known = KnownBits::mulhs(Known, Known2);
3692 break;
3693 }
3694 case ISD::ABDU: {
3695 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3696 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3697 Known = KnownBits::abdu(Known, Known2);
3698 break;
3699 }
3700 case ISD::ABDS: {
3701 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3702 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3703 Known = KnownBits::abds(Known, Known2);
3704 unsigned SignBits1 =
3705 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3706 if (SignBits1 == 1)
3707 break;
3708 unsigned SignBits0 =
3709 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3710 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3711 break;
3712 }
3713 case ISD::UMUL_LOHI: {
3714 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3715 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3716 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3717 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3718 if (Op.getResNo() == 0)
3719 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3720 else
3721 Known = KnownBits::mulhu(Known, Known2);
3722 break;
3723 }
3724 case ISD::SMUL_LOHI: {
3725 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3726 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3727 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3728 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3729 if (Op.getResNo() == 0)
3730 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3731 else
3732 Known = KnownBits::mulhs(Known, Known2);
3733 break;
3734 }
3735 case ISD::AVGFLOORU: {
3736 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3737 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3738 Known = KnownBits::avgFloorU(Known, Known2);
3739 break;
3740 }
3741 case ISD::AVGCEILU: {
3742 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3743 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3744 Known = KnownBits::avgCeilU(Known, Known2);
3745 break;
3746 }
3747 case ISD::AVGFLOORS: {
3748 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3749 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3750 Known = KnownBits::avgFloorS(Known, Known2);
3751 break;
3752 }
3753 case ISD::AVGCEILS: {
3754 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3755 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3756 Known = KnownBits::avgCeilS(Known, Known2);
3757 break;
3758 }
3759 case ISD::SELECT:
3760 case ISD::VSELECT:
3761 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3762 // If we don't know any bits, early out.
3763 if (Known.isUnknown())
3764 break;
3765 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3766
3767 // Only known if known in both the LHS and RHS.
3768 Known = Known.intersectWith(Known2);
3769 break;
3770 case ISD::SELECT_CC:
3771 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3772 // If we don't know any bits, early out.
3773 if (Known.isUnknown())
3774 break;
3775 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3776
3777 // Only known if known in both the LHS and RHS.
3778 Known = Known.intersectWith(Known2);
3779 break;
3780 case ISD::SMULO:
3781 case ISD::UMULO:
3782 if (Op.getResNo() != 1)
3783 break;
3784 // The boolean result conforms to getBooleanContents.
3785 // If we know the result of a setcc has the top bits zero, use this info.
3786 // We know that we have an integer-based boolean since these operations
3787 // are only available for integer.
3788 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3790 BitWidth > 1)
3791 Known.Zero.setBitsFrom(1);
3792 break;
3793 case ISD::SETCC:
3794 case ISD::SETCCCARRY:
3795 case ISD::STRICT_FSETCC:
3796 case ISD::STRICT_FSETCCS: {
3797 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3798 // If we know the result of a setcc has the top bits zero, use this info.
3799 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3801 BitWidth > 1)
3802 Known.Zero.setBitsFrom(1);
3803 break;
3804 }
3805 case ISD::SHL: {
3806 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3807 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3808
3809 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3810 bool NSW = Op->getFlags().hasNoSignedWrap();
3811
3812 bool ShAmtNonZero = Known2.isNonZero();
3813
3814 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3815
3816 // Minimum shift low bits are known zero.
3817 if (std::optional<unsigned> ShMinAmt =
3818 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3819 Known.Zero.setLowBits(*ShMinAmt);
3820 break;
3821 }
3822 case ISD::SRL:
3823 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3824 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3825 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3826 Op->getFlags().hasExact());
3827
3828 // Minimum shift high bits are known zero.
3829 if (std::optional<unsigned> ShMinAmt =
3830 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3831 Known.Zero.setHighBits(*ShMinAmt);
3832 break;
3833 case ISD::SRA:
3834 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3835 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3836 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3837 Op->getFlags().hasExact());
3838 break;
3839 case ISD::ROTL:
3840 case ISD::ROTR:
3841 if (ConstantSDNode *C =
3842 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3843 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3844
3845 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3846
3847 // Canonicalize to ROTR.
3848 if (Opcode == ISD::ROTL && Amt != 0)
3849 Amt = BitWidth - Amt;
3850
3851 Known.Zero = Known.Zero.rotr(Amt);
3852 Known.One = Known.One.rotr(Amt);
3853 }
3854 break;
3855 case ISD::FSHL:
3856 case ISD::FSHR:
3857 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3858 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3859
3860 // For fshl, 0-shift returns the 1st arg.
3861 // For fshr, 0-shift returns the 2nd arg.
3862 if (Amt == 0) {
3863 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3864 DemandedElts, Depth + 1);
3865 break;
3866 }
3867
3868 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3869 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3870 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3871 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3872 if (Opcode == ISD::FSHL) {
3873 Known <<= Amt;
3874 Known2 >>= BitWidth - Amt;
3875 } else {
3876 Known <<= BitWidth - Amt;
3877 Known2 >>= Amt;
3878 }
3879 Known = Known.unionWith(Known2);
3880 }
3881 break;
3882 case ISD::SHL_PARTS:
3883 case ISD::SRA_PARTS:
3884 case ISD::SRL_PARTS: {
3885 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3886
3887 // Collect lo/hi source values and concatenate.
3888 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3889 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3890 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3891 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3892 Known = Known2.concat(Known);
3893
3894 // Collect shift amount.
3895 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3896
3897 if (Opcode == ISD::SHL_PARTS)
3898 Known = KnownBits::shl(Known, Known2);
3899 else if (Opcode == ISD::SRA_PARTS)
3900 Known = KnownBits::ashr(Known, Known2);
3901 else // if (Opcode == ISD::SRL_PARTS)
3902 Known = KnownBits::lshr(Known, Known2);
3903
3904 // TODO: Minimum shift low/high bits are known zero.
3905
3906 if (Op.getResNo() == 0)
3907 Known = Known.extractBits(LoBits, 0);
3908 else
3909 Known = Known.extractBits(HiBits, LoBits);
3910 break;
3911 }
3913 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3914 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3915 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3916 break;
3917 }
3918 case ISD::CTTZ:
3919 case ISD::CTTZ_ZERO_UNDEF: {
3920 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3921 // If we have a known 1, its position is our upper bound.
3922 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3923 unsigned LowBits = llvm::bit_width(PossibleTZ);
3924 Known.Zero.setBitsFrom(LowBits);
3925 break;
3926 }
3927 case ISD::CTLZ:
3928 case ISD::CTLZ_ZERO_UNDEF: {
3929 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3930 // If we have a known 1, its position is our upper bound.
3931 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3932 unsigned LowBits = llvm::bit_width(PossibleLZ);
3933 Known.Zero.setBitsFrom(LowBits);
3934 break;
3935 }
3936 case ISD::CTLS: {
3937 unsigned MinRedundantSignBits =
3938 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3939 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3941 Known = Range.toKnownBits();
3942 break;
3943 }
3944 case ISD::CTPOP: {
3945 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3946 // If we know some of the bits are zero, they can't be one.
3947 unsigned PossibleOnes = Known2.countMaxPopulation();
3948 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3949 break;
3950 }
3951 case ISD::PARITY: {
3952 // Parity returns 0 everywhere but the LSB.
3953 Known.Zero.setBitsFrom(1);
3954 break;
3955 }
3956 case ISD::CLMUL: {
3957 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3958 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3959 Known = KnownBits::clmul(Known, Known2);
3960 break;
3961 }
3962 case ISD::MGATHER:
3963 case ISD::MLOAD: {
3964 ISD::LoadExtType ETy =
3965 (Opcode == ISD::MGATHER)
3966 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3967 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3968 if (ETy == ISD::ZEXTLOAD) {
3969 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3970 KnownBits Known0(MemVT.getScalarSizeInBits());
3971 return Known0.zext(BitWidth);
3972 }
3973 break;
3974 }
3975 case ISD::LOAD: {
3977 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3978 if (ISD::isNON_EXTLoad(LD) && Cst) {
3979 // Determine any common known bits from the loaded constant pool value.
3980 Type *CstTy = Cst->getType();
3981 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3982 !Op.getValueType().isScalableVector()) {
3983 // If its a vector splat, then we can (quickly) reuse the scalar path.
3984 // NOTE: We assume all elements match and none are UNDEF.
3985 if (CstTy->isVectorTy()) {
3986 if (const Constant *Splat = Cst->getSplatValue()) {
3987 Cst = Splat;
3988 CstTy = Cst->getType();
3989 }
3990 }
3991 // TODO - do we need to handle different bitwidths?
3992 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3993 // Iterate across all vector elements finding common known bits.
3994 Known.setAllConflict();
3995 for (unsigned i = 0; i != NumElts; ++i) {
3996 if (!DemandedElts[i])
3997 continue;
3998 if (Constant *Elt = Cst->getAggregateElement(i)) {
3999 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4000 const APInt &Value = CInt->getValue();
4001 Known.One &= Value;
4002 Known.Zero &= ~Value;
4003 continue;
4004 }
4005 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4006 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4007 Known.One &= Value;
4008 Known.Zero &= ~Value;
4009 continue;
4010 }
4011 }
4012 Known.One.clearAllBits();
4013 Known.Zero.clearAllBits();
4014 break;
4015 }
4016 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4017 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4018 Known = KnownBits::makeConstant(CInt->getValue());
4019 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4020 Known =
4021 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4022 }
4023 }
4024 }
4025 } else if (Op.getResNo() == 0) {
4026 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4027 KnownBits KnownScalarMemory(ScalarMemorySize);
4028 if (const MDNode *MD = LD->getRanges())
4029 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4030
4031 // Extend the Known bits from memory to the size of the scalar result.
4032 if (ISD::isZEXTLoad(Op.getNode()))
4033 Known = KnownScalarMemory.zext(BitWidth);
4034 else if (ISD::isSEXTLoad(Op.getNode()))
4035 Known = KnownScalarMemory.sext(BitWidth);
4036 else if (ISD::isEXTLoad(Op.getNode()))
4037 Known = KnownScalarMemory.anyext(BitWidth);
4038 else
4039 Known = KnownScalarMemory;
4040 assert(Known.getBitWidth() == BitWidth);
4041 return Known;
4042 }
4043 break;
4044 }
4046 if (Op.getValueType().isScalableVector())
4047 break;
4048 EVT InVT = Op.getOperand(0).getValueType();
4049 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4050 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4051 Known = Known.zext(BitWidth);
4052 break;
4053 }
4054 case ISD::ZERO_EXTEND: {
4055 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4056 Known = Known.zext(BitWidth);
4057 break;
4058 }
4060 if (Op.getValueType().isScalableVector())
4061 break;
4062 EVT InVT = Op.getOperand(0).getValueType();
4063 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4064 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4065 // If the sign bit is known to be zero or one, then sext will extend
4066 // it to the top bits, else it will just zext.
4067 Known = Known.sext(BitWidth);
4068 break;
4069 }
4070 case ISD::SIGN_EXTEND: {
4071 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4072 // If the sign bit is known to be zero or one, then sext will extend
4073 // it to the top bits, else it will just zext.
4074 Known = Known.sext(BitWidth);
4075 break;
4076 }
4078 if (Op.getValueType().isScalableVector())
4079 break;
4080 EVT InVT = Op.getOperand(0).getValueType();
4081 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4082 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4083 Known = Known.anyext(BitWidth);
4084 break;
4085 }
4086 case ISD::ANY_EXTEND: {
4087 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4088 Known = Known.anyext(BitWidth);
4089 break;
4090 }
4091 case ISD::TRUNCATE: {
4092 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4093 Known = Known.trunc(BitWidth);
4094 break;
4095 }
4096 case ISD::TRUNCATE_SSAT_S: {
4097 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4098 Known = Known.truncSSat(BitWidth);
4099 break;
4100 }
4101 case ISD::TRUNCATE_SSAT_U: {
4102 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4103 Known = Known.truncSSatU(BitWidth);
4104 break;
4105 }
4106 case ISD::TRUNCATE_USAT_U: {
4107 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4108 Known = Known.truncUSat(BitWidth);
4109 break;
4110 }
4111 case ISD::AssertZext: {
4112 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4114 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4115 Known.Zero |= (~InMask);
4116 Known.One &= (~Known.Zero);
4117 break;
4118 }
4119 case ISD::AssertAlign: {
4120 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4121 assert(LogOfAlign != 0);
4122
4123 // TODO: Should use maximum with source
4124 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4125 // well as clearing one bits.
4126 Known.Zero.setLowBits(LogOfAlign);
4127 Known.One.clearLowBits(LogOfAlign);
4128 break;
4129 }
4130 case ISD::AssertNoFPClass: {
4131 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4132
4133 FPClassTest NoFPClass =
4134 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4135 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4136 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4137 // Cannot be negative.
4138 Known.makeNonNegative();
4139 }
4140
4141 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4142 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4143 // Cannot be positive.
4144 Known.makeNegative();
4145 }
4146
4147 break;
4148 }
4149 case ISD::FABS:
4150 // fabs clears the sign bit
4151 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4152 Known.makeNonNegative();
4153 break;
4154 case ISD::FGETSIGN:
4155 // All bits are zero except the low bit.
4156 Known.Zero.setBitsFrom(1);
4157 break;
4158 case ISD::ADD: {
4159 SDNodeFlags Flags = Op.getNode()->getFlags();
4160 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4161 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4162 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4164 Op.getOperand(0), DemandedElts, false, Depth + 1);
4165 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4166 Flags.hasNoUnsignedWrap(), SelfAdd);
4167 break;
4168 }
4169 case ISD::SUB: {
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 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4174 Flags.hasNoUnsignedWrap());
4175 break;
4176 }
4177 case ISD::USUBO:
4178 case ISD::SSUBO:
4179 case ISD::USUBO_CARRY:
4180 case ISD::SSUBO_CARRY:
4181 if (Op.getResNo() == 1) {
4182 // If we know the result of a setcc has the top bits zero, use this info.
4183 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4185 BitWidth > 1)
4186 Known.Zero.setBitsFrom(1);
4187 break;
4188 }
4189 [[fallthrough]];
4190 case ISD::SUBC: {
4191 assert(Op.getResNo() == 0 &&
4192 "We only compute knownbits for the difference here.");
4193
4194 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4195 KnownBits Borrow(1);
4196 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4197 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4198 // Borrow has bit width 1
4199 Borrow = Borrow.trunc(1);
4200 } else {
4201 Borrow.setAllZero();
4202 }
4203
4204 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4205 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4206 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4207 break;
4208 }
4209 case ISD::UADDO:
4210 case ISD::SADDO:
4211 case ISD::UADDO_CARRY:
4212 case ISD::SADDO_CARRY:
4213 if (Op.getResNo() == 1) {
4214 // If we know the result of a setcc has the top bits zero, use this info.
4215 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4217 BitWidth > 1)
4218 Known.Zero.setBitsFrom(1);
4219 break;
4220 }
4221 [[fallthrough]];
4222 case ISD::ADDC:
4223 case ISD::ADDE: {
4224 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4225
4226 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4227 KnownBits Carry(1);
4228 if (Opcode == ISD::ADDE)
4229 // Can't track carry from glue, set carry to unknown.
4230 Carry.resetAll();
4231 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4232 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4233 // Carry has bit width 1
4234 Carry = Carry.trunc(1);
4235 } else {
4236 Carry.setAllZero();
4237 }
4238
4239 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4240 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4241 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4242 break;
4243 }
4244 case ISD::UDIV: {
4245 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4246 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4247 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4248 break;
4249 }
4250 case ISD::SDIV: {
4251 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4252 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4253 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4254 break;
4255 }
4256 case ISD::SREM: {
4257 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4258 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4259 Known = KnownBits::srem(Known, Known2);
4260 break;
4261 }
4262 case ISD::UREM: {
4263 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4264 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4265 Known = KnownBits::urem(Known, Known2);
4266 break;
4267 }
4268 case ISD::EXTRACT_ELEMENT: {
4269 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4270 const unsigned Index = Op.getConstantOperandVal(1);
4271 const unsigned EltBitWidth = Op.getValueSizeInBits();
4272
4273 // Remove low part of known bits mask
4274 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4275 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4276
4277 // Remove high part of known bit mask
4278 Known = Known.trunc(EltBitWidth);
4279 break;
4280 }
4282 SDValue InVec = Op.getOperand(0);
4283 SDValue EltNo = Op.getOperand(1);
4284 EVT VecVT = InVec.getValueType();
4285 // computeKnownBits not yet implemented for scalable vectors.
4286 if (VecVT.isScalableVector())
4287 break;
4288 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4289 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4290
4291 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4292 // anything about the extended bits.
4293 if (BitWidth > EltBitWidth)
4294 Known = Known.trunc(EltBitWidth);
4295
4296 // If we know the element index, just demand that vector element, else for
4297 // an unknown element index, ignore DemandedElts and demand them all.
4298 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4299 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4300 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4301 DemandedSrcElts =
4302 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4303
4304 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4305 if (BitWidth > EltBitWidth)
4306 Known = Known.anyext(BitWidth);
4307 break;
4308 }
4310 if (Op.getValueType().isScalableVector())
4311 break;
4312
4313 // If we know the element index, split the demand between the
4314 // source vector and the inserted element, otherwise assume we need
4315 // the original demanded vector elements and the value.
4316 SDValue InVec = Op.getOperand(0);
4317 SDValue InVal = Op.getOperand(1);
4318 SDValue EltNo = Op.getOperand(2);
4319 bool DemandedVal = true;
4320 APInt DemandedVecElts = DemandedElts;
4321 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4322 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4323 unsigned EltIdx = CEltNo->getZExtValue();
4324 DemandedVal = !!DemandedElts[EltIdx];
4325 DemandedVecElts.clearBit(EltIdx);
4326 }
4327 Known.setAllConflict();
4328 if (DemandedVal) {
4329 Known2 = computeKnownBits(InVal, Depth + 1);
4330 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4331 }
4332 if (!!DemandedVecElts) {
4333 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4334 Known = Known.intersectWith(Known2);
4335 }
4336 break;
4337 }
4338 case ISD::BITREVERSE: {
4339 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4340 Known = Known2.reverseBits();
4341 break;
4342 }
4343 case ISD::BSWAP: {
4344 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4345 Known = Known2.byteSwap();
4346 break;
4347 }
4348 case ISD::ABS: {
4349 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4350 Known = Known2.abs();
4351 Known.Zero.setHighBits(
4352 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4353 break;
4354 }
4355 case ISD::USUBSAT: {
4356 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4357 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4358 Known = KnownBits::usub_sat(Known, Known2);
4359 break;
4360 }
4361 case ISD::UMIN: {
4362 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4363 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4364 Known = KnownBits::umin(Known, Known2);
4365 break;
4366 }
4367 case ISD::UMAX: {
4368 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4369 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4370 Known = KnownBits::umax(Known, Known2);
4371 break;
4372 }
4373 case ISD::SMIN:
4374 case ISD::SMAX: {
4375 // If we have a clamp pattern, we know that the number of sign bits will be
4376 // the minimum of the clamp min/max range.
4377 bool IsMax = (Opcode == ISD::SMAX);
4378 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4379 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4380 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4381 CstHigh =
4382 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4383 if (CstLow && CstHigh) {
4384 if (!IsMax)
4385 std::swap(CstLow, CstHigh);
4386
4387 const APInt &ValueLow = CstLow->getAPIntValue();
4388 const APInt &ValueHigh = CstHigh->getAPIntValue();
4389 if (ValueLow.sle(ValueHigh)) {
4390 unsigned LowSignBits = ValueLow.getNumSignBits();
4391 unsigned HighSignBits = ValueHigh.getNumSignBits();
4392 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4393 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4394 Known.One.setHighBits(MinSignBits);
4395 break;
4396 }
4397 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4398 Known.Zero.setHighBits(MinSignBits);
4399 break;
4400 }
4401 }
4402 }
4403
4404 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4405 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4406 if (IsMax)
4407 Known = KnownBits::smax(Known, Known2);
4408 else
4409 Known = KnownBits::smin(Known, Known2);
4410
4411 // For SMAX, if CstLow is non-negative we know the result will be
4412 // non-negative and thus all sign bits are 0.
4413 // TODO: There's an equivalent of this for smin with negative constant for
4414 // known ones.
4415 if (IsMax && CstLow) {
4416 const APInt &ValueLow = CstLow->getAPIntValue();
4417 if (ValueLow.isNonNegative()) {
4418 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4419 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4420 }
4421 }
4422
4423 break;
4424 }
4425 case ISD::UINT_TO_FP: {
4426 Known.makeNonNegative();
4427 break;
4428 }
4429 case ISD::SINT_TO_FP: {
4430 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4431 if (Known2.isNonNegative())
4432 Known.makeNonNegative();
4433 else if (Known2.isNegative())
4434 Known.makeNegative();
4435 break;
4436 }
4437 case ISD::FP_TO_UINT_SAT: {
4438 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4439 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4441 break;
4442 }
4443 case ISD::ATOMIC_LOAD: {
4444 // If we are looking at the loaded value.
4445 if (Op.getResNo() == 0) {
4446 auto *AT = cast<AtomicSDNode>(Op);
4447 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4448 KnownBits KnownScalarMemory(ScalarMemorySize);
4449 if (const MDNode *MD = AT->getRanges())
4450 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4451
4452 switch (AT->getExtensionType()) {
4453 case ISD::ZEXTLOAD:
4454 Known = KnownScalarMemory.zext(BitWidth);
4455 break;
4456 case ISD::SEXTLOAD:
4457 Known = KnownScalarMemory.sext(BitWidth);
4458 break;
4459 case ISD::EXTLOAD:
4460 switch (TLI->getExtendForAtomicOps()) {
4461 case ISD::ZERO_EXTEND:
4462 Known = KnownScalarMemory.zext(BitWidth);
4463 break;
4464 case ISD::SIGN_EXTEND:
4465 Known = KnownScalarMemory.sext(BitWidth);
4466 break;
4467 default:
4468 Known = KnownScalarMemory.anyext(BitWidth);
4469 break;
4470 }
4471 break;
4472 case ISD::NON_EXTLOAD:
4473 Known = KnownScalarMemory;
4474 break;
4475 }
4476 assert(Known.getBitWidth() == BitWidth);
4477 }
4478 break;
4479 }
4481 if (Op.getResNo() == 1) {
4482 // The boolean result conforms to getBooleanContents.
4483 // If we know the result of a setcc has the top bits zero, use this info.
4484 // We know that we have an integer-based boolean since these operations
4485 // are only available for integer.
4486 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4488 BitWidth > 1)
4489 Known.Zero.setBitsFrom(1);
4490 break;
4491 }
4492 [[fallthrough]];
4494 case ISD::ATOMIC_SWAP:
4505 case ISD::ATOMIC_LOAD_UMAX: {
4506 // If we are looking at the loaded value.
4507 if (Op.getResNo() == 0) {
4508 auto *AT = cast<AtomicSDNode>(Op);
4509 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4510
4511 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4512 Known.Zero.setBitsFrom(MemBits);
4513 }
4514 break;
4515 }
4516 case ISD::FrameIndex:
4518 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4519 Known, getMachineFunction());
4520 break;
4521
4522 default:
4523 if (Opcode < ISD::BUILTIN_OP_END)
4524 break;
4525 [[fallthrough]];
4529 // TODO: Probably okay to remove after audit; here to reduce change size
4530 // in initial enablement patch for scalable vectors
4531 if (Op.getValueType().isScalableVector())
4532 break;
4533
4534 // Allow the target to implement this method for its nodes.
4535 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4536 break;
4537 }
4538
4539 return Known;
4540}
4541
4542/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4555
4558 // X + 0 never overflow
4559 if (isNullConstant(N1))
4560 return OFK_Never;
4561
4562 // If both operands each have at least two sign bits, the addition
4563 // cannot overflow.
4564 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4565 return OFK_Never;
4566
4567 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4568 return OFK_Sometime;
4569}
4570
4573 // X + 0 never overflow
4574 if (isNullConstant(N1))
4575 return OFK_Never;
4576
4577 // mulhi + 1 never overflow
4578 KnownBits N1Known = computeKnownBits(N1);
4579 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4580 N1Known.getMaxValue().ult(2))
4581 return OFK_Never;
4582
4583 KnownBits N0Known = computeKnownBits(N0);
4584 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4585 N0Known.getMaxValue().ult(2))
4586 return OFK_Never;
4587
4588 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4589 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4590 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4591 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4592}
4593
4596 // X - 0 never overflow
4597 if (isNullConstant(N1))
4598 return OFK_Never;
4599
4600 // If both operands each have at least two sign bits, the subtraction
4601 // cannot overflow.
4602 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4603 return OFK_Never;
4604
4605 KnownBits N0Known = computeKnownBits(N0);
4606 KnownBits N1Known = computeKnownBits(N1);
4607 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4608 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4609 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4610}
4611
4614 // X - 0 never overflow
4615 if (isNullConstant(N1))
4616 return OFK_Never;
4617
4618 ConstantRange N0Range =
4619 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4620 ConstantRange N1Range =
4621 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4622 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4623}
4624
4627 // X * 0 and X * 1 never overflow.
4628 if (isNullConstant(N1) || isOneConstant(N1))
4629 return OFK_Never;
4630
4633 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4634}
4635
4638 // X * 0 and X * 1 never overflow.
4639 if (isNullConstant(N1) || isOneConstant(N1))
4640 return OFK_Never;
4641
4642 // Get the size of the result.
4643 unsigned BitWidth = N0.getScalarValueSizeInBits();
4644
4645 // Sum of the sign bits.
4646 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4647
4648 // If we have enough sign bits, then there's no overflow.
4649 if (SignBits > BitWidth + 1)
4650 return OFK_Never;
4651
4652 if (SignBits == BitWidth + 1) {
4653 // The overflow occurs when the true multiplication of the
4654 // the operands is the minimum negative number.
4655 KnownBits N0Known = computeKnownBits(N0);
4656 KnownBits N1Known = computeKnownBits(N1);
4657 // If one of the operands is non-negative, then there's no
4658 // overflow.
4659 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4660 return OFK_Never;
4661 }
4662
4663 return OFK_Sometime;
4664}
4665
4667 unsigned Depth) const {
4668 APInt DemandedElts = getDemandAllEltsMask(Op);
4669 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4670}
4671
4673 const APInt &DemandedElts,
4674 bool ForSigned,
4675 unsigned Depth) const {
4676 EVT VT = Op.getValueType();
4677 unsigned BitWidth = VT.getScalarSizeInBits();
4678
4679 if (Depth >= MaxRecursionDepth)
4680 return ConstantRange::getFull(BitWidth);
4681
4682 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4683 return ConstantRange(C->getAPIntValue());
4684
4685 unsigned Opcode = Op.getOpcode();
4686 switch (Opcode) {
4687 case ISD::VSCALE: {
4689 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4690 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4691 }
4692 default:
4693 break;
4694 }
4695
4696 return ConstantRange::getFull(BitWidth);
4697}
4698
4701 unsigned Depth) const {
4702 APInt DemandedElts = getDemandAllEltsMask(Op);
4703 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4704 Depth);
4705}
4706
4708 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4709 unsigned Depth) const {
4710 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4711 ConstantRange CR1 = ConstantRange::fromKnownBits(Known, ForSigned);
4712 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4715 return CR1.intersectWith(CR2, RangeType);
4716}
4717
4719 unsigned Depth) const {
4720 APInt DemandedElts = getDemandAllEltsMask(Val);
4721 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4722}
4723
4725 const APInt &DemandedElts,
4726 bool OrZero, unsigned Depth) const {
4727 if (Depth >= MaxRecursionDepth)
4728 return false; // Limit search depth.
4729
4730 EVT OpVT = Val.getValueType();
4731 unsigned BitWidth = OpVT.getScalarSizeInBits();
4732 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4733 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4734 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4735 assert(
4736 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4737 "Unexpected vector size");
4738
4739 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4740 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4741 return (OrZero && V.isZero()) || V.isPowerOf2();
4742 };
4743
4744 // Is the constant a known power of 2 or zero?
4745 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4746 return true;
4747
4748 switch (Val.getOpcode()) {
4749 case ISD::BUILD_VECTOR:
4750 // Are all operands of a build vector constant powers of two or zero?
4751 if (all_of(enumerate(Val->ops()), [&](auto P) {
4752 auto *C = dyn_cast<ConstantSDNode>(P.value());
4753 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4754 }))
4755 return true;
4756 break;
4757
4758 case ISD::SPLAT_VECTOR:
4759 // Is the operand of a splat vector a constant power of two?
4760 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4761 if (IsPowerOfTwoOrZero(C))
4762 return true;
4763 break;
4764
4766 SDValue InVec = Val.getOperand(0);
4767 SDValue EltNo = Val.getOperand(1);
4768 EVT VecVT = InVec.getValueType();
4769
4770 // Skip scalable vectors or implicit extensions.
4771 if (VecVT.isScalableVector() ||
4772 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4773 break;
4774
4775 // If we know the element index, just demand that vector element, else for
4776 // an unknown element index, ignore DemandedElts and demand them all.
4777 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4778 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4779 APInt DemandedSrcElts =
4780 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4781 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4782 : APInt::getAllOnes(NumSrcElts);
4783 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4784 }
4785
4786 case ISD::AND: {
4787 // Looking for `x & -x` pattern:
4788 // If x == 0:
4789 // x & -x -> 0
4790 // If x != 0:
4791 // x & -x -> non-zero pow2
4792 // so if we find the pattern return whether we know `x` is non-zero.
4793 SDValue X, Z;
4794 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4795 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4796 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4797 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4798 break;
4799 }
4800
4801 case ISD::SHL: {
4802 // A left-shift of a constant one will have exactly one bit set because
4803 // shifting the bit off the end is undefined.
4804 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4805 if (C && C->getAPIntValue() == 1)
4806 return true;
4807 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4808 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4809 Depth + 1);
4810 }
4811
4812 case ISD::SRL: {
4813 // A logical right-shift of a constant sign-bit will have exactly
4814 // one bit set.
4815 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4816 if (C && C->getAPIntValue().isSignMask())
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::TRUNCATE:
4824 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4825 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4826 Depth + 1);
4827
4828 case ISD::ROTL:
4829 case ISD::ROTR:
4830 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4831 Depth + 1);
4832 case ISD::BSWAP:
4833 case ISD::BITREVERSE:
4834 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4835 Depth + 1);
4836
4837 case ISD::SMIN:
4838 case ISD::SMAX:
4839 case ISD::UMIN:
4840 case ISD::UMAX:
4841 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4842 Depth + 1) &&
4843 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4844 Depth + 1);
4845
4846 case ISD::SELECT:
4847 case ISD::VSELECT:
4848 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4849 Depth + 1) &&
4850 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4851 Depth + 1);
4852
4853 case ISD::ZERO_EXTEND:
4854 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4855 Depth + 1);
4856
4857 case ISD::VSCALE:
4858 // vscale(power-of-two) is a power-of-two
4859 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4860 Depth + 1);
4861
4862 case ISD::VECTOR_SHUFFLE: {
4864 // Demanded elements with undef shuffle mask elements are unknown
4865 // - we cannot guarantee they are a power of two, so return false.
4866 APInt DemandedLHS, DemandedRHS;
4868 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4869 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4870 DemandedLHS, DemandedRHS))
4871 return false;
4872
4873 // All demanded elements from LHS must be known power of two.
4874 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4875 OrZero, Depth + 1))
4876 return false;
4877
4878 // All demanded elements from RHS must be known power of two.
4879 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4880 OrZero, Depth + 1))
4881 return false;
4882
4883 return true;
4884 }
4885 }
4886
4887 // More could be done here, though the above checks are enough
4888 // to handle some common cases.
4889 return false;
4890}
4891
4893 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4894 return C1->getValueAPF().getExactLog2Abs() >= 0;
4895
4896 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4897 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4898
4899 return false;
4900}
4901
4903 APInt DemandedElts = getDemandAllEltsMask(Op);
4904 return ComputeNumSignBits(Op, DemandedElts, Depth);
4905}
4906
4907unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4908 unsigned Depth) const {
4909 EVT VT = Op.getValueType();
4910 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4911 unsigned VTBits = VT.getScalarSizeInBits();
4912 unsigned NumElts = DemandedElts.getBitWidth();
4913 unsigned Tmp, Tmp2;
4914 unsigned FirstAnswer = 1;
4915
4916 assert((!VT.isScalableVector() || NumElts == 1) &&
4917 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4918
4919 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4920 const APInt &Val = C->getAPIntValue();
4921 return Val.getNumSignBits();
4922 }
4923
4924 if (Depth >= MaxRecursionDepth)
4925 return 1; // Limit search depth.
4926
4927 if (!DemandedElts)
4928 return 1; // No demanded elts, better to assume we don't know anything.
4929
4930 unsigned Opcode = Op.getOpcode();
4931 switch (Opcode) {
4932 default: break;
4933 case ISD::AssertSext:
4934 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4935 return VTBits-Tmp+1;
4936 case ISD::AssertZext:
4937 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4938 return VTBits-Tmp;
4939 case ISD::FREEZE:
4940 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4941 /*PoisonOnly=*/false))
4942 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4943 break;
4944 case ISD::MERGE_VALUES:
4945 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4946 Depth + 1);
4947 case ISD::SPLAT_VECTOR: {
4948 // Check if the sign bits of source go down as far as the truncated value.
4949 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4950 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4951 if (NumSrcSignBits > (NumSrcBits - VTBits))
4952 return NumSrcSignBits - (NumSrcBits - VTBits);
4953 break;
4954 }
4955 case ISD::BUILD_VECTOR:
4956 assert(!VT.isScalableVector());
4957 Tmp = VTBits;
4958 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4959 if (!DemandedElts[i])
4960 continue;
4961
4962 SDValue SrcOp = Op.getOperand(i);
4963 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4964 // for constant nodes to ensure we only look at the sign bits.
4966 APInt T = C->getAPIntValue().trunc(VTBits);
4967 Tmp2 = T.getNumSignBits();
4968 } else {
4969 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4970
4971 if (SrcOp.getValueSizeInBits() != VTBits) {
4972 assert(SrcOp.getValueSizeInBits() > VTBits &&
4973 "Expected BUILD_VECTOR implicit truncation");
4974 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4975 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4976 }
4977 }
4978 Tmp = std::min(Tmp, Tmp2);
4979 }
4980 return Tmp;
4981
4982 case ISD::VECTOR_COMPRESS: {
4983 SDValue Vec = Op.getOperand(0);
4984 SDValue PassThru = Op.getOperand(2);
4985 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4986 if (Tmp == 1)
4987 return 1;
4988 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
4989 Tmp = std::min(Tmp, Tmp2);
4990 return Tmp;
4991 }
4992
4993 case ISD::VECTOR_SHUFFLE: {
4994 // Collect the minimum number of sign bits that are shared by every vector
4995 // element referenced by the shuffle.
4996 APInt DemandedLHS, DemandedRHS;
4998 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4999 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5000 DemandedLHS, DemandedRHS))
5001 return 1;
5002
5003 Tmp = std::numeric_limits<unsigned>::max();
5004 if (!!DemandedLHS)
5005 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5006 if (!!DemandedRHS) {
5007 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5008 Tmp = std::min(Tmp, Tmp2);
5009 }
5010 // If we don't know anything, early out and try computeKnownBits fall-back.
5011 if (Tmp == 1)
5012 break;
5013 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5014 return Tmp;
5015 }
5016
5017 case ISD::BITCAST: {
5018 if (VT.isScalableVector())
5019 break;
5020 SDValue N0 = Op.getOperand(0);
5021 EVT SrcVT = N0.getValueType();
5022 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5023
5024 // Ignore bitcasts from unsupported types..
5025 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5026 break;
5027
5028 // Fast handling of 'identity' bitcasts.
5029 if (VTBits == SrcBits)
5030 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5031
5032 bool IsLE = getDataLayout().isLittleEndian();
5033
5034 // Bitcast 'large element' scalar/vector to 'small element' vector.
5035 if ((SrcBits % VTBits) == 0) {
5036 assert(VT.isVector() && "Expected bitcast to vector");
5037
5038 unsigned Scale = SrcBits / VTBits;
5039 APInt SrcDemandedElts =
5040 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5041
5042 // Fast case - sign splat can be simply split across the small elements.
5043 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5044 if (Tmp == SrcBits)
5045 return VTBits;
5046
5047 // Slow case - determine how far the sign extends into each sub-element.
5048 Tmp2 = VTBits;
5049 for (unsigned i = 0; i != NumElts; ++i)
5050 if (DemandedElts[i]) {
5051 unsigned SubOffset = i % Scale;
5052 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5053 SubOffset = SubOffset * VTBits;
5054 if (Tmp <= SubOffset)
5055 return 1;
5056 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5057 }
5058 return Tmp2;
5059 }
5060 break;
5061 }
5062
5064 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5065 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5066 return VTBits - Tmp + 1;
5067 case ISD::SIGN_EXTEND:
5068 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5069 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5071 // Max of the input and what this extends.
5072 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5073 Tmp = VTBits-Tmp+1;
5074 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5075 return std::max(Tmp, Tmp2);
5077 if (VT.isScalableVector())
5078 break;
5079 SDValue Src = Op.getOperand(0);
5080 EVT SrcVT = Src.getValueType();
5081 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5082 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5083 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5084 }
5085 case ISD::SRA:
5086 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5087 // SRA X, C -> adds C sign bits.
5088 if (std::optional<unsigned> ShAmt =
5089 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5090 Tmp = std::min(Tmp + *ShAmt, VTBits);
5091 return Tmp;
5092 case ISD::SHL:
5093 if (std::optional<ConstantRange> ShAmtRange =
5094 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5095 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5096 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5097 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5098 // shifted out, then we can compute the number of sign bits for the
5099 // operand being extended. A future improvement could be to pass along the
5100 // "shifted left by" information in the recursive calls to
5101 // ComputeKnownSignBits. Allowing us to handle this more generically.
5102 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5103 SDValue Ext = Op.getOperand(0);
5104 EVT ExtVT = Ext.getValueType();
5105 SDValue Extendee = Ext.getOperand(0);
5106 EVT ExtendeeVT = Extendee.getValueType();
5107 unsigned SizeDifference =
5108 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5109 if (SizeDifference <= MinShAmt) {
5110 Tmp = SizeDifference +
5111 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5112 if (MaxShAmt < Tmp)
5113 return Tmp - MaxShAmt;
5114 }
5115 }
5116 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5117 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5118 if (MaxShAmt < Tmp)
5119 return Tmp - MaxShAmt;
5120 }
5121 break;
5122 case ISD::AND:
5123 case ISD::OR:
5124 case ISD::XOR: // NOT is handled here.
5125 // Logical binary ops preserve the number of sign bits at the worst.
5126 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5127 if (Tmp != 1) {
5128 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5129 FirstAnswer = std::min(Tmp, Tmp2);
5130 // We computed what we know about the sign bits as our first
5131 // answer. Now proceed to the generic code that uses
5132 // computeKnownBits, and pick whichever answer is better.
5133 }
5134 break;
5135
5136 case ISD::SELECT:
5137 case ISD::VSELECT:
5138 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5139 if (Tmp == 1) return 1; // Early out.
5140 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5141 return std::min(Tmp, Tmp2);
5142 case ISD::SELECT_CC:
5143 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5144 if (Tmp == 1) return 1; // Early out.
5145 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5146 return std::min(Tmp, Tmp2);
5147
5148 case ISD::SMIN:
5149 case ISD::SMAX: {
5150 // If we have a clamp pattern, we know that the number of sign bits will be
5151 // the minimum of the clamp min/max range.
5152 bool IsMax = (Opcode == ISD::SMAX);
5153 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5154 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5155 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5156 CstHigh =
5157 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5158 if (CstLow && CstHigh) {
5159 if (!IsMax)
5160 std::swap(CstLow, CstHigh);
5161 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5162 Tmp = CstLow->getAPIntValue().getNumSignBits();
5163 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5164 return std::min(Tmp, Tmp2);
5165 }
5166 }
5167
5168 // Fallback - just get the minimum number of sign bits of the operands.
5169 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5170 if (Tmp == 1)
5171 return 1; // Early out.
5172 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5173 return std::min(Tmp, Tmp2);
5174 }
5175 case ISD::UMIN:
5176 case ISD::UMAX:
5177 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5178 if (Tmp == 1)
5179 return 1; // Early out.
5180 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5181 return std::min(Tmp, Tmp2);
5182 case ISD::SSUBO_CARRY:
5183 case ISD::USUBO_CARRY:
5184 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5185 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5186 return VTBits;
5187 [[fallthrough]];
5188 case ISD::SADDO:
5189 case ISD::UADDO:
5190 case ISD::SADDO_CARRY:
5191 case ISD::UADDO_CARRY:
5192 case ISD::SSUBO:
5193 case ISD::USUBO:
5194 case ISD::SMULO:
5195 case ISD::UMULO:
5196 if (Op.getResNo() != 1)
5197 break;
5198 // The boolean result conforms to getBooleanContents. Fall through.
5199 // If setcc returns 0/-1, all bits are sign bits.
5200 // We know that we have an integer-based boolean since these operations
5201 // are only available for integer.
5202 if (TLI->getBooleanContents(VT.isVector(), false) ==
5204 return VTBits;
5205 break;
5206 case ISD::SETCC:
5207 case ISD::SETCCCARRY:
5208 case ISD::STRICT_FSETCC:
5209 case ISD::STRICT_FSETCCS: {
5210 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5211 // If setcc returns 0/-1, all bits are sign bits.
5212 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5214 return VTBits;
5215 break;
5216 }
5217 case ISD::ROTL:
5218 case ISD::ROTR:
5219 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5220
5221 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5222 if (Tmp == VTBits)
5223 return VTBits;
5224
5225 if (ConstantSDNode *C =
5226 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5227 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5228
5229 // Handle rotate right by N like a rotate left by 32-N.
5230 if (Opcode == ISD::ROTR)
5231 RotAmt = (VTBits - RotAmt) % VTBits;
5232
5233 // If we aren't rotating out all of the known-in sign bits, return the
5234 // number that are left. This handles rotl(sext(x), 1) for example.
5235 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5236 }
5237 break;
5238 case ISD::ADD:
5239 case ISD::ADDC:
5240 // TODO: Move Operand 1 check before Operand 0 check
5241 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5242 if (Tmp == 1) return 1; // Early out.
5243
5244 // Special case decrementing a value (ADD X, -1):
5245 if (ConstantSDNode *CRHS =
5246 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5247 if (CRHS->isAllOnes()) {
5248 KnownBits Known =
5249 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5250
5251 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5252 // sign bits set.
5253 if ((Known.Zero | 1).isAllOnes())
5254 return VTBits;
5255
5256 // If we are subtracting one from a positive number, there is no carry
5257 // out of the result.
5258 if (Known.isNonNegative())
5259 return Tmp;
5260 }
5261
5262 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5263 if (Tmp2 == 1) return 1; // Early out.
5264
5265 // Add can have at most one carry bit. Thus we know that the output
5266 // is, at worst, one more bit than the inputs.
5267 return std::min(Tmp, Tmp2) - 1;
5268 case ISD::SUB:
5269 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5270 if (Tmp2 == 1) return 1; // Early out.
5271
5272 // Handle NEG.
5273 if (ConstantSDNode *CLHS =
5274 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5275 if (CLHS->isZero()) {
5276 KnownBits Known =
5277 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5278 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5279 // sign bits set.
5280 if ((Known.Zero | 1).isAllOnes())
5281 return VTBits;
5282
5283 // If the input is known to be positive (the sign bit is known clear),
5284 // the output of the NEG has the same number of sign bits as the input.
5285 if (Known.isNonNegative())
5286 return Tmp2;
5287
5288 // Otherwise, we treat this like a SUB.
5289 }
5290
5291 // Sub can have at most one carry bit. Thus we know that the output
5292 // is, at worst, one more bit than the inputs.
5293 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5294 if (Tmp == 1) return 1; // Early out.
5295 return std::min(Tmp, Tmp2) - 1;
5296 case ISD::MUL: {
5297 // The output of the Mul can be at most twice the valid bits in the inputs.
5298 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5299 if (SignBitsOp0 == 1)
5300 break;
5301 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5302 if (SignBitsOp1 == 1)
5303 break;
5304 unsigned OutValidBits =
5305 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5306 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5307 }
5308 case ISD::AVGCEILS:
5309 case ISD::AVGFLOORS:
5310 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5311 if (Tmp == 1)
5312 return 1; // Early out.
5313 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5314 return std::min(Tmp, Tmp2);
5315 case ISD::SREM:
5316 // The sign bit is the LHS's sign bit, except when the result of the
5317 // remainder is zero. The magnitude of the result should be less than or
5318 // equal to the magnitude of the LHS. Therefore, the result should have
5319 // at least as many sign bits as the left hand side.
5320 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5321 case ISD::TRUNCATE: {
5322 // Check if the sign bits of source go down as far as the truncated value.
5323 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5324 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5325 if (NumSrcSignBits > (NumSrcBits - VTBits))
5326 return NumSrcSignBits - (NumSrcBits - VTBits);
5327 break;
5328 }
5329 case ISD::EXTRACT_ELEMENT: {
5330 if (VT.isScalableVector())
5331 break;
5332 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5333 const int BitWidth = Op.getValueSizeInBits();
5334 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5335
5336 // Get reverse index (starting from 1), Op1 value indexes elements from
5337 // little end. Sign starts at big end.
5338 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5339
5340 // If the sign portion ends in our element the subtraction gives correct
5341 // result. Otherwise it gives either negative or > bitwidth result
5342 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5343 }
5345 if (VT.isScalableVector())
5346 break;
5347 // If we know the element index, split the demand between the
5348 // source vector and the inserted element, otherwise assume we need
5349 // the original demanded vector elements and the value.
5350 SDValue InVec = Op.getOperand(0);
5351 SDValue InVal = Op.getOperand(1);
5352 SDValue EltNo = Op.getOperand(2);
5353 bool DemandedVal = true;
5354 APInt DemandedVecElts = DemandedElts;
5355 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5356 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5357 unsigned EltIdx = CEltNo->getZExtValue();
5358 DemandedVal = !!DemandedElts[EltIdx];
5359 DemandedVecElts.clearBit(EltIdx);
5360 }
5361 Tmp = std::numeric_limits<unsigned>::max();
5362 if (DemandedVal) {
5363 // TODO - handle implicit truncation of inserted elements.
5364 if (InVal.getScalarValueSizeInBits() != VTBits)
5365 break;
5366 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5367 Tmp = std::min(Tmp, Tmp2);
5368 }
5369 if (!!DemandedVecElts) {
5370 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5371 Tmp = std::min(Tmp, Tmp2);
5372 }
5373 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5374 return Tmp;
5375 }
5377 SDValue InVec = Op.getOperand(0);
5378 SDValue EltNo = Op.getOperand(1);
5379 EVT VecVT = InVec.getValueType();
5380 // ComputeNumSignBits not yet implemented for scalable vectors.
5381 if (VecVT.isScalableVector())
5382 break;
5383 const unsigned BitWidth = Op.getValueSizeInBits();
5384 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5385 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5386
5387 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5388 // anything about sign bits. But if the sizes match we can derive knowledge
5389 // about sign bits from the vector operand.
5390 if (BitWidth != EltBitWidth)
5391 break;
5392
5393 // If we know the element index, just demand that vector element, else for
5394 // an unknown element index, ignore DemandedElts and demand them all.
5395 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5396 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5397 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5398 DemandedSrcElts =
5399 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5400
5401 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5402 }
5404 // Offset the demanded elts by the subvector index.
5405 SDValue Src = Op.getOperand(0);
5406
5407 APInt DemandedSrcElts;
5408 if (Src.getValueType().isScalableVector())
5409 DemandedSrcElts = APInt(1, 1);
5410 else {
5411 uint64_t Idx = Op.getConstantOperandVal(1);
5412 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5413 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5414 }
5415 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5416 }
5417 case ISD::CONCAT_VECTORS: {
5418 if (VT.isScalableVector())
5419 break;
5420 // Determine the minimum number of sign bits across all demanded
5421 // elts of the input vectors. Early out if the result is already 1.
5422 Tmp = std::numeric_limits<unsigned>::max();
5423 EVT SubVectorVT = Op.getOperand(0).getValueType();
5424 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5425 unsigned NumSubVectors = Op.getNumOperands();
5426 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5427 APInt DemandedSub =
5428 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5429 if (!DemandedSub)
5430 continue;
5431 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5432 Tmp = std::min(Tmp, Tmp2);
5433 }
5434 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5435 return Tmp;
5436 }
5437 case ISD::INSERT_SUBVECTOR: {
5438 if (VT.isScalableVector())
5439 break;
5440 // Demand any elements from the subvector and the remainder from the src its
5441 // inserted into.
5442 SDValue Src = Op.getOperand(0);
5443 SDValue Sub = Op.getOperand(1);
5444 uint64_t Idx = Op.getConstantOperandVal(2);
5445 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5446 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5447 APInt DemandedSrcElts = DemandedElts;
5448 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5449
5450 Tmp = std::numeric_limits<unsigned>::max();
5451 if (!!DemandedSubElts) {
5452 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5453 if (Tmp == 1)
5454 return 1; // early-out
5455 }
5456 if (!!DemandedSrcElts) {
5457 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5458 Tmp = std::min(Tmp, Tmp2);
5459 }
5460 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5461 return Tmp;
5462 }
5463 case ISD::LOAD: {
5464 // If we are looking at the loaded value of the SDNode.
5465 if (Op.getResNo() != 0)
5466 break;
5467
5469 if (const MDNode *Ranges = LD->getRanges()) {
5470 if (DemandedElts != 1)
5471 break;
5472
5474 if (VTBits > CR.getBitWidth()) {
5475 switch (LD->getExtensionType()) {
5476 case ISD::SEXTLOAD:
5477 CR = CR.signExtend(VTBits);
5478 break;
5479 case ISD::ZEXTLOAD:
5480 CR = CR.zeroExtend(VTBits);
5481 break;
5482 default:
5483 break;
5484 }
5485 }
5486
5487 if (VTBits != CR.getBitWidth())
5488 break;
5489 return std::min(CR.getSignedMin().getNumSignBits(),
5491 }
5492
5493 unsigned ExtType = LD->getExtensionType();
5494 switch (ExtType) {
5495 default:
5496 break;
5497 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5498 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5499 return VTBits - Tmp + 1;
5500 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5501 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5502 return VTBits - Tmp;
5503 case ISD::NON_EXTLOAD:
5504 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5505 // We only need to handle vectors - computeKnownBits should handle
5506 // scalar cases.
5507 Type *CstTy = Cst->getType();
5508 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5509 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5510 VTBits == CstTy->getScalarSizeInBits()) {
5511 Tmp = VTBits;
5512 for (unsigned i = 0; i != NumElts; ++i) {
5513 if (!DemandedElts[i])
5514 continue;
5515 if (Constant *Elt = Cst->getAggregateElement(i)) {
5516 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5517 const APInt &Value = CInt->getValue();
5518 Tmp = std::min(Tmp, Value.getNumSignBits());
5519 continue;
5520 }
5521 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5522 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5523 Tmp = std::min(Tmp, Value.getNumSignBits());
5524 continue;
5525 }
5526 }
5527 // Unknown type. Conservatively assume no bits match sign bit.
5528 return 1;
5529 }
5530 return Tmp;
5531 }
5532 }
5533 break;
5534 }
5535
5536 break;
5537 }
5540 case ISD::ATOMIC_SWAP:
5552 case ISD::ATOMIC_LOAD: {
5553 auto *AT = cast<AtomicSDNode>(Op);
5554 // If we are looking at the loaded value.
5555 if (Op.getResNo() == 0) {
5556 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5557 if (Tmp == VTBits)
5558 return 1; // early-out
5559
5560 // For atomic_load, prefer to use the extension type.
5561 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5562 switch (AT->getExtensionType()) {
5563 default:
5564 break;
5565 case ISD::SEXTLOAD:
5566 return VTBits - Tmp + 1;
5567 case ISD::ZEXTLOAD:
5568 return VTBits - Tmp;
5569 }
5570 }
5571
5572 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5573 return VTBits - Tmp + 1;
5574 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5575 return VTBits - Tmp;
5576 }
5577 break;
5578 }
5579 }
5580
5581 // Allow the target to implement this method for its nodes.
5582 if (Opcode >= ISD::BUILTIN_OP_END ||
5583 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5584 Opcode == ISD::INTRINSIC_W_CHAIN ||
5585 Opcode == ISD::INTRINSIC_VOID) {
5586 // TODO: This can probably be removed once target code is audited. This
5587 // is here purely to reduce patch size and review complexity.
5588 if (!VT.isScalableVector()) {
5589 unsigned NumBits =
5590 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5591 if (NumBits > 1)
5592 FirstAnswer = std::max(FirstAnswer, NumBits);
5593 }
5594 }
5595
5596 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5597 // use this information.
5598 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5599 return std::max(FirstAnswer, Known.countMinSignBits());
5600}
5601
5603 unsigned Depth) const {
5604 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5605 return Op.getScalarValueSizeInBits() - SignBits + 1;
5606}
5607
5609 const APInt &DemandedElts,
5610 unsigned Depth) const {
5611 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5612 return Op.getScalarValueSizeInBits() - SignBits + 1;
5613}
5614
5616 unsigned Depth) const {
5617 // Early out for FREEZE.
5618 if (Op.getOpcode() == ISD::FREEZE)
5619 return true;
5620
5621 APInt DemandedElts = getDemandAllEltsMask(Op);
5622 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, PoisonOnly, Depth);
5623}
5624
5626 const APInt &DemandedElts,
5627 bool PoisonOnly,
5628 unsigned Depth) const {
5629 unsigned Opcode = Op.getOpcode();
5630
5631 // Early out for FREEZE.
5632 if (Opcode == ISD::FREEZE)
5633 return true;
5634
5635 if (Depth >= MaxRecursionDepth)
5636 return false; // Limit search depth.
5637
5638 if (isIntOrFPConstant(Op))
5639 return true;
5640
5641 switch (Opcode) {
5642 case ISD::CONDCODE:
5643 case ISD::VALUETYPE:
5644 case ISD::FrameIndex:
5646 case ISD::CopyFromReg:
5647 return true;
5648
5649 case ISD::POISON:
5650 return false;
5651
5652 case ISD::UNDEF:
5653 return PoisonOnly;
5654
5655 case ISD::BUILD_VECTOR:
5656 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5657 // this shouldn't affect the result.
5658 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5659 if (!DemandedElts[i])
5660 continue;
5662 Depth + 1))
5663 return false;
5664 }
5665 return true;
5666
5668 SDValue Src = Op.getOperand(0);
5669 if (Src.getValueType().isScalableVector())
5670 break;
5671 uint64_t Idx = Op.getConstantOperandVal(1);
5672 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5673 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5674 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
5675 Depth + 1);
5676 }
5677
5678 case ISD::INSERT_SUBVECTOR: {
5679 if (Op.getValueType().isScalableVector())
5680 break;
5681 SDValue Src = Op.getOperand(0);
5682 SDValue Sub = Op.getOperand(1);
5683 uint64_t Idx = Op.getConstantOperandVal(2);
5684 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5685 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5686 APInt DemandedSrcElts = DemandedElts;
5687 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5688
5689 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5690 Sub, DemandedSubElts, PoisonOnly, Depth + 1))
5691 return false;
5692 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5693 Src, DemandedSrcElts, PoisonOnly, Depth + 1))
5694 return false;
5695 return true;
5696 }
5697
5699 SDValue Src = Op.getOperand(0);
5700 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5701 EVT SrcVT = Src.getValueType();
5702 if (SrcVT.isFixedLengthVector() && IndexC &&
5703 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5704 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5705 IndexC->getZExtValue());
5706 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
5707 Depth + 1);
5708 }
5709 break;
5710 }
5711
5713 SDValue InVec = Op.getOperand(0);
5714 SDValue InVal = Op.getOperand(1);
5715 SDValue EltNo = Op.getOperand(2);
5716 EVT VT = InVec.getValueType();
5717 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5718 if (IndexC && VT.isFixedLengthVector() &&
5719 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5720 if (DemandedElts[IndexC->getZExtValue()] &&
5722 return false;
5723 APInt InVecDemandedElts = DemandedElts;
5724 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5725 if (!!InVecDemandedElts &&
5727 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5728 InVecDemandedElts, PoisonOnly, Depth + 1))
5729 return false;
5730 return true;
5731 }
5732 break;
5733 }
5734
5736 // Check upper (known undef) elements.
5737 if (DemandedElts.ugt(1) && !PoisonOnly)
5738 return false;
5739 // Check element zero.
5740 if (DemandedElts[0] && !isGuaranteedNotToBeUndefOrPoison(
5741 Op.getOperand(0), PoisonOnly, Depth + 1))
5742 return false;
5743 return true;
5744
5745 case ISD::SPLAT_VECTOR:
5746 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), PoisonOnly,
5747 Depth + 1);
5748
5749 case ISD::VECTOR_SHUFFLE: {
5750 APInt DemandedLHS, DemandedRHS;
5751 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5752 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5753 DemandedElts, DemandedLHS, DemandedRHS,
5754 /*AllowUndefElts=*/false))
5755 return false;
5756 if (!DemandedLHS.isZero() &&
5757 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS,
5758 PoisonOnly, Depth + 1))
5759 return false;
5760 if (!DemandedRHS.isZero() &&
5761 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS,
5762 PoisonOnly, Depth + 1))
5763 return false;
5764 return true;
5765 }
5766
5767 case ISD::SHL:
5768 case ISD::SRL:
5769 case ISD::SRA:
5770 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5771 // enough to check operand 0 if Op can't create undef/poison.
5772 return !canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly,
5773 /*ConsiderFlags*/ true, Depth) &&
5774 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5775 PoisonOnly, Depth + 1);
5776
5777 case ISD::BSWAP:
5778 case ISD::CTPOP:
5779 case ISD::BITREVERSE:
5780 case ISD::AND:
5781 case ISD::OR:
5782 case ISD::XOR:
5783 case ISD::ADD:
5784 case ISD::SUB:
5785 case ISD::MUL:
5786 case ISD::SADDSAT:
5787 case ISD::UADDSAT:
5788 case ISD::SSUBSAT:
5789 case ISD::USUBSAT:
5790 case ISD::SSHLSAT:
5791 case ISD::USHLSAT:
5792 case ISD::SMIN:
5793 case ISD::SMAX:
5794 case ISD::UMIN:
5795 case ISD::UMAX:
5796 case ISD::ZERO_EXTEND:
5797 case ISD::SIGN_EXTEND:
5798 case ISD::ANY_EXTEND:
5799 case ISD::TRUNCATE:
5800 case ISD::VSELECT: {
5801 // If Op can't create undef/poison and none of its operands are undef/poison
5802 // then Op is never undef/poison. A difference from the more common check
5803 // below, outside the switch, is that we handle elementwise operations for
5804 // which the DemandedElts mask is valid for all operands here.
5805 return !canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly,
5806 /*ConsiderFlags*/ true, Depth) &&
5807 all_of(Op->ops(), [&](SDValue V) {
5808 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts,
5809 PoisonOnly, Depth + 1);
5810 });
5811 }
5812
5813 // TODO: Search for noundef attributes from library functions.
5814
5815 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5816
5817 default:
5818 // Allow the target to implement this method for its nodes.
5819 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5820 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5821 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5822 Op, DemandedElts, *this, PoisonOnly, Depth);
5823 break;
5824 }
5825
5826 // If Op can't create undef/poison and none of its operands are undef/poison
5827 // then Op is never undef/poison.
5828 // NOTE: TargetNodes can handle this in themselves in
5829 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5830 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5831 return !canCreateUndefOrPoison(Op, PoisonOnly, /*ConsiderFlags*/ true,
5832 Depth) &&
5833 all_of(Op->ops(), [&](SDValue V) {
5834 return isGuaranteedNotToBeUndefOrPoison(V, PoisonOnly, Depth + 1);
5835 });
5836}
5837
5839 bool ConsiderFlags,
5840 unsigned Depth) const {
5841 APInt DemandedElts = getDemandAllEltsMask(Op);
5842 return canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly, ConsiderFlags,
5843 Depth);
5844}
5845
5847 bool PoisonOnly, bool ConsiderFlags,
5848 unsigned Depth) const {
5849 if (ConsiderFlags && Op->hasPoisonGeneratingFlags())
5850 return true;
5851
5852 unsigned Opcode = Op.getOpcode();
5853 switch (Opcode) {
5854 case ISD::AssertSext:
5855 case ISD::AssertZext:
5856 case ISD::AssertAlign:
5858 // Assertion nodes can create poison if the assertion fails.
5859 return true;
5860
5861 case ISD::FREEZE:
5865 case ISD::SADDSAT:
5866 case ISD::UADDSAT:
5867 case ISD::SSUBSAT:
5868 case ISD::USUBSAT:
5869 case ISD::MULHU:
5870 case ISD::MULHS:
5871 case ISD::AVGFLOORS:
5872 case ISD::AVGFLOORU:
5873 case ISD::AVGCEILS:
5874 case ISD::AVGCEILU:
5875 case ISD::ABDU:
5876 case ISD::ABDS:
5877 case ISD::SMIN:
5878 case ISD::SMAX:
5879 case ISD::SCMP:
5880 case ISD::UMIN:
5881 case ISD::UMAX:
5882 case ISD::UCMP:
5883 case ISD::AND:
5884 case ISD::XOR:
5885 case ISD::ROTL:
5886 case ISD::ROTR:
5887 case ISD::FSHL:
5888 case ISD::FSHR:
5889 case ISD::BSWAP:
5890 case ISD::CTTZ:
5891 case ISD::CTLZ:
5892 case ISD::CTLS:
5893 case ISD::CTPOP:
5894 case ISD::BITREVERSE:
5895 case ISD::PARITY:
5896 case ISD::SIGN_EXTEND:
5897 case ISD::TRUNCATE:
5901 case ISD::BITCAST:
5902 case ISD::BUILD_VECTOR:
5903 case ISD::BUILD_PAIR:
5904 case ISD::SPLAT_VECTOR:
5905 case ISD::FABS:
5906 return false;
5907
5908 case ISD::ABS:
5909 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5910 // Different to Intrinsic::abs.
5911 return false;
5912
5913 case ISD::ADDC:
5914 case ISD::SUBC:
5915 case ISD::ADDE:
5916 case ISD::SUBE:
5917 case ISD::SADDO:
5918 case ISD::SSUBO:
5919 case ISD::SMULO:
5920 case ISD::SADDO_CARRY:
5921 case ISD::SSUBO_CARRY:
5922 case ISD::UADDO:
5923 case ISD::USUBO:
5924 case ISD::UMULO:
5925 case ISD::UADDO_CARRY:
5926 case ISD::USUBO_CARRY:
5927 // No poison on result or overflow flags.
5928 return false;
5929
5930 case ISD::SELECT_CC:
5931 case ISD::SETCC: {
5932 // Integer setcc cannot create undef or poison.
5933 if (Op.getOperand(0).getValueType().isInteger())
5934 return false;
5935
5936 // FP compares are more complicated. They can create poison for nan/infinity
5937 // based on options and flags. The options and flags also cause special
5938 // nonan condition codes to be used. Those condition codes may be preserved
5939 // even if the nonan flag is dropped somewhere.
5940 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
5941 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
5942 return (unsigned)CCCode & 0x10U;
5943 }
5944
5945 case ISD::OR:
5946 case ISD::ZERO_EXTEND:
5947 case ISD::SELECT:
5948 case ISD::VSELECT:
5949 case ISD::ADD:
5950 case ISD::SUB:
5951 case ISD::MUL:
5952 case ISD::FNEG:
5953 case ISD::FADD:
5954 case ISD::FSUB:
5955 case ISD::FMUL:
5956 case ISD::FDIV:
5957 case ISD::FREM:
5958 case ISD::FCOPYSIGN:
5959 case ISD::FMA:
5960 case ISD::FMAD:
5961 case ISD::FMULADD:
5962 case ISD::FP_EXTEND:
5968 // No poison except from flags (which is handled above)
5969 return false;
5970
5971 case ISD::SHL:
5972 case ISD::SRL:
5973 case ISD::SRA:
5974 // If the max shift amount isn't in range, then the shift can
5975 // create poison.
5976 return !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
5977
5980 // If the amount is zero then the result will be poison.
5981 // TODO: Add isKnownNeverZero DemandedElts handling.
5982 return !isKnownNeverZero(Op.getOperand(0), Depth + 1);
5983
5985 // Check if we demand any upper (undef) elements.
5986 return !PoisonOnly && DemandedElts.ugt(1);
5987
5990 // Ensure that the element index is in bounds.
5991 EVT VecVT = Op.getOperand(0).getValueType();
5992 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
5993 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
5994 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5995 }
5996
5997 case ISD::VECTOR_SHUFFLE: {
5998 // Check for any demanded shuffle element that is undef.
5999 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6000 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6001 if (Elt < 0 && DemandedElts[Idx])
6002 return true;
6003 return false;
6004 }
6005
6007 return false;
6008
6009 default:
6010 // Allow the target to implement this method for its nodes.
6011 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6012 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6013 return TLI->canCreateUndefOrPoisonForTargetNode(
6014 Op, DemandedElts, *this, PoisonOnly, ConsiderFlags, Depth);
6015 break;
6016 }
6017
6018 // Be conservative and return true.
6019 return true;
6020}
6021
6022bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6023 unsigned Opcode = Op.getOpcode();
6024 if (Opcode == ISD::OR)
6025 return Op->getFlags().hasDisjoint() ||
6026 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6027 if (Opcode == ISD::XOR)
6028 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6029 return false;
6030}
6031
6033 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6034 (Op.isAnyAdd() || isADDLike(Op));
6035}
6036
6038 FPClassTest InterestedClasses,
6039 unsigned Depth) const {
6040 APInt DemandedElts = getDemandAllEltsMask(Op);
6041 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6042}
6043
6045 const APInt &DemandedElts,
6046 FPClassTest InterestedClasses,
6047 unsigned Depth) const {
6048 KnownFPClass Known;
6049
6050 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6051 return KnownFPClass(CFP->getValueAPF());
6052
6053 if (Depth >= MaxRecursionDepth)
6054 return Known;
6055
6056 if (Op.getOpcode() == ISD::UNDEF)
6057 return Known;
6058
6059 EVT VT = Op.getValueType();
6060 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6061 assert((!VT.isFixedLengthVector() ||
6062 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6063 "Unexpected vector size");
6064
6065 if (!DemandedElts)
6066 return Known;
6067
6068 unsigned Opcode = Op.getOpcode();
6069 switch (Opcode) {
6070 case ISD::POISON: {
6071 Known.KnownFPClasses = fcNone;
6072 Known.SignBit = false;
6073 break;
6074 }
6075 case ISD::FNEG: {
6076 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6077 InterestedClasses, Depth + 1);
6078 Known.fneg();
6079 break;
6080 }
6081 case ISD::BUILD_VECTOR: {
6082 assert(!VT.isScalableVector());
6083 bool First = true;
6084 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6085 if (!DemandedElts[I])
6086 continue;
6087
6088 if (First) {
6089 Known =
6090 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6091 First = false;
6092 } else {
6093 Known |=
6094 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6095 }
6096
6097 if (Known.isUnknown())
6098 break;
6099 }
6100 break;
6101 }
6103 SDValue Src = Op.getOperand(0);
6104 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6105 EVT SrcVT = Src.getValueType();
6106 if (SrcVT.isFixedLengthVector() && CIdx) {
6107 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6108 APInt DemandedSrcElts = APInt::getOneBitSet(
6109 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6110 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6111 Depth + 1);
6112 } else {
6113 // Out of bounds index is poison.
6114 Known.KnownFPClasses = fcNone;
6115 }
6116 } else {
6117 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6118 }
6119 break;
6120 }
6121 case ISD::SPLAT_VECTOR: {
6122 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6123 break;
6124 }
6125 case ISD::BITCAST: {
6126 // FIXME: It should not be necessary to check for an elementwise bitcast.
6127 // If a bitcast is not elementwise between vector / scalar types,
6128 // computeKnownBits already splices the known bits of the source elements
6129 // appropriately so as to line up with the bits of the result's demanded
6130 // elements.
6131 EVT SrcVT = Op.getOperand(0).getValueType();
6132 if (VT.isScalableVector() || SrcVT.isScalableVector())
6133 break;
6134 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6135 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6136 if (VTNumElts != SrcVTNumElts)
6137 break;
6138
6139 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6140 Known = KnownFPClass::bitcast(VT.getFltSemantics(), Bits);
6141 break;
6142 }
6143 case ISD::FABS: {
6144 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6145 InterestedClasses, Depth + 1);
6146 Known.fabs();
6147 break;
6148 }
6149 case ISD::AssertNoFPClass: {
6150 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6151 InterestedClasses, Depth + 1);
6152 FPClassTest AssertedClasses =
6153 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6154 Known.KnownFPClasses &= ~AssertedClasses;
6155 break;
6156 }
6157 default:
6158 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6159 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6160 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6161 Depth);
6162 }
6163 break;
6164 }
6165
6166 return Known;
6167}
6168
6170 unsigned Depth) const {
6171 APInt DemandedElts = getDemandAllEltsMask(Op);
6172 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6173}
6174
6176 bool SNaN, unsigned Depth) const {
6177 assert(!DemandedElts.isZero() && "No demanded elements");
6178
6179 // If we're told that NaNs won't happen, assume they won't.
6180 if (Op->getFlags().hasNoNaNs())
6181 return true;
6182
6183 if (Depth >= MaxRecursionDepth)
6184 return false; // Limit search depth.
6185
6186 unsigned Opcode = Op.getOpcode();
6187 switch (Opcode) {
6188 case ISD::FADD:
6189 case ISD::FSUB:
6190 case ISD::FMUL:
6191 case ISD::FDIV:
6192 case ISD::FREM:
6193 case ISD::FSIN:
6194 case ISD::FCOS:
6195 case ISD::FTAN:
6196 case ISD::FASIN:
6197 case ISD::FACOS:
6198 case ISD::FATAN:
6199 case ISD::FATAN2:
6200 case ISD::FSINH:
6201 case ISD::FCOSH:
6202 case ISD::FTANH:
6203 case ISD::FMA:
6204 case ISD::FMULADD:
6205 case ISD::FMAD: {
6206 if (SNaN)
6207 return true;
6208 // TODO: Need isKnownNeverInfinity
6209 return false;
6210 }
6211 case ISD::FCANONICALIZE:
6212 case ISD::FEXP:
6213 case ISD::FEXP2:
6214 case ISD::FEXP10:
6215 case ISD::FTRUNC:
6216 case ISD::FFLOOR:
6217 case ISD::FCEIL:
6218 case ISD::FROUND:
6219 case ISD::FROUNDEVEN:
6220 case ISD::LROUND:
6221 case ISD::LLROUND:
6222 case ISD::FRINT:
6223 case ISD::LRINT:
6224 case ISD::LLRINT:
6225 case ISD::FNEARBYINT:
6226 case ISD::FLDEXP: {
6227 if (SNaN)
6228 return true;
6229 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6230 }
6231 case ISD::FABS:
6232 case ISD::FNEG:
6233 case ISD::FCOPYSIGN: {
6234 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6235 }
6236 case ISD::SELECT:
6237 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6238 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6239 case ISD::FP_EXTEND:
6240 case ISD::FP_ROUND: {
6241 if (SNaN)
6242 return true;
6243 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6244 }
6245 case ISD::SINT_TO_FP:
6246 case ISD::UINT_TO_FP:
6247 return true;
6248 case ISD::FSQRT: // Need is known positive
6249 case ISD::FLOG:
6250 case ISD::FLOG2:
6251 case ISD::FLOG10:
6252 case ISD::FPOWI:
6253 case ISD::FPOW: {
6254 if (SNaN)
6255 return true;
6256 // TODO: Refine on operand
6257 return false;
6258 }
6259 case ISD::FMINNUM:
6260 case ISD::FMAXNUM:
6261 case ISD::FMINIMUMNUM:
6262 case ISD::FMAXIMUMNUM: {
6263 // Only one needs to be known not-nan, since it will be returned if the
6264 // other ends up being one.
6265 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6266 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6267 }
6268 case ISD::FMINNUM_IEEE:
6269 case ISD::FMAXNUM_IEEE: {
6270 if (SNaN)
6271 return true;
6272 // This can return a NaN if either operand is an sNaN, or if both operands
6273 // are NaN.
6274 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6275 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6276 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6277 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6278 }
6279 case ISD::FMINIMUM:
6280 case ISD::FMAXIMUM: {
6281 // TODO: Does this quiet or return the origina NaN as-is?
6282 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6283 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6284 }
6286 SDValue Src = Op.getOperand(0);
6287 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6288 EVT SrcVT = Src.getValueType();
6289 if (SrcVT.isFixedLengthVector() && Idx &&
6290 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6291 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6292 Idx->getZExtValue());
6293 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6294 }
6295 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6296 }
6298 SDValue Src = Op.getOperand(0);
6299 if (Src.getValueType().isFixedLengthVector()) {
6300 unsigned Idx = Op.getConstantOperandVal(1);
6301 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6302 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6303 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6304 }
6305 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6306 }
6307 case ISD::INSERT_SUBVECTOR: {
6308 SDValue BaseVector = Op.getOperand(0);
6309 SDValue SubVector = Op.getOperand(1);
6310 EVT BaseVectorVT = BaseVector.getValueType();
6311 if (BaseVectorVT.isFixedLengthVector()) {
6312 unsigned Idx = Op.getConstantOperandVal(2);
6313 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6314 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6315
6316 // Clear/Extract the bits at the position where the subvector will be
6317 // inserted.
6318 APInt DemandedMask =
6319 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6320 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6321 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6322
6323 bool NeverNaN = true;
6324 if (!DemandedSrcElts.isZero())
6325 NeverNaN &=
6326 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6327 if (NeverNaN && !DemandedSubElts.isZero())
6328 NeverNaN &=
6329 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6330 return NeverNaN;
6331 }
6332 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6333 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6334 }
6335 case ISD::BUILD_VECTOR: {
6336 unsigned NumElts = Op.getNumOperands();
6337 for (unsigned I = 0; I != NumElts; ++I)
6338 if (DemandedElts[I] &&
6339 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6340 return false;
6341 return true;
6342 }
6343 case ISD::SPLAT_VECTOR:
6344 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6345 case ISD::AssertNoFPClass: {
6346 FPClassTest NoFPClass =
6347 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6348 if ((NoFPClass & fcNan) == fcNan)
6349 return true;
6350 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6351 return true;
6352 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6353 }
6354 default:
6355 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6356 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6357 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6358 Depth);
6359 }
6360 break;
6361 }
6362
6363 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6364 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6365 return Known.isKnownNever(NanMask);
6366}
6367
6369 APInt DemandedElts = getDemandAllEltsMask(Op);
6370 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6371}
6372
6374 const APInt &DemandedElts,
6375 unsigned Depth) const {
6376 assert(!DemandedElts.isZero() && "No demanded elements");
6377 EVT VT = Op.getValueType();
6378 KnownFPClass Known =
6379 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6380 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6381}
6382
6384 APInt DemandedElts = getDemandAllEltsMask(Op);
6385 return isKnownNeverZero(Op, DemandedElts, Depth);
6386}
6387
6389 unsigned Depth) const {
6390 if (Depth >= MaxRecursionDepth)
6391 return false; // Limit search depth.
6392
6393 EVT OpVT = Op.getValueType();
6394 unsigned BitWidth = OpVT.getScalarSizeInBits();
6395
6396 assert(!Op.getValueType().isFloatingPoint() &&
6397 "Floating point types unsupported - use isKnownNeverLogicalZero");
6398
6399 // If the value is a constant, we can obviously see if it is a zero or not.
6400 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6401 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6402 return !V.isZero();
6403 };
6404
6405 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6406 return true;
6407
6408 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6409 // some degree.
6410 switch (Op.getOpcode()) {
6411 default:
6412 break;
6413
6414 case ISD::BUILD_VECTOR:
6415 // Are all operands of a build vector constant non-zero?
6416 if (all_of(enumerate(Op->ops()), [&](auto P) {
6417 auto *C = dyn_cast<ConstantSDNode>(P.value());
6418 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6419 }))
6420 return true;
6421 break;
6422
6423 case ISD::SPLAT_VECTOR:
6424 // Is the operand of a splat vector a constant non-zero?
6425 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6426 if (IsNeverZero(C))
6427 return true;
6428 break;
6429
6431 SDValue InVec = Op.getOperand(0);
6432 SDValue EltNo = Op.getOperand(1);
6433 EVT VecVT = InVec.getValueType();
6434
6435 // Skip scalable vectors or implicit extensions.
6436 if (VecVT.isScalableVector() ||
6437 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6438 break;
6439
6440 // If we know the element index, just demand that vector element, else for
6441 // an unknown element index, ignore DemandedElts and demand them all.
6442 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6443 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6444 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6445 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6446 DemandedSrcElts =
6447 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6448
6449 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6450 }
6451
6452 case ISD::OR:
6453 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6454 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6455
6456 case ISD::VSELECT:
6457 case ISD::SELECT:
6458 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6459 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6460
6461 case ISD::SHL: {
6462 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6463 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6464 KnownBits ValKnown =
6465 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6466 // 1 << X is never zero.
6467 if (ValKnown.One[0])
6468 return true;
6469 // If max shift cnt of known ones is non-zero, result is non-zero.
6470 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6471 .getMaxValue();
6472 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6473 !ValKnown.One.shl(MaxCnt).isZero())
6474 return true;
6475 break;
6476 }
6477
6478 case ISD::VECTOR_SHUFFLE: {
6479 if (Op.getValueType().isScalableVector())
6480 return false;
6481
6482 unsigned NumElts = DemandedElts.getBitWidth();
6483
6484 // All demanded elements from LHS and RHS must be known non-zero.
6485 // Demanded elements with undef shuffle mask elements are unknown.
6486
6487 APInt DemandedLHS, DemandedRHS;
6488 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6489 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6490 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6491 DemandedLHS, DemandedRHS))
6492 return false;
6493
6494 return (!DemandedLHS ||
6495 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6496 (!DemandedRHS ||
6497 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6498 }
6499
6500 case ISD::UADDSAT:
6501 case ISD::UMAX:
6502 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6503 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6504
6505 case ISD::UMIN:
6506 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6507 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6508
6509 // For smin/smax: If either operand is known negative/positive
6510 // respectively we don't need the other to be known at all.
6511 case ISD::SMAX: {
6512 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6513 if (Op1.isStrictlyPositive())
6514 return true;
6515
6516 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6517 if (Op0.isStrictlyPositive())
6518 return true;
6519
6520 if (Op1.isNonZero() && Op0.isNonZero())
6521 return true;
6522
6523 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6524 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6525 }
6526 case ISD::SMIN: {
6527 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6528 if (Op1.isNegative())
6529 return true;
6530
6531 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6532 if (Op0.isNegative())
6533 return true;
6534
6535 if (Op1.isNonZero() && Op0.isNonZero())
6536 return true;
6537
6538 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6539 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6540 }
6541
6542 case ISD::ROTL:
6543 case ISD::ROTR:
6544 case ISD::BITREVERSE:
6545 case ISD::BSWAP:
6546 case ISD::CTPOP:
6547 case ISD::ABS:
6548 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6549
6550 case ISD::SRA:
6551 case ISD::SRL: {
6552 if (Op->getFlags().hasExact())
6553 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6554 KnownBits ValKnown =
6555 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6556 if (ValKnown.isNegative())
6557 return true;
6558 // If max shift cnt of known ones is non-zero, result is non-zero.
6559 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6560 .getMaxValue();
6561 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6562 !ValKnown.One.lshr(MaxCnt).isZero())
6563 return true;
6564 break;
6565 }
6566 case ISD::UDIV:
6567 case ISD::SDIV:
6568 // div exact can only produce a zero if the dividend is zero.
6569 // TODO: For udiv this is also true if Op1 u<= Op0
6570 if (Op->getFlags().hasExact())
6571 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6572 break;
6573
6574 case ISD::ADD:
6575 if (Op->getFlags().hasNoUnsignedWrap())
6576 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6577 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6578 return true;
6579 // TODO: There are a lot more cases we can prove for add.
6580 break;
6581
6582 case ISD::SUB: {
6583 if (isNullConstant(Op.getOperand(0)))
6584 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6585
6586 std::optional<bool> ne = KnownBits::ne(
6587 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6588 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6589 return ne && *ne;
6590 }
6591
6592 case ISD::MUL:
6593 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6594 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6595 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6596 return true;
6597 break;
6598
6599 case ISD::ZERO_EXTEND:
6600 case ISD::SIGN_EXTEND:
6601 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6602 case ISD::VSCALE: {
6604 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6605 ConstantRange CR =
6606 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6607 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6608 return true;
6609 break;
6610 }
6611 }
6612
6614}
6615
6617 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6618 return !C1->isNegative();
6619
6620 switch (Op.getOpcode()) {
6621 case ISD::FABS:
6622 case ISD::FEXP:
6623 case ISD::FEXP2:
6624 case ISD::FEXP10:
6625 return true;
6626 default:
6627 return false;
6628 }
6629
6630 llvm_unreachable("covered opcode switch");
6631}
6632
6634 assert(Use.getValueType().isFloatingPoint());
6635 const SDNode *User = Use.getUser();
6636 if (User->getFlags().hasNoSignedZeros())
6637 return true;
6638
6639 unsigned OperandNo = Use.getOperandNo();
6640 // Check if this use is insensitive to the sign of zero
6641 switch (User->getOpcode()) {
6642 case ISD::SETCC:
6643 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6644 case ISD::FABS:
6645 // fabs always produces +0.0.
6646 return true;
6647 case ISD::FCOPYSIGN:
6648 // copysign overwrites the sign bit of the first operand.
6649 return OperandNo == 0;
6650 case ISD::FADD:
6651 case ISD::FSUB: {
6652 // Arithmetic with non-zero constants fixes the uncertainty around the
6653 // sign bit.
6654 SDValue Other = User->getOperand(1 - OperandNo);
6656 }
6657 case ISD::FP_TO_SINT:
6658 case ISD::FP_TO_UINT:
6659 // fp-to-int conversions normalize signed zeros.
6660 return true;
6661 default:
6662 return false;
6663 }
6664}
6665
6667 if (Op->getFlags().hasNoSignedZeros())
6668 return true;
6669 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6670 // regression. Ideally, this should be implemented as a demanded-bits
6671 // optimization that stems from the users.
6672 if (Op->use_size() > 2)
6673 return false;
6674 return all_of(Op->uses(),
6675 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6676}
6677
6679 // Check the obvious case.
6680 if (A == B) return true;
6681
6682 // For negative and positive zero.
6685 if (CA->isZero() && CB->isZero()) return true;
6686
6687 // Otherwise they may not be equal.
6688 return false;
6689}
6690
6691// Only bits set in Mask must be negated, other bits may be arbitrary.
6693 if (isBitwiseNot(V, AllowUndefs))
6694 return V.getOperand(0);
6695
6696 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6697 // bits in the non-extended part.
6698 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6699 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6700 return SDValue();
6701 SDValue ExtArg = V.getOperand(0);
6702 if (ExtArg.getScalarValueSizeInBits() >=
6703 MaskC->getAPIntValue().getActiveBits() &&
6704 isBitwiseNot(ExtArg, AllowUndefs) &&
6705 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6706 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6707 return ExtArg.getOperand(0).getOperand(0);
6708 return SDValue();
6709}
6710
6712 // Match masked merge pattern (X & ~M) op (Y & M)
6713 // Including degenerate case (X & ~M) op M
6714 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6715 SDValue Other) {
6716 if (SDValue NotOperand =
6717 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6718 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6719 NotOperand->getOpcode() == ISD::TRUNCATE)
6720 NotOperand = NotOperand->getOperand(0);
6721
6722 if (Other == NotOperand)
6723 return true;
6724 if (Other->getOpcode() == ISD::AND)
6725 return NotOperand == Other->getOperand(0) ||
6726 NotOperand == Other->getOperand(1);
6727 }
6728 return false;
6729 };
6730
6731 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6732 A = A->getOperand(0);
6733
6734 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6735 B = B->getOperand(0);
6736
6737 if (A->getOpcode() == ISD::AND)
6738 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6739 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6740 return false;
6741}
6742
6743// FIXME: unify with llvm::haveNoCommonBitsSet.
6745 assert(A.getValueType() == B.getValueType() &&
6746 "Values must have the same type");
6749 return true;
6752}
6753
6754static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6755 SelectionDAG &DAG) {
6756 if (cast<ConstantSDNode>(Step)->isZero())
6757 return DAG.getConstant(0, DL, VT);
6758
6759 return SDValue();
6760}
6761
6764 SelectionDAG &DAG) {
6765 int NumOps = Ops.size();
6766 assert(NumOps != 0 && "Can't build an empty vector!");
6767 assert(!VT.isScalableVector() &&
6768 "BUILD_VECTOR cannot be used with scalable types");
6769 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6770 "Incorrect element count in BUILD_VECTOR!");
6771
6772 // BUILD_VECTOR of UNDEFs is UNDEF.
6773 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6774 return DAG.getUNDEF(VT);
6775
6776 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6777 SDValue IdentitySrc;
6778 bool IsIdentity = true;
6779 for (int i = 0; i != NumOps; ++i) {
6781 Ops[i].getOperand(0).getValueType() != VT ||
6782 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6783 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6784 Ops[i].getConstantOperandAPInt(1) != i) {
6785 IsIdentity = false;
6786 break;
6787 }
6788 IdentitySrc = Ops[i].getOperand(0);
6789 }
6790 if (IsIdentity)
6791 return IdentitySrc;
6792
6793 return SDValue();
6794}
6795
6796/// Try to simplify vector concatenation to an input value, undef, or build
6797/// vector.
6800 SelectionDAG &DAG) {
6801 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6803 [Ops](SDValue Op) {
6804 return Ops[0].getValueType() == Op.getValueType();
6805 }) &&
6806 "Concatenation of vectors with inconsistent value types!");
6807 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6808 VT.getVectorElementCount() &&
6809 "Incorrect element count in vector concatenation!");
6810
6811 if (Ops.size() == 1)
6812 return Ops[0];
6813
6814 // Concat of UNDEFs is UNDEF.
6815 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6816 return DAG.getUNDEF(VT);
6817
6818 // Scan the operands and look for extract operations from a single source
6819 // that correspond to insertion at the same location via this concatenation:
6820 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6821 SDValue IdentitySrc;
6822 bool IsIdentity = true;
6823 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6824 SDValue Op = Ops[i];
6825 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
6826 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
6827 Op.getOperand(0).getValueType() != VT ||
6828 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
6829 Op.getConstantOperandVal(1) != IdentityIndex) {
6830 IsIdentity = false;
6831 break;
6832 }
6833 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
6834 "Unexpected identity source vector for concat of extracts");
6835 IdentitySrc = Op.getOperand(0);
6836 }
6837 if (IsIdentity) {
6838 assert(IdentitySrc && "Failed to set source vector of extracts");
6839 return IdentitySrc;
6840 }
6841
6842 // The code below this point is only designed to work for fixed width
6843 // vectors, so we bail out for now.
6844 if (VT.isScalableVector())
6845 return SDValue();
6846
6847 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
6848 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
6849 // BUILD_VECTOR.
6850 // FIXME: Add support for SCALAR_TO_VECTOR as well.
6851 EVT SVT = VT.getScalarType();
6853 for (SDValue Op : Ops) {
6854 EVT OpVT = Op.getValueType();
6855 if (Op.isUndef())
6856 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
6857 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
6858 Elts.append(Op->op_begin(), Op->op_end());
6859 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
6860 OpVT.getVectorNumElements() == 1 &&
6861 isNullConstant(Op.getOperand(2)))
6862 Elts.push_back(Op.getOperand(1));
6863 else
6864 return SDValue();
6865 }
6866
6867 // BUILD_VECTOR requires all inputs to be of the same type, find the
6868 // maximum type and extend them all.
6869 for (SDValue Op : Elts)
6870 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
6871
6872 if (SVT.bitsGT(VT.getScalarType())) {
6873 for (SDValue &Op : Elts) {
6874 if (Op.isUndef())
6875 Op = DAG.getUNDEF(SVT);
6876 else
6877 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
6878 ? DAG.getZExtOrTrunc(Op, DL, SVT)
6879 : DAG.getSExtOrTrunc(Op, DL, SVT);
6880 }
6881 }
6882
6883 SDValue V = DAG.getBuildVector(VT, DL, Elts);
6884 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
6885 return V;
6886}
6887
6888/// Gets or creates the specified node.
6889SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6890 SDVTList VTs = getVTList(VT);
6892 AddNodeIDNode(ID, Opcode, VTs, {});
6893 void *IP = nullptr;
6894 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6895 return SDValue(E, 0);
6896
6897 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6898 CSEMap.InsertNode(N, IP);
6899
6900 InsertNode(N);
6901 SDValue V = SDValue(N, 0);
6902 NewSDValueDbgMsg(V, "Creating new node: ", this);
6903 return V;
6904}
6905
6906SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6907 SDValue N1) {
6908 SDNodeFlags Flags;
6909 if (Inserter)
6910 Flags = Inserter->getFlags();
6911 return getNode(Opcode, DL, VT, N1, Flags);
6912}
6913
6914SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6915 SDValue N1, const SDNodeFlags Flags) {
6916 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
6917
6918 // Constant fold unary operations with a vector integer or float operand.
6919 switch (Opcode) {
6920 default:
6921 // FIXME: Entirely reasonable to perform folding of other unary
6922 // operations here as the need arises.
6923 break;
6924 case ISD::FNEG:
6925 case ISD::FABS:
6926 case ISD::FCEIL:
6927 case ISD::FTRUNC:
6928 case ISD::FFLOOR:
6929 case ISD::FP_EXTEND:
6930 case ISD::FP_TO_SINT:
6931 case ISD::FP_TO_UINT:
6932 case ISD::FP_TO_FP16:
6933 case ISD::FP_TO_BF16:
6934 case ISD::TRUNCATE:
6935 case ISD::ANY_EXTEND:
6936 case ISD::ZERO_EXTEND:
6937 case ISD::SIGN_EXTEND:
6938 case ISD::UINT_TO_FP:
6939 case ISD::SINT_TO_FP:
6940 case ISD::FP16_TO_FP:
6941 case ISD::BF16_TO_FP:
6942 case ISD::BITCAST:
6943 case ISD::ABS:
6944 case ISD::BITREVERSE:
6945 case ISD::BSWAP:
6946 case ISD::CTLZ:
6948 case ISD::CTTZ:
6950 case ISD::CTPOP:
6951 case ISD::CTLS:
6952 case ISD::STEP_VECTOR: {
6953 SDValue Ops = {N1};
6954 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
6955 return Fold;
6956 }
6957 }
6958
6959 unsigned OpOpcode = N1.getNode()->getOpcode();
6960 switch (Opcode) {
6961 case ISD::STEP_VECTOR:
6962 assert(VT.isScalableVector() &&
6963 "STEP_VECTOR can only be used with scalable types");
6964 assert(OpOpcode == ISD::TargetConstant &&
6965 VT.getVectorElementType() == N1.getValueType() &&
6966 "Unexpected step operand");
6967 break;
6968 case ISD::FREEZE:
6969 assert(VT == N1.getValueType() && "Unexpected VT!");
6970 if (isGuaranteedNotToBeUndefOrPoison(N1, /*PoisonOnly=*/false))
6971 return N1;
6972 break;
6973 case ISD::TokenFactor:
6974 case ISD::MERGE_VALUES:
6976 return N1; // Factor, merge or concat of one node? No need.
6977 case ISD::BUILD_VECTOR: {
6978 // Attempt to simplify BUILD_VECTOR.
6979 SDValue Ops[] = {N1};
6980 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
6981 return V;
6982 break;
6983 }
6984 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
6985 case ISD::FP_EXTEND:
6987 "Invalid FP cast!");
6988 if (N1.getValueType() == VT) return N1; // noop conversion.
6989 assert((!VT.isVector() || VT.getVectorElementCount() ==
6991 "Vector element count mismatch!");
6992 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
6993 if (N1.isUndef())
6994 return getUNDEF(VT);
6995 break;
6996 case ISD::FP_TO_SINT:
6997 case ISD::FP_TO_UINT:
6998 if (N1.isUndef())
6999 return getUNDEF(VT);
7000 break;
7001 case ISD::SINT_TO_FP:
7002 case ISD::UINT_TO_FP:
7003 // [us]itofp(undef) = 0, because the result value is bounded.
7004 if (N1.isUndef())
7005 return getConstantFP(0.0, DL, VT);
7006 break;
7007 case ISD::SIGN_EXTEND:
7008 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7009 "Invalid SIGN_EXTEND!");
7010 assert(VT.isVector() == N1.getValueType().isVector() &&
7011 "SIGN_EXTEND result type type should be vector iff the operand "
7012 "type is vector!");
7013 if (N1.getValueType() == VT) return N1; // noop extension
7014 assert((!VT.isVector() || VT.getVectorElementCount() ==
7016 "Vector element count mismatch!");
7017 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7018 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7019 SDNodeFlags Flags;
7020 if (OpOpcode == ISD::ZERO_EXTEND)
7021 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7022 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7023 transferDbgValues(N1, NewVal);
7024 return NewVal;
7025 }
7026
7027 if (OpOpcode == ISD::POISON)
7028 return getPOISON(VT);
7029
7030 if (N1.isUndef())
7031 // sext(undef) = 0, because the top bits will all be the same.
7032 return getConstant(0, DL, VT);
7033
7034 // Skip unnecessary sext_inreg pattern:
7035 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7036 if (OpOpcode == ISD::TRUNCATE) {
7037 SDValue OpOp = N1.getOperand(0);
7038 if (OpOp.getValueType() == VT) {
7039 unsigned NumSignExtBits =
7041 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7042 transferDbgValues(N1, OpOp);
7043 return OpOp;
7044 }
7045 }
7046 }
7047 break;
7048 case ISD::ZERO_EXTEND:
7049 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7050 "Invalid ZERO_EXTEND!");
7051 assert(VT.isVector() == N1.getValueType().isVector() &&
7052 "ZERO_EXTEND result type type should be vector iff the operand "
7053 "type is vector!");
7054 if (N1.getValueType() == VT) return N1; // noop extension
7055 assert((!VT.isVector() || VT.getVectorElementCount() ==
7057 "Vector element count mismatch!");
7058 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7059 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7060 SDNodeFlags Flags;
7061 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7062 SDValue NewVal =
7063 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7064 transferDbgValues(N1, NewVal);
7065 return NewVal;
7066 }
7067
7068 if (OpOpcode == ISD::POISON)
7069 return getPOISON(VT);
7070
7071 if (N1.isUndef())
7072 // zext(undef) = 0, because the top bits will be zero.
7073 return getConstant(0, DL, VT);
7074
7075 // Skip unnecessary zext_inreg pattern:
7076 // (zext (trunc x)) -> x iff the upper bits are known zero.
7077 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7078 // use to recognise zext_inreg patterns.
7079 if (OpOpcode == ISD::TRUNCATE) {
7080 SDValue OpOp = N1.getOperand(0);
7081 if (OpOp.getValueType() == VT) {
7082 if (OpOp.getOpcode() != ISD::AND) {
7085 if (MaskedValueIsZero(OpOp, HiBits)) {
7086 transferDbgValues(N1, OpOp);
7087 return OpOp;
7088 }
7089 }
7090 }
7091 }
7092 break;
7093 case ISD::ANY_EXTEND:
7094 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7095 "Invalid ANY_EXTEND!");
7096 assert(VT.isVector() == N1.getValueType().isVector() &&
7097 "ANY_EXTEND result type type should be vector iff the operand "
7098 "type is vector!");
7099 if (N1.getValueType() == VT) return N1; // noop extension
7100 assert((!VT.isVector() || VT.getVectorElementCount() ==
7102 "Vector element count mismatch!");
7103 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7104
7105 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7106 OpOpcode == ISD::ANY_EXTEND) {
7107 SDNodeFlags Flags;
7108 if (OpOpcode == ISD::ZERO_EXTEND)
7109 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7110 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7111 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7112 }
7113 if (N1.isUndef())
7114 return getUNDEF(VT);
7115
7116 // (ext (trunc x)) -> x
7117 if (OpOpcode == ISD::TRUNCATE) {
7118 SDValue OpOp = N1.getOperand(0);
7119 if (OpOp.getValueType() == VT) {
7120 transferDbgValues(N1, OpOp);
7121 return OpOp;
7122 }
7123 }
7124 break;
7125 case ISD::TRUNCATE:
7126 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7127 "Invalid TRUNCATE!");
7128 assert(VT.isVector() == N1.getValueType().isVector() &&
7129 "TRUNCATE result type type should be vector iff the operand "
7130 "type is vector!");
7131 if (N1.getValueType() == VT) return N1; // noop truncate
7132 assert((!VT.isVector() || VT.getVectorElementCount() ==
7134 "Vector element count mismatch!");
7135 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7136 if (OpOpcode == ISD::TRUNCATE)
7137 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7138 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7139 OpOpcode == ISD::ANY_EXTEND) {
7140 // If the source is smaller than the dest, we still need an extend.
7142 VT.getScalarType())) {
7143 SDNodeFlags Flags;
7144 if (OpOpcode == ISD::ZERO_EXTEND)
7145 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7146 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7147 }
7148 if (N1.getOperand(0).getValueType().bitsGT(VT))
7149 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7150 return N1.getOperand(0);
7151 }
7152 if (N1.isUndef())
7153 return getUNDEF(VT);
7154 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7155 return getVScale(DL, VT,
7157 break;
7161 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7162 assert(N1.getValueType().bitsLE(VT) &&
7163 "The input must be the same size or smaller than the result.");
7166 "The destination vector type must have fewer lanes than the input.");
7167 break;
7168 case ISD::ABS:
7169 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7170 if (N1.isUndef())
7171 return getConstant(0, DL, VT);
7172 break;
7173 case ISD::BSWAP:
7174 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7175 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7176 "BSWAP types must be a multiple of 16 bits!");
7177 if (N1.isUndef())
7178 return getUNDEF(VT);
7179 // bswap(bswap(X)) -> X.
7180 if (OpOpcode == ISD::BSWAP)
7181 return N1.getOperand(0);
7182 break;
7183 case ISD::BITREVERSE:
7184 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7185 if (N1.isUndef())
7186 return getUNDEF(VT);
7187 break;
7188 case ISD::BITCAST:
7190 "Cannot BITCAST between types of different sizes!");
7191 if (VT == N1.getValueType()) return N1; // noop conversion.
7192 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7193 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7194 if (N1.isUndef())
7195 return getUNDEF(VT);
7196 break;
7198 assert(VT.isVector() && !N1.getValueType().isVector() &&
7199 (VT.getVectorElementType() == N1.getValueType() ||
7201 N1.getValueType().isInteger() &&
7203 "Illegal SCALAR_TO_VECTOR node!");
7204 if (N1.isUndef())
7205 return getUNDEF(VT);
7206 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7207 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7209 N1.getConstantOperandVal(1) == 0 &&
7210 N1.getOperand(0).getValueType() == VT)
7211 return N1.getOperand(0);
7212 break;
7213 case ISD::FNEG:
7214 // Negation of an unknown bag of bits is still completely undefined.
7215 if (N1.isUndef())
7216 return getUNDEF(VT);
7217
7218 if (OpOpcode == ISD::FNEG) // --X -> X
7219 return N1.getOperand(0);
7220 break;
7221 case ISD::FABS:
7222 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7223 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7224 break;
7225 case ISD::VSCALE:
7226 assert(VT == N1.getValueType() && "Unexpected VT!");
7227 break;
7228 case ISD::CTPOP:
7229 if (N1.getValueType().getScalarType() == MVT::i1)
7230 return N1;
7231 break;
7232 case ISD::CTLZ:
7233 case ISD::CTTZ:
7234 if (N1.getValueType().getScalarType() == MVT::i1)
7235 return getNOT(DL, N1, N1.getValueType());
7236 break;
7237 case ISD::CTLS:
7238 if (N1.getValueType().getScalarType() == MVT::i1)
7239 return getConstant(0, DL, VT);
7240 break;
7241 case ISD::VECREDUCE_ADD:
7242 if (N1.getValueType().getScalarType() == MVT::i1)
7243 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7244 break;
7247 if (N1.getValueType().getScalarType() == MVT::i1)
7248 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7249 break;
7252 if (N1.getValueType().getScalarType() == MVT::i1)
7253 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7254 break;
7255 case ISD::SPLAT_VECTOR:
7256 assert(VT.isVector() && "Wrong return type!");
7257 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7258 // that for now.
7260 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7262 N1.getValueType().isInteger() &&
7264 "Wrong operand type!");
7265 break;
7266 }
7267
7268 SDNode *N;
7269 SDVTList VTs = getVTList(VT);
7270 SDValue Ops[] = {N1};
7271 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7273 AddNodeIDNode(ID, Opcode, VTs, Ops);
7274 void *IP = nullptr;
7275 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7276 E->intersectFlagsWith(Flags);
7277 return SDValue(E, 0);
7278 }
7279
7280 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7281 N->setFlags(Flags);
7282 createOperands(N, Ops);
7283 CSEMap.InsertNode(N, IP);
7284 } else {
7285 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7286 createOperands(N, Ops);
7287 }
7288
7289 InsertNode(N);
7290 SDValue V = SDValue(N, 0);
7291 NewSDValueDbgMsg(V, "Creating new node: ", this);
7292 return V;
7293}
7294
7295static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7296 const APInt &C2) {
7297 switch (Opcode) {
7298 case ISD::ADD: return C1 + C2;
7299 case ISD::SUB: return C1 - C2;
7300 case ISD::MUL: return C1 * C2;
7301 case ISD::AND: return C1 & C2;
7302 case ISD::OR: return C1 | C2;
7303 case ISD::XOR: return C1 ^ C2;
7304 case ISD::SHL: return C1 << C2;
7305 case ISD::SRL: return C1.lshr(C2);
7306 case ISD::SRA: return C1.ashr(C2);
7307 case ISD::ROTL: return C1.rotl(C2);
7308 case ISD::ROTR: return C1.rotr(C2);
7309 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7310 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7311 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7312 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7313 case ISD::SADDSAT: return C1.sadd_sat(C2);
7314 case ISD::UADDSAT: return C1.uadd_sat(C2);
7315 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7316 case ISD::USUBSAT: return C1.usub_sat(C2);
7317 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7318 case ISD::USHLSAT: return C1.ushl_sat(C2);
7319 case ISD::UDIV:
7320 if (!C2.getBoolValue())
7321 break;
7322 return C1.udiv(C2);
7323 case ISD::UREM:
7324 if (!C2.getBoolValue())
7325 break;
7326 return C1.urem(C2);
7327 case ISD::SDIV:
7328 if (!C2.getBoolValue())
7329 break;
7330 return C1.sdiv(C2);
7331 case ISD::SREM:
7332 if (!C2.getBoolValue())
7333 break;
7334 return C1.srem(C2);
7335 case ISD::AVGFLOORS:
7336 return APIntOps::avgFloorS(C1, C2);
7337 case ISD::AVGFLOORU:
7338 return APIntOps::avgFloorU(C1, C2);
7339 case ISD::AVGCEILS:
7340 return APIntOps::avgCeilS(C1, C2);
7341 case ISD::AVGCEILU:
7342 return APIntOps::avgCeilU(C1, C2);
7343 case ISD::ABDS:
7344 return APIntOps::abds(C1, C2);
7345 case ISD::ABDU:
7346 return APIntOps::abdu(C1, C2);
7347 case ISD::MULHS:
7348 return APIntOps::mulhs(C1, C2);
7349 case ISD::MULHU:
7350 return APIntOps::mulhu(C1, C2);
7351 case ISD::CLMUL:
7352 return APIntOps::clmul(C1, C2);
7353 case ISD::CLMULR:
7354 return APIntOps::clmulr(C1, C2);
7355 case ISD::CLMULH:
7356 return APIntOps::clmulh(C1, C2);
7357 }
7358 return std::nullopt;
7359}
7360// Handle constant folding with UNDEF.
7361// TODO: Handle more cases.
7362static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7363 bool IsUndef1, const APInt &C2,
7364 bool IsUndef2) {
7365 if (!(IsUndef1 || IsUndef2))
7366 return FoldValue(Opcode, C1, C2);
7367
7368 // Fold and(x, undef) -> 0
7369 // Fold mul(x, undef) -> 0
7370 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7371 return APInt::getZero(C1.getBitWidth());
7372
7373 return std::nullopt;
7374}
7375
7377 const GlobalAddressSDNode *GA,
7378 const SDNode *N2) {
7379 if (GA->getOpcode() != ISD::GlobalAddress)
7380 return SDValue();
7381 if (!TLI->isOffsetFoldingLegal(GA))
7382 return SDValue();
7383 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7384 if (!C2)
7385 return SDValue();
7386 int64_t Offset = C2->getSExtValue();
7387 switch (Opcode) {
7388 case ISD::ADD:
7389 case ISD::PTRADD:
7390 break;
7391 case ISD::SUB: Offset = -uint64_t(Offset); break;
7392 default: return SDValue();
7393 }
7394 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7395 GA->getOffset() + uint64_t(Offset));
7396}
7397
7399 switch (Opcode) {
7400 case ISD::SDIV:
7401 case ISD::UDIV:
7402 case ISD::SREM:
7403 case ISD::UREM: {
7404 // If a divisor is zero/undef or any element of a divisor vector is
7405 // zero/undef, the whole op is undef.
7406 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7407 SDValue Divisor = Ops[1];
7408 if (Divisor.isUndef() || isNullConstant(Divisor))
7409 return true;
7410
7411 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7412 llvm::any_of(Divisor->op_values(),
7413 [](SDValue V) { return V.isUndef() ||
7414 isNullConstant(V); });
7415 // TODO: Handle signed overflow.
7416 }
7417 // TODO: Handle oversized shifts.
7418 default:
7419 return false;
7420 }
7421}
7422
7425 SDNodeFlags Flags) {
7426 // If the opcode is a target-specific ISD node, there's nothing we can
7427 // do here and the operand rules may not line up with the below, so
7428 // bail early.
7429 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7430 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7431 // foldCONCAT_VECTORS in getNode before this is called.
7432 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7433 return SDValue();
7434
7435 unsigned NumOps = Ops.size();
7436 if (NumOps == 0)
7437 return SDValue();
7438
7439 if (isUndef(Opcode, Ops))
7440 return getUNDEF(VT);
7441
7442 // Handle unary special cases.
7443 if (NumOps == 1) {
7444 SDValue N1 = Ops[0];
7445
7446 // Constant fold unary operations with an integer constant operand. Even
7447 // opaque constant will be folded, because the folding of unary operations
7448 // doesn't create new constants with different values. Nevertheless, the
7449 // opaque flag is preserved during folding to prevent future folding with
7450 // other constants.
7451 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7452 const APInt &Val = C->getAPIntValue();
7453 switch (Opcode) {
7454 case ISD::SIGN_EXTEND:
7455 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7456 C->isTargetOpcode(), C->isOpaque());
7457 case ISD::TRUNCATE:
7458 if (C->isOpaque())
7459 break;
7460 [[fallthrough]];
7461 case ISD::ZERO_EXTEND:
7462 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7463 C->isTargetOpcode(), C->isOpaque());
7464 case ISD::ANY_EXTEND:
7465 // Some targets like RISCV prefer to sign extend some types.
7466 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7467 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7468 C->isTargetOpcode(), C->isOpaque());
7469 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7470 C->isTargetOpcode(), C->isOpaque());
7471 case ISD::ABS:
7472 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7473 C->isOpaque());
7474 case ISD::BITREVERSE:
7475 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7476 C->isOpaque());
7477 case ISD::BSWAP:
7478 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7479 C->isOpaque());
7480 case ISD::CTPOP:
7481 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7482 C->isOpaque());
7483 case ISD::CTLZ:
7485 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7486 C->isOpaque());
7487 case ISD::CTTZ:
7489 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7490 C->isOpaque());
7491 case ISD::CTLS:
7492 // CTLS returns the number of extra sign bits so subtract one.
7493 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7494 C->isTargetOpcode(), C->isOpaque());
7495 case ISD::UINT_TO_FP:
7496 case ISD::SINT_TO_FP: {
7498 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7500 return getConstantFP(FPV, DL, VT);
7501 }
7502 case ISD::FP16_TO_FP:
7503 case ISD::BF16_TO_FP: {
7504 bool Ignored;
7505 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7506 : APFloat::BFloat(),
7507 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7508
7509 // This can return overflow, underflow, or inexact; we don't care.
7510 // FIXME need to be more flexible about rounding mode.
7512 &Ignored);
7513 return getConstantFP(FPV, DL, VT);
7514 }
7515 case ISD::STEP_VECTOR:
7516 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7517 return V;
7518 break;
7519 case ISD::BITCAST:
7520 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7521 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7522 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7523 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7524 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7525 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7526 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7527 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7528 break;
7529 }
7530 }
7531
7532 // Constant fold unary operations with a floating point constant operand.
7533 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7534 APFloat V = C->getValueAPF(); // make copy
7535 switch (Opcode) {
7536 case ISD::FNEG:
7537 V.changeSign();
7538 return getConstantFP(V, DL, VT);
7539 case ISD::FABS:
7540 V.clearSign();
7541 return getConstantFP(V, DL, VT);
7542 case ISD::FCEIL: {
7543 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7545 return getConstantFP(V, DL, VT);
7546 return SDValue();
7547 }
7548 case ISD::FTRUNC: {
7549 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7551 return getConstantFP(V, DL, VT);
7552 return SDValue();
7553 }
7554 case ISD::FFLOOR: {
7555 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7557 return getConstantFP(V, DL, VT);
7558 return SDValue();
7559 }
7560 case ISD::FP_EXTEND: {
7561 bool ignored;
7562 // This can return overflow, underflow, or inexact; we don't care.
7563 // FIXME need to be more flexible about rounding mode.
7564 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7565 &ignored);
7566 return getConstantFP(V, DL, VT);
7567 }
7568 case ISD::FP_TO_SINT:
7569 case ISD::FP_TO_UINT: {
7570 bool ignored;
7571 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7572 // FIXME need to be more flexible about rounding mode.
7574 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7575 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7576 break;
7577 return getConstant(IntVal, DL, VT);
7578 }
7579 case ISD::FP_TO_FP16:
7580 case ISD::FP_TO_BF16: {
7581 bool Ignored;
7582 // This can return overflow, underflow, or inexact; we don't care.
7583 // FIXME need to be more flexible about rounding mode.
7584 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7585 : APFloat::BFloat(),
7587 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7588 }
7589 case ISD::BITCAST:
7590 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7591 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7592 VT);
7593 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7594 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7595 VT);
7596 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7597 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7598 VT);
7599 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7600 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7601 break;
7602 }
7603 }
7604
7605 // Early-out if we failed to constant fold a bitcast.
7606 if (Opcode == ISD::BITCAST)
7607 return SDValue();
7608 }
7609
7610 // Handle binops special cases.
7611 if (NumOps == 2) {
7612 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7613 return CFP;
7614
7615 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7616 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7617 if (C1->isOpaque() || C2->isOpaque())
7618 return SDValue();
7619
7620 std::optional<APInt> FoldAttempt =
7621 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7622 if (!FoldAttempt)
7623 return SDValue();
7624
7625 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7626 assert((!Folded || !VT.isVector()) &&
7627 "Can't fold vectors ops with scalar operands");
7628 return Folded;
7629 }
7630 }
7631
7632 // fold (add Sym, c) -> Sym+c
7634 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7635 if (TLI->isCommutativeBinOp(Opcode))
7637 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7638
7639 // fold (sext_in_reg c1) -> c2
7640 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7641 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7642
7643 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7644 unsigned FromBits = EVT.getScalarSizeInBits();
7645 Val <<= Val.getBitWidth() - FromBits;
7646 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7647 return getConstant(Val, DL, ConstantVT);
7648 };
7649
7650 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7651 const APInt &Val = C1->getAPIntValue();
7652 return SignExtendInReg(Val, VT);
7653 }
7654
7656 SmallVector<SDValue, 8> ScalarOps;
7657 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7658 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7659 SDValue Op = Ops[0].getOperand(I);
7660 if (Op.isUndef()) {
7661 ScalarOps.push_back(getUNDEF(OpVT));
7662 continue;
7663 }
7664 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7665 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7666 }
7667 return getBuildVector(VT, DL, ScalarOps);
7668 }
7669
7670 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7671 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7672 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7673 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7674 Ops[0].getOperand(0).getValueType()));
7675 }
7676 }
7677
7678 // Handle fshl/fshr special cases.
7679 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7680 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7681 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7682 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7683
7684 if (C1 && C2 && C3) {
7685 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7686 return SDValue();
7687 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7688 &V3 = C3->getAPIntValue();
7689
7690 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7691 : APIntOps::fshr(V1, V2, V3);
7692 return getConstant(FoldedVal, DL, VT);
7693 }
7694 }
7695
7696 // Handle fma/fmad special cases.
7697 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7698 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7699 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7700 Ops[2].getValueType() == VT && "FMA types must match!");
7704 if (C1 && C2 && C3) {
7705 APFloat V1 = C1->getValueAPF();
7706 const APFloat &V2 = C2->getValueAPF();
7707 const APFloat &V3 = C3->getValueAPF();
7708 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7711 } else
7713 return getConstantFP(V1, DL, VT);
7714 }
7715 }
7716
7717 // This is for vector folding only from here on.
7718 if (!VT.isVector())
7719 return SDValue();
7720
7721 ElementCount NumElts = VT.getVectorElementCount();
7722
7723 // See if we can fold through any bitcasted integer ops.
7724 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7725 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7726 (Ops[0].getOpcode() == ISD::BITCAST ||
7727 Ops[1].getOpcode() == ISD::BITCAST)) {
7730 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7731 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7732 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7733 N2.getValueType().isInteger()) {
7734 bool IsLE = getDataLayout().isLittleEndian();
7735 unsigned EltBits = VT.getScalarSizeInBits();
7736 SmallVector<APInt> RawBits1, RawBits2;
7737 BitVector UndefElts1, UndefElts2;
7738 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7739 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7740 SmallVector<APInt> RawBits;
7741 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7742 std::optional<APInt> Fold = FoldValueWithUndef(
7743 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7744 if (!Fold)
7745 break;
7746 RawBits.push_back(*Fold);
7747 }
7748 if (RawBits.size() == NumElts.getFixedValue()) {
7749 // We have constant folded, but we might need to cast this again back
7750 // to the original (possibly legalized) type.
7751 EVT BVVT, BVEltVT;
7752 if (N1.getValueType() == VT) {
7753 BVVT = N1.getValueType();
7754 BVEltVT = BV1->getOperand(0).getValueType();
7755 } else {
7756 BVVT = N2.getValueType();
7757 BVEltVT = BV2->getOperand(0).getValueType();
7758 }
7759 unsigned BVEltBits = BVEltVT.getSizeInBits();
7760 SmallVector<APInt> DstBits;
7761 BitVector DstUndefs;
7763 DstBits, RawBits, DstUndefs,
7764 BitVector(RawBits.size(), false));
7765 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
7766 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
7767 if (DstUndefs[I])
7768 continue;
7769 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
7770 }
7771 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
7772 }
7773 }
7774 }
7775 }
7776
7777 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
7778 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
7779 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
7780 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
7781 APInt RHSVal;
7782 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
7783 APInt NewStep = Opcode == ISD::MUL
7784 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
7785 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
7786 return getStepVector(DL, VT, NewStep);
7787 }
7788 }
7789
7790 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
7791 return !Op.getValueType().isVector() ||
7792 Op.getValueType().getVectorElementCount() == NumElts;
7793 };
7794
7795 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
7796 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
7797 Op.getOpcode() == ISD::BUILD_VECTOR ||
7798 Op.getOpcode() == ISD::SPLAT_VECTOR;
7799 };
7800
7801 // All operands must be vector types with the same number of elements as
7802 // the result type and must be either UNDEF or a build/splat vector
7803 // or UNDEF scalars.
7804 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
7805 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
7806 return SDValue();
7807
7808 // If we are comparing vectors, then the result needs to be a i1 boolean that
7809 // is then extended back to the legal result type depending on how booleans
7810 // are represented.
7811 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
7812 ISD::NodeType ExtendCode =
7813 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
7814 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
7816
7817 // Find legal integer scalar type for constant promotion and
7818 // ensure that its scalar size is at least as large as source.
7819 EVT LegalSVT = VT.getScalarType();
7820 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
7821 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
7822 if (LegalSVT.bitsLT(VT.getScalarType()))
7823 return SDValue();
7824 }
7825
7826 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
7827 // only have one operand to check. For fixed-length vector types we may have
7828 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
7829 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
7830
7831 // Constant fold each scalar lane separately.
7832 SmallVector<SDValue, 4> ScalarResults;
7833 for (unsigned I = 0; I != NumVectorElts; I++) {
7834 SmallVector<SDValue, 4> ScalarOps;
7835 for (SDValue Op : Ops) {
7836 EVT InSVT = Op.getValueType().getScalarType();
7837 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
7838 Op.getOpcode() != ISD::SPLAT_VECTOR) {
7839 if (Op.isUndef())
7840 ScalarOps.push_back(getUNDEF(InSVT));
7841 else
7842 ScalarOps.push_back(Op);
7843 continue;
7844 }
7845
7846 SDValue ScalarOp =
7847 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
7848 EVT ScalarVT = ScalarOp.getValueType();
7849
7850 // Build vector (integer) scalar operands may need implicit
7851 // truncation - do this before constant folding.
7852 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
7853 // Don't create illegally-typed nodes unless they're constants or undef
7854 // - if we fail to constant fold we can't guarantee the (dead) nodes
7855 // we're creating will be cleaned up before being visited for
7856 // legalization.
7857 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
7858 !isa<ConstantSDNode>(ScalarOp) &&
7859 TLI->getTypeAction(*getContext(), InSVT) !=
7861 return SDValue();
7862 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
7863 }
7864
7865 ScalarOps.push_back(ScalarOp);
7866 }
7867
7868 // Constant fold the scalar operands.
7869 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
7870
7871 // Scalar folding only succeeded if the result is a constant or UNDEF.
7872 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
7873 ScalarResult.getOpcode() != ISD::ConstantFP)
7874 return SDValue();
7875
7876 // Legalize the (integer) scalar constant if necessary. We only do
7877 // this once we know the folding succeeded, since otherwise we would
7878 // get a node with illegal type which has a user.
7879 if (LegalSVT != SVT)
7880 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
7881
7882 ScalarResults.push_back(ScalarResult);
7883 }
7884
7885 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
7886 : getBuildVector(VT, DL, ScalarResults);
7887 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
7888 return V;
7889}
7890
7893 // TODO: Add support for unary/ternary fp opcodes.
7894 if (Ops.size() != 2)
7895 return SDValue();
7896
7897 // TODO: We don't do any constant folding for strict FP opcodes here, but we
7898 // should. That will require dealing with a potentially non-default
7899 // rounding mode, checking the "opStatus" return value from the APFloat
7900 // math calculations, and possibly other variations.
7901 SDValue N1 = Ops[0];
7902 SDValue N2 = Ops[1];
7903 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
7904 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
7905 if (N1CFP && N2CFP) {
7906 APFloat C1 = N1CFP->getValueAPF(); // make copy
7907 const APFloat &C2 = N2CFP->getValueAPF();
7908 switch (Opcode) {
7909 case ISD::FADD:
7911 return getConstantFP(C1, DL, VT);
7912 case ISD::FSUB:
7914 return getConstantFP(C1, DL, VT);
7915 case ISD::FMUL:
7917 return getConstantFP(C1, DL, VT);
7918 case ISD::FDIV:
7920 return getConstantFP(C1, DL, VT);
7921 case ISD::FREM:
7922 C1.mod(C2);
7923 return getConstantFP(C1, DL, VT);
7924 case ISD::FCOPYSIGN:
7925 C1.copySign(C2);
7926 return getConstantFP(C1, DL, VT);
7927 case ISD::FMINNUM:
7928 return getConstantFP(minnum(C1, C2), DL, VT);
7929 case ISD::FMAXNUM:
7930 return getConstantFP(maxnum(C1, C2), DL, VT);
7931 case ISD::FMINIMUM:
7932 return getConstantFP(minimum(C1, C2), DL, VT);
7933 case ISD::FMAXIMUM:
7934 return getConstantFP(maximum(C1, C2), DL, VT);
7935 case ISD::FMINIMUMNUM:
7936 return getConstantFP(minimumnum(C1, C2), DL, VT);
7937 case ISD::FMAXIMUMNUM:
7938 return getConstantFP(maximumnum(C1, C2), DL, VT);
7939 default: break;
7940 }
7941 }
7942 if (N1CFP && Opcode == ISD::FP_ROUND) {
7943 APFloat C1 = N1CFP->getValueAPF(); // make copy
7944 bool Unused;
7945 // This can return overflow, underflow, or inexact; we don't care.
7946 // FIXME need to be more flexible about rounding mode.
7948 &Unused);
7949 return getConstantFP(C1, DL, VT);
7950 }
7951
7952 switch (Opcode) {
7953 case ISD::FSUB:
7954 // -0.0 - undef --> undef (consistent with "fneg undef")
7955 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
7956 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
7957 return getUNDEF(VT);
7958 [[fallthrough]];
7959
7960 case ISD::FADD:
7961 case ISD::FMUL:
7962 case ISD::FDIV:
7963 case ISD::FREM:
7964 // If both operands are undef, the result is undef. If 1 operand is undef,
7965 // the result is NaN. This should match the behavior of the IR optimizer.
7966 if (N1.isUndef() && N2.isUndef())
7967 return getUNDEF(VT);
7968 if (N1.isUndef() || N2.isUndef())
7970 }
7971 return SDValue();
7972}
7973
7975 const SDLoc &DL, EVT DstEltVT) {
7976 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
7977
7978 // If this is already the right type, we're done.
7979 if (SrcEltVT == DstEltVT)
7980 return SDValue(BV, 0);
7981
7982 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
7983 unsigned DstBitSize = DstEltVT.getSizeInBits();
7984
7985 // If this is a conversion of N elements of one type to N elements of another
7986 // type, convert each element. This handles FP<->INT cases.
7987 if (SrcBitSize == DstBitSize) {
7989 for (SDValue Op : BV->op_values()) {
7990 // If the vector element type is not legal, the BUILD_VECTOR operands
7991 // are promoted and implicitly truncated. Make that explicit here.
7992 if (Op.getValueType() != SrcEltVT)
7993 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
7994 Ops.push_back(getBitcast(DstEltVT, Op));
7995 }
7996 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
7998 return getBuildVector(VT, DL, Ops);
7999 }
8000
8001 // Otherwise, we're growing or shrinking the elements. To avoid having to
8002 // handle annoying details of growing/shrinking FP values, we convert them to
8003 // int first.
8004 if (SrcEltVT.isFloatingPoint()) {
8005 // Convert the input float vector to a int vector where the elements are the
8006 // same sizes.
8007 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8008 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8010 DstEltVT);
8011 return SDValue();
8012 }
8013
8014 // Now we know the input is an integer vector. If the output is a FP type,
8015 // convert to integer first, then to FP of the right size.
8016 if (DstEltVT.isFloatingPoint()) {
8017 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8018 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8020 DstEltVT);
8021 return SDValue();
8022 }
8023
8024 // Okay, we know the src/dst types are both integers of differing types.
8025 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8026
8027 // Extract the constant raw bit data.
8028 BitVector UndefElements;
8029 SmallVector<APInt> RawBits;
8030 bool IsLE = getDataLayout().isLittleEndian();
8031 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8032 return SDValue();
8033
8035 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8036 if (UndefElements[I])
8037 Ops.push_back(getUNDEF(DstEltVT));
8038 else
8039 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8040 }
8041
8042 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8043 return getBuildVector(VT, DL, Ops);
8044}
8045
8047 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8048
8049 // There's no need to assert on a byte-aligned pointer. All pointers are at
8050 // least byte aligned.
8051 if (A == Align(1))
8052 return Val;
8053
8054 SDVTList VTs = getVTList(Val.getValueType());
8056 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
8057 ID.AddInteger(A.value());
8058
8059 void *IP = nullptr;
8060 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
8061 return SDValue(E, 0);
8062
8063 auto *N =
8064 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8065 createOperands(N, {Val});
8066
8067 CSEMap.InsertNode(N, IP);
8068 InsertNode(N);
8069
8070 SDValue V(N, 0);
8071 NewSDValueDbgMsg(V, "Creating new node: ", this);
8072 return V;
8073}
8074
8075SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8076 SDValue N1, SDValue N2) {
8077 SDNodeFlags Flags;
8078 if (Inserter)
8079 Flags = Inserter->getFlags();
8080 return getNode(Opcode, DL, VT, N1, N2, Flags);
8081}
8082
8084 SDValue &N2) const {
8085 if (!TLI->isCommutativeBinOp(Opcode))
8086 return;
8087
8088 // Canonicalize:
8089 // binop(const, nonconst) -> binop(nonconst, const)
8092 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8093 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8094 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8095 std::swap(N1, N2);
8096
8097 // Canonicalize:
8098 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8099 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8101 std::swap(N1, N2);
8102}
8103
8104SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8105 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8107 N2.getOpcode() != ISD::DELETED_NODE &&
8108 "Operand is DELETED_NODE!");
8109
8110 canonicalizeCommutativeBinop(Opcode, N1, N2);
8111
8112 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8113 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8114
8115 // Don't allow undefs in vector splats - we might be returning N2 when folding
8116 // to zero etc.
8117 ConstantSDNode *N2CV =
8118 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8119
8120 switch (Opcode) {
8121 default: break;
8122 case ISD::TokenFactor:
8123 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8124 N2.getValueType() == MVT::Other && "Invalid token factor!");
8125 // Fold trivial token factors.
8126 if (N1.getOpcode() == ISD::EntryToken) return N2;
8127 if (N2.getOpcode() == ISD::EntryToken) return N1;
8128 if (N1 == N2) return N1;
8129 break;
8130 case ISD::BUILD_VECTOR: {
8131 // Attempt to simplify BUILD_VECTOR.
8132 SDValue Ops[] = {N1, N2};
8133 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8134 return V;
8135 break;
8136 }
8137 case ISD::CONCAT_VECTORS: {
8138 SDValue Ops[] = {N1, N2};
8139 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8140 return V;
8141 break;
8142 }
8143 case ISD::AND:
8144 assert(VT.isInteger() && "This operator does not apply to FP types!");
8145 assert(N1.getValueType() == N2.getValueType() &&
8146 N1.getValueType() == VT && "Binary operator types must match!");
8147 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8148 // worth handling here.
8149 if (N2CV && N2CV->isZero())
8150 return N2;
8151 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8152 return N1;
8153 break;
8154 case ISD::OR:
8155 case ISD::XOR:
8156 case ISD::ADD:
8157 case ISD::PTRADD:
8158 case ISD::SUB:
8159 assert(VT.isInteger() && "This operator does not apply to FP types!");
8160 assert(N1.getValueType() == N2.getValueType() &&
8161 N1.getValueType() == VT && "Binary operator types must match!");
8162 // The equal operand types requirement is unnecessarily strong for PTRADD.
8163 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8164 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8165 // logic everywhere where PTRADDs may be folded or combined to properly
8166 // support them. If/when we introduce pointer types to the SDAG, we will
8167 // need to relax this constraint.
8168
8169 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8170 // it's worth handling here.
8171 if (N2CV && N2CV->isZero())
8172 return N1;
8173 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8174 VT.getScalarType() == MVT::i1)
8175 return getNode(ISD::XOR, DL, VT, N1, N2);
8176 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8177 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8178 N2.getOpcode() == ISD::VSCALE) {
8179 const APInt &C1 = N1->getConstantOperandAPInt(0);
8180 const APInt &C2 = N2->getConstantOperandAPInt(0);
8181 return getVScale(DL, VT, C1 + C2);
8182 }
8183 break;
8184 case ISD::MUL:
8185 assert(VT.isInteger() && "This operator does not apply to FP types!");
8186 assert(N1.getValueType() == N2.getValueType() &&
8187 N1.getValueType() == VT && "Binary operator types must match!");
8188 if (VT.getScalarType() == MVT::i1)
8189 return getNode(ISD::AND, DL, VT, N1, N2);
8190 if (N2CV && N2CV->isZero())
8191 return N2;
8192 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8193 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8194 const APInt &N2CImm = N2C->getAPIntValue();
8195 return getVScale(DL, VT, MulImm * N2CImm);
8196 }
8197 break;
8198 case ISD::UDIV:
8199 case ISD::UREM:
8200 case ISD::MULHU:
8201 case ISD::MULHS:
8202 case ISD::SDIV:
8203 case ISD::SREM:
8204 case ISD::SADDSAT:
8205 case ISD::SSUBSAT:
8206 case ISD::UADDSAT:
8207 case ISD::USUBSAT:
8208 assert(VT.isInteger() && "This operator does not apply to FP types!");
8209 assert(N1.getValueType() == N2.getValueType() &&
8210 N1.getValueType() == VT && "Binary operator types must match!");
8211 if (VT.getScalarType() == MVT::i1) {
8212 // fold (add_sat x, y) -> (or x, y) for bool types.
8213 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8214 return getNode(ISD::OR, DL, VT, N1, N2);
8215 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8216 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8217 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8218 }
8219 break;
8220 case ISD::SCMP:
8221 case ISD::UCMP:
8222 assert(N1.getValueType() == N2.getValueType() &&
8223 "Types of operands of UCMP/SCMP must match");
8224 assert(N1.getValueType().isVector() == VT.isVector() &&
8225 "Operands and return type of must both be scalars or vectors");
8226 if (VT.isVector())
8229 "Result and operands must have the same number of elements");
8230 break;
8231 case ISD::AVGFLOORS:
8232 case ISD::AVGFLOORU:
8233 case ISD::AVGCEILS:
8234 case ISD::AVGCEILU:
8235 assert(VT.isInteger() && "This operator does not apply to FP types!");
8236 assert(N1.getValueType() == N2.getValueType() &&
8237 N1.getValueType() == VT && "Binary operator types must match!");
8238 break;
8239 case ISD::ABDS:
8240 case ISD::ABDU:
8241 assert(VT.isInteger() && "This operator does not apply to FP types!");
8242 assert(N1.getValueType() == N2.getValueType() &&
8243 N1.getValueType() == VT && "Binary operator types must match!");
8244 if (VT.getScalarType() == MVT::i1)
8245 return getNode(ISD::XOR, DL, VT, N1, N2);
8246 break;
8247 case ISD::SMIN:
8248 case ISD::UMAX:
8249 assert(VT.isInteger() && "This operator does not apply to FP types!");
8250 assert(N1.getValueType() == N2.getValueType() &&
8251 N1.getValueType() == VT && "Binary operator types must match!");
8252 if (VT.getScalarType() == MVT::i1)
8253 return getNode(ISD::OR, DL, VT, N1, N2);
8254 break;
8255 case ISD::SMAX:
8256 case ISD::UMIN:
8257 assert(VT.isInteger() && "This operator does not apply to FP types!");
8258 assert(N1.getValueType() == N2.getValueType() &&
8259 N1.getValueType() == VT && "Binary operator types must match!");
8260 if (VT.getScalarType() == MVT::i1)
8261 return getNode(ISD::AND, DL, VT, N1, N2);
8262 break;
8263 case ISD::FADD:
8264 case ISD::FSUB:
8265 case ISD::FMUL:
8266 case ISD::FDIV:
8267 case ISD::FREM:
8268 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8269 assert(N1.getValueType() == N2.getValueType() &&
8270 N1.getValueType() == VT && "Binary operator types must match!");
8271 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8272 return V;
8273 break;
8274 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8275 assert(N1.getValueType() == VT &&
8278 "Invalid FCOPYSIGN!");
8279 break;
8280 case ISD::SHL:
8281 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8282 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8283 const APInt &ShiftImm = N2C->getAPIntValue();
8284 return getVScale(DL, VT, MulImm << ShiftImm);
8285 }
8286 [[fallthrough]];
8287 case ISD::SRA:
8288 case ISD::SRL:
8289 if (SDValue V = simplifyShift(N1, N2))
8290 return V;
8291 [[fallthrough]];
8292 case ISD::ROTL:
8293 case ISD::ROTR:
8294 case ISD::SSHLSAT:
8295 case ISD::USHLSAT:
8296 assert(VT == N1.getValueType() &&
8297 "Shift operators return type must be the same as their first arg");
8298 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8299 "Shifts only work on integers");
8300 assert((!VT.isVector() || VT == N2.getValueType()) &&
8301 "Vector shift amounts must be in the same as their first arg");
8302 // Verify that the shift amount VT is big enough to hold valid shift
8303 // amounts. This catches things like trying to shift an i1024 value by an
8304 // i8, which is easy to fall into in generic code that uses
8305 // TLI.getShiftAmount().
8308 "Invalid use of small shift amount with oversized value!");
8309
8310 // Always fold shifts of i1 values so the code generator doesn't need to
8311 // handle them. Since we know the size of the shift has to be less than the
8312 // size of the value, the shift/rotate count is guaranteed to be zero.
8313 if (VT == MVT::i1)
8314 return N1;
8315 if (N2CV && N2CV->isZero())
8316 return N1;
8317 break;
8318 case ISD::FP_ROUND:
8320 VT.bitsLE(N1.getValueType()) && N2C &&
8321 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8322 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8323 if (N1.getValueType() == VT) return N1; // noop conversion.
8324 break;
8325 case ISD::IS_FPCLASS: {
8327 "IS_FPCLASS is used for a non-floating type");
8328 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8329 // is.fpclass(poison, mask) -> poison
8330 if (N1.getOpcode() == ISD::POISON)
8331 return getPOISON(VT);
8332 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8333 // If all tests are made, it doesn't matter what the value is.
8334 if ((Mask & fcAllFlags) == fcAllFlags)
8335 return getBoolConstant(true, DL, VT, N1.getValueType());
8336 if ((Mask & fcAllFlags) == 0)
8337 return getBoolConstant(false, DL, VT, N1.getValueType());
8338 break;
8339 }
8340 case ISD::AssertNoFPClass: {
8342 "AssertNoFPClass is used for a non-floating type");
8343 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8344 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8345 assert(llvm::to_underlying(NoFPClass) <=
8347 "FPClassTest value too large");
8348 (void)NoFPClass;
8349 break;
8350 }
8351 case ISD::AssertSext:
8352 case ISD::AssertZext: {
8353 EVT EVT = cast<VTSDNode>(N2)->getVT();
8354 assert(VT == N1.getValueType() && "Not an inreg extend!");
8355 assert(VT.isInteger() && EVT.isInteger() &&
8356 "Cannot *_EXTEND_INREG FP types");
8357 assert(!EVT.isVector() &&
8358 "AssertSExt/AssertZExt type should be the vector element type "
8359 "rather than the vector type!");
8360 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8361 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8362 break;
8363 }
8365 EVT EVT = cast<VTSDNode>(N2)->getVT();
8366 assert(VT == N1.getValueType() && "Not an inreg extend!");
8367 assert(VT.isInteger() && EVT.isInteger() &&
8368 "Cannot *_EXTEND_INREG FP types");
8369 assert(EVT.isVector() == VT.isVector() &&
8370 "SIGN_EXTEND_INREG type should be vector iff the operand "
8371 "type is vector!");
8372 assert((!EVT.isVector() ||
8374 "Vector element counts must match in SIGN_EXTEND_INREG");
8375 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8376 if (EVT == VT) return N1; // Not actually extending
8377 break;
8378 }
8380 case ISD::FP_TO_UINT_SAT: {
8381 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8382 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8383 assert(N1.getValueType().isVector() == VT.isVector() &&
8384 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8385 "vector!");
8386 assert((!VT.isVector() || VT.getVectorElementCount() ==
8388 "Vector element counts must match in FP_TO_*INT_SAT");
8389 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8390 "Type to saturate to must be a scalar.");
8391 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8392 "Not extending!");
8393 break;
8394 }
8397 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8398 element type of the vector.");
8399
8400 // Extract from an undefined value or using an undefined index is undefined.
8401 if (N1.isUndef() || N2.isUndef())
8402 return getUNDEF(VT);
8403
8404 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8405 // vectors. For scalable vectors we will provide appropriate support for
8406 // dealing with arbitrary indices.
8407 if (N2C && N1.getValueType().isFixedLengthVector() &&
8408 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8409 return getPOISON(VT);
8410
8411 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8412 // expanding copies of large vectors from registers. This only works for
8413 // fixed length vectors, since we need to know the exact number of
8414 // elements.
8415 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8417 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8418 return getExtractVectorElt(DL, VT,
8419 N1.getOperand(N2C->getZExtValue() / Factor),
8420 N2C->getZExtValue() % Factor);
8421 }
8422
8423 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8424 // lowering is expanding large vector constants.
8425 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8426 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8429 "BUILD_VECTOR used for scalable vectors");
8430 unsigned Index =
8431 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8432 SDValue Elt = N1.getOperand(Index);
8433
8434 if (VT != Elt.getValueType())
8435 // If the vector element type is not legal, the BUILD_VECTOR operands
8436 // are promoted and implicitly truncated, and the result implicitly
8437 // extended. Make that explicit here.
8438 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8439
8440 return Elt;
8441 }
8442
8443 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8444 // operations are lowered to scalars.
8445 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8446 // If the indices are the same, return the inserted element else
8447 // if the indices are known different, extract the element from
8448 // the original vector.
8449 SDValue N1Op2 = N1.getOperand(2);
8451
8452 if (N1Op2C && N2C) {
8453 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8454 if (VT == N1.getOperand(1).getValueType())
8455 return N1.getOperand(1);
8456 if (VT.isFloatingPoint()) {
8458 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8459 }
8460 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8461 }
8462 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8463 }
8464 }
8465
8466 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8467 // when vector types are scalarized and v1iX is legal.
8468 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8469 // Here we are completely ignoring the extract element index (N2),
8470 // which is fine for fixed width vectors, since any index other than 0
8471 // is undefined anyway. However, this cannot be ignored for scalable
8472 // vectors - in theory we could support this, but we don't want to do this
8473 // without a profitability check.
8474 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8476 N1.getValueType().getVectorNumElements() == 1) {
8477 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8478 N1.getOperand(1));
8479 }
8480 break;
8482 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8483 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8484 (N1.getValueType().isInteger() == VT.isInteger()) &&
8485 N1.getValueType() != VT &&
8486 "Wrong types for EXTRACT_ELEMENT!");
8487
8488 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8489 // 64-bit integers into 32-bit parts. Instead of building the extract of
8490 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8491 if (N1.getOpcode() == ISD::BUILD_PAIR)
8492 return N1.getOperand(N2C->getZExtValue());
8493
8494 // EXTRACT_ELEMENT of a constant int is also very common.
8495 if (N1C) {
8496 unsigned ElementSize = VT.getSizeInBits();
8497 unsigned Shift = ElementSize * N2C->getZExtValue();
8498 const APInt &Val = N1C->getAPIntValue();
8499 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8500 }
8501 break;
8503 EVT N1VT = N1.getValueType();
8504 assert(VT.isVector() && N1VT.isVector() &&
8505 "Extract subvector VTs must be vectors!");
8507 "Extract subvector VTs must have the same element type!");
8508 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8509 "Cannot extract a scalable vector from a fixed length vector!");
8510 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8512 "Extract subvector must be from larger vector to smaller vector!");
8513 assert(N2C && "Extract subvector index must be a constant");
8514 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8515 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8516 N1VT.getVectorMinNumElements()) &&
8517 "Extract subvector overflow!");
8518 assert(N2C->getAPIntValue().getBitWidth() ==
8519 TLI->getVectorIdxWidth(getDataLayout()) &&
8520 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8521 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8522 "Extract index is not a multiple of the output vector length");
8523
8524 // Trivial extraction.
8525 if (VT == N1VT)
8526 return N1;
8527
8528 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8529 if (N1.isUndef())
8530 return getUNDEF(VT);
8531
8532 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8533 // the concat have the same type as the extract.
8534 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8535 VT == N1.getOperand(0).getValueType()) {
8536 unsigned Factor = VT.getVectorMinNumElements();
8537 return N1.getOperand(N2C->getZExtValue() / Factor);
8538 }
8539
8540 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8541 // during shuffle legalization.
8542 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8543 VT == N1.getOperand(1).getValueType())
8544 return N1.getOperand(1);
8545 break;
8546 }
8547 }
8548
8549 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8550 switch (Opcode) {
8551 case ISD::XOR:
8552 case ISD::ADD:
8553 case ISD::PTRADD:
8554 case ISD::SUB:
8556 case ISD::UDIV:
8557 case ISD::SDIV:
8558 case ISD::UREM:
8559 case ISD::SREM:
8560 case ISD::MUL:
8561 case ISD::AND:
8562 case ISD::SSUBSAT:
8563 case ISD::USUBSAT:
8564 case ISD::UMIN:
8565 case ISD::OR:
8566 case ISD::SADDSAT:
8567 case ISD::UADDSAT:
8568 case ISD::UMAX:
8569 case ISD::SMAX:
8570 case ISD::SMIN:
8571 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8572 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8573 }
8574 }
8575
8576 // Canonicalize an UNDEF to the RHS, even over a constant.
8577 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8578 if (TLI->isCommutativeBinOp(Opcode)) {
8579 std::swap(N1, N2);
8580 } else {
8581 switch (Opcode) {
8582 case ISD::PTRADD:
8583 case ISD::SUB:
8584 // fold op(undef, non_undef_arg2) -> undef.
8585 return N1;
8587 case ISD::UDIV:
8588 case ISD::SDIV:
8589 case ISD::UREM:
8590 case ISD::SREM:
8591 case ISD::SSUBSAT:
8592 case ISD::USUBSAT:
8593 // fold op(undef, non_undef_arg2) -> 0.
8594 return getConstant(0, DL, VT);
8595 }
8596 }
8597 }
8598
8599 // Fold a bunch of operators when the RHS is undef.
8600 if (N2.getOpcode() == ISD::UNDEF) {
8601 switch (Opcode) {
8602 case ISD::XOR:
8603 if (N1.getOpcode() == ISD::UNDEF)
8604 // Handle undef ^ undef -> 0 special case. This is a common
8605 // idiom (misuse).
8606 return getConstant(0, DL, VT);
8607 [[fallthrough]];
8608 case ISD::ADD:
8609 case ISD::PTRADD:
8610 case ISD::SUB:
8611 // fold op(arg1, undef) -> undef.
8612 return N2;
8613 case ISD::UDIV:
8614 case ISD::SDIV:
8615 case ISD::UREM:
8616 case ISD::SREM:
8617 // fold op(arg1, undef) -> poison.
8618 return getPOISON(VT);
8619 case ISD::MUL:
8620 case ISD::AND:
8621 case ISD::SSUBSAT:
8622 case ISD::USUBSAT:
8623 case ISD::UMIN:
8624 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8625 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8626 case ISD::OR:
8627 case ISD::SADDSAT:
8628 case ISD::UADDSAT:
8629 case ISD::UMAX:
8630 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8631 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8632 case ISD::SMAX:
8633 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8634 return N1.getOpcode() == ISD::UNDEF
8635 ? N2
8636 : getConstant(
8638 VT);
8639 case ISD::SMIN:
8640 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8641 return N1.getOpcode() == ISD::UNDEF
8642 ? N2
8643 : getConstant(
8645 VT);
8646 }
8647 }
8648
8649 // Perform trivial constant folding.
8650 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8651 return SV;
8652
8653 // Memoize this node if possible.
8654 SDNode *N;
8655 SDVTList VTs = getVTList(VT);
8656 SDValue Ops[] = {N1, N2};
8657 if (VT != MVT::Glue) {
8659 AddNodeIDNode(ID, Opcode, VTs, Ops);
8660 void *IP = nullptr;
8661 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8662 E->intersectFlagsWith(Flags);
8663 return SDValue(E, 0);
8664 }
8665
8666 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8667 N->setFlags(Flags);
8668 createOperands(N, Ops);
8669 CSEMap.InsertNode(N, IP);
8670 } else {
8671 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8672 createOperands(N, Ops);
8673 }
8674
8675 InsertNode(N);
8676 SDValue V = SDValue(N, 0);
8677 NewSDValueDbgMsg(V, "Creating new node: ", this);
8678 return V;
8679}
8680
8681SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8682 SDValue N1, SDValue N2, SDValue N3) {
8683 SDNodeFlags Flags;
8684 if (Inserter)
8685 Flags = Inserter->getFlags();
8686 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8687}
8688
8689SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8690 SDValue N1, SDValue N2, SDValue N3,
8691 const SDNodeFlags Flags) {
8693 N2.getOpcode() != ISD::DELETED_NODE &&
8694 N3.getOpcode() != ISD::DELETED_NODE &&
8695 "Operand is DELETED_NODE!");
8696 // Perform various simplifications.
8697 switch (Opcode) {
8698 case ISD::BUILD_VECTOR: {
8699 // Attempt to simplify BUILD_VECTOR.
8700 SDValue Ops[] = {N1, N2, N3};
8701 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8702 return V;
8703 break;
8704 }
8705 case ISD::CONCAT_VECTORS: {
8706 SDValue Ops[] = {N1, N2, N3};
8707 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8708 return V;
8709 break;
8710 }
8711 case ISD::SETCC: {
8712 assert(VT.isInteger() && "SETCC result type must be an integer!");
8713 assert(N1.getValueType() == N2.getValueType() &&
8714 "SETCC operands must have the same type!");
8715 assert(VT.isVector() == N1.getValueType().isVector() &&
8716 "SETCC type should be vector iff the operand type is vector!");
8717 assert((!VT.isVector() || VT.getVectorElementCount() ==
8719 "SETCC vector element counts must match!");
8720 // Use FoldSetCC to simplify SETCC's.
8721 if (SDValue V =
8722 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8723 return V;
8724 break;
8725 }
8726 case ISD::SELECT:
8727 case ISD::VSELECT:
8728 if (SDValue V = simplifySelect(N1, N2, N3))
8729 return V;
8730 break;
8732 llvm_unreachable("should use getVectorShuffle constructor!");
8734 if (isNullConstant(N3))
8735 return N1;
8736 break;
8738 if (isNullConstant(N3))
8739 return N2;
8740 break;
8742 assert(VT.isVector() && VT == N1.getValueType() &&
8743 "INSERT_VECTOR_ELT vector type mismatch");
8745 "INSERT_VECTOR_ELT scalar fp/int mismatch");
8746 assert((!VT.isFloatingPoint() ||
8747 VT.getVectorElementType() == N2.getValueType()) &&
8748 "INSERT_VECTOR_ELT fp scalar type mismatch");
8749 assert((!VT.isInteger() ||
8751 "INSERT_VECTOR_ELT int scalar size mismatch");
8752
8753 auto *N3C = dyn_cast<ConstantSDNode>(N3);
8754 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
8755 // for scalable vectors where we will generate appropriate code to
8756 // deal with out-of-bounds cases correctly.
8757 if (N3C && VT.isFixedLengthVector() &&
8758 N3C->getZExtValue() >= VT.getVectorNumElements())
8759 return getUNDEF(VT);
8760
8761 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
8762 if (N3.isUndef())
8763 return getUNDEF(VT);
8764
8765 // If inserting poison, just use the input vector.
8766 if (N2.getOpcode() == ISD::POISON)
8767 return N1;
8768
8769 // Inserting undef into undef/poison is still undef.
8770 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8771 return getUNDEF(VT);
8772
8773 // If the inserted element is an UNDEF, just use the input vector.
8774 // But not if skipping the insert could make the result more poisonous.
8775 if (N2.isUndef()) {
8776 if (N3C && VT.isFixedLengthVector()) {
8777 APInt EltMask =
8778 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
8779 if (isGuaranteedNotToBePoison(N1, EltMask))
8780 return N1;
8781 } else if (isGuaranteedNotToBePoison(N1))
8782 return N1;
8783 }
8784 break;
8785 }
8786 case ISD::INSERT_SUBVECTOR: {
8787 // If inserting poison, just use the input vector,
8788 if (N2.getOpcode() == ISD::POISON)
8789 return N1;
8790
8791 // Inserting undef into undef/poison is still undef.
8792 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8793 return getUNDEF(VT);
8794
8795 EVT N2VT = N2.getValueType();
8796 assert(VT == N1.getValueType() &&
8797 "Dest and insert subvector source types must match!");
8798 assert(VT.isVector() && N2VT.isVector() &&
8799 "Insert subvector VTs must be vectors!");
8801 "Insert subvector VTs must have the same element type!");
8802 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
8803 "Cannot insert a scalable vector into a fixed length vector!");
8804 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8806 "Insert subvector must be from smaller vector to larger vector!");
8808 "Insert subvector index must be constant");
8809 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8810 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
8812 "Insert subvector overflow!");
8814 TLI->getVectorIdxWidth(getDataLayout()) &&
8815 "Constant index for INSERT_SUBVECTOR has an invalid size");
8816
8817 // Trivial insertion.
8818 if (VT == N2VT)
8819 return N2;
8820
8821 // If this is an insert of an extracted vector into an undef/poison vector,
8822 // we can just use the input to the extract. But not if skipping the
8823 // extract+insert could make the result more poisonous.
8824 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8825 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
8826 if (N1.getOpcode() == ISD::POISON)
8827 return N2.getOperand(0);
8828 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
8829 unsigned LoBit = N3->getAsZExtVal();
8830 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8831 APInt EltMask =
8832 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8833 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
8834 return N2.getOperand(0);
8835 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
8836 return N2.getOperand(0);
8837 }
8838
8839 // If the inserted subvector is UNDEF, just use the input vector.
8840 // But not if skipping the insert could make the result more poisonous.
8841 if (N2.isUndef()) {
8842 if (VT.isFixedLengthVector()) {
8843 unsigned LoBit = N3->getAsZExtVal();
8844 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8845 APInt EltMask =
8846 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8847 if (isGuaranteedNotToBePoison(N1, EltMask))
8848 return N1;
8849 } else if (isGuaranteedNotToBePoison(N1))
8850 return N1;
8851 }
8852 break;
8853 }
8854 case ISD::BITCAST:
8855 // Fold bit_convert nodes from a type to themselves.
8856 if (N1.getValueType() == VT)
8857 return N1;
8858 break;
8859 case ISD::VP_TRUNCATE:
8860 case ISD::VP_SIGN_EXTEND:
8861 case ISD::VP_ZERO_EXTEND:
8862 // Don't create noop casts.
8863 if (N1.getValueType() == VT)
8864 return N1;
8865 break;
8866 case ISD::VECTOR_COMPRESS: {
8867 [[maybe_unused]] EVT VecVT = N1.getValueType();
8868 [[maybe_unused]] EVT MaskVT = N2.getValueType();
8869 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
8870 assert(VT == VecVT && "Vector and result type don't match.");
8871 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
8872 "All inputs must be vectors.");
8873 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
8875 "Vector and mask must have same number of elements.");
8876
8877 if (N1.isUndef() || N2.isUndef())
8878 return N3;
8879
8880 break;
8881 }
8886 [[maybe_unused]] EVT AccVT = N1.getValueType();
8887 [[maybe_unused]] EVT Input1VT = N2.getValueType();
8888 [[maybe_unused]] EVT Input2VT = N3.getValueType();
8889 assert(Input1VT.isVector() && Input1VT == Input2VT &&
8890 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8891 "node to have the same type!");
8892 assert(VT.isVector() && VT == AccVT &&
8893 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
8894 "the same type as its result!");
8896 AccVT.getVectorElementCount()) &&
8897 "Expected the element count of the second and third operands of the "
8898 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
8899 "element count of the first operand and the result!");
8901 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8902 "node to have an element type which is the same as or smaller than "
8903 "the element type of the first operand and result!");
8904 break;
8905 }
8906 }
8907
8908 // Perform trivial constant folding for arithmetic operators.
8909 switch (Opcode) {
8910 case ISD::FMA:
8911 case ISD::FMAD:
8912 case ISD::SETCC:
8913 case ISD::FSHL:
8914 case ISD::FSHR:
8915 if (SDValue SV =
8916 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
8917 return SV;
8918 break;
8919 }
8920
8921 // Memoize node if it doesn't produce a glue result.
8922 SDNode *N;
8923 SDVTList VTs = getVTList(VT);
8924 SDValue Ops[] = {N1, N2, N3};
8925 if (VT != MVT::Glue) {
8927 AddNodeIDNode(ID, Opcode, VTs, Ops);
8928 void *IP = nullptr;
8929 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8930 E->intersectFlagsWith(Flags);
8931 return SDValue(E, 0);
8932 }
8933
8934 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8935 N->setFlags(Flags);
8936 createOperands(N, Ops);
8937 CSEMap.InsertNode(N, IP);
8938 } else {
8939 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8940 createOperands(N, Ops);
8941 }
8942
8943 InsertNode(N);
8944 SDValue V = SDValue(N, 0);
8945 NewSDValueDbgMsg(V, "Creating new node: ", this);
8946 return V;
8947}
8948
8949SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8950 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8951 const SDNodeFlags Flags) {
8952 SDValue Ops[] = { N1, N2, N3, N4 };
8953 return getNode(Opcode, DL, VT, Ops, Flags);
8954}
8955
8956SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8957 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
8958 SDNodeFlags Flags;
8959 if (Inserter)
8960 Flags = Inserter->getFlags();
8961 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
8962}
8963
8964SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8965 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8966 SDValue N5, const SDNodeFlags Flags) {
8967 SDValue Ops[] = { N1, N2, N3, N4, N5 };
8968 return getNode(Opcode, DL, VT, Ops, Flags);
8969}
8970
8971SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8972 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8973 SDValue N5) {
8974 SDNodeFlags Flags;
8975 if (Inserter)
8976 Flags = Inserter->getFlags();
8977 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
8978}
8979
8980/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
8981/// the incoming stack arguments to be loaded from the stack.
8983 SmallVector<SDValue, 8> ArgChains;
8984
8985 // Include the original chain at the beginning of the list. When this is
8986 // used by target LowerCall hooks, this helps legalize find the
8987 // CALLSEQ_BEGIN node.
8988 ArgChains.push_back(Chain);
8989
8990 // Add a chain value for each stack argument.
8991 for (SDNode *U : getEntryNode().getNode()->users())
8992 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
8993 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
8994 if (FI->getIndex() < 0)
8995 ArgChains.push_back(SDValue(L, 1));
8996
8997 // Build a tokenfactor for all the chains.
8998 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
8999}
9000
9001/// getMemsetValue - Vectorized representation of the memset value
9002/// operand.
9004 const SDLoc &dl) {
9005 assert(!Value.isUndef());
9006
9007 unsigned NumBits = VT.getScalarSizeInBits();
9009 assert(C->getAPIntValue().getBitWidth() == 8);
9010 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9011 if (VT.isInteger()) {
9012 bool IsOpaque = VT.getSizeInBits() > 64 ||
9013 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9014 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9015 }
9016 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9017 }
9018
9019 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9020 EVT IntVT = VT.getScalarType();
9021 if (!IntVT.isInteger())
9022 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9023
9024 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9025 if (NumBits > 8) {
9026 // Use a multiplication with 0x010101... to extend the input to the
9027 // required length.
9028 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9029 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9030 DAG.getConstant(Magic, dl, IntVT));
9031 }
9032
9033 if (VT != Value.getValueType() && !VT.isInteger())
9034 Value = DAG.getBitcast(VT.getScalarType(), Value);
9035 if (VT != Value.getValueType())
9036 Value = DAG.getSplatBuildVector(VT, dl, Value);
9037
9038 return Value;
9039}
9040
9041/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9042/// used when a memcpy is turned into a memset when the source is a constant
9043/// string ptr.
9045 const TargetLowering &TLI,
9046 const ConstantDataArraySlice &Slice) {
9047 // Handle vector with all elements zero.
9048 if (Slice.Array == nullptr) {
9049 if (VT.isInteger())
9050 return DAG.getConstant(0, dl, VT);
9051 return DAG.getNode(ISD::BITCAST, dl, VT,
9052 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9053 }
9054
9055 assert(!VT.isVector() && "Can't handle vector type here!");
9056 unsigned NumVTBits = VT.getSizeInBits();
9057 unsigned NumVTBytes = NumVTBits / 8;
9058 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9059
9060 APInt Val(NumVTBits, 0);
9061 if (DAG.getDataLayout().isLittleEndian()) {
9062 for (unsigned i = 0; i != NumBytes; ++i)
9063 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9064 } else {
9065 for (unsigned i = 0; i != NumBytes; ++i)
9066 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9067 }
9068
9069 // If the "cost" of materializing the integer immediate is less than the cost
9070 // of a load, then it is cost effective to turn the load into the immediate.
9071 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9072 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9073 return DAG.getConstant(Val, dl, VT);
9074 return SDValue();
9075}
9076
9078 const SDLoc &DL,
9079 const SDNodeFlags Flags) {
9080 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9081 return getMemBasePlusOffset(Base, Index, DL, Flags);
9082}
9083
9085 const SDLoc &DL,
9086 const SDNodeFlags Flags) {
9087 assert(Offset.getValueType().isInteger());
9088 EVT BasePtrVT = Ptr.getValueType();
9089 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9090 BasePtrVT))
9091 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9092 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9093 SDNodeFlags AddFlags = Flags;
9094 AddFlags.setInBounds(false);
9095 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9096}
9097
9098/// Returns true if memcpy source is constant data.
9100 uint64_t SrcDelta = 0;
9101 GlobalAddressSDNode *G = nullptr;
9102 if (Src.getOpcode() == ISD::GlobalAddress)
9104 else if (Src->isAnyAdd() &&
9105 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9106 Src.getOperand(1).getOpcode() == ISD::Constant) {
9107 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9108 SrcDelta = Src.getConstantOperandVal(1);
9109 }
9110 if (!G)
9111 return false;
9112
9113 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9114 SrcDelta + G->getOffset());
9115}
9116
9118 SelectionDAG &DAG) {
9119 // On Darwin, -Os means optimize for size without hurting performance, so
9120 // only really optimize for size when -Oz (MinSize) is used.
9122 return MF.getFunction().hasMinSize();
9123 return DAG.shouldOptForSize();
9124}
9125
9127 SmallVector<SDValue, 32> &OutChains, unsigned From,
9128 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9129 SmallVector<SDValue, 16> &OutStoreChains) {
9130 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9131 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9132 SmallVector<SDValue, 16> GluedLoadChains;
9133 for (unsigned i = From; i < To; ++i) {
9134 OutChains.push_back(OutLoadChains[i]);
9135 GluedLoadChains.push_back(OutLoadChains[i]);
9136 }
9137
9138 // Chain for all loads.
9139 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9140 GluedLoadChains);
9141
9142 for (unsigned i = From; i < To; ++i) {
9143 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9144 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9145 ST->getBasePtr(), ST->getMemoryVT(),
9146 ST->getMemOperand());
9147 OutChains.push_back(NewStore);
9148 }
9149}
9150
9152 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9153 uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline,
9154 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
9155 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
9156 // Turn a memcpy of undef to nop.
9157 // FIXME: We need to honor volatile even is Src is undef.
9158 if (Src.isUndef())
9159 return Chain;
9160
9161 // Expand memcpy to a series of load and store ops if the size operand falls
9162 // below a certain threshold.
9163 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9164 // rather than maybe a humongous number of loads and stores.
9165 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9166 const DataLayout &DL = DAG.getDataLayout();
9167 LLVMContext &C = *DAG.getContext();
9168 std::vector<EVT> MemOps;
9169 bool DstAlignCanChange = false;
9171 MachineFrameInfo &MFI = MF.getFrameInfo();
9172 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9174 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9175 DstAlignCanChange = true;
9176 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
9177 if (!SrcAlign || Alignment > *SrcAlign)
9178 SrcAlign = Alignment;
9179 assert(SrcAlign && "SrcAlign must be set");
9181 // If marked as volatile, perform a copy even when marked as constant.
9182 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9183 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9184 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9185 const MemOp Op = isZeroConstant
9186 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
9187 /*IsZeroMemset*/ true, isVol)
9188 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
9189 *SrcAlign, isVol, CopyFromConstant);
9190 if (!TLI.findOptimalMemOpLowering(
9191 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9192 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9193 return SDValue();
9194
9195 if (DstAlignCanChange) {
9196 Type *Ty = MemOps[0].getTypeForEVT(C);
9197 Align NewAlign = DL.getABITypeAlign(Ty);
9198
9199 // Don't promote to an alignment that would require dynamic stack
9200 // realignment which may conflict with optimizations such as tail call
9201 // optimization.
9203 if (!TRI->hasStackRealignment(MF))
9204 if (MaybeAlign StackAlign = DL.getStackAlignment())
9205 NewAlign = std::min(NewAlign, *StackAlign);
9206
9207 if (NewAlign > Alignment) {
9208 // Give the stack frame object a larger alignment if needed.
9209 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9210 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9211 Alignment = NewAlign;
9212 }
9213 }
9214
9215 // Prepare AAInfo for loads/stores after lowering this memcpy.
9216 AAMDNodes NewAAInfo = AAInfo;
9217 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9218
9219 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9220 bool isConstant =
9221 BatchAA && SrcVal &&
9222 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9223
9224 MachineMemOperand::Flags MMOFlags =
9226 SmallVector<SDValue, 16> OutLoadChains;
9227 SmallVector<SDValue, 16> OutStoreChains;
9228 SmallVector<SDValue, 32> OutChains;
9229 unsigned NumMemOps = MemOps.size();
9230 uint64_t SrcOff = 0, DstOff = 0;
9231 for (unsigned i = 0; i != NumMemOps; ++i) {
9232 EVT VT = MemOps[i];
9233 unsigned VTSize = VT.getSizeInBits() / 8;
9234 SDValue Value, Store;
9235
9236 if (VTSize > Size) {
9237 // Issuing an unaligned load / store pair that overlaps with the previous
9238 // pair. Adjust the offset accordingly.
9239 assert(i == NumMemOps-1 && i != 0);
9240 SrcOff -= VTSize - Size;
9241 DstOff -= VTSize - Size;
9242 }
9243
9244 if (CopyFromConstant &&
9245 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9246 // It's unlikely a store of a vector immediate can be done in a single
9247 // instruction. It would require a load from a constantpool first.
9248 // We only handle zero vectors here.
9249 // FIXME: Handle other cases where store of vector immediate is done in
9250 // a single instruction.
9251 ConstantDataArraySlice SubSlice;
9252 if (SrcOff < Slice.Length) {
9253 SubSlice = Slice;
9254 SubSlice.move(SrcOff);
9255 } else {
9256 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9257 SubSlice.Array = nullptr;
9258 SubSlice.Offset = 0;
9259 SubSlice.Length = VTSize;
9260 }
9261 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9262 if (Value.getNode()) {
9263 Store = DAG.getStore(
9264 Chain, dl, Value,
9265 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9266 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
9267 OutChains.push_back(Store);
9268 }
9269 }
9270
9271 if (!Store.getNode()) {
9272 // The type might not be legal for the target. This should only happen
9273 // if the type is smaller than a legal type, as on PPC, so the right
9274 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9275 // to Load/Store if NVT==VT.
9276 // FIXME does the case above also need this?
9277 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9278 assert(NVT.bitsGE(VT));
9279
9280 bool isDereferenceable =
9281 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9282 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9283 if (isDereferenceable)
9285 if (isConstant)
9286 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9287
9288 Value = DAG.getExtLoad(
9289 ISD::EXTLOAD, dl, NVT, Chain,
9290 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9291 SrcPtrInfo.getWithOffset(SrcOff), VT,
9292 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9293 OutLoadChains.push_back(Value.getValue(1));
9294
9295 Store = DAG.getTruncStore(
9296 Chain, dl, Value,
9297 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9298 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
9299 OutStoreChains.push_back(Store);
9300 }
9301 SrcOff += VTSize;
9302 DstOff += VTSize;
9303 Size -= VTSize;
9304 }
9305
9306 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9308 unsigned NumLdStInMemcpy = OutStoreChains.size();
9309
9310 if (NumLdStInMemcpy) {
9311 // It may be that memcpy might be converted to memset if it's memcpy
9312 // of constants. In such a case, we won't have loads and stores, but
9313 // just stores. In the absence of loads, there is nothing to gang up.
9314 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9315 // If target does not care, just leave as it.
9316 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9317 OutChains.push_back(OutLoadChains[i]);
9318 OutChains.push_back(OutStoreChains[i]);
9319 }
9320 } else {
9321 // Ld/St less than/equal limit set by target.
9322 if (NumLdStInMemcpy <= GluedLdStLimit) {
9323 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9324 NumLdStInMemcpy, OutLoadChains,
9325 OutStoreChains);
9326 } else {
9327 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9328 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9329 unsigned GlueIter = 0;
9330
9331 // Residual ld/st.
9332 if (RemainingLdStInMemcpy) {
9334 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9335 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9336 }
9337
9338 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9339 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9340 GlueIter - GluedLdStLimit;
9341 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9342 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9343 OutLoadChains, OutStoreChains);
9344 GlueIter += GluedLdStLimit;
9345 }
9346 }
9347 }
9348 }
9349 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9350}
9351
9353 SDValue Chain, SDValue Dst, SDValue Src,
9354 uint64_t Size, Align Alignment,
9355 bool isVol, bool AlwaysInline,
9356 MachinePointerInfo DstPtrInfo,
9357 MachinePointerInfo SrcPtrInfo,
9358 const AAMDNodes &AAInfo) {
9359 // Turn a memmove of undef to nop.
9360 // FIXME: We need to honor volatile even is Src is undef.
9361 if (Src.isUndef())
9362 return Chain;
9363
9364 // Expand memmove to a series of load and store ops if the size operand falls
9365 // below a certain threshold.
9366 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9367 const DataLayout &DL = DAG.getDataLayout();
9368 LLVMContext &C = *DAG.getContext();
9369 std::vector<EVT> MemOps;
9370 bool DstAlignCanChange = false;
9372 MachineFrameInfo &MFI = MF.getFrameInfo();
9373 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9375 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9376 DstAlignCanChange = true;
9377 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
9378 if (!SrcAlign || Alignment > *SrcAlign)
9379 SrcAlign = Alignment;
9380 assert(SrcAlign && "SrcAlign must be set");
9381 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9382 if (!TLI.findOptimalMemOpLowering(
9383 C, MemOps, Limit,
9384 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign, isVol),
9385 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9386 MF.getFunction().getAttributes(), nullptr))
9387 return SDValue();
9388
9389 if (DstAlignCanChange) {
9390 Type *Ty = MemOps[0].getTypeForEVT(C);
9391 Align NewAlign = DL.getABITypeAlign(Ty);
9392
9393 // Don't promote to an alignment that would require dynamic stack
9394 // realignment which may conflict with optimizations such as tail call
9395 // optimization.
9397 if (!TRI->hasStackRealignment(MF))
9398 if (MaybeAlign StackAlign = DL.getStackAlignment())
9399 NewAlign = std::min(NewAlign, *StackAlign);
9400
9401 if (NewAlign > Alignment) {
9402 // Give the stack frame object a larger alignment if needed.
9403 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9404 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9405 Alignment = NewAlign;
9406 }
9407 }
9408
9409 // Prepare AAInfo for loads/stores after lowering this memmove.
9410 AAMDNodes NewAAInfo = AAInfo;
9411 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9412
9413 MachineMemOperand::Flags MMOFlags =
9415 uint64_t SrcOff = 0;
9416 SmallVector<SDValue, 8> LoadValues;
9417 SmallVector<SDValue, 8> LoadChains;
9418 SmallVector<SDValue, 8> OutChains;
9419 unsigned NumMemOps = MemOps.size();
9420 for (unsigned i = 0; i < NumMemOps; i++) {
9421 EVT VT = MemOps[i];
9422 unsigned VTSize = VT.getSizeInBits() / 8;
9423 SDValue Value;
9424 bool IsOverlapping = false;
9425
9426 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9427 // Issuing an unaligned load / store pair that overlaps with the previous
9428 // pair. Adjust the offset accordingly.
9429 SrcOff = Size - VTSize;
9430 IsOverlapping = true;
9431 }
9432
9433 // Calculate the actual alignment at the current offset. The alignment at
9434 // SrcOff may be lower than the base alignment, especially when using
9435 // overlapping loads.
9436 Align SrcAlignAtOffset = commonAlignment(*SrcAlign, SrcOff);
9437 if (IsOverlapping) {
9438 // Verify that the target allows misaligned memory accesses at the
9439 // adjusted offset when using overlapping loads.
9440 unsigned Fast;
9441 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9442 SrcAlignAtOffset, MMOFlags,
9443 &Fast) ||
9444 !Fast) {
9445 // This should have been caught by findOptimalMemOpLowering, but verify
9446 // here for safety.
9447 return SDValue();
9448 }
9449 }
9450
9451 bool isDereferenceable =
9452 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9453 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9454 if (isDereferenceable)
9456 Value =
9457 DAG.getLoad(VT, dl, Chain,
9458 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9459 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9460 SrcMMOFlags, NewAAInfo);
9461 LoadValues.push_back(Value);
9462 LoadChains.push_back(Value.getValue(1));
9463 SrcOff += VTSize;
9464 }
9465 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9466 OutChains.clear();
9467 uint64_t DstOff = 0;
9468 for (unsigned i = 0; i < NumMemOps; i++) {
9469 EVT VT = MemOps[i];
9470 unsigned VTSize = VT.getSizeInBits() / 8;
9471 SDValue Store;
9472 bool IsOverlapping = false;
9473
9474 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9475 // Issuing an unaligned load / store pair that overlaps with the previous
9476 // pair. Adjust the offset accordingly.
9477 DstOff = Size - VTSize;
9478 IsOverlapping = true;
9479 }
9480
9481 // Calculate the actual alignment at the current offset. The alignment at
9482 // DstOff may be lower than the base alignment, especially when using
9483 // overlapping stores.
9484 Align DstAlignAtOffset = commonAlignment(Alignment, DstOff);
9485 if (IsOverlapping) {
9486 // Verify that the target allows misaligned memory accesses at the
9487 // adjusted offset when using overlapping stores.
9488 unsigned Fast;
9489 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9490 DstAlignAtOffset, MMOFlags,
9491 &Fast) ||
9492 !Fast) {
9493 // This should have been caught by findOptimalMemOpLowering, but verify
9494 // here for safety.
9495 return SDValue();
9496 }
9497 }
9498 Store = DAG.getStore(
9499 Chain, dl, LoadValues[i],
9500 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9501 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9502 NewAAInfo);
9503 OutChains.push_back(Store);
9504 DstOff += VTSize;
9505 }
9506
9507 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9508}
9509
9510/// Lower the call to 'memset' intrinsic function into a series of store
9511/// operations.
9512///
9513/// \param DAG Selection DAG where lowered code is placed.
9514/// \param dl Link to corresponding IR location.
9515/// \param Chain Control flow dependency.
9516/// \param Dst Pointer to destination memory location.
9517/// \param Src Value of byte to write into the memory.
9518/// \param Size Number of bytes to write.
9519/// \param Alignment Alignment of the destination in bytes.
9520/// \param isVol True if destination is volatile.
9521/// \param AlwaysInline Makes sure no function call is generated.
9522/// \param DstPtrInfo IR information on the memory pointer.
9523/// \returns New head in the control flow, if lowering was successful, empty
9524/// SDValue otherwise.
9525///
9526/// The function tries to replace 'llvm.memset' intrinsic with several store
9527/// operations and value calculation code. This is usually profitable for small
9528/// memory size or when the semantic requires inlining.
9530 SDValue Chain, SDValue Dst, SDValue Src,
9531 uint64_t Size, Align Alignment, bool isVol,
9532 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9533 const AAMDNodes &AAInfo) {
9534 // Turn a memset of undef to nop.
9535 // FIXME: We need to honor volatile even is Src is undef.
9536 if (Src.isUndef())
9537 return Chain;
9538
9539 // Expand memset to a series of load/store ops if the size operand
9540 // falls below a certain threshold.
9541 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9542 std::vector<EVT> MemOps;
9543 bool DstAlignCanChange = false;
9544 LLVMContext &C = *DAG.getContext();
9546 MachineFrameInfo &MFI = MF.getFrameInfo();
9547 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9549 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9550 DstAlignCanChange = true;
9551 bool IsZeroVal = isNullConstant(Src);
9552 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9553
9554 EVT LargestVT;
9555 if (!TLI.findOptimalMemOpLowering(
9556 C, MemOps, Limit,
9557 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9558 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9559 &LargestVT))
9560 return SDValue();
9561
9562 if (DstAlignCanChange) {
9563 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9564 const DataLayout &DL = DAG.getDataLayout();
9565 Align NewAlign = DL.getABITypeAlign(Ty);
9566
9567 // Don't promote to an alignment that would require dynamic stack
9568 // realignment which may conflict with optimizations such as tail call
9569 // optimization.
9571 if (!TRI->hasStackRealignment(MF))
9572 if (MaybeAlign StackAlign = DL.getStackAlignment())
9573 NewAlign = std::min(NewAlign, *StackAlign);
9574
9575 if (NewAlign > Alignment) {
9576 // Give the stack frame object a larger alignment if needed.
9577 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9578 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9579 Alignment = NewAlign;
9580 }
9581 }
9582
9583 SmallVector<SDValue, 8> OutChains;
9584 uint64_t DstOff = 0;
9585 unsigned NumMemOps = MemOps.size();
9586
9587 // Find the largest store and generate the bit pattern for it.
9588 // If target didn't set LargestVT, compute it from MemOps.
9589 if (!LargestVT.isSimple()) {
9590 LargestVT = MemOps[0];
9591 for (unsigned i = 1; i < NumMemOps; i++)
9592 if (MemOps[i].bitsGT(LargestVT))
9593 LargestVT = MemOps[i];
9594 }
9595 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9596
9597 // Prepare AAInfo for loads/stores after lowering this memset.
9598 AAMDNodes NewAAInfo = AAInfo;
9599 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9600
9601 for (unsigned i = 0; i < NumMemOps; i++) {
9602 EVT VT = MemOps[i];
9603 unsigned VTSize = VT.getSizeInBits() / 8;
9604 // The target should specify store types that exactly cover the memset size
9605 // (with the last store potentially being oversized for overlapping stores).
9606 assert(Size > 0 && "Target specified more stores than needed in "
9607 "findOptimalMemOpLowering");
9608 if (VTSize > Size) {
9609 // Issuing an unaligned load / store pair that overlaps with the previous
9610 // pair. Adjust the offset accordingly.
9611 assert(i == NumMemOps-1 && i != 0);
9612 DstOff -= VTSize - Size;
9613 }
9614
9615 // If this store is smaller than the largest store see whether we can get
9616 // the smaller value for free with a truncate or extract vector element and
9617 // then store.
9618 SDValue Value = MemSetValue;
9619 if (VT.bitsLT(LargestVT)) {
9620 unsigned Index;
9621 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9622 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9623 if (!LargestVT.isVector() && !VT.isVector() &&
9624 TLI.isTruncateFree(LargestVT, VT))
9625 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9626 else if (LargestVT.isVector() && !VT.isVector() &&
9628 LargestVT.getTypeForEVT(*DAG.getContext()),
9629 VT.getSizeInBits(), Index) &&
9630 TLI.isTypeLegal(SVT) &&
9631 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9632 // Target which can combine store(extractelement VectorTy, Idx) can get
9633 // the smaller value for free.
9634 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9635 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9636 } else
9637 Value = getMemsetValue(Src, VT, DAG, dl);
9638 }
9639 assert(Value.getValueType() == VT && "Value with wrong type.");
9640 SDValue Store = DAG.getStore(
9641 Chain, dl, Value,
9642 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9643 DstPtrInfo.getWithOffset(DstOff), Alignment,
9645 NewAAInfo);
9646 OutChains.push_back(Store);
9647 DstOff += VT.getSizeInBits() / 8;
9648 // For oversized overlapping stores, only subtract the remaining bytes.
9649 // For normal stores, subtract the full store size.
9650 if (VTSize > Size) {
9651 Size = 0;
9652 } else {
9653 Size -= VTSize;
9654 }
9655 }
9656
9657 // After processing all stores, Size should be exactly 0. Any remaining bytes
9658 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9659 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9660 "stores that exactly cover the memset size");
9661
9662 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9663}
9664
9666 unsigned AS) {
9667 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9668 // pointer operands can be losslessly bitcasted to pointers of address space 0
9669 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9670 report_fatal_error("cannot lower memory intrinsic in address space " +
9671 Twine(AS));
9672 }
9673}
9674
9676 const SelectionDAG *SelDAG,
9677 bool AllowReturnsFirstArg) {
9678 if (!CI || !CI->isTailCall())
9679 return false;
9680 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9681 // helper symbol we lower to.
9682 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9683 AllowReturnsFirstArg &&
9685}
9686
9687static std::pair<SDValue, SDValue>
9690 const CallInst *CI, RTLIB::Libcall Call,
9691 SelectionDAG *DAG, const TargetLowering *TLI) {
9692 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9693
9694 if (LCImpl == RTLIB::Unsupported)
9695 return {};
9696
9698 bool IsTailCall =
9699 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9700 SDValue Callee =
9701 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9702
9703 CLI.setDebugLoc(dl)
9704 .setChain(Chain)
9706 CI->getType(), Callee, std::move(Args))
9707 .setTailCall(IsTailCall);
9708
9709 return TLI->LowerCallTo(CLI);
9710}
9711
9712std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9713 const SDLoc &dl, SDValue S1,
9714 SDValue S2,
9715 const CallInst *CI) {
9717 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9718 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9719 RTLIB::STRCMP, this, TLI);
9720}
9721
9722std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9723 const SDLoc &dl, SDValue S1,
9724 SDValue S2,
9725 const CallInst *CI) {
9727 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9728 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9729 RTLIB::STRSTR, this, TLI);
9730}
9731
9732std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9733 const SDLoc &dl,
9734 SDValue Dst, SDValue Src,
9736 const CallInst *CI) {
9738
9740 {Dst, PT},
9741 {Src, PT},
9744 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9745 RTLIB::MEMCCPY, this, TLI);
9746}
9747
9748std::pair<SDValue, SDValue>
9750 SDValue Mem1, SDValue Size, const CallInst *CI) {
9753 {Mem0, PT},
9754 {Mem1, PT},
9756 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9757 RTLIB::MEMCMP, this, TLI);
9758}
9759
9760std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
9761 const SDLoc &dl,
9762 SDValue Dst, SDValue Src,
9763 const CallInst *CI) {
9765 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
9766 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9767 RTLIB::STRCPY, this, TLI);
9768}
9769
9770std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
9771 const SDLoc &dl,
9772 SDValue Src,
9773 const CallInst *CI) {
9774 // Emit a library call.
9777 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9778 RTLIB::STRLEN, this, TLI);
9779}
9780
9782 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
9783 Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI,
9784 std::optional<bool> OverrideTailCall, MachinePointerInfo DstPtrInfo,
9785 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9786 BatchAAResults *BatchAA) {
9787 // Check to see if we should lower the memcpy to loads and stores first.
9788 // For cases within the target-specified limits, this is the best choice.
9790 if (ConstantSize) {
9791 // Memcpy with size zero? Just return the original chain.
9792 if (ConstantSize->isZero())
9793 return Chain;
9794
9796 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9797 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9798 if (Result.getNode())
9799 return Result;
9800 }
9801
9802 // Then check to see if we should lower the memcpy with target-specific
9803 // code. If the target chooses to do this, this is the next best.
9804 if (TSI) {
9805 SDValue Result = TSI->EmitTargetCodeForMemcpy(
9806 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
9807 DstPtrInfo, SrcPtrInfo);
9808 if (Result.getNode())
9809 return Result;
9810 }
9811
9812 // If we really need inline code and the target declined to provide it,
9813 // use a (potentially long) sequence of loads and stores.
9814 if (AlwaysInline) {
9815 assert(ConstantSize && "AlwaysInline requires a constant size!");
9817 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9818 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9819 }
9820
9823
9824 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
9825 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
9826 // respect volatile, so they may do things like read or write memory
9827 // beyond the given memory regions. But fixing this isn't easy, and most
9828 // people don't care.
9829
9830 // Emit a library call.
9833 Args.emplace_back(Dst, PtrTy);
9834 Args.emplace_back(Src, PtrTy);
9835 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9836 // FIXME: pass in SDLoc
9838 bool IsTailCall = false;
9839 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
9840
9841 if (OverrideTailCall.has_value()) {
9842 IsTailCall = *OverrideTailCall;
9843 } else {
9844 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
9845 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
9846 }
9847
9848 CLI.setDebugLoc(dl)
9849 .setChain(Chain)
9850 .setLibCallee(
9851 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
9852 Dst.getValueType().getTypeForEVT(*getContext()),
9853 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
9854 std::move(Args))
9856 .setTailCall(IsTailCall);
9857
9858 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9859 return CallResult.second;
9860}
9861
9863 SDValue Dst, SDValue Src, SDValue Size,
9864 Type *SizeTy, unsigned ElemSz,
9865 bool isTailCall,
9866 MachinePointerInfo DstPtrInfo,
9867 MachinePointerInfo SrcPtrInfo) {
9868 // Emit a library call.
9871 Args.emplace_back(Dst, ArgTy);
9872 Args.emplace_back(Src, ArgTy);
9873 Args.emplace_back(Size, SizeTy);
9874
9875 RTLIB::Libcall LibraryCall =
9877 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9878 if (LibcallImpl == RTLIB::Unsupported)
9879 report_fatal_error("Unsupported element size");
9880
9882 CLI.setDebugLoc(dl)
9883 .setChain(Chain)
9884 .setLibCallee(
9885 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9887 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9888 std::move(Args))
9890 .setTailCall(isTailCall);
9891
9892 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9893 return CallResult.second;
9894}
9895
9897 SDValue Src, SDValue Size, Align Alignment,
9898 bool isVol, const CallInst *CI,
9899 std::optional<bool> OverrideTailCall,
9900 MachinePointerInfo DstPtrInfo,
9901 MachinePointerInfo SrcPtrInfo,
9902 const AAMDNodes &AAInfo,
9903 BatchAAResults *BatchAA) {
9904 // Check to see if we should lower the memmove to loads and stores first.
9905 // For cases within the target-specified limits, this is the best choice.
9907 if (ConstantSize) {
9908 // Memmove with size zero? Just return the original chain.
9909 if (ConstantSize->isZero())
9910 return Chain;
9911
9913 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9914 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
9915 if (Result.getNode())
9916 return Result;
9917 }
9918
9919 // Then check to see if we should lower the memmove with target-specific
9920 // code. If the target chooses to do this, this is the next best.
9921 if (TSI) {
9922 SDValue Result =
9923 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
9924 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
9925 if (Result.getNode())
9926 return Result;
9927 }
9928
9931
9932 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
9933 // not be safe. See memcpy above for more details.
9934
9935 // Emit a library call.
9938 Args.emplace_back(Dst, PtrTy);
9939 Args.emplace_back(Src, PtrTy);
9940 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9941 // FIXME: pass in SDLoc
9943
9944 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
9945
9946 bool IsTailCall = false;
9947 if (OverrideTailCall.has_value()) {
9948 IsTailCall = *OverrideTailCall;
9949 } else {
9950 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
9951 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
9952 }
9953
9954 CLI.setDebugLoc(dl)
9955 .setChain(Chain)
9956 .setLibCallee(
9957 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
9958 Dst.getValueType().getTypeForEVT(*getContext()),
9959 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
9960 std::move(Args))
9962 .setTailCall(IsTailCall);
9963
9964 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9965 return CallResult.second;
9966}
9967
9969 SDValue Dst, SDValue Src, SDValue Size,
9970 Type *SizeTy, unsigned ElemSz,
9971 bool isTailCall,
9972 MachinePointerInfo DstPtrInfo,
9973 MachinePointerInfo SrcPtrInfo) {
9974 // Emit a library call.
9976 Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());
9977 Args.emplace_back(Dst, IntPtrTy);
9978 Args.emplace_back(Src, IntPtrTy);
9979 Args.emplace_back(Size, SizeTy);
9980
9981 RTLIB::Libcall LibraryCall =
9983 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9984 if (LibcallImpl == RTLIB::Unsupported)
9985 report_fatal_error("Unsupported element size");
9986
9988 CLI.setDebugLoc(dl)
9989 .setChain(Chain)
9990 .setLibCallee(
9991 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9993 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9994 std::move(Args))
9996 .setTailCall(isTailCall);
9997
9998 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9999 return CallResult.second;
10000}
10001
10003 SDValue Src, SDValue Size, Align Alignment,
10004 bool isVol, bool AlwaysInline,
10005 const CallInst *CI,
10006 MachinePointerInfo DstPtrInfo,
10007 const AAMDNodes &AAInfo) {
10008 // Check to see if we should lower the memset to stores first.
10009 // For cases within the target-specified limits, this is the best choice.
10011 if (ConstantSize) {
10012 // Memset with size zero? Just return the original chain.
10013 if (ConstantSize->isZero())
10014 return Chain;
10015
10016 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10017 ConstantSize->getZExtValue(), Alignment,
10018 isVol, false, DstPtrInfo, AAInfo);
10019
10020 if (Result.getNode())
10021 return Result;
10022 }
10023
10024 // Then check to see if we should lower the memset with target-specific
10025 // code. If the target chooses to do this, this is the next best.
10026 if (TSI) {
10027 SDValue Result = TSI->EmitTargetCodeForMemset(
10028 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10029 if (Result.getNode())
10030 return Result;
10031 }
10032
10033 // If we really need inline code and the target declined to provide it,
10034 // use a (potentially long) sequence of loads and stores.
10035 if (AlwaysInline) {
10036 assert(ConstantSize && "AlwaysInline requires a constant size!");
10037 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10038 ConstantSize->getZExtValue(), Alignment,
10039 isVol, true, DstPtrInfo, AAInfo);
10040 assert(Result &&
10041 "getMemsetStores must return a valid sequence when AlwaysInline");
10042 return Result;
10043 }
10044
10046
10047 // Emit a library call.
10048 auto &Ctx = *getContext();
10049 const auto& DL = getDataLayout();
10050
10052 // FIXME: pass in SDLoc
10053 CLI.setDebugLoc(dl).setChain(Chain);
10054
10055 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10056 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10057
10058 // If zeroing out and bzero is present, use it.
10059 if (UseBZero) {
10061 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10062 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10063 CLI.setLibCallee(
10064 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10065 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10066 } else {
10067 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10068
10070 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10071 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10072 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10073 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10074 Dst.getValueType().getTypeForEVT(Ctx),
10075 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10076 std::move(Args));
10077 }
10078
10079 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10080 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10081
10082 // If we're going to use bzero, make sure not to tail call unless the
10083 // subsequent return doesn't need a value, as bzero doesn't return the first
10084 // arg unlike memset.
10085 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10086 bool IsTailCall =
10087 CI && CI->isTailCall() &&
10088 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
10089 CLI.setDiscardResult().setTailCall(IsTailCall);
10090
10091 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10092 return CallResult.second;
10093}
10094
10097 Type *SizeTy, unsigned ElemSz,
10098 bool isTailCall,
10099 MachinePointerInfo DstPtrInfo) {
10100 // Emit a library call.
10102 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10103 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10104 Args.emplace_back(Size, SizeTy);
10105
10106 RTLIB::Libcall LibraryCall =
10108 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10109 if (LibcallImpl == RTLIB::Unsupported)
10110 report_fatal_error("Unsupported element size");
10111
10113 CLI.setDebugLoc(dl)
10114 .setChain(Chain)
10115 .setLibCallee(
10116 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10118 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10119 std::move(Args))
10121 .setTailCall(isTailCall);
10122
10123 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10124 return CallResult.second;
10125}
10126
10127SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10129 MachineMemOperand *MMO,
10130 ISD::LoadExtType ExtType) {
10132 AddNodeIDNode(ID, Opcode, VTList, Ops);
10133 ID.AddInteger(MemVT.getRawBits());
10134 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10135 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10136 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10137 ID.AddInteger(MMO->getFlags());
10138 void* IP = nullptr;
10139 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10140 E->refineAlignment(MMO);
10141 E->refineRanges(MMO);
10142 return SDValue(E, 0);
10143 }
10144
10145 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10146 VTList, MemVT, MMO, ExtType);
10147 createOperands(N, Ops);
10148
10149 CSEMap.InsertNode(N, IP);
10150 InsertNode(N);
10151 SDValue V(N, 0);
10152 NewSDValueDbgMsg(V, "Creating new node: ", this);
10153 return V;
10154}
10155
10157 EVT MemVT, SDVTList VTs, SDValue Chain,
10158 SDValue Ptr, SDValue Cmp, SDValue Swp,
10159 MachineMemOperand *MMO) {
10160 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10162 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10163
10164 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10165 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10166}
10167
10168SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10169 SDValue Chain, SDValue Ptr, SDValue Val,
10170 MachineMemOperand *MMO) {
10171 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10172 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10173 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10174 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10175 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10176 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10177 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10178 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10179 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10180 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10181 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10182 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10183 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10184 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10185 Opcode == ISD::ATOMIC_STORE) &&
10186 "Invalid Atomic Op");
10187
10188 EVT VT = Val.getValueType();
10189
10190 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10191 getVTList(VT, MVT::Other);
10192 SDValue Ops[] = {Chain, Ptr, Val};
10193 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10194}
10195
10197 EVT MemVT, EVT VT, SDValue Chain,
10198 SDValue Ptr, MachineMemOperand *MMO) {
10199 SDVTList VTs = getVTList(VT, MVT::Other);
10200 SDValue Ops[] = {Chain, Ptr};
10201 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10202}
10203
10204/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10206 if (Ops.size() == 1)
10207 return Ops[0];
10208
10210 VTs.reserve(Ops.size());
10211 for (const SDValue &Op : Ops)
10212 VTs.push_back(Op.getValueType());
10213 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10214}
10215
10217 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10218 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10220 const AAMDNodes &AAInfo) {
10221 if (Size.hasValue() && !Size.getValue())
10223
10225 MachineMemOperand *MMO =
10226 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10227
10228 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10229}
10230
10232 SDVTList VTList,
10233 ArrayRef<SDValue> Ops, EVT MemVT,
10234 MachineMemOperand *MMO) {
10235 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10236}
10237
10239 SDVTList VTList,
10240 ArrayRef<SDValue> Ops, EVT MemVT,
10242 assert(!MMOs.empty() && "Must have at least one MMO");
10243 assert(
10244 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10245 Opcode == ISD::PREFETCH ||
10246 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10247 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10248 "Opcode is not a memory-accessing opcode!");
10249
10251 if (MMOs.size() == 1) {
10252 MemRefs = MMOs[0];
10253 } else {
10254 // Allocate: [size_t count][MMO*][MMO*]...
10255 size_t AllocSize =
10256 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10257 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10258 size_t *CountPtr = static_cast<size_t *>(Buffer);
10259 *CountPtr = MMOs.size();
10260 MachineMemOperand **Array =
10261 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10262 llvm::copy(MMOs, Array);
10263 MemRefs = Array;
10264 }
10265
10266 // Memoize the node unless it returns a glue result.
10268 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10270 AddNodeIDNode(ID, Opcode, VTList, Ops);
10271 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10272 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10273 ID.AddInteger(MemVT.getRawBits());
10274 for (const MachineMemOperand *MMO : MMOs) {
10275 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10276 ID.AddInteger(MMO->getFlags());
10277 }
10278 void *IP = nullptr;
10279 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10280 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10281 return SDValue(E, 0);
10282 }
10283
10284 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10285 VTList, MemVT, MemRefs);
10286 createOperands(N, Ops);
10287 CSEMap.InsertNode(N, IP);
10288 } else {
10289 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10290 VTList, MemVT, MemRefs);
10291 createOperands(N, Ops);
10292 }
10293 InsertNode(N);
10294 SDValue V(N, 0);
10295 NewSDValueDbgMsg(V, "Creating new node: ", this);
10296 return V;
10297}
10298
10300 SDValue Chain, int FrameIndex) {
10301 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10302 const auto VTs = getVTList(MVT::Other);
10303 SDValue Ops[2] = {
10304 Chain,
10305 getFrameIndex(FrameIndex,
10306 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10307 true)};
10308
10310 AddNodeIDNode(ID, Opcode, VTs, Ops);
10311 ID.AddInteger(FrameIndex);
10312 void *IP = nullptr;
10313 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10314 return SDValue(E, 0);
10315
10316 LifetimeSDNode *N =
10317 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10318 createOperands(N, Ops);
10319 CSEMap.InsertNode(N, IP);
10320 InsertNode(N);
10321 SDValue V(N, 0);
10322 NewSDValueDbgMsg(V, "Creating new node: ", this);
10323 return V;
10324}
10325
10327 uint64_t Guid, uint64_t Index,
10328 uint32_t Attr) {
10329 const unsigned Opcode = ISD::PSEUDO_PROBE;
10330 const auto VTs = getVTList(MVT::Other);
10331 SDValue Ops[] = {Chain};
10333 AddNodeIDNode(ID, Opcode, VTs, Ops);
10334 ID.AddInteger(Guid);
10335 ID.AddInteger(Index);
10336 void *IP = nullptr;
10337 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10338 return SDValue(E, 0);
10339
10340 auto *N = newSDNode<PseudoProbeSDNode>(
10341 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10342 createOperands(N, Ops);
10343 CSEMap.InsertNode(N, IP);
10344 InsertNode(N);
10345 SDValue V(N, 0);
10346 NewSDValueDbgMsg(V, "Creating new node: ", this);
10347 return V;
10348}
10349
10350/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10351/// MachinePointerInfo record from it. This is particularly useful because the
10352/// code generator has many cases where it doesn't bother passing in a
10353/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10355 SelectionDAG &DAG, SDValue Ptr,
10356 int64_t Offset = 0) {
10357 // If this is FI+Offset, we can model it.
10358 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10360 FI->getIndex(), Offset);
10361
10362 // If this is (FI+Offset1)+Offset2, we can model it.
10363 if (Ptr.getOpcode() != ISD::ADD ||
10366 return Info;
10367
10368 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10370 DAG.getMachineFunction(), FI,
10371 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10372}
10373
10374/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10375/// MachinePointerInfo record from it. This is particularly useful because the
10376/// code generator has many cases where it doesn't bother passing in a
10377/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10379 SelectionDAG &DAG, SDValue Ptr,
10380 SDValue OffsetOp) {
10381 // If the 'Offset' value isn't a constant, we can't handle this.
10383 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10384 if (OffsetOp.isUndef())
10385 return InferPointerInfo(Info, DAG, Ptr);
10386 return Info;
10387}
10388
10390 EVT VT, const SDLoc &dl, SDValue Chain,
10391 SDValue Ptr, SDValue Offset,
10392 MachinePointerInfo PtrInfo, EVT MemVT,
10393 Align Alignment,
10394 MachineMemOperand::Flags MMOFlags,
10395 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10396 assert(Chain.getValueType() == MVT::Other &&
10397 "Invalid chain type");
10398
10399 MMOFlags |= MachineMemOperand::MOLoad;
10400 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10401 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10402 // clients.
10403 if (PtrInfo.V.isNull())
10404 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10405
10406 TypeSize Size = MemVT.getStoreSize();
10408 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10409 Alignment, AAInfo, Ranges);
10410 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10411}
10412
10414 EVT VT, const SDLoc &dl, SDValue Chain,
10415 SDValue Ptr, SDValue Offset, EVT MemVT,
10416 MachineMemOperand *MMO) {
10417 if (VT == MemVT) {
10418 ExtType = ISD::NON_EXTLOAD;
10419 } else if (ExtType == ISD::NON_EXTLOAD) {
10420 assert(VT == MemVT && "Non-extending load from different memory type!");
10421 } else {
10422 // Extending load.
10423 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10424 "Should only be an extending load, not truncating!");
10425 assert(VT.isInteger() == MemVT.isInteger() &&
10426 "Cannot convert from FP to Int or Int -> FP!");
10427 assert(VT.isVector() == MemVT.isVector() &&
10428 "Cannot use an ext load to convert to or from a vector!");
10429 assert((!VT.isVector() ||
10431 "Cannot use an ext load to change the number of vector elements!");
10432 }
10433
10434 assert((!MMO->getRanges() ||
10436 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10437 MemVT.isInteger())) &&
10438 "Range metadata and load type must match!");
10439
10440 bool Indexed = AM != ISD::UNINDEXED;
10441 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10442
10443 SDVTList VTs = Indexed ?
10444 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10445 SDValue Ops[] = { Chain, Ptr, Offset };
10447 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10448 ID.AddInteger(MemVT.getRawBits());
10449 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10450 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10451 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10452 ID.AddInteger(MMO->getFlags());
10453 void *IP = nullptr;
10454 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10455 E->refineAlignment(MMO);
10456 E->refineRanges(MMO);
10457 return SDValue(E, 0);
10458 }
10459 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10460 ExtType, MemVT, MMO);
10461 createOperands(N, Ops);
10462
10463 CSEMap.InsertNode(N, IP);
10464 InsertNode(N);
10465 SDValue V(N, 0);
10466 NewSDValueDbgMsg(V, "Creating new node: ", this);
10467 return V;
10468}
10469
10471 SDValue Ptr, MachinePointerInfo PtrInfo,
10472 MaybeAlign Alignment,
10473 MachineMemOperand::Flags MMOFlags,
10474 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10476 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10477 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10478}
10479
10481 SDValue Ptr, MachineMemOperand *MMO) {
10483 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10484 VT, MMO);
10485}
10486
10488 EVT VT, SDValue Chain, SDValue Ptr,
10489 MachinePointerInfo PtrInfo, EVT MemVT,
10490 MaybeAlign Alignment,
10491 MachineMemOperand::Flags MMOFlags,
10492 const AAMDNodes &AAInfo) {
10494 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10495 MemVT, Alignment, MMOFlags, AAInfo);
10496}
10497
10499 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10500 MachineMemOperand *MMO) {
10502 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10503 MemVT, MMO);
10504}
10505
10509 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10510 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10511 // Don't propagate the invariant or dereferenceable flags.
10512 auto MMOFlags =
10513 LD->getMemOperand()->getFlags() &
10515 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10516 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10517 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10518}
10519
10521 SDValue Ptr, MachinePointerInfo PtrInfo,
10522 Align Alignment,
10523 MachineMemOperand::Flags MMOFlags,
10524 const AAMDNodes &AAInfo) {
10525 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10526
10527 MMOFlags |= MachineMemOperand::MOStore;
10528 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10529
10530 if (PtrInfo.V.isNull())
10531 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10532
10535 MachineMemOperand *MMO =
10536 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10537 return getStore(Chain, dl, Val, Ptr, MMO);
10538}
10539
10541 SDValue Ptr, MachineMemOperand *MMO) {
10543 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10545}
10546
10548 SDValue Ptr, SDValue Offset, EVT SVT,
10550 bool IsTruncating) {
10551 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10552 EVT VT = Val.getValueType();
10553 if (VT == SVT) {
10554 IsTruncating = false;
10555 } else if (!IsTruncating) {
10556 assert(VT == SVT && "No-truncating store from different memory type!");
10557 } else {
10559 "Should only be a truncating store, not extending!");
10560 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10561 assert(VT.isVector() == SVT.isVector() &&
10562 "Cannot use trunc store to convert to or from a vector!");
10563 assert((!VT.isVector() ||
10565 "Cannot use trunc store to change the number of vector elements!");
10566 }
10567
10568 bool Indexed = AM != ISD::UNINDEXED;
10569 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10570 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10571 : getVTList(MVT::Other);
10572 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10575 ID.AddInteger(SVT.getRawBits());
10576 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10577 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10578 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10579 ID.AddInteger(MMO->getFlags());
10580 void *IP = nullptr;
10581 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10582 cast<StoreSDNode>(E)->refineAlignment(MMO);
10583 return SDValue(E, 0);
10584 }
10585 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10586 IsTruncating, SVT, MMO);
10587 createOperands(N, Ops);
10588
10589 CSEMap.InsertNode(N, IP);
10590 InsertNode(N);
10591 SDValue V(N, 0);
10592 NewSDValueDbgMsg(V, "Creating new node: ", this);
10593 return V;
10594}
10595
10597 SDValue Ptr, MachinePointerInfo PtrInfo,
10598 EVT SVT, Align Alignment,
10599 MachineMemOperand::Flags MMOFlags,
10600 const AAMDNodes &AAInfo) {
10601 assert(Chain.getValueType() == MVT::Other &&
10602 "Invalid chain type");
10603
10604 MMOFlags |= MachineMemOperand::MOStore;
10605 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10606
10607 if (PtrInfo.V.isNull())
10608 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10609
10611 MachineMemOperand *MMO = MF.getMachineMemOperand(
10612 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10613 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10614}
10615
10617 SDValue Ptr, EVT SVT,
10618 MachineMemOperand *MMO) {
10620 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10621}
10622
10626 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10627 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10628 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10629 ST->getMemoryVT(), ST->getMemOperand(), AM,
10630 ST->isTruncatingStore());
10631}
10632
10634 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10635 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10636 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10637 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10638 const MDNode *Ranges, bool IsExpanding) {
10639 MMOFlags |= MachineMemOperand::MOLoad;
10640 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10641 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10642 // clients.
10643 if (PtrInfo.V.isNull())
10644 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10645
10646 TypeSize Size = MemVT.getStoreSize();
10648 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10649 Alignment, AAInfo, Ranges);
10650 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10651 MMO, IsExpanding);
10652}
10653
10655 ISD::LoadExtType ExtType, EVT VT,
10656 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10657 SDValue Offset, SDValue Mask, SDValue EVL,
10658 EVT MemVT, MachineMemOperand *MMO,
10659 bool IsExpanding) {
10660 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10661 assert(Mask.getValueType().getVectorElementCount() ==
10662 VT.getVectorElementCount() &&
10663 "Vector width mismatch between mask and data");
10664
10665 bool Indexed = AM != ISD::UNINDEXED;
10666 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10667
10668 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10669 : getVTList(VT, MVT::Other);
10670 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10672 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10673 ID.AddInteger(MemVT.getRawBits());
10674 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10675 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10676 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10677 ID.AddInteger(MMO->getFlags());
10678 void *IP = nullptr;
10679 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10680 E->refineAlignment(MMO);
10681 E->refineRanges(MMO);
10682 return SDValue(E, 0);
10683 }
10684 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10685 ExtType, IsExpanding, MemVT, MMO);
10686 createOperands(N, Ops);
10687
10688 CSEMap.InsertNode(N, IP);
10689 InsertNode(N);
10690 SDValue V(N, 0);
10691 NewSDValueDbgMsg(V, "Creating new node: ", this);
10692 return V;
10693}
10694
10696 SDValue Ptr, SDValue Mask, SDValue EVL,
10697 MachinePointerInfo PtrInfo,
10698 MaybeAlign Alignment,
10699 MachineMemOperand::Flags MMOFlags,
10700 const AAMDNodes &AAInfo, const MDNode *Ranges,
10701 bool IsExpanding) {
10703 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10704 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10705 IsExpanding);
10706}
10707
10709 SDValue Ptr, SDValue Mask, SDValue EVL,
10710 MachineMemOperand *MMO, bool IsExpanding) {
10712 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10713 Mask, EVL, VT, MMO, IsExpanding);
10714}
10715
10717 EVT VT, SDValue Chain, SDValue Ptr,
10718 SDValue Mask, SDValue EVL,
10719 MachinePointerInfo PtrInfo, EVT MemVT,
10720 MaybeAlign Alignment,
10721 MachineMemOperand::Flags MMOFlags,
10722 const AAMDNodes &AAInfo, bool IsExpanding) {
10724 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10725 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10726 IsExpanding);
10727}
10728
10730 EVT VT, SDValue Chain, SDValue Ptr,
10731 SDValue Mask, SDValue EVL, EVT MemVT,
10732 MachineMemOperand *MMO, bool IsExpanding) {
10734 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10735 EVL, MemVT, MMO, IsExpanding);
10736}
10737
10741 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10742 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10743 // Don't propagate the invariant or dereferenceable flags.
10744 auto MMOFlags =
10745 LD->getMemOperand()->getFlags() &
10747 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10748 LD->getChain(), Base, Offset, LD->getMask(),
10749 LD->getVectorLength(), LD->getPointerInfo(),
10750 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
10751 nullptr, LD->isExpandingLoad());
10752}
10753
10755 SDValue Ptr, SDValue Offset, SDValue Mask,
10756 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
10757 ISD::MemIndexedMode AM, bool IsTruncating,
10758 bool IsCompressing) {
10759 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10760 assert(Mask.getValueType().getVectorElementCount() ==
10762 "Vector width mismatch between mask and data");
10763
10764 bool Indexed = AM != ISD::UNINDEXED;
10765 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10766 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10767 : getVTList(MVT::Other);
10768 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
10770 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10771 ID.AddInteger(MemVT.getRawBits());
10772 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10773 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10774 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10775 ID.AddInteger(MMO->getFlags());
10776 void *IP = nullptr;
10777 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10778 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10779 return SDValue(E, 0);
10780 }
10781 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10782 IsTruncating, IsCompressing, MemVT, MMO);
10783 createOperands(N, Ops);
10784
10785 CSEMap.InsertNode(N, IP);
10786 InsertNode(N);
10787 SDValue V(N, 0);
10788 NewSDValueDbgMsg(V, "Creating new node: ", this);
10789 return V;
10790}
10791
10793 SDValue Val, SDValue Ptr, SDValue Mask,
10794 SDValue EVL, MachinePointerInfo PtrInfo,
10795 EVT SVT, Align Alignment,
10796 MachineMemOperand::Flags MMOFlags,
10797 const AAMDNodes &AAInfo,
10798 bool IsCompressing) {
10799 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10800
10801 MMOFlags |= MachineMemOperand::MOStore;
10802 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10803
10804 if (PtrInfo.V.isNull())
10805 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10806
10808 MachineMemOperand *MMO = MF.getMachineMemOperand(
10809 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10810 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
10811 IsCompressing);
10812}
10813
10815 SDValue Val, SDValue Ptr, SDValue Mask,
10816 SDValue EVL, EVT SVT,
10817 MachineMemOperand *MMO,
10818 bool IsCompressing) {
10819 EVT VT = Val.getValueType();
10820
10821 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10822 if (VT == SVT)
10823 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
10824 EVL, VT, MMO, ISD::UNINDEXED,
10825 /*IsTruncating*/ false, IsCompressing);
10826
10828 "Should only be a truncating store, not extending!");
10829 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10830 assert(VT.isVector() == SVT.isVector() &&
10831 "Cannot use trunc store to convert to or from a vector!");
10832 assert((!VT.isVector() ||
10834 "Cannot use trunc store to change the number of vector elements!");
10835
10836 SDVTList VTs = getVTList(MVT::Other);
10838 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
10840 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10841 ID.AddInteger(SVT.getRawBits());
10842 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10843 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, 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<VPStoreSDNode>(E)->refineAlignment(MMO);
10849 return SDValue(E, 0);
10850 }
10851 auto *N =
10852 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10853 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
10854 createOperands(N, Ops);
10855
10856 CSEMap.InsertNode(N, IP);
10857 InsertNode(N);
10858 SDValue V(N, 0);
10859 NewSDValueDbgMsg(V, "Creating new node: ", this);
10860 return V;
10861}
10862
10866 auto *ST = cast<VPStoreSDNode>(OrigStore);
10867 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
10868 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
10869 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
10870 Offset, ST->getMask(), ST->getVectorLength()};
10872 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10873 ID.AddInteger(ST->getMemoryVT().getRawBits());
10874 ID.AddInteger(ST->getRawSubclassData());
10875 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
10876 ID.AddInteger(ST->getMemOperand()->getFlags());
10877 void *IP = nullptr;
10878 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10879 return SDValue(E, 0);
10880
10881 auto *N = newSDNode<VPStoreSDNode>(
10882 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
10883 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
10884 createOperands(N, Ops);
10885
10886 CSEMap.InsertNode(N, IP);
10887 InsertNode(N);
10888 SDValue V(N, 0);
10889 NewSDValueDbgMsg(V, "Creating new node: ", this);
10890 return V;
10891}
10892
10894 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
10895 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
10896 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
10897 bool Indexed = AM != ISD::UNINDEXED;
10898 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10899
10900 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
10901 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10902 : getVTList(VT, MVT::Other);
10904 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
10905 ID.AddInteger(VT.getRawBits());
10906 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
10907 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10908 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10909
10910 void *IP = nullptr;
10911 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10912 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
10913 return SDValue(E, 0);
10914 }
10915
10916 auto *N =
10917 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
10918 ExtType, IsExpanding, MemVT, MMO);
10919 createOperands(N, Ops);
10920 CSEMap.InsertNode(N, IP);
10921 InsertNode(N);
10922 SDValue V(N, 0);
10923 NewSDValueDbgMsg(V, "Creating new node: ", this);
10924 return V;
10925}
10926
10928 SDValue Ptr, SDValue Stride,
10929 SDValue Mask, SDValue EVL,
10930 MachineMemOperand *MMO,
10931 bool IsExpanding) {
10933 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
10934 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
10935}
10936
10938 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
10939 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
10940 MachineMemOperand *MMO, bool IsExpanding) {
10942 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
10943 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
10944}
10945
10947 SDValue Val, SDValue Ptr,
10948 SDValue Offset, SDValue Stride,
10949 SDValue Mask, SDValue EVL, EVT MemVT,
10950 MachineMemOperand *MMO,
10952 bool IsTruncating, bool IsCompressing) {
10953 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10954 bool Indexed = AM != ISD::UNINDEXED;
10955 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10956 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10957 : getVTList(MVT::Other);
10958 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
10960 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
10961 ID.AddInteger(MemVT.getRawBits());
10962 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
10963 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10964 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10965 void *IP = nullptr;
10966 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10967 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
10968 return SDValue(E, 0);
10969 }
10970 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
10971 VTs, AM, IsTruncating,
10972 IsCompressing, MemVT, MMO);
10973 createOperands(N, Ops);
10974
10975 CSEMap.InsertNode(N, IP);
10976 InsertNode(N);
10977 SDValue V(N, 0);
10978 NewSDValueDbgMsg(V, "Creating new node: ", this);
10979 return V;
10980}
10981
10983 SDValue Val, SDValue Ptr,
10984 SDValue Stride, SDValue Mask,
10985 SDValue EVL, EVT SVT,
10986 MachineMemOperand *MMO,
10987 bool IsCompressing) {
10988 EVT VT = Val.getValueType();
10989
10990 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10991 if (VT == SVT)
10992 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
10993 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
10994 /*IsTruncating*/ false, IsCompressing);
10995
10997 "Should only be a truncating store, not extending!");
10998 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10999 assert(VT.isVector() == SVT.isVector() &&
11000 "Cannot use trunc store to convert to or from a vector!");
11001 assert((!VT.isVector() ||
11003 "Cannot use trunc store to change the number of vector elements!");
11004
11005 SDVTList VTs = getVTList(MVT::Other);
11007 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
11009 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11010 ID.AddInteger(SVT.getRawBits());
11011 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11012 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11013 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11014 void *IP = nullptr;
11015 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11016 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11017 return SDValue(E, 0);
11018 }
11019 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11020 VTs, ISD::UNINDEXED, true,
11021 IsCompressing, SVT, MMO);
11022 createOperands(N, Ops);
11023
11024 CSEMap.InsertNode(N, IP);
11025 InsertNode(N);
11026 SDValue V(N, 0);
11027 NewSDValueDbgMsg(V, "Creating new node: ", this);
11028 return V;
11029}
11030
11033 ISD::MemIndexType IndexType) {
11034 assert(Ops.size() == 6 && "Incompatible number of operands");
11035
11037 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
11038 ID.AddInteger(VT.getRawBits());
11039 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11040 dl.getIROrder(), VTs, VT, MMO, IndexType));
11041 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11042 ID.AddInteger(MMO->getFlags());
11043 void *IP = nullptr;
11044 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11045 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11046 return SDValue(E, 0);
11047 }
11048
11049 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11050 VT, MMO, IndexType);
11051 createOperands(N, Ops);
11052
11053 assert(N->getMask().getValueType().getVectorElementCount() ==
11054 N->getValueType(0).getVectorElementCount() &&
11055 "Vector width mismatch between mask and data");
11056 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11057 N->getValueType(0).getVectorElementCount().isScalable() &&
11058 "Scalable flags of index and data do not match");
11060 N->getIndex().getValueType().getVectorElementCount(),
11061 N->getValueType(0).getVectorElementCount()) &&
11062 "Vector width mismatch between index and data");
11063 assert(isa<ConstantSDNode>(N->getScale()) &&
11064 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11065 "Scale should be a constant power of 2");
11066
11067 CSEMap.InsertNode(N, IP);
11068 InsertNode(N);
11069 SDValue V(N, 0);
11070 NewSDValueDbgMsg(V, "Creating new node: ", this);
11071 return V;
11072}
11073
11076 MachineMemOperand *MMO,
11077 ISD::MemIndexType IndexType) {
11078 assert(Ops.size() == 7 && "Incompatible number of operands");
11079
11081 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
11082 ID.AddInteger(VT.getRawBits());
11083 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11084 dl.getIROrder(), VTs, VT, MMO, IndexType));
11085 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11086 ID.AddInteger(MMO->getFlags());
11087 void *IP = nullptr;
11088 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11089 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11090 return SDValue(E, 0);
11091 }
11092 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11093 VT, MMO, IndexType);
11094 createOperands(N, Ops);
11095
11096 assert(N->getMask().getValueType().getVectorElementCount() ==
11097 N->getValue().getValueType().getVectorElementCount() &&
11098 "Vector width mismatch between mask and data");
11099 assert(
11100 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11101 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11102 "Scalable flags of index and data do not match");
11104 N->getIndex().getValueType().getVectorElementCount(),
11105 N->getValue().getValueType().getVectorElementCount()) &&
11106 "Vector width mismatch between index and data");
11107 assert(isa<ConstantSDNode>(N->getScale()) &&
11108 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11109 "Scale should be a constant power of 2");
11110
11111 CSEMap.InsertNode(N, IP);
11112 InsertNode(N);
11113 SDValue V(N, 0);
11114 NewSDValueDbgMsg(V, "Creating new node: ", this);
11115 return V;
11116}
11117
11120 SDValue PassThru, EVT MemVT,
11121 MachineMemOperand *MMO,
11123 ISD::LoadExtType ExtTy, bool isExpanding) {
11124 bool Indexed = AM != ISD::UNINDEXED;
11125 assert((Indexed || Offset.isUndef()) &&
11126 "Unindexed masked load with an offset!");
11127 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11128 : getVTList(VT, MVT::Other);
11129 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11132 ID.AddInteger(MemVT.getRawBits());
11133 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11134 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11135 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11136 ID.AddInteger(MMO->getFlags());
11137 void *IP = nullptr;
11138 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11139 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11140 return SDValue(E, 0);
11141 }
11142 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11143 AM, ExtTy, isExpanding, MemVT, MMO);
11144 createOperands(N, Ops);
11145
11146 CSEMap.InsertNode(N, IP);
11147 InsertNode(N);
11148 SDValue V(N, 0);
11149 NewSDValueDbgMsg(V, "Creating new node: ", this);
11150 return V;
11151}
11152
11157 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
11158 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11159 Offset, LD->getMask(), LD->getPassThru(),
11160 LD->getMemoryVT(), LD->getMemOperand(), AM,
11161 LD->getExtensionType(), LD->isExpandingLoad());
11162}
11163
11166 SDValue Mask, EVT MemVT,
11167 MachineMemOperand *MMO,
11168 ISD::MemIndexedMode AM, bool IsTruncating,
11169 bool IsCompressing) {
11170 assert(Chain.getValueType() == MVT::Other &&
11171 "Invalid chain type");
11172 bool Indexed = AM != ISD::UNINDEXED;
11173 assert((Indexed || Offset.isUndef()) &&
11174 "Unindexed masked store with an offset!");
11175 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11176 : getVTList(MVT::Other);
11177 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11180 ID.AddInteger(MemVT.getRawBits());
11181 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11182 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11183 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11184 ID.AddInteger(MMO->getFlags());
11185 void *IP = nullptr;
11186 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11187 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11188 return SDValue(E, 0);
11189 }
11190 auto *N =
11191 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11192 IsTruncating, IsCompressing, MemVT, MMO);
11193 createOperands(N, Ops);
11194
11195 CSEMap.InsertNode(N, IP);
11196 InsertNode(N);
11197 SDValue V(N, 0);
11198 NewSDValueDbgMsg(V, "Creating new node: ", this);
11199 return V;
11200}
11201
11206 assert(ST->getOffset().isUndef() &&
11207 "Masked store is already a indexed store!");
11208 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11209 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11210 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11211}
11212
11215 MachineMemOperand *MMO,
11216 ISD::MemIndexType IndexType,
11217 ISD::LoadExtType ExtTy) {
11218 assert(Ops.size() == 6 && "Incompatible number of operands");
11219
11222 ID.AddInteger(MemVT.getRawBits());
11223 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11224 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11225 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11226 ID.AddInteger(MMO->getFlags());
11227 void *IP = nullptr;
11228 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11229 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11230 return SDValue(E, 0);
11231 }
11232
11233 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11234 VTs, MemVT, MMO, IndexType, ExtTy);
11235 createOperands(N, Ops);
11236
11237 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11238 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11239 assert(N->getMask().getValueType().getVectorElementCount() ==
11240 N->getValueType(0).getVectorElementCount() &&
11241 "Vector width mismatch between mask and data");
11242 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11243 N->getValueType(0).getVectorElementCount().isScalable() &&
11244 "Scalable flags of index and data do not match");
11246 N->getIndex().getValueType().getVectorElementCount(),
11247 N->getValueType(0).getVectorElementCount()) &&
11248 "Vector width mismatch between index and data");
11249 assert(isa<ConstantSDNode>(N->getScale()) &&
11250 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11251 "Scale should be a constant power of 2");
11252
11253 CSEMap.InsertNode(N, IP);
11254 InsertNode(N);
11255 SDValue V(N, 0);
11256 NewSDValueDbgMsg(V, "Creating new node: ", this);
11257 return V;
11258}
11259
11262 MachineMemOperand *MMO,
11263 ISD::MemIndexType IndexType,
11264 bool IsTrunc) {
11265 assert(Ops.size() == 6 && "Incompatible number of operands");
11266
11269 ID.AddInteger(MemVT.getRawBits());
11270 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11271 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11272 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11273 ID.AddInteger(MMO->getFlags());
11274 void *IP = nullptr;
11275 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11276 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11277 return SDValue(E, 0);
11278 }
11279
11280 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11281 VTs, MemVT, MMO, IndexType, IsTrunc);
11282 createOperands(N, Ops);
11283
11284 assert(N->getMask().getValueType().getVectorElementCount() ==
11285 N->getValue().getValueType().getVectorElementCount() &&
11286 "Vector width mismatch between mask and data");
11287 assert(
11288 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11289 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11290 "Scalable flags of index and data do not match");
11292 N->getIndex().getValueType().getVectorElementCount(),
11293 N->getValue().getValueType().getVectorElementCount()) &&
11294 "Vector width mismatch between index and data");
11295 assert(isa<ConstantSDNode>(N->getScale()) &&
11296 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11297 "Scale should be a constant power of 2");
11298
11299 CSEMap.InsertNode(N, IP);
11300 InsertNode(N);
11301 SDValue V(N, 0);
11302 NewSDValueDbgMsg(V, "Creating new node: ", this);
11303 return V;
11304}
11305
11307 const SDLoc &dl, ArrayRef<SDValue> Ops,
11308 MachineMemOperand *MMO,
11309 ISD::MemIndexType IndexType) {
11310 assert(Ops.size() == 7 && "Incompatible number of operands");
11311
11314 ID.AddInteger(MemVT.getRawBits());
11315 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11316 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11317 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11318 ID.AddInteger(MMO->getFlags());
11319 void *IP = nullptr;
11320 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11321 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11322 return SDValue(E, 0);
11323 }
11324
11325 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11326 VTs, MemVT, MMO, IndexType);
11327 createOperands(N, Ops);
11328
11329 assert(N->getMask().getValueType().getVectorElementCount() ==
11330 N->getIndex().getValueType().getVectorElementCount() &&
11331 "Vector width mismatch between mask and data");
11332 assert(isa<ConstantSDNode>(N->getScale()) &&
11333 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11334 "Scale should be a constant power of 2");
11335 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11336
11337 CSEMap.InsertNode(N, IP);
11338 InsertNode(N);
11339 SDValue V(N, 0);
11340 NewSDValueDbgMsg(V, "Creating new node: ", this);
11341 return V;
11342}
11343
11345 SDValue Ptr, SDValue Mask, SDValue EVL,
11346 MachineMemOperand *MMO) {
11347 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11348 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11350 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11351 ID.AddInteger(VT.getRawBits());
11352 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11353 VTs, VT, MMO));
11354 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11355 ID.AddInteger(MMO->getFlags());
11356 void *IP = nullptr;
11357 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11358 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11359 return SDValue(E, 0);
11360 }
11361 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11362 VT, MMO);
11363 createOperands(N, Ops);
11364
11365 CSEMap.InsertNode(N, IP);
11366 InsertNode(N);
11367 SDValue V(N, 0);
11368 NewSDValueDbgMsg(V, "Creating new node: ", this);
11369 return V;
11370}
11371
11373 EVT MemVT, MachineMemOperand *MMO) {
11374 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11375 SDVTList VTs = getVTList(MVT::Other);
11376 SDValue Ops[] = {Chain, Ptr};
11379 ID.AddInteger(MemVT.getRawBits());
11380 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11381 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11382 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11383 ID.AddInteger(MMO->getFlags());
11384 void *IP = nullptr;
11385 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11386 return SDValue(E, 0);
11387
11388 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11389 dl.getDebugLoc(), VTs, MemVT, MMO);
11390 createOperands(N, Ops);
11391
11392 CSEMap.InsertNode(N, IP);
11393 InsertNode(N);
11394 SDValue V(N, 0);
11395 NewSDValueDbgMsg(V, "Creating new node: ", this);
11396 return V;
11397}
11398
11400 EVT MemVT, MachineMemOperand *MMO) {
11401 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11402 SDVTList VTs = getVTList(MVT::Other);
11403 SDValue Ops[] = {Chain, Ptr};
11406 ID.AddInteger(MemVT.getRawBits());
11407 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11408 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11409 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11410 ID.AddInteger(MMO->getFlags());
11411 void *IP = nullptr;
11412 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11413 return SDValue(E, 0);
11414
11415 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11416 dl.getDebugLoc(), VTs, MemVT, MMO);
11417 createOperands(N, Ops);
11418
11419 CSEMap.InsertNode(N, IP);
11420 InsertNode(N);
11421 SDValue V(N, 0);
11422 NewSDValueDbgMsg(V, "Creating new node: ", this);
11423 return V;
11424}
11425
11427 // select undef, T, F --> T (if T is a constant), otherwise F
11428 // select, ?, undef, F --> F
11429 // select, ?, T, undef --> T
11430 if (Cond.isUndef())
11431 return isConstantValueOfAnyType(T) ? T : F;
11432 if (T.isUndef())
11434 if (F.isUndef())
11436
11437 // select true, T, F --> T
11438 // select false, T, F --> F
11439 if (auto C = isBoolConstant(Cond))
11440 return *C ? T : F;
11441
11442 // select ?, T, T --> T
11443 if (T == F)
11444 return T;
11445
11446 return SDValue();
11447}
11448
11450 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11451 if (X.isUndef())
11452 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11453 // shift X, undef --> undef (because it may shift by the bitwidth)
11454 if (Y.isUndef())
11455 return getUNDEF(X.getValueType());
11456
11457 // shift 0, Y --> 0
11458 // shift X, 0 --> X
11460 return X;
11461
11462 // shift X, C >= bitwidth(X) --> undef
11463 // All vector elements must be too big (or undef) to avoid partial undefs.
11464 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11465 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11466 };
11467 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11468 return getUNDEF(X.getValueType());
11469
11470 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11471 if (X.getValueType().getScalarType() == MVT::i1)
11472 return X;
11473
11474 return SDValue();
11475}
11476
11478 SDNodeFlags Flags) {
11479 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11480 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11481 // operation is poison. That result can be relaxed to undef.
11482 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11483 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11484 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11485 (YC && YC->getValueAPF().isNaN());
11486 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11487 (YC && YC->getValueAPF().isInfinity());
11488
11489 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11490 return getUNDEF(X.getValueType());
11491
11492 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11493 return getUNDEF(X.getValueType());
11494
11495 if (!YC)
11496 return SDValue();
11497
11498 // X + -0.0 --> X
11499 if (Opcode == ISD::FADD)
11500 if (YC->getValueAPF().isNegZero())
11501 return X;
11502
11503 // X - +0.0 --> X
11504 if (Opcode == ISD::FSUB)
11505 if (YC->getValueAPF().isPosZero())
11506 return X;
11507
11508 // X * 1.0 --> X
11509 // X / 1.0 --> X
11510 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11511 if (YC->getValueAPF().isExactlyValue(1.0))
11512 return X;
11513
11514 // X * 0.0 --> 0.0
11515 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11516 if (YC->getValueAPF().isZero())
11517 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11518
11519 return SDValue();
11520}
11521
11523 SDValue Ptr, SDValue SV, unsigned Align) {
11524 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11525 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11526}
11527
11528SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11530 switch (Ops.size()) {
11531 case 0: return getNode(Opcode, DL, VT);
11532 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11533 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11534 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11535 default: break;
11536 }
11537
11538 // Copy from an SDUse array into an SDValue array for use with
11539 // the regular getNode logic.
11541 return getNode(Opcode, DL, VT, NewOps);
11542}
11543
11544SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11546 SDNodeFlags Flags;
11547 if (Inserter)
11548 Flags = Inserter->getFlags();
11549 return getNode(Opcode, DL, VT, Ops, Flags);
11550}
11551
11552SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11553 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11554 unsigned NumOps = Ops.size();
11555 switch (NumOps) {
11556 case 0: return getNode(Opcode, DL, VT);
11557 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11558 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11559 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11560 default: break;
11561 }
11562
11563#ifndef NDEBUG
11564 for (const auto &Op : Ops)
11565 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11566 "Operand is DELETED_NODE!");
11567#endif
11568
11569 switch (Opcode) {
11570 default: break;
11571 case ISD::BUILD_VECTOR:
11572 // Attempt to simplify BUILD_VECTOR.
11573 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11574 return V;
11575 break;
11577 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11578 return V;
11579 break;
11580 case ISD::SELECT_CC:
11581 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11582 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11583 "LHS and RHS of condition must have same type!");
11584 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11585 "True and False arms of SelectCC must have same type!");
11586 assert(Ops[2].getValueType() == VT &&
11587 "select_cc node must be of same type as true and false value!");
11588 assert((!Ops[0].getValueType().isVector() ||
11589 Ops[0].getValueType().getVectorElementCount() ==
11590 VT.getVectorElementCount()) &&
11591 "Expected select_cc with vector result to have the same sized "
11592 "comparison type!");
11593 break;
11594 case ISD::BR_CC:
11595 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11596 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11597 "LHS/RHS of comparison should match types!");
11598 break;
11599 case ISD::VP_ADD:
11600 case ISD::VP_SUB:
11601 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11602 if (VT.getScalarType() == MVT::i1)
11603 Opcode = ISD::VP_XOR;
11604 break;
11605 case ISD::VP_MUL:
11606 // If it is VP_MUL mask operation then turn it to VP_AND
11607 if (VT.getScalarType() == MVT::i1)
11608 Opcode = ISD::VP_AND;
11609 break;
11610 case ISD::VP_REDUCE_MUL:
11611 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11612 if (VT == MVT::i1)
11613 Opcode = ISD::VP_REDUCE_AND;
11614 break;
11615 case ISD::VP_REDUCE_ADD:
11616 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11617 if (VT == MVT::i1)
11618 Opcode = ISD::VP_REDUCE_XOR;
11619 break;
11620 case ISD::VP_REDUCE_SMAX:
11621 case ISD::VP_REDUCE_UMIN:
11622 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11623 // VP_REDUCE_AND.
11624 if (VT == MVT::i1)
11625 Opcode = ISD::VP_REDUCE_AND;
11626 break;
11627 case ISD::VP_REDUCE_SMIN:
11628 case ISD::VP_REDUCE_UMAX:
11629 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11630 // VP_REDUCE_OR.
11631 if (VT == MVT::i1)
11632 Opcode = ISD::VP_REDUCE_OR;
11633 break;
11634 }
11635
11636 // Memoize nodes.
11637 SDNode *N;
11638 SDVTList VTs = getVTList(VT);
11639
11640 if (VT != MVT::Glue) {
11642 AddNodeIDNode(ID, Opcode, VTs, Ops);
11643 void *IP = nullptr;
11644
11645 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11646 E->intersectFlagsWith(Flags);
11647 return SDValue(E, 0);
11648 }
11649
11650 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11651 createOperands(N, Ops);
11652
11653 CSEMap.InsertNode(N, IP);
11654 } else {
11655 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11656 createOperands(N, Ops);
11657 }
11658
11659 N->setFlags(Flags);
11660 InsertNode(N);
11661 SDValue V(N, 0);
11662 NewSDValueDbgMsg(V, "Creating new node: ", this);
11663 return V;
11664}
11665
11666SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11667 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11668 SDNodeFlags Flags;
11669 if (Inserter)
11670 Flags = Inserter->getFlags();
11671 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11672}
11673
11674SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11676 const SDNodeFlags Flags) {
11677 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11678}
11679
11680SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11682 SDNodeFlags Flags;
11683 if (Inserter)
11684 Flags = Inserter->getFlags();
11685 return getNode(Opcode, DL, VTList, Ops, Flags);
11686}
11687
11688SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11689 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11690 if (VTList.NumVTs == 1)
11691 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11692
11693#ifndef NDEBUG
11694 for (const auto &Op : Ops)
11695 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11696 "Operand is DELETED_NODE!");
11697#endif
11698
11699 switch (Opcode) {
11700 case ISD::SADDO:
11701 case ISD::UADDO:
11702 case ISD::SSUBO:
11703 case ISD::USUBO: {
11704 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11705 "Invalid add/sub overflow op!");
11706 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11707 Ops[0].getValueType() == Ops[1].getValueType() &&
11708 Ops[0].getValueType() == VTList.VTs[0] &&
11709 "Binary operator types must match!");
11710 SDValue N1 = Ops[0], N2 = Ops[1];
11711 canonicalizeCommutativeBinop(Opcode, N1, N2);
11712
11713 // (X +- 0) -> X with zero-overflow.
11714 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11715 /*AllowTruncation*/ true);
11716 if (N2CV && N2CV->isZero()) {
11717 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11718 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11719 }
11720
11721 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11722 VTList.VTs[1].getScalarType() == MVT::i1) {
11723 SDValue F1 = getFreeze(N1);
11724 SDValue F2 = getFreeze(N2);
11725 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11726 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11727 return getNode(ISD::MERGE_VALUES, DL, VTList,
11728 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11729 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11730 Flags);
11731 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11732 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11733 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11734 return getNode(ISD::MERGE_VALUES, DL, VTList,
11735 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11736 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11737 Flags);
11738 }
11739 }
11740 break;
11741 }
11742 case ISD::SADDO_CARRY:
11743 case ISD::UADDO_CARRY:
11744 case ISD::SSUBO_CARRY:
11745 case ISD::USUBO_CARRY:
11746 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11747 "Invalid add/sub overflow op!");
11748 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11749 Ops[0].getValueType() == Ops[1].getValueType() &&
11750 Ops[0].getValueType() == VTList.VTs[0] &&
11751 Ops[2].getValueType() == VTList.VTs[1] &&
11752 "Binary operator types must match!");
11753 break;
11754 case ISD::SMUL_LOHI:
11755 case ISD::UMUL_LOHI: {
11756 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
11757 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
11758 VTList.VTs[0] == Ops[0].getValueType() &&
11759 VTList.VTs[0] == Ops[1].getValueType() &&
11760 "Binary operator types must match!");
11761 // Constant fold.
11764 if (LHS && RHS) {
11765 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
11766 unsigned OutWidth = Width * 2;
11767 APInt Val = LHS->getAPIntValue();
11768 APInt Mul = RHS->getAPIntValue();
11769 if (Opcode == ISD::SMUL_LOHI) {
11770 Val = Val.sext(OutWidth);
11771 Mul = Mul.sext(OutWidth);
11772 } else {
11773 Val = Val.zext(OutWidth);
11774 Mul = Mul.zext(OutWidth);
11775 }
11776 Val *= Mul;
11777
11778 SDValue Hi =
11779 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
11780 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
11781 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
11782 }
11783 break;
11784 }
11785 case ISD::FFREXP: {
11786 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
11787 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
11788 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
11789
11791 int FrexpExp;
11792 APFloat FrexpMant =
11793 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
11794 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
11795 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
11796 DL, VTList.VTs[1]);
11797 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
11798 }
11799
11800 break;
11801 }
11803 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11804 "Invalid STRICT_FP_EXTEND!");
11805 assert(VTList.VTs[0].isFloatingPoint() &&
11806 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
11807 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11808 "STRICT_FP_EXTEND result type should be vector iff the operand "
11809 "type is vector!");
11810 assert((!VTList.VTs[0].isVector() ||
11811 VTList.VTs[0].getVectorElementCount() ==
11812 Ops[1].getValueType().getVectorElementCount()) &&
11813 "Vector element count mismatch!");
11814 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
11815 "Invalid fpext node, dst <= src!");
11816 break;
11818 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
11819 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11820 "STRICT_FP_ROUND result type should be vector iff the operand "
11821 "type is vector!");
11822 assert((!VTList.VTs[0].isVector() ||
11823 VTList.VTs[0].getVectorElementCount() ==
11824 Ops[1].getValueType().getVectorElementCount()) &&
11825 "Vector element count mismatch!");
11826 assert(VTList.VTs[0].isFloatingPoint() &&
11827 Ops[1].getValueType().isFloatingPoint() &&
11828 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
11829 Ops[2].getOpcode() == ISD::TargetConstant &&
11830 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
11831 "Invalid STRICT_FP_ROUND!");
11832 break;
11833 }
11834
11835 // Memoize the node unless it returns a glue result.
11836 SDNode *N;
11837 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
11839 AddNodeIDNode(ID, Opcode, VTList, Ops);
11840 void *IP = nullptr;
11841 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11842 E->intersectFlagsWith(Flags);
11843 return SDValue(E, 0);
11844 }
11845
11846 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11847 createOperands(N, Ops);
11848 CSEMap.InsertNode(N, IP);
11849 } else {
11850 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11851 createOperands(N, Ops);
11852 }
11853
11854 N->setFlags(Flags);
11855 InsertNode(N);
11856 SDValue V(N, 0);
11857 NewSDValueDbgMsg(V, "Creating new node: ", this);
11858 return V;
11859}
11860
11861SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11862 SDVTList VTList) {
11863 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
11864}
11865
11866SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11867 SDValue N1) {
11868 SDValue Ops[] = { N1 };
11869 return getNode(Opcode, DL, VTList, Ops);
11870}
11871
11872SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11873 SDValue N1, SDValue N2) {
11874 SDValue Ops[] = { N1, N2 };
11875 return getNode(Opcode, DL, VTList, Ops);
11876}
11877
11878SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11879 SDValue N1, SDValue N2, SDValue N3) {
11880 SDValue Ops[] = { N1, N2, N3 };
11881 return getNode(Opcode, DL, VTList, Ops);
11882}
11883
11884SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11885 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
11886 SDValue Ops[] = { N1, N2, N3, N4 };
11887 return getNode(Opcode, DL, VTList, Ops);
11888}
11889
11890SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11891 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
11892 SDValue N5) {
11893 SDValue Ops[] = { N1, N2, N3, N4, N5 };
11894 return getNode(Opcode, DL, VTList, Ops);
11895}
11896
11898 if (!VT.isExtended())
11899 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
11900
11901 return makeVTList(&(*EVTs.insert(VT).first), 1);
11902}
11903
11906 ID.AddInteger(2U);
11907 ID.AddInteger(VT1.getRawBits());
11908 ID.AddInteger(VT2.getRawBits());
11909
11910 void *IP = nullptr;
11911 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11912 if (!Result) {
11913 EVT *Array = Allocator.Allocate<EVT>(2);
11914 Array[0] = VT1;
11915 Array[1] = VT2;
11916 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
11917 VTListMap.InsertNode(Result, IP);
11918 }
11919 return Result->getSDVTList();
11920}
11921
11924 ID.AddInteger(3U);
11925 ID.AddInteger(VT1.getRawBits());
11926 ID.AddInteger(VT2.getRawBits());
11927 ID.AddInteger(VT3.getRawBits());
11928
11929 void *IP = nullptr;
11930 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11931 if (!Result) {
11932 EVT *Array = Allocator.Allocate<EVT>(3);
11933 Array[0] = VT1;
11934 Array[1] = VT2;
11935 Array[2] = VT3;
11936 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
11937 VTListMap.InsertNode(Result, IP);
11938 }
11939 return Result->getSDVTList();
11940}
11941
11944 ID.AddInteger(4U);
11945 ID.AddInteger(VT1.getRawBits());
11946 ID.AddInteger(VT2.getRawBits());
11947 ID.AddInteger(VT3.getRawBits());
11948 ID.AddInteger(VT4.getRawBits());
11949
11950 void *IP = nullptr;
11951 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11952 if (!Result) {
11953 EVT *Array = Allocator.Allocate<EVT>(4);
11954 Array[0] = VT1;
11955 Array[1] = VT2;
11956 Array[2] = VT3;
11957 Array[3] = VT4;
11958 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
11959 VTListMap.InsertNode(Result, IP);
11960 }
11961 return Result->getSDVTList();
11962}
11963
11965 unsigned NumVTs = VTs.size();
11967 ID.AddInteger(NumVTs);
11968 for (unsigned index = 0; index < NumVTs; index++) {
11969 ID.AddInteger(VTs[index].getRawBits());
11970 }
11971
11972 void *IP = nullptr;
11973 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11974 if (!Result) {
11975 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
11976 llvm::copy(VTs, Array);
11977 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
11978 VTListMap.InsertNode(Result, IP);
11979 }
11980 return Result->getSDVTList();
11981}
11982
11983
11984/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
11985/// specified operands. If the resultant node already exists in the DAG,
11986/// this does not modify the specified node, instead it returns the node that
11987/// already exists. If the resultant node does not exist in the DAG, the
11988/// input node is returned. As a degenerate case, if you specify the same
11989/// input operands as the node already has, the input node is returned.
11991 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
11992
11993 // Check to see if there is no change.
11994 if (Op == N->getOperand(0)) return N;
11995
11996 // See if the modified node already exists.
11997 void *InsertPos = nullptr;
11998 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
11999 return Existing;
12000
12001 // Nope it doesn't. Remove the node from its current place in the maps.
12002 if (InsertPos)
12003 if (!RemoveNodeFromCSEMaps(N))
12004 InsertPos = nullptr;
12005
12006 // Now we update the operands.
12007 N->OperandList[0].set(Op);
12008
12010 // If this gets put into a CSE map, add it.
12011 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12012 return N;
12013}
12014
12016 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12017
12018 // Check to see if there is no change.
12019 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12020 return N; // No operands changed, just return the input node.
12021
12022 // See if the modified node already exists.
12023 void *InsertPos = nullptr;
12024 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
12025 return Existing;
12026
12027 // Nope it doesn't. Remove the node from its current place in the maps.
12028 if (InsertPos)
12029 if (!RemoveNodeFromCSEMaps(N))
12030 InsertPos = nullptr;
12031
12032 // Now we update the operands.
12033 if (N->OperandList[0] != Op1)
12034 N->OperandList[0].set(Op1);
12035 if (N->OperandList[1] != Op2)
12036 N->OperandList[1].set(Op2);
12037
12039 // If this gets put into a CSE map, add it.
12040 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12041 return N;
12042}
12043
12046 SDValue Ops[] = { Op1, Op2, Op3 };
12047 return UpdateNodeOperands(N, Ops);
12048}
12049
12052 SDValue Op3, SDValue Op4) {
12053 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12054 return UpdateNodeOperands(N, Ops);
12055}
12056
12059 SDValue Op3, SDValue Op4, SDValue Op5) {
12060 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12061 return UpdateNodeOperands(N, Ops);
12062}
12063
12066 unsigned NumOps = Ops.size();
12067 assert(N->getNumOperands() == NumOps &&
12068 "Update with wrong number of operands");
12069
12070 // If no operands changed just return the input node.
12071 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12072 return N;
12073
12074 // See if the modified node already exists.
12075 void *InsertPos = nullptr;
12076 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
12077 return Existing;
12078
12079 // Nope it doesn't. Remove the node from its current place in the maps.
12080 if (InsertPos)
12081 if (!RemoveNodeFromCSEMaps(N))
12082 InsertPos = nullptr;
12083
12084 // Now we update the operands.
12085 for (unsigned i = 0; i != NumOps; ++i)
12086 if (N->OperandList[i] != Ops[i])
12087 N->OperandList[i].set(Ops[i]);
12088
12090 // If this gets put into a CSE map, add it.
12091 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12092 return N;
12093}
12094
12095/// DropOperands - Release the operands and set this node to have
12096/// zero operands.
12098 // Unlike the code in MorphNodeTo that does this, we don't need to
12099 // watch for dead nodes here.
12100 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12101 SDUse &Use = *I++;
12102 Use.set(SDValue());
12103 }
12104}
12105
12107 ArrayRef<MachineMemOperand *> NewMemRefs) {
12108 if (NewMemRefs.empty()) {
12109 N->clearMemRefs();
12110 return;
12111 }
12112
12113 // Check if we can avoid allocating by storing a single reference directly.
12114 if (NewMemRefs.size() == 1) {
12115 N->MemRefs = NewMemRefs[0];
12116 N->NumMemRefs = 1;
12117 return;
12118 }
12119
12120 MachineMemOperand **MemRefsBuffer =
12121 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12122 llvm::copy(NewMemRefs, MemRefsBuffer);
12123 N->MemRefs = MemRefsBuffer;
12124 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12125}
12126
12127/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12128/// machine opcode.
12129///
12131 EVT VT) {
12132 SDVTList VTs = getVTList(VT);
12133 return SelectNodeTo(N, MachineOpc, VTs, {});
12134}
12135
12137 EVT VT, SDValue Op1) {
12138 SDVTList VTs = getVTList(VT);
12139 SDValue Ops[] = { Op1 };
12140 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12141}
12142
12144 EVT VT, SDValue Op1,
12145 SDValue Op2) {
12146 SDVTList VTs = getVTList(VT);
12147 SDValue Ops[] = { Op1, Op2 };
12148 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12149}
12150
12152 EVT VT, SDValue Op1,
12153 SDValue Op2, SDValue Op3) {
12154 SDVTList VTs = getVTList(VT);
12155 SDValue Ops[] = { Op1, Op2, Op3 };
12156 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12157}
12158
12161 SDVTList VTs = getVTList(VT);
12162 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12163}
12164
12166 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12167 SDVTList VTs = getVTList(VT1, VT2);
12168 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12169}
12170
12172 EVT VT1, EVT VT2) {
12173 SDVTList VTs = getVTList(VT1, VT2);
12174 return SelectNodeTo(N, MachineOpc, VTs, {});
12175}
12176
12178 EVT VT1, EVT VT2, EVT VT3,
12180 SDVTList VTs = getVTList(VT1, VT2, VT3);
12181 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12182}
12183
12185 EVT VT1, EVT VT2,
12186 SDValue Op1, SDValue Op2) {
12187 SDVTList VTs = getVTList(VT1, VT2);
12188 SDValue Ops[] = { Op1, Op2 };
12189 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12190}
12191
12194 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12195 // Reset the NodeID to -1.
12196 New->setNodeId(-1);
12197 if (New != N) {
12198 ReplaceAllUsesWith(N, New);
12200 }
12201 return New;
12202}
12203
12204/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12205/// the line number information on the merged node since it is not possible to
12206/// preserve the information that operation is associated with multiple lines.
12207/// This will make the debugger working better at -O0, were there is a higher
12208/// probability having other instructions associated with that line.
12209///
12210/// For IROrder, we keep the smaller of the two
12211SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12212 DebugLoc NLoc = N->getDebugLoc();
12213 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12214 N->setDebugLoc(DebugLoc());
12215 }
12216 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12217 N->setIROrder(Order);
12218 return N;
12219}
12220
12221/// MorphNodeTo - This *mutates* the specified node to have the specified
12222/// return type, opcode, and operands.
12223///
12224/// Note that MorphNodeTo returns the resultant node. If there is already a
12225/// node of the specified opcode and operands, it returns that node instead of
12226/// the current one. Note that the SDLoc need not be the same.
12227///
12228/// Using MorphNodeTo is faster than creating a new node and swapping it in
12229/// with ReplaceAllUsesWith both because it often avoids allocating a new
12230/// node, and because it doesn't require CSE recalculation for any of
12231/// the node's users.
12232///
12233/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12234/// As a consequence it isn't appropriate to use from within the DAG combiner or
12235/// the legalizer which maintain worklists that would need to be updated when
12236/// deleting things.
12239 // If an identical node already exists, use it.
12240 void *IP = nullptr;
12241 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12243 AddNodeIDNode(ID, Opc, VTs, Ops);
12244 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
12245 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12246 }
12247
12248 if (!RemoveNodeFromCSEMaps(N))
12249 IP = nullptr;
12250
12251 // Start the morphing.
12252 N->NodeType = Opc;
12253 N->ValueList = VTs.VTs;
12254 N->NumValues = VTs.NumVTs;
12255
12256 // Clear the operands list, updating used nodes to remove this from their
12257 // use list. Keep track of any operands that become dead as a result.
12258 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12259 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12260 SDUse &Use = *I++;
12261 SDNode *Used = Use.getNode();
12262 Use.set(SDValue());
12263 if (Used->use_empty())
12264 DeadNodeSet.insert(Used);
12265 }
12266
12267 // For MachineNode, initialize the memory references information.
12269 MN->clearMemRefs();
12270
12271 // Swap for an appropriately sized array from the recycler.
12272 removeOperands(N);
12273 createOperands(N, Ops);
12274
12275 // Delete any nodes that are still dead after adding the uses for the
12276 // new operands.
12277 if (!DeadNodeSet.empty()) {
12278 SmallVector<SDNode *, 16> DeadNodes;
12279 for (SDNode *N : DeadNodeSet)
12280 if (N->use_empty())
12281 DeadNodes.push_back(N);
12282 RemoveDeadNodes(DeadNodes);
12283 }
12284
12285 if (IP)
12286 CSEMap.InsertNode(N, IP); // Memoize the new node.
12287 return N;
12288}
12289
12291 unsigned OrigOpc = Node->getOpcode();
12292 unsigned NewOpc;
12293 switch (OrigOpc) {
12294 default:
12295 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12296#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12297 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12298#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12299 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12300#include "llvm/IR/ConstrainedOps.def"
12301 }
12302
12303 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12304
12305 // We're taking this node out of the chain, so we need to re-link things.
12306 SDValue InputChain = Node->getOperand(0);
12307 SDValue OutputChain = SDValue(Node, 1);
12308 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12309
12311 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12312 Ops.push_back(Node->getOperand(i));
12313
12314 SDVTList VTs = getVTList(Node->getValueType(0));
12315 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12316
12317 // MorphNodeTo can operate in two ways: if an existing node with the
12318 // specified operands exists, it can just return it. Otherwise, it
12319 // updates the node in place to have the requested operands.
12320 if (Res == Node) {
12321 // If we updated the node in place, reset the node ID. To the isel,
12322 // this should be just like a newly allocated machine node.
12323 Res->setNodeId(-1);
12324 } else {
12327 }
12328
12329 return Res;
12330}
12331
12332/// getMachineNode - These are used for target selectors to create a new node
12333/// with specified return type(s), MachineInstr opcode, and operands.
12334///
12335/// Note that getMachineNode returns the resultant node. If there is already a
12336/// node of the specified opcode and operands, it returns that node instead of
12337/// the current one.
12339 EVT VT) {
12340 SDVTList VTs = getVTList(VT);
12341 return getMachineNode(Opcode, dl, VTs, {});
12342}
12343
12345 EVT VT, SDValue Op1) {
12346 SDVTList VTs = getVTList(VT);
12347 SDValue Ops[] = { Op1 };
12348 return getMachineNode(Opcode, dl, VTs, Ops);
12349}
12350
12352 EVT VT, SDValue Op1, SDValue Op2) {
12353 SDVTList VTs = getVTList(VT);
12354 SDValue Ops[] = { Op1, Op2 };
12355 return getMachineNode(Opcode, dl, VTs, Ops);
12356}
12357
12359 EVT VT, SDValue Op1, SDValue Op2,
12360 SDValue Op3) {
12361 SDVTList VTs = getVTList(VT);
12362 SDValue Ops[] = { Op1, Op2, Op3 };
12363 return getMachineNode(Opcode, dl, VTs, Ops);
12364}
12365
12368 SDVTList VTs = getVTList(VT);
12369 return getMachineNode(Opcode, dl, VTs, Ops);
12370}
12371
12373 EVT VT1, EVT VT2, SDValue Op1,
12374 SDValue Op2) {
12375 SDVTList VTs = getVTList(VT1, VT2);
12376 SDValue Ops[] = { Op1, Op2 };
12377 return getMachineNode(Opcode, dl, VTs, Ops);
12378}
12379
12381 EVT VT1, EVT VT2, SDValue Op1,
12382 SDValue Op2, SDValue Op3) {
12383 SDVTList VTs = getVTList(VT1, VT2);
12384 SDValue Ops[] = { Op1, Op2, Op3 };
12385 return getMachineNode(Opcode, dl, VTs, Ops);
12386}
12387
12389 EVT VT1, EVT VT2,
12391 SDVTList VTs = getVTList(VT1, VT2);
12392 return getMachineNode(Opcode, dl, VTs, Ops);
12393}
12394
12396 EVT VT1, EVT VT2, EVT VT3,
12397 SDValue Op1, SDValue Op2) {
12398 SDVTList VTs = getVTList(VT1, VT2, VT3);
12399 SDValue Ops[] = { Op1, Op2 };
12400 return getMachineNode(Opcode, dl, VTs, Ops);
12401}
12402
12404 EVT VT1, EVT VT2, EVT VT3,
12405 SDValue Op1, SDValue Op2,
12406 SDValue Op3) {
12407 SDVTList VTs = getVTList(VT1, VT2, VT3);
12408 SDValue Ops[] = { Op1, Op2, Op3 };
12409 return getMachineNode(Opcode, dl, VTs, Ops);
12410}
12411
12413 EVT VT1, EVT VT2, EVT VT3,
12415 SDVTList VTs = getVTList(VT1, VT2, VT3);
12416 return getMachineNode(Opcode, dl, VTs, Ops);
12417}
12418
12420 ArrayRef<EVT> ResultTys,
12422 SDVTList VTs = getVTList(ResultTys);
12423 return getMachineNode(Opcode, dl, VTs, Ops);
12424}
12425
12427 SDVTList VTs,
12429 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12431 void *IP = nullptr;
12432
12433 if (DoCSE) {
12435 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12436 IP = nullptr;
12437 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12438 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12439 }
12440 }
12441
12442 // Allocate a new MachineSDNode.
12443 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12444 createOperands(N, Ops);
12445
12446 if (DoCSE)
12447 CSEMap.InsertNode(N, IP);
12448
12449 InsertNode(N);
12450 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12451 return N;
12452}
12453
12454/// getTargetExtractSubreg - A convenience function for creating
12455/// TargetOpcode::EXTRACT_SUBREG nodes.
12457 SDValue Operand) {
12458 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12459 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12460 VT, Operand, SRIdxVal);
12461 return SDValue(Subreg, 0);
12462}
12463
12464/// getTargetInsertSubreg - A convenience function for creating
12465/// TargetOpcode::INSERT_SUBREG nodes.
12467 SDValue Operand, SDValue Subreg) {
12468 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12469 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12470 VT, Operand, Subreg, SRIdxVal);
12471 return SDValue(Result, 0);
12472}
12473
12474/// getNodeIfExists - Get the specified node if it's already available, or
12475/// else return NULL.
12478 bool AllowCommute) {
12479 SDNodeFlags Flags;
12480 if (Inserter)
12481 Flags = Inserter->getFlags();
12482 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12483}
12484
12487 const SDNodeFlags Flags,
12488 bool AllowCommute) {
12489 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12490 return nullptr;
12491
12492 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12494 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12495 void *IP = nullptr;
12496 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12497 E->intersectFlagsWith(Flags);
12498 return E;
12499 }
12500 return nullptr;
12501 };
12502
12503 if (SDNode *Existing = Lookup(Ops))
12504 return Existing;
12505
12506 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12507 return Lookup({Ops[1], Ops[0]});
12508
12509 return nullptr;
12510}
12511
12512/// doesNodeExist - Check if a node exists without modifying its flags.
12513bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12515 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12517 AddNodeIDNode(ID, Opcode, VTList, Ops);
12518 void *IP = nullptr;
12519 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12520 return true;
12521 }
12522 return false;
12523}
12524
12525/// getDbgValue - Creates a SDDbgValue node.
12526///
12527/// SDNode
12529 SDNode *N, unsigned R, bool IsIndirect,
12530 const DebugLoc &DL, unsigned O) {
12531 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12532 "Expected inlined-at fields to agree");
12533 return new (DbgInfo->getAlloc())
12534 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12535 {}, IsIndirect, DL, O,
12536 /*IsVariadic=*/false);
12537}
12538
12539/// Constant
12541 DIExpression *Expr,
12542 const Value *C,
12543 const DebugLoc &DL, unsigned O) {
12544 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12545 "Expected inlined-at fields to agree");
12546 return new (DbgInfo->getAlloc())
12547 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12548 /*IsIndirect=*/false, DL, O,
12549 /*IsVariadic=*/false);
12550}
12551
12552/// FrameIndex
12554 DIExpression *Expr, unsigned FI,
12555 bool IsIndirect,
12556 const DebugLoc &DL,
12557 unsigned O) {
12558 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12559 "Expected inlined-at fields to agree");
12560 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12561}
12562
12563/// FrameIndex with dependencies
12565 DIExpression *Expr, unsigned FI,
12566 ArrayRef<SDNode *> Dependencies,
12567 bool IsIndirect,
12568 const DebugLoc &DL,
12569 unsigned O) {
12570 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12571 "Expected inlined-at fields to agree");
12572 return new (DbgInfo->getAlloc())
12573 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12574 Dependencies, IsIndirect, DL, O,
12575 /*IsVariadic=*/false);
12576}
12577
12578/// VReg
12580 Register VReg, bool IsIndirect,
12581 const DebugLoc &DL, unsigned O) {
12582 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12583 "Expected inlined-at fields to agree");
12584 return new (DbgInfo->getAlloc())
12585 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12586 {}, IsIndirect, DL, O,
12587 /*IsVariadic=*/false);
12588}
12589
12592 ArrayRef<SDNode *> Dependencies,
12593 bool IsIndirect, const DebugLoc &DL,
12594 unsigned O, bool IsVariadic) {
12595 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12596 "Expected inlined-at fields to agree");
12597 return new (DbgInfo->getAlloc())
12598 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12599 DL, O, IsVariadic);
12600}
12601
12603 unsigned OffsetInBits, unsigned SizeInBits,
12604 bool InvalidateDbg) {
12605 SDNode *FromNode = From.getNode();
12606 SDNode *ToNode = To.getNode();
12607 assert(FromNode && ToNode && "Can't modify dbg values");
12608
12609 // PR35338
12610 // TODO: assert(From != To && "Redundant dbg value transfer");
12611 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12612 if (From == To || FromNode == ToNode)
12613 return;
12614
12615 if (!FromNode->getHasDebugValue())
12616 return;
12617
12618 SDDbgOperand FromLocOp =
12619 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12621
12623 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12624 if (Dbg->isInvalidated())
12625 continue;
12626
12627 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12628
12629 // Create a new location ops vector that is equal to the old vector, but
12630 // with each instance of FromLocOp replaced with ToLocOp.
12631 bool Changed = false;
12632 auto NewLocOps = Dbg->copyLocationOps();
12633 std::replace_if(
12634 NewLocOps.begin(), NewLocOps.end(),
12635 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12636 bool Match = Op == FromLocOp;
12637 Changed |= Match;
12638 return Match;
12639 },
12640 ToLocOp);
12641 // Ignore this SDDbgValue if we didn't find a matching location.
12642 if (!Changed)
12643 continue;
12644
12645 DIVariable *Var = Dbg->getVariable();
12646 auto *Expr = Dbg->getExpression();
12647 // If a fragment is requested, update the expression.
12648 if (SizeInBits) {
12649 // When splitting a larger (e.g., sign-extended) value whose
12650 // lower bits are described with an SDDbgValue, do not attempt
12651 // to transfer the SDDbgValue to the upper bits.
12652 if (auto FI = Expr->getFragmentInfo())
12653 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12654 continue;
12655 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12656 SizeInBits);
12657 if (!Fragment)
12658 continue;
12659 Expr = *Fragment;
12660 }
12661
12662 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12663 // Clone the SDDbgValue and move it to To.
12664 SDDbgValue *Clone = getDbgValueList(
12665 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12666 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12667 Dbg->isVariadic());
12668 ClonedDVs.push_back(Clone);
12669
12670 if (InvalidateDbg) {
12671 // Invalidate value and indicate the SDDbgValue should not be emitted.
12672 Dbg->setIsInvalidated();
12673 Dbg->setIsEmitted();
12674 }
12675 }
12676
12677 for (SDDbgValue *Dbg : ClonedDVs) {
12678 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12679 "Transferred DbgValues should depend on the new SDNode");
12680 AddDbgValue(Dbg, false);
12681 }
12682}
12683
12685 if (!N.getHasDebugValue())
12686 return;
12687
12688 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12689 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12690 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12691 return SDDbgOperand::fromNode(Node, ResNo);
12692 };
12693
12695 for (auto *DV : GetDbgValues(&N)) {
12696 if (DV->isInvalidated())
12697 continue;
12698 switch (N.getOpcode()) {
12699 default:
12700 break;
12701 case ISD::ADD: {
12702 SDValue N0 = N.getOperand(0);
12703 SDValue N1 = N.getOperand(1);
12704 if (!isa<ConstantSDNode>(N0)) {
12705 bool RHSConstant = isa<ConstantSDNode>(N1);
12707 if (RHSConstant)
12708 Offset = N.getConstantOperandVal(1);
12709 // We are not allowed to turn indirect debug values variadic, so
12710 // don't salvage those.
12711 if (!RHSConstant && DV->isIndirect())
12712 continue;
12713
12714 // Rewrite an ADD constant node into a DIExpression. Since we are
12715 // performing arithmetic to compute the variable's *value* in the
12716 // DIExpression, we need to mark the expression with a
12717 // DW_OP_stack_value.
12718 auto *DIExpr = DV->getExpression();
12719 auto NewLocOps = DV->copyLocationOps();
12720 bool Changed = false;
12721 size_t OrigLocOpsSize = NewLocOps.size();
12722 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12723 // We're not given a ResNo to compare against because the whole
12724 // node is going away. We know that any ISD::ADD only has one
12725 // result, so we can assume any node match is using the result.
12726 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12727 NewLocOps[i].getSDNode() != &N)
12728 continue;
12729 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12730 if (RHSConstant) {
12733 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12734 } else {
12735 // Convert to a variadic expression (if not already).
12736 // convertToVariadicExpression() returns a const pointer, so we use
12737 // a temporary const variable here.
12738 const auto *TmpDIExpr =
12742 ExprOps.push_back(NewLocOps.size());
12743 ExprOps.push_back(dwarf::DW_OP_plus);
12744 SDDbgOperand RHS =
12746 NewLocOps.push_back(RHS);
12747 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12748 }
12749 Changed = true;
12750 }
12751 (void)Changed;
12752 assert(Changed && "Salvage target doesn't use N");
12753
12754 bool IsVariadic =
12755 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12756
12757 auto AdditionalDependencies = DV->getAdditionalDependencies();
12758 SDDbgValue *Clone = getDbgValueList(
12759 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12760 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12761 ClonedDVs.push_back(Clone);
12762 DV->setIsInvalidated();
12763 DV->setIsEmitted();
12764 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12765 N0.getNode()->dumprFull(this);
12766 dbgs() << " into " << *DIExpr << '\n');
12767 }
12768 break;
12769 }
12770 case ISD::TRUNCATE: {
12771 SDValue N0 = N.getOperand(0);
12772 TypeSize FromSize = N0.getValueSizeInBits();
12773 TypeSize ToSize = N.getValueSizeInBits(0);
12774
12775 DIExpression *DbgExpression = DV->getExpression();
12776 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12777 auto NewLocOps = DV->copyLocationOps();
12778 bool Changed = false;
12779 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12780 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12781 NewLocOps[i].getSDNode() != &N)
12782 continue;
12783
12784 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12785 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
12786 Changed = true;
12787 }
12788 assert(Changed && "Salvage target doesn't use N");
12789 (void)Changed;
12790
12791 SDDbgValue *Clone =
12792 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
12793 DV->getAdditionalDependencies(), DV->isIndirect(),
12794 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
12795
12796 ClonedDVs.push_back(Clone);
12797 DV->setIsInvalidated();
12798 DV->setIsEmitted();
12799 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
12800 dbgs() << " into " << *DbgExpression << '\n');
12801 break;
12802 }
12803 }
12804 }
12805
12806 for (SDDbgValue *Dbg : ClonedDVs) {
12807 assert((!Dbg->getSDNodes().empty() ||
12808 llvm::any_of(Dbg->getLocationOps(),
12809 [&](const SDDbgOperand &Op) {
12810 return Op.getKind() == SDDbgOperand::FRAMEIX;
12811 })) &&
12812 "Salvaged DbgValue should depend on a new SDNode");
12813 AddDbgValue(Dbg, false);
12814 }
12815}
12816
12817/// Creates a SDDbgLabel node.
12819 const DebugLoc &DL, unsigned O) {
12820 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
12821 "Expected inlined-at fields to agree");
12822 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
12823}
12824
12825namespace {
12826
12827/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
12828/// pointed to by a use iterator is deleted, increment the use iterator
12829/// so that it doesn't dangle.
12830///
12831class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
12834
12835 void NodeDeleted(SDNode *N, SDNode *E) override {
12836 // Increment the iterator as needed.
12837 while (UI != UE && N == UI->getUser())
12838 ++UI;
12839 }
12840
12841public:
12842 RAUWUpdateListener(SelectionDAG &d,
12845 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
12846};
12847
12848} // end anonymous namespace
12849
12850/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12851/// This can cause recursive merging of nodes in the DAG.
12852///
12853/// This version assumes From has a single result value.
12854///
12856 SDNode *From = FromN.getNode();
12857 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
12858 "Cannot replace with this method!");
12859 assert(From != To.getNode() && "Cannot replace uses of with self");
12860
12861 // Preserve Debug Values
12862 transferDbgValues(FromN, To);
12863 // Preserve extra info.
12864 copyExtraInfo(From, To.getNode());
12865
12866 // Iterate over all the existing uses of From. New uses will be added
12867 // to the beginning of the use list, which we avoid visiting.
12868 // This specifically avoids visiting uses of From that arise while the
12869 // replacement is happening, because any such uses would be the result
12870 // of CSE: If an existing node looks like From after one of its operands
12871 // is replaced by To, we don't want to replace of all its users with To
12872 // too. See PR3018 for more info.
12873 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12874 RAUWUpdateListener Listener(*this, UI, UE);
12875 while (UI != UE) {
12876 SDNode *User = UI->getUser();
12877
12878 // This node is about to morph, remove its old self from the CSE maps.
12879 RemoveNodeFromCSEMaps(User);
12880
12881 // A user can appear in a use list multiple times, and when this
12882 // happens the uses are usually next to each other in the list.
12883 // To help reduce the number of CSE recomputations, process all
12884 // the uses of this user that we can find this way.
12885 do {
12886 SDUse &Use = *UI;
12887 ++UI;
12888 Use.set(To);
12889 if (To->isDivergent() != From->isDivergent())
12891 } while (UI != UE && UI->getUser() == User);
12892 // Now that we have modified User, add it back to the CSE maps. If it
12893 // already exists there, recursively merge the results together.
12894 AddModifiedNodeToCSEMaps(User);
12895 }
12896
12897 // If we just RAUW'd the root, take note.
12898 if (FromN == getRoot())
12899 setRoot(To);
12900}
12901
12902/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12903/// This can cause recursive merging of nodes in the DAG.
12904///
12905/// This version assumes that for each value of From, there is a
12906/// corresponding value in To in the same position with the same type.
12907///
12909#ifndef NDEBUG
12910 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
12911 assert((!From->hasAnyUseOfValue(i) ||
12912 From->getValueType(i) == To->getValueType(i)) &&
12913 "Cannot use this version of ReplaceAllUsesWith!");
12914#endif
12915
12916 // Handle the trivial case.
12917 if (From == To)
12918 return;
12919
12920 // Preserve Debug Info. Only do this if there's a use.
12921 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
12922 if (From->hasAnyUseOfValue(i)) {
12923 assert((i < To->getNumValues()) && "Invalid To location");
12924 transferDbgValues(SDValue(From, i), SDValue(To, i));
12925 }
12926 // Preserve extra info.
12927 copyExtraInfo(From, To);
12928
12929 // Iterate over just the existing users of From. See the comments in
12930 // the ReplaceAllUsesWith above.
12931 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12932 RAUWUpdateListener Listener(*this, UI, UE);
12933 while (UI != UE) {
12934 SDNode *User = UI->getUser();
12935
12936 // This node is about to morph, remove its old self from the CSE maps.
12937 RemoveNodeFromCSEMaps(User);
12938
12939 // A user can appear in a use list multiple times, and when this
12940 // happens the uses are usually next to each other in the list.
12941 // To help reduce the number of CSE recomputations, process all
12942 // the uses of this user that we can find this way.
12943 do {
12944 SDUse &Use = *UI;
12945 ++UI;
12946 Use.setNode(To);
12947 if (To->isDivergent() != From->isDivergent())
12949 } while (UI != UE && UI->getUser() == User);
12950
12951 // Now that we have modified User, add it back to the CSE maps. If it
12952 // already exists there, recursively merge the results together.
12953 AddModifiedNodeToCSEMaps(User);
12954 }
12955
12956 // If we just RAUW'd the root, take note.
12957 if (From == getRoot().getNode())
12958 setRoot(SDValue(To, getRoot().getResNo()));
12959}
12960
12961/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12962/// This can cause recursive merging of nodes in the DAG.
12963///
12964/// This version can replace From with any result values. To must match the
12965/// number and types of values returned by From.
12967 if (From->getNumValues() == 1) // Handle the simple case efficiently.
12968 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
12969
12970 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
12971 // Preserve Debug Info.
12972 transferDbgValues(SDValue(From, i), To[i]);
12973 // Preserve extra info.
12974 copyExtraInfo(From, To[i].getNode());
12975 }
12976
12977 // Iterate over just the existing users of From. See the comments in
12978 // the ReplaceAllUsesWith above.
12979 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12980 RAUWUpdateListener Listener(*this, UI, UE);
12981 while (UI != UE) {
12982 SDNode *User = UI->getUser();
12983
12984 // This node is about to morph, remove its old self from the CSE maps.
12985 RemoveNodeFromCSEMaps(User);
12986
12987 // A user can appear in a use list multiple times, and when this happens the
12988 // uses are usually next to each other in the list. To help reduce the
12989 // number of CSE and divergence recomputations, process all the uses of this
12990 // user that we can find this way.
12991 bool To_IsDivergent = false;
12992 do {
12993 SDUse &Use = *UI;
12994 const SDValue &ToOp = To[Use.getResNo()];
12995 ++UI;
12996 Use.set(ToOp);
12997 if (ToOp.getValueType() != MVT::Other)
12998 To_IsDivergent |= ToOp->isDivergent();
12999 } while (UI != UE && UI->getUser() == User);
13000
13001 if (To_IsDivergent != From->isDivergent())
13003
13004 // Now that we have modified User, add it back to the CSE maps. If it
13005 // already exists there, recursively merge the results together.
13006 AddModifiedNodeToCSEMaps(User);
13007 }
13008
13009 // If we just RAUW'd the root, take note.
13010 if (From == getRoot().getNode())
13011 setRoot(SDValue(To[getRoot().getResNo()]));
13012}
13013
13014/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13015/// uses of other values produced by From.getNode() alone. The Deleted
13016/// vector is handled the same way as for ReplaceAllUsesWith.
13018 // Handle the really simple, really trivial case efficiently.
13019 if (From == To) return;
13020
13021 // Handle the simple, trivial, case efficiently.
13022 if (From.getNode()->getNumValues() == 1) {
13023 ReplaceAllUsesWith(From, To);
13024 return;
13025 }
13026
13027 // Preserve Debug Info.
13028 transferDbgValues(From, To);
13029 copyExtraInfo(From.getNode(), To.getNode());
13030
13031 // Iterate over just the existing users of From. See the comments in
13032 // the ReplaceAllUsesWith above.
13033 SDNode::use_iterator UI = From.getNode()->use_begin(),
13034 UE = From.getNode()->use_end();
13035 RAUWUpdateListener Listener(*this, UI, UE);
13036 while (UI != UE) {
13037 SDNode *User = UI->getUser();
13038 bool UserRemovedFromCSEMaps = false;
13039
13040 // A user can appear in a use list multiple times, and when this
13041 // happens the uses are usually next to each other in the list.
13042 // To help reduce the number of CSE recomputations, process all
13043 // the uses of this user that we can find this way.
13044 do {
13045 SDUse &Use = *UI;
13046
13047 // Skip uses of different values from the same node.
13048 if (Use.getResNo() != From.getResNo()) {
13049 ++UI;
13050 continue;
13051 }
13052
13053 // If this node hasn't been modified yet, it's still in the CSE maps,
13054 // so remove its old self from the CSE maps.
13055 if (!UserRemovedFromCSEMaps) {
13056 RemoveNodeFromCSEMaps(User);
13057 UserRemovedFromCSEMaps = true;
13058 }
13059
13060 ++UI;
13061 Use.set(To);
13062 if (To->isDivergent() != From->isDivergent())
13064 } while (UI != UE && UI->getUser() == User);
13065 // We are iterating over all uses of the From node, so if a use
13066 // doesn't use the specific value, no changes are made.
13067 if (!UserRemovedFromCSEMaps)
13068 continue;
13069
13070 // Now that we have modified User, add it back to the CSE maps. If it
13071 // already exists there, recursively merge the results together.
13072 AddModifiedNodeToCSEMaps(User);
13073 }
13074
13075 // If we just RAUW'd the root, take note.
13076 if (From == getRoot())
13077 setRoot(To);
13078}
13079
13080namespace {
13081
13082/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13083/// to record information about a use.
13084struct UseMemo {
13085 SDNode *User;
13086 unsigned Index;
13087 SDUse *Use;
13088};
13089
13090/// operator< - Sort Memos by User.
13091bool operator<(const UseMemo &L, const UseMemo &R) {
13092 return (intptr_t)L.User < (intptr_t)R.User;
13093}
13094
13095/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13096/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13097/// the node already has been taken care of recursively.
13098class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13099 SmallVectorImpl<UseMemo> &Uses;
13100
13101 void NodeDeleted(SDNode *N, SDNode *E) override {
13102 for (UseMemo &Memo : Uses)
13103 if (Memo.User == N)
13104 Memo.User = nullptr;
13105 }
13106
13107public:
13108 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13109 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13110};
13111
13112} // end anonymous namespace
13113
13114/// Return true if a glue output should propagate divergence information.
13116 switch (Node->getOpcode()) {
13117 case ISD::CopyFromReg:
13118 case ISD::CopyToReg:
13119 return false;
13120 default:
13121 return true;
13122 }
13123
13124 llvm_unreachable("covered opcode switch");
13125}
13126
13128 if (TLI->isSDNodeAlwaysUniform(N)) {
13129 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13130 "Conflicting divergence information!");
13131 return false;
13132 }
13133 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13134 return true;
13135 for (const auto &Op : N->ops()) {
13136 EVT VT = Op.getValueType();
13137
13138 // Skip Chain. It does not carry divergence.
13139 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13140 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13141 return true;
13142 }
13143 return false;
13144}
13145
13147 SmallVector<SDNode *, 16> Worklist(1, N);
13148 do {
13149 N = Worklist.pop_back_val();
13150 bool IsDivergent = calculateDivergence(N);
13151 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13152 N->SDNodeBits.IsDivergent = IsDivergent;
13153 llvm::append_range(Worklist, N->users());
13154 }
13155 } while (!Worklist.empty());
13156}
13157
13158void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13160 Order.reserve(AllNodes.size());
13161 for (auto &N : allnodes()) {
13162 unsigned NOps = N.getNumOperands();
13163 Degree[&N] = NOps;
13164 if (0 == NOps)
13165 Order.push_back(&N);
13166 }
13167 for (size_t I = 0; I != Order.size(); ++I) {
13168 SDNode *N = Order[I];
13169 for (auto *U : N->users()) {
13170 unsigned &UnsortedOps = Degree[U];
13171 if (0 == --UnsortedOps)
13172 Order.push_back(U);
13173 }
13174 }
13175}
13176
13177#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13178void SelectionDAG::VerifyDAGDivergence() {
13179 std::vector<SDNode *> TopoOrder;
13180 CreateTopologicalOrder(TopoOrder);
13181 for (auto *N : TopoOrder) {
13182 assert(calculateDivergence(N) == N->isDivergent() &&
13183 "Divergence bit inconsistency detected");
13184 }
13185}
13186#endif
13187
13188/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13189/// uses of other values produced by From.getNode() alone. The same value
13190/// may appear in both the From and To list. The Deleted vector is
13191/// handled the same way as for ReplaceAllUsesWith.
13193 const SDValue *To,
13194 unsigned Num){
13195 // Handle the simple, trivial case efficiently.
13196 if (Num == 1)
13197 return ReplaceAllUsesOfValueWith(*From, *To);
13198
13199 transferDbgValues(*From, *To);
13200 copyExtraInfo(From->getNode(), To->getNode());
13201
13202 // Read up all the uses and make records of them. This helps
13203 // processing new uses that are introduced during the
13204 // replacement process.
13206 for (unsigned i = 0; i != Num; ++i) {
13207 unsigned FromResNo = From[i].getResNo();
13208 SDNode *FromNode = From[i].getNode();
13209 for (SDUse &Use : FromNode->uses()) {
13210 if (Use.getResNo() == FromResNo) {
13211 UseMemo Memo = {Use.getUser(), i, &Use};
13212 Uses.push_back(Memo);
13213 }
13214 }
13215 }
13216
13217 // Sort the uses, so that all the uses from a given User are together.
13219 RAUOVWUpdateListener Listener(*this, Uses);
13220
13221 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13222 UseIndex != UseIndexEnd; ) {
13223 // We know that this user uses some value of From. If it is the right
13224 // value, update it.
13225 SDNode *User = Uses[UseIndex].User;
13226 // If the node has been deleted by recursive CSE updates when updating
13227 // another node, then just skip this entry.
13228 if (User == nullptr) {
13229 ++UseIndex;
13230 continue;
13231 }
13232
13233 // This node is about to morph, remove its old self from the CSE maps.
13234 RemoveNodeFromCSEMaps(User);
13235
13236 // The Uses array is sorted, so all the uses for a given User
13237 // are next to each other in the list.
13238 // To help reduce the number of CSE recomputations, process all
13239 // the uses of this user that we can find this way.
13240 do {
13241 unsigned i = Uses[UseIndex].Index;
13242 SDUse &Use = *Uses[UseIndex].Use;
13243 ++UseIndex;
13244
13245 Use.set(To[i]);
13246 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13247
13248 // Now that we have modified User, add it back to the CSE maps. If it
13249 // already exists there, recursively merge the results together.
13250 AddModifiedNodeToCSEMaps(User);
13251 }
13252}
13253
13254/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13255/// based on their topological order. It returns the maximum id and a vector
13256/// of the SDNodes* in assigned order by reference.
13258 unsigned DAGSize = 0;
13259
13260 // SortedPos tracks the progress of the algorithm. Nodes before it are
13261 // sorted, nodes after it are unsorted. When the algorithm completes
13262 // it is at the end of the list.
13263 allnodes_iterator SortedPos = allnodes_begin();
13264
13265 // Visit all the nodes. Move nodes with no operands to the front of
13266 // the list immediately. Annotate nodes that do have operands with their
13267 // operand count. Before we do this, the Node Id fields of the nodes
13268 // may contain arbitrary values. After, the Node Id fields for nodes
13269 // before SortedPos will contain the topological sort index, and the
13270 // Node Id fields for nodes At SortedPos and after will contain the
13271 // count of outstanding operands.
13273 checkForCycles(&N, this);
13274 unsigned Degree = N.getNumOperands();
13275 if (Degree == 0) {
13276 // A node with no uses, add it to the result array immediately.
13277 N.setNodeId(DAGSize++);
13278 allnodes_iterator Q(&N);
13279 if (Q != SortedPos)
13280 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13281 assert(SortedPos != AllNodes.end() && "Overran node list");
13282 ++SortedPos;
13283 } else {
13284 // Temporarily use the Node Id as scratch space for the degree count.
13285 N.setNodeId(Degree);
13286 }
13287 }
13288
13289 // Visit all the nodes. As we iterate, move nodes into sorted order,
13290 // such that by the time the end is reached all nodes will be sorted.
13291 for (SDNode &Node : allnodes()) {
13292 SDNode *N = &Node;
13293 checkForCycles(N, this);
13294 // N is in sorted position, so all its uses have one less operand
13295 // that needs to be sorted.
13296 for (SDNode *P : N->users()) {
13297 unsigned Degree = P->getNodeId();
13298 assert(Degree != 0 && "Invalid node degree");
13299 --Degree;
13300 if (Degree == 0) {
13301 // All of P's operands are sorted, so P may sorted now.
13302 P->setNodeId(DAGSize++);
13303 if (P->getIterator() != SortedPos)
13304 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13305 assert(SortedPos != AllNodes.end() && "Overran node list");
13306 ++SortedPos;
13307 } else {
13308 // Update P's outstanding operand count.
13309 P->setNodeId(Degree);
13310 }
13311 }
13312 if (Node.getIterator() == SortedPos) {
13313#ifndef NDEBUG
13315 SDNode *S = &*++I;
13316 dbgs() << "Overran sorted position:\n";
13317 S->dumprFull(this); dbgs() << "\n";
13318 dbgs() << "Checking if this is due to cycles\n";
13319 checkForCycles(this, true);
13320#endif
13321 llvm_unreachable(nullptr);
13322 }
13323 }
13324
13325 assert(SortedPos == AllNodes.end() &&
13326 "Topological sort incomplete!");
13327 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13328 "First node in topological sort is not the entry token!");
13329 assert(AllNodes.front().getNodeId() == 0 &&
13330 "First node in topological sort has non-zero id!");
13331 assert(AllNodes.front().getNumOperands() == 0 &&
13332 "First node in topological sort has operands!");
13333 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13334 "Last node in topologic sort has unexpected id!");
13335 assert(AllNodes.back().use_empty() &&
13336 "Last node in topologic sort has users!");
13337 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13338 return DAGSize;
13339}
13340
13342 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13343 SortedNodes.clear();
13344 // Node -> remaining number of outstanding operands.
13345 DenseMap<const SDNode *, unsigned> RemainingOperands;
13346
13347 // Put nodes without any operands into SortedNodes first.
13348 for (const SDNode &N : allnodes()) {
13349 checkForCycles(&N, this);
13350 unsigned NumOperands = N.getNumOperands();
13351 if (NumOperands == 0)
13352 SortedNodes.push_back(&N);
13353 else
13354 // Record their total number of outstanding operands.
13355 RemainingOperands[&N] = NumOperands;
13356 }
13357
13358 // A node is pushed into SortedNodes when all of its operands (predecessors in
13359 // the graph) are also in SortedNodes.
13360 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13361 const SDNode *N = SortedNodes[i];
13362 for (const SDNode *U : N->users()) {
13363 // HandleSDNode is never part of a DAG and therefore has no entry in
13364 // RemainingOperands.
13365 if (U->getOpcode() == ISD::HANDLENODE)
13366 continue;
13367 unsigned &NumRemOperands = RemainingOperands[U];
13368 assert(NumRemOperands && "Invalid number of remaining operands");
13369 --NumRemOperands;
13370 if (!NumRemOperands)
13371 SortedNodes.push_back(U);
13372 }
13373 }
13374
13375 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13376 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13377 "First node in topological sort is not the entry token");
13378 assert(SortedNodes.front()->getNumOperands() == 0 &&
13379 "First node in topological sort has operands");
13380}
13381
13382/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13383/// value is produced by SD.
13384void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13385 for (SDNode *SD : DB->getSDNodes()) {
13386 if (!SD)
13387 continue;
13388 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13389 SD->setHasDebugValue(true);
13390 }
13391 DbgInfo->add(DB, isParameter);
13392}
13393
13394void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13395
13397 SDValue NewMemOpChain) {
13398 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13399 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13400 // The new memory operation must have the same position as the old load in
13401 // terms of memory dependency. Create a TokenFactor for the old load and new
13402 // memory operation and update uses of the old load's output chain to use that
13403 // TokenFactor.
13404 if (OldChain == NewMemOpChain || OldChain.use_empty())
13405 return NewMemOpChain;
13406
13407 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13408 OldChain, NewMemOpChain);
13409 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13410 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13411 return TokenFactor;
13412}
13413
13415 SDValue NewMemOp) {
13416 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13417 SDValue OldChain = SDValue(OldLoad, 1);
13418 SDValue NewMemOpChain = NewMemOp.getValue(1);
13419 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13420}
13421
13423 Function **OutFunction) {
13424 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13425
13426 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13427 auto *Module = MF->getFunction().getParent();
13428 auto *Function = Module->getFunction(Symbol);
13429
13430 if (OutFunction != nullptr)
13431 *OutFunction = Function;
13432
13433 if (Function != nullptr) {
13434 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13435 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13436 }
13437
13438 std::string ErrorStr;
13439 raw_string_ostream ErrorFormatter(ErrorStr);
13440 ErrorFormatter << "Undefined external symbol ";
13441 ErrorFormatter << '"' << Symbol << '"';
13442 report_fatal_error(Twine(ErrorStr));
13443}
13444
13445//===----------------------------------------------------------------------===//
13446// SDNode Class
13447//===----------------------------------------------------------------------===//
13448
13451 return Const != nullptr && Const->isZero();
13452}
13453
13455 return V.isUndef() || isNullConstant(V);
13456}
13457
13460 return Const != nullptr && Const->isZero() && !Const->isNegative();
13461}
13462
13465 return Const != nullptr && Const->isAllOnes();
13466}
13467
13470 return Const != nullptr && Const->isOne();
13471}
13472
13475 return Const != nullptr && Const->isMinSignedValue();
13476}
13477
13478bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V,
13479 unsigned OperandNo) {
13480 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13481 // TODO: Target-specific opcodes could be added.
13482 if (auto *ConstV = isConstOrConstSplat(V, /*AllowUndefs*/ false,
13483 /*AllowTruncation*/ true)) {
13484 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
13485 switch (Opcode) {
13486 case ISD::ADD:
13487 case ISD::OR:
13488 case ISD::XOR:
13489 case ISD::UMAX:
13490 return Const.isZero();
13491 case ISD::MUL:
13492 return Const.isOne();
13493 case ISD::AND:
13494 case ISD::UMIN:
13495 return Const.isAllOnes();
13496 case ISD::SMAX:
13497 return Const.isMinSignedValue();
13498 case ISD::SMIN:
13499 return Const.isMaxSignedValue();
13500 case ISD::SUB:
13501 case ISD::SHL:
13502 case ISD::SRA:
13503 case ISD::SRL:
13504 return OperandNo == 1 && Const.isZero();
13505 case ISD::UDIV:
13506 case ISD::SDIV:
13507 return OperandNo == 1 && Const.isOne();
13508 }
13509 } else if (auto *ConstFP = isConstOrConstSplatFP(V)) {
13510 switch (Opcode) {
13511 case ISD::FADD:
13512 return ConstFP->isZero() &&
13513 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13514 case ISD::FSUB:
13515 return OperandNo == 1 && ConstFP->isZero() &&
13516 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13517 case ISD::FMUL:
13518 return ConstFP->isExactlyValue(1.0);
13519 case ISD::FDIV:
13520 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
13521 case ISD::FMINNUM:
13522 case ISD::FMAXNUM: {
13523 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13524 EVT VT = V.getValueType();
13525 const fltSemantics &Semantics = VT.getFltSemantics();
13526 APFloat NeutralAF = !Flags.hasNoNaNs()
13527 ? APFloat::getQNaN(Semantics)
13528 : !Flags.hasNoInfs()
13529 ? APFloat::getInf(Semantics)
13530 : APFloat::getLargest(Semantics);
13531 if (Opcode == ISD::FMAXNUM)
13532 NeutralAF.changeSign();
13533
13534 return ConstFP->isExactlyValue(NeutralAF);
13535 }
13536 }
13537 }
13538 return false;
13539}
13540
13542 while (V.getOpcode() == ISD::BITCAST)
13543 V = V.getOperand(0);
13544 return V;
13545}
13546
13548 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13549 V = V.getOperand(0);
13550 return V;
13551}
13552
13554 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13555 V = V.getOperand(0);
13556 return V;
13557}
13558
13560 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13561 SDValue InVec = V.getOperand(0);
13562 SDValue EltNo = V.getOperand(2);
13563 EVT VT = InVec.getValueType();
13564 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13565 if (IndexC && VT.isFixedLengthVector() &&
13566 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13567 !DemandedElts[IndexC->getZExtValue()]) {
13568 V = InVec;
13569 continue;
13570 }
13571 break;
13572 }
13573 return V;
13574}
13575
13577 while (V.getOpcode() == ISD::TRUNCATE)
13578 V = V.getOperand(0);
13579 return V;
13580}
13581
13582bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13583 if (V.getOpcode() != ISD::XOR)
13584 return false;
13585 V = peekThroughBitcasts(V.getOperand(1));
13586 unsigned NumBits = V.getScalarValueSizeInBits();
13587 ConstantSDNode *C =
13588 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13589 return C && (C->getAPIntValue().countr_one() >= NumBits);
13590}
13591
13593 bool AllowTruncation) {
13594 APInt DemandedElts = getDemandAllEltsMask(N);
13595 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13596}
13597
13599 bool AllowUndefs,
13600 bool AllowTruncation) {
13602 return CN;
13603
13604 // SplatVectors can truncate their operands. Ignore that case here unless
13605 // AllowTruncation is set.
13606 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13607 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13608 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13609 EVT CVT = CN->getValueType(0);
13610 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13611 if (AllowTruncation || CVT == VecEltVT)
13612 return CN;
13613 }
13614 }
13615
13617 BitVector UndefElements;
13618 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13619
13620 // BuildVectors can truncate their operands. Ignore that case here unless
13621 // AllowTruncation is set.
13622 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13623 if (CN && (UndefElements.none() || AllowUndefs)) {
13624 EVT CVT = CN->getValueType(0);
13625 EVT NSVT = N.getValueType().getScalarType();
13626 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13627 if (AllowTruncation || (CVT == NSVT))
13628 return CN;
13629 }
13630 }
13631
13632 return nullptr;
13633}
13634
13636 APInt DemandedElts = getDemandAllEltsMask(N);
13637 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13638}
13639
13641 const APInt &DemandedElts,
13642 bool AllowUndefs) {
13644 return CN;
13645
13647 BitVector UndefElements;
13648 ConstantFPSDNode *CN =
13649 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13650 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13651 if (CN && (UndefElements.none() || AllowUndefs))
13652 return CN;
13653 }
13654
13655 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13656 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13657 return CN;
13658
13659 return nullptr;
13660}
13661
13662bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13663 // TODO: may want to use peekThroughBitcast() here.
13664 ConstantSDNode *C =
13665 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13666 return C && C->isZero();
13667}
13668
13669bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13670 ConstantSDNode *C =
13671 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13672 return C && C->isOne();
13673}
13674
13675bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13676 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13677 return C && C->isExactlyValue(1.0);
13678}
13679
13680bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13682 unsigned BitWidth = N.getScalarValueSizeInBits();
13683 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13684 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
13685}
13686
13687bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13688 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13689 return C && APInt::isSameValue(C->getAPIntValue(),
13690 APInt(C->getAPIntValue().getBitWidth(), 1));
13691}
13692
13693bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13695 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13696 return C && C->isZero();
13697}
13698
13699bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13700 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13701 return C && C->isZero();
13702}
13703
13707
13709 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13711 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13712 bool IsVolatile = false;
13713 bool IsNonTemporal = false;
13714 bool IsDereferenceable = true;
13715 bool IsInvariant = true;
13716 for (const MachineMemOperand *MMO : memoperands()) {
13717 IsVolatile |= MMO->isVolatile();
13718 IsNonTemporal |= MMO->isNonTemporal();
13719 IsDereferenceable &= MMO->isDereferenceable();
13720 IsInvariant &= MMO->isInvariant();
13721 }
13722 MemSDNodeBits.IsVolatile = IsVolatile;
13723 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13724 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13725 MemSDNodeBits.IsInvariant = IsInvariant;
13726
13727 // For the single-MMO case, we check here that the size of the memory operand
13728 // fits within the size of the MMO. This is because the MMO might indicate
13729 // only a possible address range instead of specifying the affected memory
13730 // addresses precisely.
13733 getMemOperand()->getSize().getValue())) &&
13734 "Size mismatch!");
13735}
13736
13737/// Profile - Gather unique data for the node.
13738///
13740 AddNodeIDNode(ID, this);
13741}
13742
13743namespace {
13744
13745 struct EVTArray {
13746 std::vector<EVT> VTs;
13747
13748 EVTArray() {
13749 VTs.reserve(MVT::VALUETYPE_SIZE);
13750 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13751 VTs.push_back(MVT((MVT::SimpleValueType)i));
13752 }
13753 };
13754
13755} // end anonymous namespace
13756
13757/// getValueTypeList - Return a pointer to the specified value type.
13758///
13759const EVT *SDNode::getValueTypeList(MVT VT) {
13760 static EVTArray SimpleVTArray;
13761
13762 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13763 return &SimpleVTArray.VTs[VT.SimpleTy];
13764}
13765
13766/// hasAnyUseOfValue - Return true if there are any use of the indicated
13767/// value. This method ignores uses of other values defined by this operation.
13768bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13769 assert(Value < getNumValues() && "Bad value!");
13770
13771 for (SDUse &U : uses())
13772 if (U.getResNo() == Value)
13773 return true;
13774
13775 return false;
13776}
13777
13778/// isOnlyUserOf - Return true if this node is the only use of N.
13779bool SDNode::isOnlyUserOf(const SDNode *N) const {
13780 bool Seen = false;
13781 for (const SDNode *User : N->users()) {
13782 if (User == this)
13783 Seen = true;
13784 else
13785 return false;
13786 }
13787
13788 return Seen;
13789}
13790
13791/// Return true if the only users of N are contained in Nodes.
13793 bool Seen = false;
13794 for (const SDNode *User : N->users()) {
13795 if (llvm::is_contained(Nodes, User))
13796 Seen = true;
13797 else
13798 return false;
13799 }
13800
13801 return Seen;
13802}
13803
13804/// Return true if the referenced return value is an operand of N.
13805bool SDValue::isOperandOf(const SDNode *N) const {
13806 return is_contained(N->op_values(), *this);
13807}
13808
13809bool SDNode::isOperandOf(const SDNode *N) const {
13810 return any_of(N->op_values(),
13811 [this](SDValue Op) { return this == Op.getNode(); });
13812}
13813
13814/// reachesChainWithoutSideEffects - Return true if this operand (which must
13815/// be a chain) reaches the specified operand without crossing any
13816/// side-effecting instructions on any chain path. In practice, this looks
13817/// through token factors and non-volatile loads. In order to remain efficient,
13818/// this only looks a couple of nodes in, it does not do an exhaustive search.
13819///
13820/// Note that we only need to examine chains when we're searching for
13821/// side-effects; SelectionDAG requires that all side-effects are represented
13822/// by chains, even if another operand would force a specific ordering. This
13823/// constraint is necessary to allow transformations like splitting loads.
13825 unsigned Depth) const {
13826 if (*this == Dest) return true;
13827
13828 // Don't search too deeply, we just want to be able to see through
13829 // TokenFactor's etc.
13830 if (Depth == 0) return false;
13831
13832 // If this is a token factor, all inputs to the TF happen in parallel.
13833 if (getOpcode() == ISD::TokenFactor) {
13834 // First, try a shallow search.
13835 if (is_contained((*this)->ops(), Dest)) {
13836 // We found the chain we want as an operand of this TokenFactor.
13837 // Essentially, we reach the chain without side-effects if we could
13838 // serialize the TokenFactor into a simple chain of operations with
13839 // Dest as the last operation. This is automatically true if the
13840 // chain has one use: there are no other ordering constraints.
13841 // If the chain has more than one use, we give up: some other
13842 // use of Dest might force a side-effect between Dest and the current
13843 // node.
13844 if (Dest.hasOneUse())
13845 return true;
13846 }
13847 // Next, try a deep search: check whether every operand of the TokenFactor
13848 // reaches Dest.
13849 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
13850 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
13851 });
13852 }
13853
13854 // Loads don't have side effects, look through them.
13855 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
13856 if (Ld->isUnordered())
13857 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
13858 }
13859 return false;
13860}
13861
13862bool SDNode::hasPredecessor(const SDNode *N) const {
13865 Worklist.push_back(this);
13866 return hasPredecessorHelper(N, Visited, Worklist);
13867}
13868
13870 this->Flags &= Flags;
13871}
13872
13873SDValue
13875 ArrayRef<ISD::NodeType> CandidateBinOps,
13876 bool AllowPartials) {
13877 // The pattern must end in an extract from index 0.
13878 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
13879 !isNullConstant(Extract->getOperand(1)))
13880 return SDValue();
13881
13882 // Match against one of the candidate binary ops.
13883 SDValue Op = Extract->getOperand(0);
13884 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
13885 return Op.getOpcode() == unsigned(BinOp);
13886 }))
13887 return SDValue();
13888
13889 // Floating-point reductions may require relaxed constraints on the final step
13890 // of the reduction because they may reorder intermediate operations.
13891 unsigned CandidateBinOp = Op.getOpcode();
13892 if (Op.getValueType().isFloatingPoint()) {
13893 SDNodeFlags Flags = Op->getFlags();
13894 switch (CandidateBinOp) {
13895 case ISD::FADD:
13896 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
13897 return SDValue();
13898 break;
13899 default:
13900 llvm_unreachable("Unhandled FP opcode for binop reduction");
13901 }
13902 }
13903
13904 // Matching failed - attempt to see if we did enough stages that a partial
13905 // reduction from a subvector is possible.
13906 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
13907 if (!AllowPartials || !Op)
13908 return SDValue();
13909 EVT OpVT = Op.getValueType();
13910 EVT OpSVT = OpVT.getScalarType();
13911 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
13912 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
13913 return SDValue();
13914 BinOp = (ISD::NodeType)CandidateBinOp;
13915 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
13916 };
13917
13918 // At each stage, we're looking for something that looks like:
13919 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
13920 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
13921 // i32 undef, i32 undef, i32 undef, i32 undef>
13922 // %a = binop <8 x i32> %op, %s
13923 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
13924 // we expect something like:
13925 // <4,5,6,7,u,u,u,u>
13926 // <2,3,u,u,u,u,u,u>
13927 // <1,u,u,u,u,u,u,u>
13928 // While a partial reduction match would be:
13929 // <2,3,u,u,u,u,u,u>
13930 // <1,u,u,u,u,u,u,u>
13931 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
13932 SDValue PrevOp;
13933 for (unsigned i = 0; i < Stages; ++i) {
13934 unsigned MaskEnd = (1 << i);
13935
13936 if (Op.getOpcode() != CandidateBinOp)
13937 return PartialReduction(PrevOp, MaskEnd);
13938
13939 SDValue Op0 = Op.getOperand(0);
13940 SDValue Op1 = Op.getOperand(1);
13941
13943 if (Shuffle) {
13944 Op = Op1;
13945 } else {
13946 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
13947 Op = Op0;
13948 }
13949
13950 // The first operand of the shuffle should be the same as the other operand
13951 // of the binop.
13952 if (!Shuffle || Shuffle->getOperand(0) != Op)
13953 return PartialReduction(PrevOp, MaskEnd);
13954
13955 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
13956 for (int Index = 0; Index < (int)MaskEnd; ++Index)
13957 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
13958 return PartialReduction(PrevOp, MaskEnd);
13959
13960 PrevOp = Op;
13961 }
13962
13963 // Handle subvector reductions, which tend to appear after the shuffle
13964 // reduction stages.
13965 while (Op.getOpcode() == CandidateBinOp) {
13966 unsigned NumElts = Op.getValueType().getVectorNumElements();
13967 SDValue Op0 = Op.getOperand(0);
13968 SDValue Op1 = Op.getOperand(1);
13969 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
13971 Op0.getOperand(0) != Op1.getOperand(0))
13972 break;
13973 SDValue Src = Op0.getOperand(0);
13974 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
13975 if (NumSrcElts != (2 * NumElts))
13976 break;
13977 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
13978 Op1.getConstantOperandAPInt(1) == NumElts) &&
13979 !(Op1.getConstantOperandAPInt(1) == 0 &&
13980 Op0.getConstantOperandAPInt(1) == NumElts))
13981 break;
13982 Op = Src;
13983 }
13984
13985 BinOp = (ISD::NodeType)CandidateBinOp;
13986 return Op;
13987}
13988
13990 EVT VT = N->getValueType(0);
13991 EVT EltVT = VT.getVectorElementType();
13992 unsigned NE = VT.getVectorNumElements();
13993
13994 SDLoc dl(N);
13995
13996 // If ResNE is 0, fully unroll the vector op.
13997 if (ResNE == 0)
13998 ResNE = NE;
13999 else if (NE > ResNE)
14000 NE = ResNE;
14001
14002 if (N->getNumValues() == 2) {
14003 SmallVector<SDValue, 8> Scalars0, Scalars1;
14004 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14005 EVT VT1 = N->getValueType(1);
14006 EVT EltVT1 = VT1.getVectorElementType();
14007
14008 unsigned i;
14009 for (i = 0; i != NE; ++i) {
14010 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14011 SDValue Operand = N->getOperand(j);
14012 EVT OperandVT = Operand.getValueType();
14013
14014 // A vector operand; extract a single element.
14015 EVT OperandEltVT = OperandVT.getVectorElementType();
14016 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14017 }
14018
14019 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14020 Scalars0.push_back(EltOp);
14021 Scalars1.push_back(EltOp.getValue(1));
14022 }
14023
14024 for (; i < ResNE; ++i) {
14025 Scalars0.push_back(getUNDEF(EltVT));
14026 Scalars1.push_back(getUNDEF(EltVT1));
14027 }
14028
14029 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14030 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
14031 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
14032 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
14033 return getMergeValues({Vec0, Vec1}, dl);
14034 }
14035
14036 assert(N->getNumValues() == 1 &&
14037 "Can't unroll a vector with multiple results!");
14038
14040 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14041
14042 unsigned i;
14043 for (i= 0; i != NE; ++i) {
14044 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14045 SDValue Operand = N->getOperand(j);
14046 EVT OperandVT = Operand.getValueType();
14047 if (OperandVT.isVector()) {
14048 // A vector operand; extract a single element.
14049 EVT OperandEltVT = OperandVT.getVectorElementType();
14050 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14051 } else {
14052 // A scalar operand; just use it as is.
14053 Operands[j] = Operand;
14054 }
14055 }
14056
14057 switch (N->getOpcode()) {
14058 default: {
14059 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14060 N->getFlags()));
14061 break;
14062 }
14063 case ISD::VSELECT:
14064 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
14065 break;
14066 case ISD::SHL:
14067 case ISD::SRA:
14068 case ISD::SRL:
14069 case ISD::ROTL:
14070 case ISD::ROTR:
14071 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14072 getShiftAmountOperand(Operands[0].getValueType(),
14073 Operands[1])));
14074 break;
14076 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14077 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14078 Operands[0],
14079 getValueType(ExtVT)));
14080 break;
14081 }
14082 case ISD::ADDRSPACECAST: {
14083 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14084 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
14085 ASC->getSrcAddressSpace(),
14086 ASC->getDestAddressSpace()));
14087 break;
14088 }
14089 }
14090 }
14091
14092 for (; i < ResNE; ++i)
14093 Scalars.push_back(getUNDEF(EltVT));
14094
14095 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14096 return getBuildVector(VecVT, dl, Scalars);
14097}
14098
14099std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14100 SDNode *N, unsigned ResNE) {
14101 unsigned Opcode = N->getOpcode();
14102 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14103 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14104 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14105 "Expected an overflow opcode");
14106
14107 EVT ResVT = N->getValueType(0);
14108 EVT OvVT = N->getValueType(1);
14109 EVT ResEltVT = ResVT.getVectorElementType();
14110 EVT OvEltVT = OvVT.getVectorElementType();
14111 SDLoc dl(N);
14112
14113 // If ResNE is 0, fully unroll the vector op.
14114 unsigned NE = ResVT.getVectorNumElements();
14115 if (ResNE == 0)
14116 ResNE = NE;
14117 else if (NE > ResNE)
14118 NE = ResNE;
14119
14120 SmallVector<SDValue, 8> LHSScalars;
14121 SmallVector<SDValue, 8> RHSScalars;
14122 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14123 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14124
14125 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14126 SDVTList VTs = getVTList(ResEltVT, SVT);
14127 SmallVector<SDValue, 8> ResScalars;
14128 SmallVector<SDValue, 8> OvScalars;
14129 for (unsigned i = 0; i < NE; ++i) {
14130 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14131 SDValue Ov =
14132 getSelect(dl, OvEltVT, Res.getValue(1),
14133 getBoolConstant(true, dl, OvEltVT, ResVT),
14134 getConstant(0, dl, OvEltVT));
14135
14136 ResScalars.push_back(Res);
14137 OvScalars.push_back(Ov);
14138 }
14139
14140 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14141 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14142
14143 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14144 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14145 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14146 getBuildVector(NewOvVT, dl, OvScalars));
14147}
14148
14151 unsigned Bytes,
14152 int Dist) const {
14153 if (LD->isVolatile() || Base->isVolatile())
14154 return false;
14155 // TODO: probably too restrictive for atomics, revisit
14156 if (!LD->isSimple())
14157 return false;
14158 if (LD->isIndexed() || Base->isIndexed())
14159 return false;
14160 if (LD->getChain() != Base->getChain())
14161 return false;
14162 EVT VT = LD->getMemoryVT();
14163 if (VT.getSizeInBits() / 8 != Bytes)
14164 return false;
14165
14166 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
14167 auto LocDecomp = BaseIndexOffset::match(LD, *this);
14168
14169 int64_t Offset = 0;
14170 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
14171 return (Dist * (int64_t)Bytes == Offset);
14172 return false;
14173}
14174
14175/// InferPtrAlignment - Infer alignment of a load / store address. Return
14176/// std::nullopt if it cannot be inferred.
14178 // If this is a GlobalAddress + cst, return the alignment.
14179 const GlobalValue *GV = nullptr;
14180 int64_t GVOffset = 0;
14181 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14182 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14183 KnownBits Known(PtrWidth);
14185 unsigned AlignBits = Known.countMinTrailingZeros();
14186 if (AlignBits)
14187 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14188 }
14189
14190 // If this is a direct reference to a stack slot, use information about the
14191 // stack slot's alignment.
14192 int FrameIdx = INT_MIN;
14193 int64_t FrameOffset = 0;
14195 FrameIdx = FI->getIndex();
14196 } else if (isBaseWithConstantOffset(Ptr) &&
14198 // Handle FI+Cst
14199 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14200 FrameOffset = Ptr.getConstantOperandVal(1);
14201 }
14202
14203 if (FrameIdx != INT_MIN) {
14205 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14206 }
14207
14208 return std::nullopt;
14209}
14210
14211/// Split the scalar node with EXTRACT_ELEMENT using the provided
14212/// VTs and return the low/high part.
14213std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14214 const SDLoc &DL,
14215 const EVT &LoVT,
14216 const EVT &HiVT) {
14217 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14218 "Split node must be a scalar type");
14219 SDValue Lo =
14221 SDValue Hi =
14223 return std::make_pair(Lo, Hi);
14224}
14225
14226/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14227/// which is split (or expanded) into two not necessarily identical pieces.
14228std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14229 // Currently all types are split in half.
14230 EVT LoVT, HiVT;
14231 if (!VT.isVector())
14232 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14233 else
14234 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14235
14236 return std::make_pair(LoVT, HiVT);
14237}
14238
14239/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14240/// type, dependent on an enveloping VT that has been split into two identical
14241/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14242std::pair<EVT, EVT>
14244 bool *HiIsEmpty) const {
14245 EVT EltTp = VT.getVectorElementType();
14246 // Examples:
14247 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14248 // custom VL=9 with enveloping VL=8/8 yields 8/1
14249 // custom VL=10 with enveloping VL=8/8 yields 8/2
14250 // etc.
14251 ElementCount VTNumElts = VT.getVectorElementCount();
14252 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14253 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14254 "Mixing fixed width and scalable vectors when enveloping a type");
14255 EVT LoVT, HiVT;
14256 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14257 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14258 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14259 *HiIsEmpty = false;
14260 } else {
14261 // Flag that hi type has zero storage size, but return split envelop type
14262 // (this would be easier if vector types with zero elements were allowed).
14263 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14264 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14265 *HiIsEmpty = true;
14266 }
14267 return std::make_pair(LoVT, HiVT);
14268}
14269
14270/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14271/// low/high part.
14272std::pair<SDValue, SDValue>
14273SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14274 const EVT &HiVT) {
14275 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14276 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14277 "Splitting vector with an invalid mixture of fixed and scalable "
14278 "vector types");
14280 N.getValueType().getVectorMinNumElements() &&
14281 "More vector elements requested than available!");
14282 SDValue Lo, Hi;
14283 Lo = getExtractSubvector(DL, LoVT, N, 0);
14284 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14285 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14286 // IDX with the runtime scaling factor of the result vector type. For
14287 // fixed-width result vectors, that runtime scaling factor is 1.
14290 return std::make_pair(Lo, Hi);
14291}
14292
14293std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14294 const SDLoc &DL) {
14295 // Split the vector length parameter.
14296 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14297 EVT VT = N.getValueType();
14299 "Expecting the mask to be an evenly-sized vector");
14300 SDValue HalfNumElts = getElementCount(
14302 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14303 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14304 return std::make_pair(Lo, Hi);
14305}
14306
14307/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14309 EVT VT = N.getValueType();
14312 return getInsertSubvector(DL, getUNDEF(WideVT), N, 0);
14313}
14314
14317 unsigned Start, unsigned Count,
14318 EVT EltVT) {
14319 EVT VT = Op.getValueType();
14320 if (Count == 0)
14322 if (EltVT == EVT())
14323 EltVT = VT.getVectorElementType();
14324 SDLoc SL(Op);
14325 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14326 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14327 }
14328}
14329
14330// getAddressSpace - Return the address space this GlobalAddress belongs to.
14332 return getGlobal()->getType()->getAddressSpace();
14333}
14334
14337 return Val.MachineCPVal->getType();
14338 return Val.ConstVal->getType();
14339}
14340
14341bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14342 unsigned &SplatBitSize,
14343 bool &HasAnyUndefs,
14344 unsigned MinSplatBits,
14345 bool IsBigEndian) const {
14346 EVT VT = getValueType(0);
14347 assert(VT.isVector() && "Expected a vector type");
14348 unsigned VecWidth = VT.getSizeInBits();
14349 if (MinSplatBits > VecWidth)
14350 return false;
14351
14352 // FIXME: The widths are based on this node's type, but build vectors can
14353 // truncate their operands.
14354 SplatValue = APInt(VecWidth, 0);
14355 SplatUndef = APInt(VecWidth, 0);
14356
14357 // Get the bits. Bits with undefined values (when the corresponding element
14358 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14359 // in SplatValue. If any of the values are not constant, give up and return
14360 // false.
14361 unsigned int NumOps = getNumOperands();
14362 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14363 unsigned EltWidth = VT.getScalarSizeInBits();
14364
14365 for (unsigned j = 0; j < NumOps; ++j) {
14366 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14367 SDValue OpVal = getOperand(i);
14368 unsigned BitPos = j * EltWidth;
14369
14370 if (OpVal.isUndef())
14371 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14372 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14373 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14374 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14375 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14376 else
14377 return false;
14378 }
14379
14380 // The build_vector is all constants or undefs. Find the smallest element
14381 // size that splats the vector.
14382 HasAnyUndefs = (SplatUndef != 0);
14383
14384 // FIXME: This does not work for vectors with elements less than 8 bits.
14385 while (VecWidth > 8) {
14386 // If we can't split in half, stop here.
14387 if (VecWidth & 1)
14388 break;
14389
14390 unsigned HalfSize = VecWidth / 2;
14391 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14392 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14393 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14394 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14395
14396 // If the two halves do not match (ignoring undef bits), stop here.
14397 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14398 MinSplatBits > HalfSize)
14399 break;
14400
14401 SplatValue = HighValue | LowValue;
14402 SplatUndef = HighUndef & LowUndef;
14403
14404 VecWidth = HalfSize;
14405 }
14406
14407 // FIXME: The loop above only tries to split in halves. But if the input
14408 // vector for example is <3 x i16> it wouldn't be able to detect a
14409 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14410 // optimizations. I guess that back in the days when this helper was created
14411 // vectors normally was power-of-2 sized.
14412
14413 SplatBitSize = VecWidth;
14414 return true;
14415}
14416
14418 BitVector *UndefElements) const {
14419 unsigned NumOps = getNumOperands();
14420 if (UndefElements) {
14421 UndefElements->clear();
14422 UndefElements->resize(NumOps);
14423 }
14424 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14425 if (!DemandedElts)
14426 return SDValue();
14427 SDValue Splatted;
14428 for (unsigned i = 0; i != NumOps; ++i) {
14429 if (!DemandedElts[i])
14430 continue;
14431 SDValue Op = getOperand(i);
14432 if (Op.isUndef()) {
14433 if (UndefElements)
14434 (*UndefElements)[i] = true;
14435 } else if (!Splatted) {
14436 Splatted = Op;
14437 } else if (Splatted != Op) {
14438 return SDValue();
14439 }
14440 }
14441
14442 if (!Splatted) {
14443 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14444 assert(getOperand(FirstDemandedIdx).isUndef() &&
14445 "Can only have a splat without a constant for all undefs.");
14446 return getOperand(FirstDemandedIdx);
14447 }
14448
14449 return Splatted;
14450}
14451
14453 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14454 return getSplatValue(DemandedElts, UndefElements);
14455}
14456
14458 SmallVectorImpl<SDValue> &Sequence,
14459 BitVector *UndefElements) const {
14460 unsigned NumOps = getNumOperands();
14461 Sequence.clear();
14462 if (UndefElements) {
14463 UndefElements->clear();
14464 UndefElements->resize(NumOps);
14465 }
14466 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14467 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14468 return false;
14469
14470 // Set the undefs even if we don't find a sequence (like getSplatValue).
14471 if (UndefElements)
14472 for (unsigned I = 0; I != NumOps; ++I)
14473 if (DemandedElts[I] && getOperand(I).isUndef())
14474 (*UndefElements)[I] = true;
14475
14476 // Iteratively widen the sequence length looking for repetitions.
14477 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14478 Sequence.append(SeqLen, SDValue());
14479 for (unsigned I = 0; I != NumOps; ++I) {
14480 if (!DemandedElts[I])
14481 continue;
14482 SDValue &SeqOp = Sequence[I % SeqLen];
14484 if (Op.isUndef()) {
14485 if (!SeqOp)
14486 SeqOp = Op;
14487 continue;
14488 }
14489 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14490 Sequence.clear();
14491 break;
14492 }
14493 SeqOp = Op;
14494 }
14495 if (!Sequence.empty())
14496 return true;
14497 }
14498
14499 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14500 return false;
14501}
14502
14504 BitVector *UndefElements) const {
14505 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14506 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14507}
14508
14511 BitVector *UndefElements) const {
14513 getSplatValue(DemandedElts, UndefElements));
14514}
14515
14518 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14519}
14520
14523 BitVector *UndefElements) const {
14525 getSplatValue(DemandedElts, UndefElements));
14526}
14527
14532
14533int32_t
14535 uint32_t BitWidth) const {
14536 if (ConstantFPSDNode *CN =
14538 bool IsExact;
14539 APSInt IntVal(BitWidth);
14540 const APFloat &APF = CN->getValueAPF();
14541 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14542 APFloat::opOK ||
14543 !IsExact)
14544 return -1;
14545
14546 return IntVal.exactLogBase2();
14547 }
14548 return -1;
14549}
14550
14552 bool IsLittleEndian, unsigned DstEltSizeInBits,
14553 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14554 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14555 if (!isConstant())
14556 return false;
14557
14558 unsigned NumSrcOps = getNumOperands();
14559 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14560 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14561 "Invalid bitcast scale");
14562
14563 // Extract raw src bits.
14564 SmallVector<APInt> SrcBitElements(NumSrcOps,
14565 APInt::getZero(SrcEltSizeInBits));
14566 BitVector SrcUndeElements(NumSrcOps, false);
14567
14568 for (unsigned I = 0; I != NumSrcOps; ++I) {
14570 if (Op.isUndef()) {
14571 SrcUndeElements.set(I);
14572 continue;
14573 }
14574 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14575 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14576 assert((CInt || CFP) && "Unknown constant");
14577 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14578 : CFP->getValueAPF().bitcastToAPInt();
14579 }
14580
14581 // Recast to dst width.
14582 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14583 SrcBitElements, UndefElements, SrcUndeElements);
14584 return true;
14585}
14586
14587void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14588 unsigned DstEltSizeInBits,
14589 SmallVectorImpl<APInt> &DstBitElements,
14590 ArrayRef<APInt> SrcBitElements,
14591 BitVector &DstUndefElements,
14592 const BitVector &SrcUndefElements) {
14593 unsigned NumSrcOps = SrcBitElements.size();
14594 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14595 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14596 "Invalid bitcast scale");
14597 assert(NumSrcOps == SrcUndefElements.size() &&
14598 "Vector size mismatch");
14599
14600 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14601 DstUndefElements.clear();
14602 DstUndefElements.resize(NumDstOps, false);
14603 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14604
14605 // Concatenate src elements constant bits together into dst element.
14606 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14607 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14608 for (unsigned I = 0; I != NumDstOps; ++I) {
14609 DstUndefElements.set(I);
14610 APInt &DstBits = DstBitElements[I];
14611 for (unsigned J = 0; J != Scale; ++J) {
14612 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14613 if (SrcUndefElements[Idx])
14614 continue;
14615 DstUndefElements.reset(I);
14616 const APInt &SrcBits = SrcBitElements[Idx];
14617 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14618 "Illegal constant bitwidths");
14619 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14620 }
14621 }
14622 return;
14623 }
14624
14625 // Split src element constant bits into dst elements.
14626 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14627 for (unsigned I = 0; I != NumSrcOps; ++I) {
14628 if (SrcUndefElements[I]) {
14629 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14630 continue;
14631 }
14632 const APInt &SrcBits = SrcBitElements[I];
14633 for (unsigned J = 0; J != Scale; ++J) {
14634 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14635 APInt &DstBits = DstBitElements[Idx];
14636 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14637 }
14638 }
14639}
14640
14642 for (const SDValue &Op : op_values()) {
14643 unsigned Opc = Op.getOpcode();
14644 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14645 return false;
14646 }
14647 return true;
14648}
14649
14650std::optional<std::pair<APInt, APInt>>
14652 unsigned NumOps = getNumOperands();
14653 if (NumOps < 2)
14654 return std::nullopt;
14655
14656 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14657 APInt Start, Stride;
14658 int FirstIdx = -1, SecondIdx = -1;
14659
14660 // Find the first two non-undef constant elements to determine Start and
14661 // Stride, then verify all remaining elements match the sequence.
14662 for (unsigned I = 0; I < NumOps; ++I) {
14664 if (Op->isUndef())
14665 continue;
14666 if (!isa<ConstantSDNode>(Op))
14667 return std::nullopt;
14668
14669 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14670 if (FirstIdx < 0) {
14671 FirstIdx = I;
14672 Start = Val;
14673 } else if (SecondIdx < 0) {
14674 SecondIdx = I;
14675 // Compute stride using modular arithmetic. Simple division would handle
14676 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14677 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14678 // Note that modular arithmetic is agnostic to signed/unsigned.
14679 unsigned IdxDiff = I - FirstIdx;
14680 APInt ValDiff = Val - Start;
14681
14682 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14683 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14684 if (ValDiff.countr_zero() < CommonPow2Bits)
14685 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14686 IdxDiff >>= CommonPow2Bits;
14687 ValDiff.lshrInPlace(CommonPow2Bits);
14688
14689 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14690 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14691 // one, but we could try all candidates to handle more cases.
14692 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14693 if (Stride.isZero())
14694 return std::nullopt;
14695
14696 // Step 3: Adjust Start based on the first defined element's index.
14697 Start -= Stride * FirstIdx;
14698 } else {
14699 // Verify this element matches the sequence.
14700 if (Val != Start + Stride * I)
14701 return std::nullopt;
14702 }
14703 }
14704
14705 // Need at least two defined elements.
14706 if (SecondIdx < 0)
14707 return std::nullopt;
14708
14709 return std::make_pair(Start, Stride);
14710}
14711
14713 // Find the first non-undef value in the shuffle mask.
14714 unsigned i, e;
14715 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14716 /* search */;
14717
14718 // If all elements are undefined, this shuffle can be considered a splat
14719 // (although it should eventually get simplified away completely).
14720 if (i == e)
14721 return true;
14722
14723 // Make sure all remaining elements are either undef or the same as the first
14724 // non-undef value.
14725 for (int Idx = Mask[i]; i != e; ++i)
14726 if (Mask[i] >= 0 && Mask[i] != Idx)
14727 return false;
14728 return true;
14729}
14730
14731// Returns true if it is a constant integer BuildVector or constant integer,
14732// possibly hidden by a bitcast.
14734 SDValue N, bool AllowOpaques) const {
14736
14737 if (auto *C = dyn_cast<ConstantSDNode>(N))
14738 return AllowOpaques || !C->isOpaque();
14739
14741 return true;
14742
14743 // Treat a GlobalAddress supporting constant offset folding as a
14744 // constant integer.
14745 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14746 if (GA->getOpcode() == ISD::GlobalAddress &&
14747 TLI->isOffsetFoldingLegal(GA))
14748 return true;
14749
14750 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14751 isa<ConstantSDNode>(N.getOperand(0)))
14752 return true;
14753 return false;
14754}
14755
14756// Returns true if it is a constant float BuildVector or constant float.
14759 return true;
14760
14762 return true;
14763
14764 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14765 isa<ConstantFPSDNode>(N.getOperand(0)))
14766 return true;
14767
14768 return false;
14769}
14770
14771std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
14772 ConstantSDNode *Const =
14773 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
14774 if (!Const)
14775 return std::nullopt;
14776
14777 EVT VT = N->getValueType(0);
14778 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
14779 switch (TLI->getBooleanContents(N.getValueType())) {
14781 if (CVal.isOne())
14782 return true;
14783 if (CVal.isZero())
14784 return false;
14785 return std::nullopt;
14787 if (CVal.isAllOnes())
14788 return true;
14789 if (CVal.isZero())
14790 return false;
14791 return std::nullopt;
14793 return CVal[0];
14794 }
14795 llvm_unreachable("Unknown BooleanContent enum");
14796}
14797
14798void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
14799 assert(!Node->OperandList && "Node already has operands");
14801 "too many operands to fit into SDNode");
14802 SDUse *Ops = OperandRecycler.allocate(
14803 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
14804
14805 bool IsDivergent = false;
14806 for (unsigned I = 0; I != Vals.size(); ++I) {
14807 Ops[I].setUser(Node);
14808 Ops[I].setInitial(Vals[I]);
14809 EVT VT = Ops[I].getValueType();
14810
14811 // Skip Chain. It does not carry divergence.
14812 if (VT != MVT::Other &&
14813 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
14814 Ops[I].getNode()->isDivergent()) {
14815 IsDivergent = true;
14816 }
14817 }
14818 Node->NumOperands = Vals.size();
14819 Node->OperandList = Ops;
14820 if (!TLI->isSDNodeAlwaysUniform(Node)) {
14821 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
14822 Node->SDNodeBits.IsDivergent = IsDivergent;
14823 }
14824 checkForCycles(Node);
14825}
14826
14829 size_t Limit = SDNode::getMaxNumOperands();
14830 while (Vals.size() > Limit) {
14831 unsigned SliceIdx = Vals.size() - Limit;
14832 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
14833 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
14834 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
14835 Vals.emplace_back(NewTF);
14836 }
14837 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
14838}
14839
14841 EVT VT, SDNodeFlags Flags) {
14842 switch (Opcode) {
14843 default:
14844 return SDValue();
14845 case ISD::ADD:
14846 case ISD::OR:
14847 case ISD::XOR:
14848 case ISD::UMAX:
14849 return getConstant(0, DL, VT);
14850 case ISD::MUL:
14851 return getConstant(1, DL, VT);
14852 case ISD::AND:
14853 case ISD::UMIN:
14854 return getAllOnesConstant(DL, VT);
14855 case ISD::SMAX:
14857 case ISD::SMIN:
14859 case ISD::FADD:
14860 // If flags allow, prefer positive zero since it's generally cheaper
14861 // to materialize on most targets.
14862 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
14863 case ISD::FMUL:
14864 return getConstantFP(1.0, DL, VT);
14865 case ISD::FMINNUM:
14866 case ISD::FMAXNUM: {
14867 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
14868 const fltSemantics &Semantics = VT.getFltSemantics();
14869 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
14870 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
14871 APFloat::getLargest(Semantics);
14872 if (Opcode == ISD::FMAXNUM)
14873 NeutralAF.changeSign();
14874
14875 return getConstantFP(NeutralAF, DL, VT);
14876 }
14877 case ISD::FMINIMUM:
14878 case ISD::FMAXIMUM: {
14879 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
14880 const fltSemantics &Semantics = VT.getFltSemantics();
14881 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
14882 : APFloat::getLargest(Semantics);
14883 if (Opcode == ISD::FMAXIMUM)
14884 NeutralAF.changeSign();
14885
14886 return getConstantFP(NeutralAF, DL, VT);
14887 }
14888
14889 }
14890}
14891
14893 SDValue Acc, SDValue LHS,
14894 SDValue RHS) {
14895 EVT AccVT = Acc.getValueType();
14896 if (AccVT.isFloatingPoint()) {
14897 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
14898 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
14899 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
14900 }
14902 "Unexpected opcode");
14903 SDValue NegAcc = getNegative(Acc, DL, AccVT);
14904 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
14905 return getNegative(MLA, DL, AccVT);
14906}
14907
14908/// Helper used to make a call to a library function that has one argument of
14909/// pointer type.
14910///
14911/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
14912/// used to get or set floating-point state. They have one argument of pointer
14913/// type, which points to the memory region containing bits of the
14914/// floating-point state. The value returned by such function is ignored in the
14915/// created call.
14916///
14917/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
14918/// \param Ptr Pointer used to save/load state.
14919/// \param InChain Ingoing token chain.
14920/// \returns Outgoing chain token.
14922 SDValue InChain,
14923 const SDLoc &DLoc) {
14924 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
14926 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
14927 RTLIB::LibcallImpl LibcallImpl =
14928 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
14929 if (LibcallImpl == RTLIB::Unsupported)
14930 reportFatalUsageError("emitting call to unsupported libcall");
14931
14932 SDValue Callee =
14933 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
14935 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
14936 Libcalls->getLibcallImplCallingConv(LibcallImpl),
14937 Type::getVoidTy(*getContext()), Callee, std::move(Args));
14938 return TLI->LowerCallTo(CLI).second;
14939}
14940
14942 assert(From && To && "Invalid SDNode; empty source SDValue?");
14943 auto I = SDEI.find(From);
14944 if (I == SDEI.end())
14945 return;
14946
14947 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
14948 // the iterator, hence the need to make a copy to prevent a use-after-free.
14949 NodeExtraInfo NEI = I->second;
14950 if (LLVM_LIKELY(!NEI.PCSections)) {
14951 // No deep copy required for the types of extra info set.
14952 //
14953 // FIXME: Investigate if other types of extra info also need deep copy. This
14954 // depends on the types of nodes they can be attached to: if some extra info
14955 // is only ever attached to nodes where a replacement To node is always the
14956 // node where later use and propagation of the extra info has the intended
14957 // semantics, no deep copy is required.
14958 SDEI[To] = std::move(NEI);
14959 return;
14960 }
14961
14962 const SDNode *EntrySDN = getEntryNode().getNode();
14963
14964 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
14965 // through the replacement of From with To. Otherwise, replacements of a node
14966 // (From) with more complex nodes (To and its operands) may result in lost
14967 // extra info where the root node (To) is insignificant in further propagating
14968 // and using extra info when further lowering to MIR.
14969 //
14970 // In the first step pre-populate the visited set with the nodes reachable
14971 // from the old From node. This avoids copying NodeExtraInfo to parts of the
14972 // DAG that is not new and should be left untouched.
14973 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
14974 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
14975 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
14976 if (MaxDepth == 0) {
14977 // Remember this node in case we need to increase MaxDepth and continue
14978 // populating FromReach from this node.
14979 Leafs.emplace_back(N);
14980 return;
14981 }
14982 if (!FromReach.insert(N).second)
14983 return;
14984 for (const SDValue &Op : N->op_values())
14985 Self(Self, Op.getNode(), MaxDepth - 1);
14986 };
14987
14988 // Copy extra info to To and all its transitive operands (that are new).
14990 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
14991 if (FromReach.contains(N))
14992 return true;
14993 if (!Visited.insert(N).second)
14994 return true;
14995 if (EntrySDN == N)
14996 return false;
14997 for (const SDValue &Op : N->op_values()) {
14998 if (N == To && Op.getNode() == EntrySDN) {
14999 // Special case: New node's operand is the entry node; just need to
15000 // copy extra info to new node.
15001 break;
15002 }
15003 if (!Self(Self, Op.getNode()))
15004 return false;
15005 }
15006 // Copy only if entry node was not reached.
15007 SDEI[N] = std::move(NEI);
15008 return true;
15009 };
15010
15011 // We first try with a lower MaxDepth, assuming that the path to common
15012 // operands between From and To is relatively short. This significantly
15013 // improves performance in the common case. The initial MaxDepth is big
15014 // enough to avoid retry in the common case; the last MaxDepth is large
15015 // enough to avoid having to use the fallback below (and protects from
15016 // potential stack exhaustion from recursion).
15017 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15018 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15019 // StartFrom is the previous (or initial) set of leafs reachable at the
15020 // previous maximum depth.
15022 std::swap(StartFrom, Leafs);
15023 for (const SDNode *N : StartFrom)
15024 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15025 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15026 return;
15027 // This should happen very rarely (reached the entry node).
15028 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15029 assert(!Leafs.empty());
15030 }
15031
15032 // This should not happen - but if it did, that means the subgraph reachable
15033 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15034 // could not visit all reachable common operands. Consequently, we were able
15035 // to reach the entry node.
15036 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15037 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15038 // Best-effort fallback if assertions disabled.
15039 SDEI[To] = std::move(NEI);
15040}
15041
15042#ifndef NDEBUG
15043static void checkForCyclesHelper(const SDNode *N,
15046 const llvm::SelectionDAG *DAG) {
15047 // If this node has already been checked, don't check it again.
15048 if (Checked.count(N))
15049 return;
15050
15051 // If a node has already been visited on this depth-first walk, reject it as
15052 // a cycle.
15053 if (!Visited.insert(N).second) {
15054 errs() << "Detected cycle in SelectionDAG\n";
15055 dbgs() << "Offending node:\n";
15056 N->dumprFull(DAG); dbgs() << "\n";
15057 abort();
15058 }
15059
15060 for (const SDValue &Op : N->op_values())
15061 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15062
15063 Checked.insert(N);
15064 Visited.erase(N);
15065}
15066#endif
15067
15069 const llvm::SelectionDAG *DAG,
15070 bool force) {
15071#ifndef NDEBUG
15072 bool check = force;
15073#ifdef EXPENSIVE_CHECKS
15074 check = true;
15075#endif // EXPENSIVE_CHECKS
15076 if (check) {
15077 assert(N && "Checking nonexistent SDNode");
15080 checkForCyclesHelper(N, visited, checked, DAG);
15081 }
15082#endif // !NDEBUG
15083}
15084
15085void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15086 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15087}
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:851
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition Compiler.h:592
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:335
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:114
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 std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition VPlanSLP.cpp:247
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:334
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static const fltSemantics & BFloat()
Definition APFloat.h:295
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
static const fltSemantics & IEEEdouble()
Definition APFloat.h:297
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:347
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:346
static const fltSemantics & IEEEhalf()
Definition APFloat.h:294
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1175
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1263
void copySign(const APFloat &RHS)
Definition APFloat.h:1357
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5890
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1245
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition APFloat.h:1499
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1236
bool isFinite() const
Definition APFloat.h:1521
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1402
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1254
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
Definition APFloat.h:1290
bool isZero() const
Definition APFloat.h:1512
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1193
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1387
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1153
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1281
bool isPosZero() const
Definition APFloat.h:1527
bool isNegZero() const
Definition APFloat.h:1528
void changeSign()
Definition APFloat.h:1352
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1164
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2022
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2106
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1615
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1429
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1054
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1563
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1414
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1693
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1408
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition APInt.cpp:639
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1075
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1535
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:967
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1353
APInt abs() const
Get the absolute value.
Definition APInt.h:1818
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2077
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1708
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1511
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1686
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1419
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1196
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:789
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1173
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1662
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1651
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1621
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:651
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2137
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2151
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1083
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:1183
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:397
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1458
unsigned logBase2() const
Definition APInt.h:1784
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2087
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1316
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1787
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1027
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1390
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:767
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1264
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1440
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1411
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:482
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2096
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
This is an SDNode representing atomic operations.
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Definition BitVector.h:411
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition BitVector.h:360
void clear()
clear - Removes all bits from the bitvector.
Definition BitVector.h:354
BitVector & set()
Definition BitVector.h:370
bool none() const
none - Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
size - Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1065
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static LLVM_ABI void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
LLVM_ABI ConstantRange multiply(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:215
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:123
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
const char * getSymbol() const
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:209
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
LLVM_ABI CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
LLVM_ABI RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
LLVM_ABI void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
LLVM_ABI bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
LLVM_ABI void Profile(FoldingSetNodeID &ID) const
Gather unique data for the node.
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
LLVM_ABI void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
static LLVM_ABI bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
std::optional< APInt > bitcastToAPInt() const
LLVM_ABI bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
LLVM_ABI bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool isUndef() const
Returns true if the node type is UNDEF or POISON.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
LLVM_ABI void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
Represents a use of a SDNode.
SDNode * getUser()
This returns the SDNode that contains this Use.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI std::pair< SDValue, SDValue > getMemccpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI)
Lower a memccpy operation into a target library call and return the resulting chain and call result a...
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI std::optional< bool > isBoolConstant(SDValue N) const
Check if a value \op N is a constant using the target's BooleanContent for its type.
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getNeutralElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) neutral element for the given opcode, if it exists.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, MachineModuleInfo &MMI, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
LLVM_ABI std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
allnodes_const_iterator allnodes_begin() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
SDValue getPartialReduceMLS(unsigned Opc, const SDLoc &DL, SDValue Acc, SDValue LHS, SDValue RHS)
Get an expression that implements a partial multiply-subtract reduction.
LLVM_ABI SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
LLVM_ABI SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(SDValue Op, bool ForSigned, unsigned Depth=0) const
Combine constant ranges from computeConstantRange() and computeKnownBits().
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getLoadFFVP(EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachineMemOperand *MMO)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
LLVM_ABI std::pair< SDValue, SDValue > getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, const CallInst *CI)
Lower a memcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, bool PoisonOnly=false, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getIndexedLoadVP(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
LLVM_ABI MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
LLVM_ABI 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 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 SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask, SDValue EVL, EVT VT)
Create a vector-predicated logical NOT operation as (VP_XOR Val, BooleanOne, Mask,...
LLVM_ABI SDValue getMaskFromElementCount(const SDLoc &DL, EVT VT, ElementCount Len)
Return a vector with the first 'Len' lanes set to true and remaining lanes set to false.
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
iterator_range< allnodes_iterator > allnodes()
LLVM_ABI SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, bool PoisonOnly=false, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
LLVM_ABI OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getTruncStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT SVT, MachineMemOperand *MMO, bool IsCompressing=false)
LLVM_ABI void canonicalizeCommutativeBinop(unsigned Opcode, SDValue &N1, SDValue &N2) const
Swap N1 and N2 if Opcode is a commutative binary opcode and the canonical form expects the opposite o...
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
LLVM_ABI bool isKnownToBeAPowerOfTwoFP(SDValue Val, unsigned Depth=0) const
Test if the given fp value is known to be an integer power-of-2, either positive or negative.
LLVM_ABI OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y, SDNodeFlags Flags)
Try to simplify a floating-point binary operation into 1 of its operands or a constant.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue getDeactivationSymbol(const GlobalValue *GV)
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
LLVM_ABI bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
LLVM_ABI std::pair< EVT, EVT > GetDependentSplitDestVTs(const EVT &VT, const EVT &EnvVT, bool *HiIsEmpty) const
Compute the VTs needed for the low/hi parts of a type, dependent on an enveloping VT that has been sp...
LLVM_ABI SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
LLVM_ABI std::optional< ConstantRange > getValidShiftAmountRange(SDValue V, const APInt &DemandedElts, unsigned Depth) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
LLVM_ABI SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
LLVM_ABI SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
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.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool 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:644
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:290
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:313
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:286
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:311
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:201
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:236
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
LLVM_ABI void set(Value *Val)
Definition Value.h:883
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Value * getOperand(unsigned i) const
Definition User.h:207
This class is used to represent an VP_GATHER node.
This class is used to represent a VP_LOAD node.
This class is used to represent an VP_SCATTER node.
This class is used to represent a VP_STORE node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3252
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3182
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3169
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3159
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3233
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3174
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:3242
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2297
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3224
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:3060
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3257
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2302
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3154
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3164
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:24
LLVM_ABI CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:819
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:538
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:522
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:910
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:715
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:665
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:873
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:827
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:691
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:792
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:704
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:649
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:811
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:899
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:888
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:505
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:710
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:681
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:921
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition ISDOpcodes.h:997
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:833
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:871
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:722
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:875
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
LLVM_ABI CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:532
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
MaybeAlign getAlign(const CallInst &I, unsigned Index)
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1548
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1710
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:634
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1530
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:1622
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:1665
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:331
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
LLVM_ABI SDValue peekThroughInsertVectorElt(SDValue V, const APInt &DemandedElts)
Recursively peek through INSERT_VECTOR_ELT nodes, returning the source vector operand of V,...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1696
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1646
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
constexpr unsigned BitWidth
bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:572
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1683
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1723
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo)
Returns true if V is a neutral element of Opc with Flags.
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:373
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:783
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:403
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:528
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:292
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:308
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:358
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:381
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:367
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:393
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:324
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:189
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:331
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:300
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:264
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:182
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:336
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:344
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:316
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:469
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition KnownBits.h:269
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:125
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
bool isUnknown() const
Returns true if we don't know any bits.
Definition KnownBits.h:64
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
void makeNegative()
Make this value negative.
Definition KnownBits.h:120
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:97
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:545
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:549
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
KnownBits unionWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for either this or RHS or both.
Definition KnownBits.h:335
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:325
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
LLVM_ABI KnownBits truncSSat(unsigned BitWidth) const
Truncate with signed saturation (signed input -> signed output)
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:233
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
LLVM_ABI KnownBits truncUSat(unsigned BitWidth) const
Truncate with unsigned saturation (unsigned input -> unsigned output)
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
LLVM_ABI KnownBits truncSSatU(unsigned BitWidth) const
Truncate with signed saturation to unsigned (signed input -> unsigned output)
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
bool isUnknown() const
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)