LLVM 24.0.0git
SelectionDAG.cpp
Go to the documentation of this file.
1//===- SelectionDAG.cpp - Implement the SelectionDAG data structures ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the SelectionDAG class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseSet.h"
21#include "llvm/ADT/FoldingSet.h"
22#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/Twine.h"
51#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugLoc.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/GlobalValue.h"
59#include "llvm/IR/Metadata.h"
60#include "llvm/IR/Type.h"
64#include "llvm/Support/Debug.h"
74#include <algorithm>
75#include <cassert>
76#include <cstdint>
77#include <cstdlib>
78#include <limits>
79#include <optional>
80#include <string>
81#include <utility>
82#include <vector>
83
84using namespace llvm;
85using namespace llvm::SDPatternMatch;
86
87/// makeVTList - Return an instance of the SDVTList struct initialized with the
88/// specified members.
89static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
90 SDVTList Res = {VTs, NumVTs};
91 return Res;
92}
93
94// Default null implementations of the callbacks.
98
99void SelectionDAG::DAGNodeDeletedListener::anchor() {}
100void SelectionDAG::DAGNodeInsertedListener::anchor() {}
101
102#define DEBUG_TYPE "selectiondag"
103
104static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
105 cl::Hidden, cl::init(true),
106 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
107
108static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
109 cl::desc("Number limit for gluing ld/st of memcpy."),
110 cl::Hidden, cl::init(0));
111
113 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
114 cl::desc("DAG combiner limit number of steps when searching DAG "
115 "for predecessor nodes"));
116
118 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
119}
120
122
123//===----------------------------------------------------------------------===//
124// ConstantFPSDNode Class
125//===----------------------------------------------------------------------===//
126
127/// isExactlyValue - We don't rely on operator== working on double values, as
128/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
129/// As such, this method can be used to do an exact bit-for-bit comparison of
130/// two floating point values.
132 return getValueAPF().bitwiseIsEqual(V);
133}
134
136 const APFloat& Val) {
137 assert(VT.isFloatingPoint() && "Can only convert between FP types");
138
139 // convert modifies in place, so make a copy.
140 APFloat Val2 = APFloat(Val);
141 bool losesInfo;
143 &losesInfo);
144 return !losesInfo;
145}
146
147//===----------------------------------------------------------------------===//
148// ISD Namespace
149//===----------------------------------------------------------------------===//
150
151bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
152 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
153 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
154 unsigned EltSize =
155 N->getValueType(0).getVectorElementType().getSizeInBits();
156 SplatVal = OptAPInt->trunc(EltSize);
157 return true;
158 }
159 }
160
161 auto *BV = dyn_cast<BuildVectorSDNode>(N);
162 if (!BV)
163 return false;
164
165 APInt SplatUndef;
166 unsigned SplatBitSize;
167 bool HasUndefs;
168 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
169 // Endianness does not matter here. We are checking for a splat given the
170 // element size of the vector, and if we find such a splat for little endian
171 // layout, then that should be valid also for big endian (as the full vector
172 // size is known to be a multiple of the element size).
173 const bool IsBigEndian = false;
174 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
175 EltSize, IsBigEndian) &&
176 EltSize == SplatBitSize;
177}
178
179// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
180// specializations of the more general isConstantSplatVector()?
181
182bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
183 // Look through a bit convert.
184 while (N->getOpcode() == ISD::BITCAST)
185 N = N->getOperand(0).getNode();
186
187 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
188 APInt SplatVal;
189 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
190 }
191
192 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
193
194 unsigned i = 0, e = N->getNumOperands();
195
196 // Skip over all of the undef values.
197 while (i != e && N->getOperand(i).isUndef())
198 ++i;
199
200 // Do not accept an all-undef vector.
201 if (i == e) return false;
202
203 // Do not accept build_vectors that aren't all constants or which have non-~0
204 // elements. We have to be a bit careful here, as the type of the constant
205 // may not be the same as the type of the vector elements due to type
206 // legalization (the elements are promoted to a legal type for the target and
207 // a vector of a type may be legal when the base element type is not).
208 // We only want to check enough bits to cover the vector elements, because
209 // we care if the resultant vector is all ones, not whether the individual
210 // constants are.
211 SDValue NotZero = N->getOperand(i);
212 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
213 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
214 if (OptAPInt->countr_one() < EltSize)
215 return false;
216 } else
217 return false;
218
219 // Okay, we have at least one ~0 value, check to see if the rest match or are
220 // undefs. Even with the above element type twiddling, this should be OK, as
221 // the same type legalization should have applied to all the elements.
222 for (++i; i != e; ++i)
223 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
224 return false;
225 return true;
226}
227
228bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
229 // Look through a bit convert.
230 while (N->getOpcode() == ISD::BITCAST)
231 N = N->getOperand(0).getNode();
232
233 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
234 APInt SplatVal;
235 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
236 }
237
238 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
239
240 bool IsAllUndef = true;
241 for (const SDValue &Op : N->op_values()) {
242 if (Op.isUndef())
243 continue;
244 IsAllUndef = false;
245 // Do not accept build_vectors that aren't all constants or which have non-0
246 // elements. We have to be a bit careful here, as the type of the constant
247 // may not be the same as the type of the vector elements due to type
248 // legalization (the elements are promoted to a legal type for the target
249 // and a vector of a type may be legal when the base element type is not).
250 // We only want to check enough bits to cover the vector elements, because
251 // we care if the resultant vector is all zeros, not whether the individual
252 // constants are.
253 if (auto OptAPInt = Op->bitcastToAPInt()) {
254 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
255 if (OptAPInt->countr_zero() < EltSize)
256 return false;
257 } else
258 return false;
259 }
260
261 // Do not accept an all-undef vector.
262 if (IsAllUndef)
263 return false;
264 return true;
265}
266
268 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
269}
270
272 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
273}
274
276 if (N->getOpcode() != ISD::BUILD_VECTOR)
277 return false;
278
279 for (const SDValue &Op : N->op_values()) {
280 if (Op.isUndef())
281 continue;
283 return false;
284 }
285 return true;
286}
287
289 if (N->getOpcode() != ISD::BUILD_VECTOR)
290 return false;
291
292 for (const SDValue &Op : N->op_values()) {
293 if (Op.isUndef())
294 continue;
296 return false;
297 }
298 return true;
299}
300
301bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
302 bool Signed) {
303 assert(N->getValueType(0).isVector() && "Expected a vector!");
304
305 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
306 if (EltSize <= NewEltSize)
307 return false;
308
309 if (N->getOpcode() == ISD::ZERO_EXTEND) {
310 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
311 NewEltSize) &&
312 !Signed;
313 }
314 if (N->getOpcode() == ISD::SIGN_EXTEND) {
315 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
316 NewEltSize) &&
317 Signed;
318 }
319 if (N->getOpcode() != ISD::BUILD_VECTOR)
320 return false;
321
322 for (const SDValue &Op : N->op_values()) {
323 if (Op.isUndef())
324 continue;
326 return false;
327
328 APInt C = Op->getAsAPIntVal().trunc(EltSize);
329 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
330 return false;
331 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
332 return false;
333 }
334
335 return true;
336}
337
339 // Return false if the node has no operands.
340 // This is "logically inconsistent" with the definition of "all" but
341 // is probably the desired behavior.
342 if (N->getNumOperands() == 0)
343 return false;
344 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
345}
346
348 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
349}
350
351template <typename ConstNodeType>
353 std::function<bool(ConstNodeType *)> Match,
354 bool AllowUndefs, bool AllowTruncation) {
355 // FIXME: Add support for scalar UNDEF cases?
356 if (auto *C = dyn_cast<ConstNodeType>(Op))
357 return Match(C);
358
359 // FIXME: Add support for vector UNDEF cases?
360 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
361 ISD::SPLAT_VECTOR != Op.getOpcode())
362 return false;
363
364 EVT SVT = Op.getValueType().getScalarType();
365 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
366 if (AllowUndefs && Op.getOperand(i).isUndef()) {
367 if (!Match(nullptr))
368 return false;
369 continue;
370 }
371
372 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
373 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
374 !Match(Cst))
375 return false;
376 }
377 return true;
378}
379// Build used template types.
381 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
383 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
384
386 SDValue LHS, SDValue RHS,
387 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
388 bool AllowUndefs, bool AllowTypeMismatch) {
389 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
390 return false;
391
392 // TODO: Add support for scalar UNDEF cases?
393 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
394 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
395 return Match(LHSCst, RHSCst);
396
397 // TODO: Add support for vector UNDEF cases?
398 if (LHS.getOpcode() != RHS.getOpcode() ||
399 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
400 LHS.getOpcode() != ISD::SPLAT_VECTOR))
401 return false;
402
403 EVT SVT = LHS.getValueType().getScalarType();
404 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
405 SDValue LHSOp = LHS.getOperand(i);
406 SDValue RHSOp = RHS.getOperand(i);
407 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
408 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
409 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
410 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
411 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
412 return false;
413 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
414 LHSOp.getValueType() != RHSOp.getValueType()))
415 return false;
416 if (!Match(LHSCst, RHSCst))
417 return false;
418 }
419 return true;
420}
421
423 switch (MinMaxOpc) {
424 default:
425 llvm_unreachable("unrecognized opcode");
426 case ISD::UMIN:
427 return ISD::UMAX;
428 case ISD::UMAX:
429 return ISD::UMIN;
430 case ISD::SMIN:
431 return ISD::SMAX;
432 case ISD::SMAX:
433 return ISD::SMIN;
434 }
435}
436
438 switch (MinMaxOpc) {
439 default:
440 llvm_unreachable("unrecognized min/max opcode");
441 case ISD::SMIN:
442 return ISD::UMIN;
443 case ISD::SMAX:
444 return ISD::UMAX;
445 case ISD::UMIN:
446 return ISD::SMIN;
447 case ISD::UMAX:
448 return ISD::SMAX;
449 }
450}
451
453 switch (VecReduceOpcode) {
454 default:
455 llvm_unreachable("Expected VECREDUCE opcode");
458 case ISD::VP_REDUCE_FADD:
459 case ISD::VP_REDUCE_SEQ_FADD:
460 return ISD::FADD;
463 case ISD::VP_REDUCE_FMUL:
464 case ISD::VP_REDUCE_SEQ_FMUL:
465 return ISD::FMUL;
467 case ISD::VP_REDUCE_ADD:
468 return ISD::ADD;
470 case ISD::VP_REDUCE_MUL:
471 return ISD::MUL;
473 case ISD::VP_REDUCE_AND:
474 return ISD::AND;
476 case ISD::VP_REDUCE_OR:
477 return ISD::OR;
479 case ISD::VP_REDUCE_XOR:
480 return ISD::XOR;
482 case ISD::VP_REDUCE_SMAX:
483 return ISD::SMAX;
485 case ISD::VP_REDUCE_SMIN:
486 return ISD::SMIN;
488 case ISD::VP_REDUCE_UMAX:
489 return ISD::UMAX;
491 case ISD::VP_REDUCE_UMIN:
492 return ISD::UMIN;
494 case ISD::VP_REDUCE_FMAX:
495 return ISD::FMAXNUM;
497 case ISD::VP_REDUCE_FMIN:
498 return ISD::FMINNUM;
500 case ISD::VP_REDUCE_FMAXIMUM:
501 return ISD::FMAXIMUM;
503 case ISD::VP_REDUCE_FMINIMUM:
504 return ISD::FMINIMUM;
505 }
506}
507
509 switch (MaskedOpc) {
510 case ISD::MASKED_UDIV:
511 return ISD::UDIV;
512 case ISD::MASKED_SDIV:
513 return ISD::SDIV;
514 case ISD::MASKED_UREM:
515 return ISD::UREM;
516 case ISD::MASKED_SREM:
517 return ISD::SREM;
518 default:
519 llvm_unreachable("Expected masked binop opcode");
520 }
521}
522
523bool ISD::isVPOpcode(unsigned Opcode) {
524 switch (Opcode) {
525 default:
526 return false;
527#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
528 case ISD::VPSD: \
529 return true;
530#include "llvm/IR/VPIntrinsics.def"
531 }
532}
533
534bool ISD::isVPBinaryOp(unsigned Opcode) {
535 switch (Opcode) {
536 default:
537 break;
538#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
539#define VP_PROPERTY_BINARYOP return true;
540#define END_REGISTER_VP_SDNODE(VPSD) break;
541#include "llvm/IR/VPIntrinsics.def"
542 }
543 return false;
544}
545
546bool ISD::isVPReduction(unsigned Opcode) {
547 switch (Opcode) {
548 default:
549 return false;
550 case ISD::VP_REDUCE_ADD:
551 case ISD::VP_REDUCE_MUL:
552 case ISD::VP_REDUCE_AND:
553 case ISD::VP_REDUCE_OR:
554 case ISD::VP_REDUCE_XOR:
555 case ISD::VP_REDUCE_SMAX:
556 case ISD::VP_REDUCE_SMIN:
557 case ISD::VP_REDUCE_UMAX:
558 case ISD::VP_REDUCE_UMIN:
559 case ISD::VP_REDUCE_FMAX:
560 case ISD::VP_REDUCE_FMIN:
561 case ISD::VP_REDUCE_FMAXIMUM:
562 case ISD::VP_REDUCE_FMINIMUM:
563 case ISD::VP_REDUCE_FADD:
564 case ISD::VP_REDUCE_FMUL:
565 case ISD::VP_REDUCE_SEQ_FADD:
566 case ISD::VP_REDUCE_SEQ_FMUL:
567 return true;
568 }
569}
570
571/// The operand position of the vector mask.
572std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
573 switch (Opcode) {
574 default:
575 return std::nullopt;
576#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
577 case ISD::VPSD: \
578 return MASKPOS;
579#include "llvm/IR/VPIntrinsics.def"
580 }
581}
582
583/// The operand position of the explicit vector length parameter.
584std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
585 switch (Opcode) {
586 default:
587 return std::nullopt;
588#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
589 case ISD::VPSD: \
590 return EVLPOS;
591#include "llvm/IR/VPIntrinsics.def"
592 }
593}
594
595std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
596 bool hasFPExcept) {
597 // FIXME: Return strict opcodes in case of fp exceptions.
598 switch (VPOpcode) {
599 default:
600 return std::nullopt;
601#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
602#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
603#define END_REGISTER_VP_SDNODE(VPOPC) break;
604#include "llvm/IR/VPIntrinsics.def"
605 }
606 return std::nullopt;
607}
608
609std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
610 switch (Opcode) {
611 default:
612 return std::nullopt;
613#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
614#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
615#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
616#include "llvm/IR/VPIntrinsics.def"
617 }
618}
619
621 switch (ExtType) {
622 case ISD::EXTLOAD:
623 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
624 case ISD::SEXTLOAD:
625 return ISD::SIGN_EXTEND;
626 case ISD::ZEXTLOAD:
627 return ISD::ZERO_EXTEND;
628 default:
629 break;
630 }
631
632 llvm_unreachable("Invalid LoadExtType");
633}
634
636 // To perform this operation, we just need to swap the L and G bits of the
637 // operation.
638 unsigned OldL = (Operation >> 2) & 1;
639 unsigned OldG = (Operation >> 1) & 1;
640 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
641 (OldL << 1) | // New G bit
642 (OldG << 2)); // New L bit.
643}
644
646 unsigned Operation = Op;
647 if (isIntegerLike)
648 Operation ^= 7; // Flip L, G, E bits, but not U.
649 else
650 Operation ^= 15; // Flip all of the condition bits.
651
653 Operation &= ~8; // Don't let N and U bits get set.
654
655 return ISD::CondCode(Operation);
656}
657
661
663 bool isIntegerLike) {
664 return getSetCCInverseImpl(Op, isIntegerLike);
665}
666
667/// For an integer comparison, return 1 if the comparison is a signed operation
668/// and 2 if the result is an unsigned comparison. Return zero if the operation
669/// does not depend on the sign of the input (setne and seteq).
670static int isSignedOp(ISD::CondCode Opcode) {
671 switch (Opcode) {
672 default: llvm_unreachable("Illegal integer setcc operation!");
673 case ISD::SETEQ:
674 case ISD::SETNE: return 0;
675 case ISD::SETLT:
676 case ISD::SETLE:
677 case ISD::SETGT:
678 case ISD::SETGE: return 1;
679 case ISD::SETULT:
680 case ISD::SETULE:
681 case ISD::SETUGT:
682 case ISD::SETUGE: return 2;
683 }
684}
685
687 EVT Type) {
688 bool IsInteger = Type.isInteger();
689 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
690 // Cannot fold a signed integer setcc with an unsigned integer setcc.
691 return ISD::SETCC_INVALID;
692
693 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
694
695 // If the N and U bits get set, then the resultant comparison DOES suddenly
696 // care about orderedness, and it is true when ordered.
697 if (Op > ISD::SETTRUE2)
698 Op &= ~16; // Clear the U bit if the N bit is set.
699
700 // Canonicalize illegal integer setcc's.
701 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
702 Op = ISD::SETNE;
703
704 return ISD::CondCode(Op);
705}
706
708 EVT Type) {
709 bool IsInteger = Type.isInteger();
710 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
711 // Cannot fold a signed setcc with an unsigned setcc.
712 return ISD::SETCC_INVALID;
713
714 // Combine all of the condition bits.
715 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
716
717 // Canonicalize illegal integer setcc's.
718 if (IsInteger) {
719 switch (Result) {
720 default: break;
721 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
722 case ISD::SETOEQ: // SETEQ & SETU[LG]E
723 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
724 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
725 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
726 }
727 }
728
729 return Result;
730}
731
732//===----------------------------------------------------------------------===//
733// SDNode Profile Support
734//===----------------------------------------------------------------------===//
735
736/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
737static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
738 ID.AddInteger(OpC);
739}
740
741/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
742/// solely with their pointer.
744 ID.AddPointer(VTList.VTs);
745}
746
747/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
750 for (const auto &Op : Ops) {
751 ID.AddPointer(Op.getNode());
752 ID.AddInteger(Op.getResNo());
753 }
754}
755
756/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
759 for (const auto &Op : Ops) {
760 ID.AddPointer(Op.getNode());
761 ID.AddInteger(Op.getResNo());
762 }
763}
764
765static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
766 SDVTList VTList, ArrayRef<SDValue> OpList) {
767 AddNodeIDOpcode(ID, OpC);
768 AddNodeIDValueTypes(ID, VTList);
769 AddNodeIDOperands(ID, OpList);
770}
771
772/// If this is an SDNode with special info, add this info to the NodeID data.
774 switch (N->getOpcode()) {
777 case ISD::MCSymbol:
778 llvm_unreachable("Should only be used on nodes with operands");
779 default: break; // Normal nodes don't need extra info.
781 case ISD::Constant: {
783 ID.AddPointer(C->getConstantIntValue());
784 ID.AddBoolean(C->isOpaque());
785 break;
786 }
788 case ISD::ConstantFP:
789 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
790 break;
796 ID.AddPointer(GA->getGlobal());
797 ID.AddInteger(GA->getOffset());
798 ID.AddInteger(GA->getTargetFlags());
799 break;
800 }
801 case ISD::BasicBlock:
803 break;
804 case ISD::Register:
805 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
806 break;
808 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
809 break;
810 case ISD::SRCVALUE:
811 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
812 break;
813 case ISD::FrameIndex:
815 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
816 break;
818 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
819 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
820 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
821 break;
822 case ISD::JumpTable:
824 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
825 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
826 break;
830 ID.AddInteger(CP->getAlign().value());
831 ID.AddInteger(CP->getOffset());
834 else
835 ID.AddPointer(CP->getConstVal());
836 ID.AddInteger(CP->getTargetFlags());
837 break;
838 }
839 case ISD::TargetIndex: {
841 ID.AddInteger(TI->getIndex());
842 ID.AddInteger(TI->getOffset());
843 ID.AddInteger(TI->getTargetFlags());
844 break;
845 }
846 case ISD::LOAD: {
847 const LoadSDNode *LD = cast<LoadSDNode>(N);
848 ID.AddInteger(LD->getMemoryVT().getRawBits());
849 ID.AddInteger(LD->getRawSubclassData());
850 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(LD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::STORE: {
855 const StoreSDNode *ST = cast<StoreSDNode>(N);
856 ID.AddInteger(ST->getMemoryVT().getRawBits());
857 ID.AddInteger(ST->getRawSubclassData());
858 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
859 ID.AddInteger(ST->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_LOAD: {
863 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
864 ID.AddInteger(ELD->getMemoryVT().getRawBits());
865 ID.AddInteger(ELD->getRawSubclassData());
866 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
867 ID.AddInteger(ELD->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::VP_LOAD_FF: {
871 const auto *LD = cast<VPLoadFFSDNode>(N);
872 ID.AddInteger(LD->getMemoryVT().getRawBits());
873 ID.AddInteger(LD->getRawSubclassData());
874 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
875 ID.AddInteger(LD->getMemOperand()->getFlags());
876 break;
877 }
878 case ISD::VP_STORE: {
879 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
880 ID.AddInteger(EST->getMemoryVT().getRawBits());
881 ID.AddInteger(EST->getRawSubclassData());
882 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
883 ID.AddInteger(EST->getMemOperand()->getFlags());
884 break;
885 }
886 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
888 ID.AddInteger(SLD->getMemoryVT().getRawBits());
889 ID.AddInteger(SLD->getRawSubclassData());
890 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
891 break;
892 }
893 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
895 ID.AddInteger(SST->getMemoryVT().getRawBits());
896 ID.AddInteger(SST->getRawSubclassData());
897 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
898 break;
899 }
900 case ISD::VP_GATHER: {
902 ID.AddInteger(EG->getMemoryVT().getRawBits());
903 ID.AddInteger(EG->getRawSubclassData());
904 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
905 ID.AddInteger(EG->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::VP_SCATTER: {
910 ID.AddInteger(ES->getMemoryVT().getRawBits());
911 ID.AddInteger(ES->getRawSubclassData());
912 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
913 ID.AddInteger(ES->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MLOAD: {
918 ID.AddInteger(MLD->getMemoryVT().getRawBits());
919 ID.AddInteger(MLD->getRawSubclassData());
920 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MLD->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSTORE: {
926 ID.AddInteger(MST->getMemoryVT().getRawBits());
927 ID.AddInteger(MST->getRawSubclassData());
928 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MST->getMemOperand()->getFlags());
930 break;
931 }
932 case ISD::MGATHER: {
934 ID.AddInteger(MG->getMemoryVT().getRawBits());
935 ID.AddInteger(MG->getRawSubclassData());
936 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
937 ID.AddInteger(MG->getMemOperand()->getFlags());
938 break;
939 }
940 case ISD::MSCATTER: {
942 ID.AddInteger(MS->getMemoryVT().getRawBits());
943 ID.AddInteger(MS->getRawSubclassData());
944 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
945 ID.AddInteger(MS->getMemOperand()->getFlags());
946 break;
947 }
950 case ISD::ATOMIC_SWAP:
962 case ISD::ATOMIC_LOAD:
963 case ISD::ATOMIC_STORE: {
964 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
965 ID.AddInteger(AT->getMemoryVT().getRawBits());
966 ID.AddInteger(AT->getRawSubclassData());
967 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
968 ID.AddInteger(AT->getMemOperand()->getFlags());
969 break;
970 }
971 case ISD::VECTOR_SHUFFLE: {
972 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
973 for (int M : Mask)
974 ID.AddInteger(M);
975 break;
976 }
977 case ISD::ADDRSPACECAST: {
979 ID.AddInteger(ASC->getSrcAddressSpace());
980 ID.AddInteger(ASC->getDestAddressSpace());
981 break;
982 }
984 case ISD::BlockAddress: {
986 ID.AddPointer(BA->getBlockAddress());
987 ID.AddInteger(BA->getOffset());
988 ID.AddInteger(BA->getTargetFlags());
989 break;
990 }
991 case ISD::AssertAlign:
992 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
993 break;
994 case ISD::PREFETCH:
997 // Handled by MemIntrinsicSDNode check after the switch.
998 break;
1000 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
1001 break;
1002 } // end switch (N->getOpcode())
1003
1004 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
1005 // to check.
1006 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
1007 ID.AddInteger(MN->getRawSubclassData());
1008 ID.AddInteger(MN->getMemoryVT().getRawBits());
1009 for (const MachineMemOperand *MMO : MN->memoperands()) {
1010 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
1011 ID.AddInteger(MMO->getFlags());
1012 }
1013 }
1014}
1015
1016/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1017/// data.
1019 AddNodeIDOpcode(ID, N->getOpcode());
1020 // Add the return value info.
1021 AddNodeIDValueTypes(ID, N->getVTList());
1022 // Add the operand info.
1023 AddNodeIDOperands(ID, N->ops());
1024
1025 // Handle SDNode leafs with special info.
1027}
1028
1029//===----------------------------------------------------------------------===//
1030// SelectionDAG Class
1031//===----------------------------------------------------------------------===//
1032
1033/// doNotCSE - Return true if CSE should not be performed for this node.
1034static bool doNotCSE(SDNode *N) {
1035 if (N->getValueType(0) == MVT::Glue)
1036 return true; // Never CSE anything that produces a glue result.
1037
1038 switch (N->getOpcode()) {
1039 default: break;
1040 case ISD::HANDLENODE:
1041 case ISD::EH_LABEL:
1042 return true; // Never CSE these nodes.
1043 }
1044
1045 // Check that remaining values produced are not flags.
1046 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1047 if (N->getValueType(i) == MVT::Glue)
1048 return true; // Never CSE anything that produces a glue result.
1049
1050 return false;
1051}
1052
1053/// Construct a DemandedElts mask which demands all elements of \p V.
1054/// If \p V is not a fixed-length vector, then this will return a single bit.
1056 EVT VT = V.getValueType();
1057 // Since the number of lanes in a scalable vector is unknown at compile time,
1058 // we track one bit which is implicitly broadcast to all lanes. This means
1059 // that all lanes in a scalable vector are considered demanded.
1061 : APInt(1, 1);
1062}
1063
1064/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1065/// SelectionDAG.
1067 // Create a dummy node (which is not added to allnodes), that adds a reference
1068 // to the root node, preventing it from being deleted.
1069 HandleSDNode Dummy(getRoot());
1070
1071 SmallVector<SDNode*, 128> DeadNodes;
1072
1073 // Add all obviously-dead nodes to the DeadNodes worklist.
1074 for (SDNode &Node : allnodes())
1075 if (Node.use_empty())
1076 DeadNodes.push_back(&Node);
1077
1078 RemoveDeadNodes(DeadNodes);
1079
1080 // If the root changed (e.g. it was a dead load, update the root).
1081 setRoot(Dummy.getValue());
1082}
1083
1084/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1085/// given list, and any nodes that become unreachable as a result.
1087
1088 // Process the worklist, deleting the nodes and adding their uses to the
1089 // worklist.
1090 while (!DeadNodes.empty()) {
1091 SDNode *N = DeadNodes.pop_back_val();
1092 // Skip to next node if we've already managed to delete the node. This could
1093 // happen if replacing a node causes a node previously added to the node to
1094 // be deleted.
1095 if (N->getOpcode() == ISD::DELETED_NODE)
1096 continue;
1097
1098 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1099 DUL->NodeDeleted(N, nullptr);
1100
1101 // Take the node out of the appropriate CSE map.
1102 RemoveNodeFromCSEMaps(N);
1103
1104 // Next, brutally remove the operand list. This is safe to do, as there are
1105 // no cycles in the graph.
1106 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1107 SDUse &Use = *I++;
1108 SDNode *Operand = Use.getNode();
1109 Use.set(SDValue());
1110
1111 // Now that we removed this operand, see if there are no uses of it left.
1112 if (Operand->use_empty())
1113 DeadNodes.push_back(Operand);
1114 }
1115
1116 DeallocateNode(N);
1117 }
1118}
1119
1121 SmallVector<SDNode*, 16> DeadNodes(1, N);
1122
1123 // Create a dummy node that adds a reference to the root node, preventing
1124 // it from being deleted. (This matters if the root is an operand of the
1125 // dead node.)
1126 HandleSDNode Dummy(getRoot());
1127
1128 RemoveDeadNodes(DeadNodes);
1129}
1130
1132 // First take this out of the appropriate CSE map.
1133 RemoveNodeFromCSEMaps(N);
1134
1135 // Finally, remove uses due to operands of this node, remove from the
1136 // AllNodes list, and delete the node.
1137 DeleteNodeNotInCSEMaps(N);
1138}
1139
1140void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1141 assert(N->getIterator() != AllNodes.begin() &&
1142 "Cannot delete the entry node!");
1143 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1144
1145 // Drop all of the operands and decrement used node's use counts.
1146 N->DropOperands();
1147
1148 DeallocateNode(N);
1149}
1150
1151void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1152 assert(!(V->isVariadic() && isParameter));
1153 if (isParameter)
1154 ByvalParmDbgValues.push_back(V);
1155 else
1156 DbgValues.push_back(V);
1157 for (const SDNode *Node : V->getSDNodes())
1158 if (Node)
1159 DbgValMap[Node].push_back(V);
1160}
1161
1163 DbgValMapType::iterator I = DbgValMap.find(Node);
1164 if (I == DbgValMap.end())
1165 return;
1166 for (auto &Val: I->second)
1167 Val->setIsInvalidated();
1168 DbgValMap.erase(I);
1169}
1170
1171void SelectionDAG::DeallocateNode(SDNode *N) {
1172 // If we have operands, deallocate them.
1174
1175 NodeAllocator.Deallocate(AllNodes.remove(N));
1176
1177 // Set the opcode to DELETED_NODE to help catch bugs when node
1178 // memory is reallocated.
1179 // FIXME: There are places in SDag that have grown a dependency on the opcode
1180 // value in the released node.
1181 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1182 N->NodeType = ISD::DELETED_NODE;
1183
1184 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1185 // them and forget about that node.
1186 DbgInfo->erase(N);
1187
1188 // Invalidate extra info.
1189 SDEI.erase(N);
1190}
1191
1192#ifndef NDEBUG
1193/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1194void SelectionDAG::verifyNode(SDNode *N) const {
1195 switch (N->getOpcode()) {
1196 default:
1197 if (N->isTargetOpcode())
1199 break;
1200 case ISD::BUILD_PAIR: {
1201 EVT VT = N->getValueType(0);
1202 assert(N->getNumValues() == 1 && "Too many results!");
1203 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1204 "Wrong return type!");
1205 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1206 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1207 "Mismatched operand types!");
1208 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1209 "Wrong operand type!");
1210 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1211 "Wrong return type size");
1212 break;
1213 }
1214 case ISD::BUILD_VECTOR: {
1215 assert(N->getNumValues() == 1 && "Too many results!");
1216 assert(N->getValueType(0).isVector() && "Wrong return type!");
1217 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1218 "Wrong number of operands!");
1219 EVT EltVT = N->getValueType(0).getVectorElementType();
1220 for (const SDUse &Op : N->ops()) {
1221 assert((Op.getValueType() == EltVT ||
1222 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1223 EltVT.bitsLE(Op.getValueType()))) &&
1224 "Wrong operand type!");
1225 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1226 "Operands must all have the same type");
1227 }
1228 break;
1229 }
1230 case ISD::SADDO:
1231 case ISD::UADDO:
1232 case ISD::SSUBO:
1233 case ISD::USUBO:
1234 assert(N->getNumValues() == 2 && "Wrong number of results!");
1235 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1236 "Invalid add/sub overflow op!");
1237 assert(N->getVTList().VTs[0].isInteger() &&
1238 N->getVTList().VTs[1].isInteger() &&
1239 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1240 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1241 "Binary operator types must match!");
1242 break;
1243 }
1244}
1245#endif // NDEBUG
1246
1247/// Insert a newly allocated node into the DAG.
1248///
1249/// Handles insertion into the all nodes list and CSE map, as well as
1250/// verification and other common operations when a new node is allocated.
1251void SelectionDAG::InsertNode(SDNode *N) {
1252 AllNodes.push_back(N);
1253#ifndef NDEBUG
1254 N->PersistentId = NextPersistentId++;
1255 verifyNode(N);
1256#endif
1257 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1258 DUL->NodeInserted(N);
1259}
1260
1261/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1262/// correspond to it. This is useful when we're about to delete or repurpose
1263/// the node. We don't want future request for structurally identical nodes
1264/// to return N anymore.
1265bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1266 bool Erased = false;
1267 switch (N->getOpcode()) {
1268 case ISD::HANDLENODE: return false; // noop.
1269 case ISD::CONDCODE:
1270 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1271 "Cond code doesn't exist!");
1272 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1273 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1274 break;
1276 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1277 break;
1279 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1280 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1281 ESN->getSymbol(), ESN->getTargetFlags()));
1282 break;
1283 }
1284 case ISD::MCSymbol: {
1285 auto *MCSN = cast<MCSymbolSDNode>(N);
1286 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1287 break;
1288 }
1289 case ISD::VALUETYPE: {
1290 EVT VT = cast<VTSDNode>(N)->getVT();
1291 if (VT.isExtended()) {
1292 Erased = ExtendedValueTypeNodes.erase(VT);
1293 } else {
1294 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1295 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1296 }
1297 break;
1298 }
1299 default:
1300 // Remove it from the CSE Map.
1301 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1302 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1303 Erased = CSEMap.RemoveNode(N);
1304 break;
1305 }
1306#ifndef NDEBUG
1307 // Verify that the node was actually in one of the CSE maps, unless it has a
1308 // glue result (which cannot be CSE'd) or is one of the special cases that are
1309 // not subject to CSE.
1310 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1311 !N->isMachineOpcode() && !doNotCSE(N)) {
1312 N->dump(this);
1313 dbgs() << "\n";
1314 llvm_unreachable("Node is not in map!");
1315 }
1316#endif
1317 return Erased;
1318}
1319
1320/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1321/// maps and modified in place. Add it back to the CSE maps, unless an identical
1322/// node already exists, in which case transfer all its users to the existing
1323/// node. This transfer can potentially trigger recursive merging.
1324void
1325SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1326 // For node types that aren't CSE'd, just act as if no identical node
1327 // already exists.
1328 if (!doNotCSE(N)) {
1329 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1330 if (Existing != N) {
1331 // If there was already an existing matching node, use ReplaceAllUsesWith
1332 // to replace the dead one with the existing one. This can cause
1333 // recursive merging of other unrelated nodes down the line.
1334 Existing->intersectFlagsWith(N->getFlags());
1335 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1336 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1337 ReplaceAllUsesWith(N, Existing);
1338
1339 // N is now dead. Inform the listeners and delete it.
1340 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1341 DUL->NodeDeleted(N, Existing);
1342 DeleteNodeNotInCSEMaps(N);
1343 return;
1344 }
1345 }
1346
1347 // If the node doesn't already exist, we updated it. Inform listeners.
1348 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1349 DUL->NodeUpdated(N);
1350}
1351
1352/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1353/// were replaced with those specified. If this node is never memoized,
1354/// return null, otherwise return a pointer to the slot it would take. If a
1355/// node already exists with these operands, the slot will be non-null.
1356SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1357 void *&InsertPos) {
1358 if (doNotCSE(N))
1359 return nullptr;
1360
1361 SDValue Ops[] = { Op };
1362 FoldingSetNodeID ID;
1363 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1365 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1366 if (Node)
1367 Node->intersectFlagsWith(N->getFlags());
1368 return Node;
1369}
1370
1371/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1372/// were replaced with those specified. If this node is never memoized,
1373/// return null, otherwise return a pointer to the slot it would take. If a
1374/// node already exists with these operands, the slot will be non-null.
1375SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1376 SDValue Op1, SDValue Op2,
1377 void *&InsertPos) {
1378 if (doNotCSE(N))
1379 return nullptr;
1380
1381 SDValue Ops[] = { Op1, Op2 };
1382 FoldingSetNodeID ID;
1383 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1385 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1386 if (Node)
1387 Node->intersectFlagsWith(N->getFlags());
1388 return Node;
1389}
1390
1391/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1392/// were replaced with those specified. If this node is never memoized,
1393/// return null, otherwise return a pointer to the slot it would take. If a
1394/// node already exists with these operands, the slot will be non-null.
1395SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1396 void *&InsertPos) {
1397 if (doNotCSE(N))
1398 return nullptr;
1399
1400 FoldingSetNodeID ID;
1401 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1403 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1404 if (Node)
1405 Node->intersectFlagsWith(N->getFlags());
1406 return Node;
1407}
1408
1410 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1411 : VT.getTypeForEVT(*getContext());
1412
1413 return getDataLayout().getABITypeAlign(Ty);
1414}
1415
1416// EntryNode could meaningfully have debug info if we can find it...
1418 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1419 getVTList(MVT::Other, MVT::Glue)),
1420 Root(getEntryNode()) {
1421 InsertNode(&EntryNode);
1422 DbgInfo = new SDDbgInfo();
1423}
1424
1426 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1427 const TargetLibraryInfo *LibraryInfo,
1428 const LibcallLoweringInfo *LibcallsInfo,
1429 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1431 FunctionVarLocs const *VarLocs) {
1432 MF = &NewMF;
1433 SDAGISelPass = PassPtr;
1434 ORE = &NewORE;
1437 LibInfo = LibraryInfo;
1438 Libcalls = LibcallsInfo;
1439 Context = &MF->getFunction().getContext();
1440 UA = NewUA;
1441 PSI = PSIin;
1442 BFI = BFIin;
1443 MMI = &MMIin;
1444 FnVarLocs = VarLocs;
1445}
1446
1448 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1449 allnodes_clear();
1450 OperandRecycler.clear(OperandAllocator);
1451 delete DbgInfo;
1452}
1453
1455 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1456}
1457
1458void SelectionDAG::allnodes_clear() {
1459 assert(&*AllNodes.begin() == &EntryNode);
1460 AllNodes.remove(AllNodes.begin());
1461 while (!AllNodes.empty())
1462 DeallocateNode(&AllNodes.front());
1463#ifndef NDEBUG
1464 NextPersistentId = 0;
1465#endif
1466}
1467
1468SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1469 void *&InsertPos) {
1470 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1471 if (N) {
1472 switch (N->getOpcode()) {
1473 default: break;
1474 case ISD::Constant:
1475 case ISD::ConstantFP:
1476 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1477 "debug location. Use another overload.");
1478 }
1479 }
1480 return N;
1481}
1482
1483SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1484 const SDLoc &DL, void *&InsertPos) {
1485 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1486 if (N) {
1487 switch (N->getOpcode()) {
1488 case ISD::Constant:
1489 case ISD::ConstantFP:
1490 // Erase debug location from the node if the node is used at several
1491 // different places. Do not propagate one location to all uses as it
1492 // will cause a worse single stepping debugging experience.
1493 if (N->getDebugLoc() != DL.getDebugLoc())
1494 N->setDebugLoc(DebugLoc());
1495 break;
1496 default:
1497 // When the node's point of use is located earlier in the instruction
1498 // sequence than its prior point of use, update its debug info to the
1499 // earlier location.
1500 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1501 N->setDebugLoc(DL.getDebugLoc());
1502 break;
1503 }
1504 }
1505 return N;
1506}
1507
1509 allnodes_clear();
1510 OperandRecycler.clear(OperandAllocator);
1511 OperandAllocator.Reset();
1512 CSEMap.clear();
1513
1514 ExtendedValueTypeNodes.clear();
1515 ExternalSymbols.clear();
1516 TargetExternalSymbols.clear();
1517 MCSymbols.clear();
1518 SDEI.clear();
1519 llvm::fill(CondCodeNodes, nullptr);
1520 llvm::fill(ValueTypeNodes, nullptr);
1521
1522 EntryNode.UseList = nullptr;
1523 InsertNode(&EntryNode);
1524 Root = getEntryNode();
1525 DbgInfo->clear();
1526}
1527
1529 return VT.bitsGT(Op.getValueType())
1530 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1531 : getNode(ISD::FP_ROUND, DL, VT, Op,
1532 getIntPtrConstant(0, DL, /*isTarget=*/true));
1533}
1534
1535std::pair<SDValue, SDValue>
1537 const SDLoc &DL, EVT VT) {
1538 assert(!VT.bitsEq(Op.getValueType()) &&
1539 "Strict no-op FP extend/round not allowed.");
1540 SDValue Res =
1541 VT.bitsGT(Op.getValueType())
1542 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1543 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1544 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1545
1546 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1547}
1548
1550 return VT.bitsGT(Op.getValueType()) ?
1551 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1552 getNode(ISD::TRUNCATE, DL, VT, Op);
1553}
1554
1556 return VT.bitsGT(Op.getValueType()) ?
1557 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1558 getNode(ISD::TRUNCATE, DL, VT, Op);
1559}
1560
1562 return VT.bitsGT(Op.getValueType()) ?
1563 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1564 getNode(ISD::TRUNCATE, DL, VT, Op);
1565}
1566
1568 EVT VT) {
1569 assert(!VT.isVector());
1570 auto Type = Op.getValueType();
1571 SDValue DestOp;
1572 if (Type == VT)
1573 return Op;
1574 auto Size = Op.getValueSizeInBits();
1575 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1576 if (DestOp.getValueType() == VT)
1577 return DestOp;
1578
1579 return getAnyExtOrTrunc(DestOp, DL, VT);
1580}
1581
1583 EVT VT) {
1584 assert(!VT.isVector());
1585 auto Type = Op.getValueType();
1586 SDValue DestOp;
1587 if (Type == VT)
1588 return Op;
1589 auto Size = Op.getValueSizeInBits();
1590 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1591 if (DestOp.getValueType() == VT)
1592 return DestOp;
1593
1594 return getSExtOrTrunc(DestOp, DL, VT);
1595}
1596
1598 EVT VT) {
1599 assert(!VT.isVector());
1600 auto Type = Op.getValueType();
1601 SDValue DestOp;
1602 if (Type == VT)
1603 return Op;
1604 auto Size = Op.getValueSizeInBits();
1605 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1606 if (DestOp.getValueType() == VT)
1607 return DestOp;
1608
1609 return getZExtOrTrunc(DestOp, DL, VT);
1610}
1611
1613 EVT OpVT) {
1614 if (VT.bitsLE(Op.getValueType()))
1615 return getNode(ISD::TRUNCATE, SL, VT, Op);
1616
1617 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1618 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1619}
1620
1622 EVT OpVT = Op.getValueType();
1623 assert(VT.isInteger() && OpVT.isInteger() &&
1624 "Cannot getZeroExtendInReg FP types");
1625 assert(VT.isVector() == OpVT.isVector() &&
1626 "getZeroExtendInReg type should be vector iff the operand "
1627 "type is vector!");
1628 assert((!VT.isVector() ||
1630 "Vector element counts must match in getZeroExtendInReg");
1631 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1632 if (OpVT == VT)
1633 return Op;
1634 // TODO: Use computeKnownBits instead of AssertZext.
1635 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1636 ->getVT()
1637 .getScalarType()
1638 .bitsLE(VT.getScalarType()))
1639 return Op;
1641 VT.getScalarSizeInBits());
1642 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1643}
1644
1646 SDValue EVL, const SDLoc &DL,
1647 EVT VT) {
1648 EVT OpVT = Op.getValueType();
1649 assert(VT.isInteger() && OpVT.isInteger() &&
1650 "Cannot getVPZeroExtendInReg FP types");
1651 assert(VT.isVector() && OpVT.isVector() &&
1652 "getVPZeroExtendInReg type and operand type should be vector!");
1654 "Vector element counts must match in getZeroExtendInReg");
1655 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1656 if (OpVT == VT)
1657 return Op;
1659 VT.getScalarSizeInBits());
1660 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1661 EVL);
1662}
1663
1665 // Only unsigned pointer semantics are supported right now. In the future this
1666 // might delegate to TLI to check pointer signedness.
1667 return getZExtOrTrunc(Op, DL, VT);
1668}
1669
1671 // Only unsigned pointer semantics are supported right now. In the future this
1672 // might delegate to TLI to check pointer signedness.
1673 return getZeroExtendInReg(Op, DL, VT);
1674}
1675
1677 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1678}
1679
1680/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1682 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1683}
1684
1686 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1687 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1688}
1689
1691 SDValue Mask, SDValue EVL, EVT VT) {
1692 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1693 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1694}
1695
1697 SDValue Mask, SDValue EVL) {
1698 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1699}
1700
1702 SDValue Mask, SDValue EVL) {
1703 if (VT.bitsGT(Op.getValueType()))
1704 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1705 if (VT.bitsLT(Op.getValueType()))
1706 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1707 return Op;
1708}
1709
1711 EVT OpVT) {
1712 if (!V)
1713 return getConstant(0, DL, VT);
1714
1715 switch (TLI->getBooleanContents(OpVT)) {
1718 return getConstant(1, DL, VT);
1720 return getAllOnesConstant(DL, VT);
1721 }
1722 llvm_unreachable("Unexpected boolean content enum!");
1723}
1724
1726 bool isT, bool isO) {
1727 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1728 DL, VT, isT, isO);
1729}
1730
1732 bool isT, bool isO) {
1733 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1734}
1735
1737 EVT VT, bool isT, bool isO) {
1738 assert(VT.isInteger() && "Cannot create FP integer constant!");
1739
1740 EVT EltVT = VT.getScalarType();
1741 const ConstantInt *Elt = &Val;
1742
1743 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1744 // to-be-splatted scalar ConstantInt.
1745 if (isa<VectorType>(Elt->getType()))
1746 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1747
1748 // In some cases the vector type is legal but the element type is illegal and
1749 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1750 // inserted value (the type does not need to match the vector element type).
1751 // Any extra bits introduced will be truncated away.
1752 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1754 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1755 APInt NewVal;
1756 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1757 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1758 else
1759 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1760 Elt = ConstantInt::get(*getContext(), NewVal);
1761 }
1762 // In other cases the element type is illegal and needs to be expanded, for
1763 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1764 // the value into n parts and use a vector type with n-times the elements.
1765 // Then bitcast to the type requested.
1766 // Legalizing constants too early makes the DAGCombiner's job harder so we
1767 // only legalize if the DAG tells us we must produce legal types.
1768 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1769 TLI->getTypeAction(*getContext(), EltVT) ==
1771 const APInt &NewVal = Elt->getValue();
1772 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1773 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1774
1775 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1776 if (VT.isScalableVector() ||
1777 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1778 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1779 "Can only handle an even split!");
1780 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1781
1782 SmallVector<SDValue, 2> ScalarParts;
1783 for (unsigned i = 0; i != Parts; ++i)
1784 ScalarParts.push_back(getConstant(
1785 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1786 ViaEltVT, isT, isO));
1787
1788 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1789 }
1790
1791 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1792 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1793
1794 // Check the temporary vector is the correct size. If this fails then
1795 // getTypeToTransformTo() probably returned a type whose size (in bits)
1796 // isn't a power-of-2 factor of the requested type size.
1797 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1798
1799 SmallVector<SDValue, 2> EltParts;
1800 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1801 EltParts.push_back(getConstant(
1802 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1803 ViaEltVT, isT, isO));
1804
1805 // EltParts is currently in little endian order. If we actually want
1806 // big-endian order then reverse it now.
1807 if (getDataLayout().isBigEndian())
1808 std::reverse(EltParts.begin(), EltParts.end());
1809
1810 // The elements must be reversed when the element order is different
1811 // to the endianness of the elements (because the BITCAST is itself a
1812 // vector shuffle in this situation). However, we do not need any code to
1813 // perform this reversal because getConstant() is producing a vector
1814 // splat.
1815 // This situation occurs in MIPS MSA.
1816
1818 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1819 llvm::append_range(Ops, EltParts);
1820
1821 SDValue V =
1822 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1823 return V;
1824 }
1825
1826 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1827 "APInt size does not match type size!");
1828 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1829 SDVTList VTs = getVTList(EltVT);
1831 AddNodeIDNode(ID, Opc, VTs, {});
1832 ID.AddPointer(Elt);
1833 ID.AddBoolean(isO);
1834 void *IP = nullptr;
1835 SDNode *N = nullptr;
1836 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1837 if (!VT.isVector())
1838 return SDValue(N, 0);
1839
1840 if (!N) {
1841 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1842 if (!isT)
1843 N->setDebugLoc(DL.getDebugLoc());
1844 CSEMap.InsertNode(N, IP);
1845 InsertNode(N);
1846 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1847 }
1848
1849 SDValue Result(N, 0);
1850 if (VT.isVector())
1851 Result = getSplat(VT, DL, Result);
1852 return Result;
1853}
1854
1856 bool isT, bool isO) {
1857 unsigned Size = VT.getScalarSizeInBits();
1858 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1859}
1860
1862 bool IsOpaque) {
1864 IsTarget, IsOpaque);
1865}
1866
1868 bool isTarget) {
1869 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1870}
1871
1873 const SDLoc &DL) {
1874 assert(VT.isInteger() && "Shift amount is not an integer type!");
1875 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1876 return getConstant(Val, DL, ShiftVT);
1877}
1878
1880 const SDLoc &DL) {
1881 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1882 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1883}
1884
1886 bool isTarget) {
1887 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1888}
1889
1891 bool isTarget) {
1892 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1893}
1894
1896 EVT VT, bool isTarget) {
1897 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1898
1899 EVT EltVT = VT.getScalarType();
1900 const ConstantFP *Elt = &V;
1901
1902 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1903 // the to-be-splatted scalar ConstantFP.
1904 if (isa<VectorType>(Elt->getType()))
1905 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1906
1907 // Do the map lookup using the actual bit pattern for the floating point
1908 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1909 // we don't have issues with SNANs.
1910 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1911 SDVTList VTs = getVTList(EltVT);
1913 AddNodeIDNode(ID, Opc, VTs, {});
1914 ID.AddPointer(Elt);
1915 void *IP = nullptr;
1916 SDNode *N = nullptr;
1917 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1918 if (!VT.isVector())
1919 return SDValue(N, 0);
1920
1921 if (!N) {
1922 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1923 CSEMap.InsertNode(N, IP);
1924 InsertNode(N);
1925 }
1926
1927 SDValue Result(N, 0);
1928 if (VT.isVector())
1929 Result = getSplat(VT, DL, Result);
1930 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1931 return Result;
1932}
1933
1935 bool isTarget) {
1936 EVT EltVT = VT.getScalarType();
1937 if (EltVT == MVT::f32)
1938 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1939 if (EltVT == MVT::f64)
1940 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1941 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1942 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1943 bool Ignored;
1944 APFloat APF = APFloat(Val);
1946 &Ignored);
1947 return getConstantFP(APF, DL, VT, isTarget);
1948 }
1949 llvm_unreachable("Unsupported type in getConstantFP");
1950}
1951
1953 EVT VT, int64_t Offset, bool isTargetGA,
1954 unsigned TargetFlags) {
1955 assert((TargetFlags == 0 || isTargetGA) &&
1956 "Cannot set target flags on target-independent globals");
1957
1958 // Truncate (with sign-extension) the offset value to the pointer size.
1960 if (BitWidth < 64)
1962
1963 unsigned Opc;
1964 if (GV->isThreadLocal())
1966 else
1968
1969 SDVTList VTs = getVTList(VT);
1971 AddNodeIDNode(ID, Opc, VTs, {});
1972 ID.AddPointer(GV);
1973 ID.AddInteger(Offset);
1974 ID.AddInteger(TargetFlags);
1975 void *IP = nullptr;
1976 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1977 return SDValue(E, 0);
1978
1979 auto *N = newSDNode<GlobalAddressSDNode>(
1980 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1981 CSEMap.InsertNode(N, IP);
1982 InsertNode(N);
1983 return SDValue(N, 0);
1984}
1985
1987 SDVTList VTs = getVTList(MVT::Untyped);
1990 ID.AddPointer(GV);
1991 void *IP = nullptr;
1992 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1993 return SDValue(E, 0);
1994
1995 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1996 CSEMap.InsertNode(N, IP);
1997 InsertNode(N);
1998 return SDValue(N, 0);
1999}
2000
2001SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
2002 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
2003 SDVTList VTs = getVTList(VT);
2005 AddNodeIDNode(ID, Opc, VTs, {});
2006 ID.AddInteger(FI);
2007 void *IP = nullptr;
2008 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2009 return SDValue(E, 0);
2010
2011 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
2012 CSEMap.InsertNode(N, IP);
2013 InsertNode(N);
2014 return SDValue(N, 0);
2015}
2016
2017SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
2018 unsigned TargetFlags) {
2019 assert((TargetFlags == 0 || isTarget) &&
2020 "Cannot set target flags on target-independent jump tables");
2021 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
2022 SDVTList VTs = getVTList(VT);
2024 AddNodeIDNode(ID, Opc, VTs, {});
2025 ID.AddInteger(JTI);
2026 ID.AddInteger(TargetFlags);
2027 void *IP = nullptr;
2028 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2029 return SDValue(E, 0);
2030
2031 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2032 CSEMap.InsertNode(N, IP);
2033 InsertNode(N);
2034 return SDValue(N, 0);
2035}
2036
2038 const SDLoc &DL) {
2040 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2041 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2042}
2043
2045 MaybeAlign Alignment, int Offset,
2046 bool isTarget, unsigned TargetFlags) {
2047 assert((TargetFlags == 0 || isTarget) &&
2048 "Cannot set target flags on target-independent globals");
2049 if (!Alignment)
2050 Alignment = shouldOptForSize()
2051 ? getDataLayout().getABITypeAlign(C->getType())
2052 : getDataLayout().getPrefTypeAlign(C->getType());
2053 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2054 SDVTList VTs = getVTList(VT);
2056 AddNodeIDNode(ID, Opc, VTs, {});
2057 ID.AddInteger(Alignment->value());
2058 ID.AddInteger(Offset);
2059 ID.AddPointer(C);
2060 ID.AddInteger(TargetFlags);
2061 void *IP = nullptr;
2062 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2063 return SDValue(E, 0);
2064
2065 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2066 TargetFlags);
2067 CSEMap.InsertNode(N, IP);
2068 InsertNode(N);
2069 SDValue V = SDValue(N, 0);
2070 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2071 return V;
2072}
2073
2075 MaybeAlign Alignment, int Offset,
2076 bool isTarget, unsigned TargetFlags) {
2077 assert((TargetFlags == 0 || isTarget) &&
2078 "Cannot set target flags on target-independent globals");
2079 if (!Alignment)
2080 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2081 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2082 SDVTList VTs = getVTList(VT);
2084 AddNodeIDNode(ID, Opc, VTs, {});
2085 ID.AddInteger(Alignment->value());
2086 ID.AddInteger(Offset);
2087 C->addSelectionDAGCSEId(ID);
2088 ID.AddInteger(TargetFlags);
2089 void *IP = nullptr;
2090 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2091 return SDValue(E, 0);
2092
2093 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2094 TargetFlags);
2095 CSEMap.InsertNode(N, IP);
2096 InsertNode(N);
2097 return SDValue(N, 0);
2098}
2099
2102 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2103 ID.AddPointer(MBB);
2104 void *IP = nullptr;
2105 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2106 return SDValue(E, 0);
2107
2108 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2109 CSEMap.InsertNode(N, IP);
2110 InsertNode(N);
2111 return SDValue(N, 0);
2112}
2113
2115 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2116 ValueTypeNodes.size())
2117 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2118
2119 SDNode *&N = VT.isExtended() ?
2120 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2121
2122 if (N) return SDValue(N, 0);
2123 N = newSDNode<VTSDNode>(VT);
2124 InsertNode(N);
2125 return SDValue(N, 0);
2126}
2127
2129 SDNode *&N = ExternalSymbols[Sym];
2130 if (N) return SDValue(N, 0);
2131 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2132 InsertNode(N);
2133 return SDValue(N, 0);
2134}
2135
2136SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2138 return getExternalSymbol(SymName.data(), VT);
2139}
2140
2142 SDNode *&N = MCSymbols[Sym];
2143 if (N)
2144 return SDValue(N, 0);
2145 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2146 InsertNode(N);
2147 return SDValue(N, 0);
2148}
2149
2151 unsigned TargetFlags) {
2152 SDNode *&N =
2153 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2154 if (N) return SDValue(N, 0);
2155 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2156 InsertNode(N);
2157 return SDValue(N, 0);
2158}
2159
2161 EVT VT, unsigned TargetFlags) {
2163 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2164}
2165
2167 if ((unsigned)Cond >= CondCodeNodes.size())
2168 CondCodeNodes.resize(Cond+1);
2169
2170 if (!CondCodeNodes[Cond]) {
2171 auto *N = newSDNode<CondCodeSDNode>(Cond);
2172 CondCodeNodes[Cond] = N;
2173 InsertNode(N);
2174 }
2175
2176 return SDValue(CondCodeNodes[Cond], 0);
2177}
2178
2180 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2181 "APInt size does not match type size!");
2182
2183 if (MulImm == 0)
2184 return getConstant(0, DL, VT);
2185
2186 const MachineFunction &MF = getMachineFunction();
2187 const Function &F = MF.getFunction();
2188 ConstantRange CR = getVScaleRange(&F, 64);
2189 if (const APInt *C = CR.getSingleElement())
2190 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2191
2192 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2193}
2194
2195/// \returns a value of type \p VT that represents the runtime value of \p
2196/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2197/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2198/// or TypeSize.
2199template <typename Ty>
2201 EVT VT, Ty Quantity) {
2202 if (Quantity.isScalable())
2203 return DAG.getVScale(
2204 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2205
2206 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2207}
2208
2210 ElementCount EC) {
2211 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2212}
2213
2215 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2216}
2217
2219 ElementCount EC) {
2220 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2221 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2222 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2223 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2224}
2225
2227 APInt One(ResVT.getScalarSizeInBits(), 1);
2228 return getStepVector(DL, ResVT, One);
2229}
2230
2232 const APInt &StepVal) {
2233 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2234 if (ResVT.isScalableVector())
2235 return getNode(
2236 ISD::STEP_VECTOR, DL, ResVT,
2237 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2238
2239 SmallVector<SDValue, 16> OpsStepConstants;
2240 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2241 OpsStepConstants.push_back(
2242 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2243 return getBuildVector(ResVT, DL, OpsStepConstants);
2244}
2245
2246/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2247/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2252
2254 SDValue N2, ArrayRef<int> Mask) {
2255 assert(VT.getVectorNumElements() == Mask.size() &&
2256 "Must have the same number of vector elements as mask elements!");
2257 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2258 "Invalid VECTOR_SHUFFLE");
2259
2260 // Canonicalize shuffle undef, undef -> undef
2261 if (N1.isUndef() && N2.isUndef())
2262 return getUNDEF(VT);
2263
2264 // Validate that all indices in Mask are within the range of the elements
2265 // input to the shuffle.
2266 int NElts = Mask.size();
2267 assert(llvm::all_of(Mask,
2268 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2269 "Index out of range");
2270
2271 // Copy the mask so we can do any needed cleanup.
2272 SmallVector<int, 8> MaskVec(Mask);
2273
2274 // Canonicalize shuffle v, v -> v, undef
2275 if (N1 == N2) {
2276 N2 = getUNDEF(VT);
2277 for (int i = 0; i != NElts; ++i)
2278 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2279 }
2280
2281 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2282 if (N1.isUndef())
2283 commuteShuffle(N1, N2, MaskVec);
2284
2285 if (TLI->hasVectorBlend()) {
2286 // If shuffling a splat, try to blend the splat instead. We do this here so
2287 // that even when this arises during lowering we don't have to re-handle it.
2288 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2289 BitVector UndefElements;
2290 SDValue Splat = BV->getSplatValue(&UndefElements);
2291 if (!Splat)
2292 return;
2293
2294 for (int i = 0; i < NElts; ++i) {
2295 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2296 continue;
2297
2298 // If this input comes from undef, mark it as such.
2299 if (UndefElements[MaskVec[i] - Offset]) {
2300 MaskVec[i] = -1;
2301 continue;
2302 }
2303
2304 // If we can blend a non-undef lane, use that instead.
2305 if (!UndefElements[i])
2306 MaskVec[i] = i + Offset;
2307 }
2308 };
2309 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2310 BlendSplat(N1BV, 0);
2311 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2312 BlendSplat(N2BV, NElts);
2313 }
2314
2315 // Canonicalize all index into lhs, -> shuffle lhs, undef
2316 // Canonicalize all index into rhs, -> shuffle rhs, undef
2317 bool AllLHS = true, AllRHS = true;
2318 bool N2Undef = N2.isUndef();
2319 for (int i = 0; i != NElts; ++i) {
2320 if (MaskVec[i] >= NElts) {
2321 if (N2Undef)
2322 MaskVec[i] = -1;
2323 else
2324 AllLHS = false;
2325 } else if (MaskVec[i] >= 0) {
2326 AllRHS = false;
2327 }
2328 }
2329 if (AllLHS && AllRHS)
2330 return getUNDEF(VT);
2331 if (AllLHS && !N2Undef)
2332 N2 = getUNDEF(VT);
2333 if (AllRHS) {
2334 N1 = getUNDEF(VT);
2335 commuteShuffle(N1, N2, MaskVec);
2336 }
2337 // Reset our undef status after accounting for the mask.
2338 N2Undef = N2.isUndef();
2339 // Re-check whether both sides ended up undef.
2340 if (N1.isUndef() && N2Undef)
2341 return getUNDEF(VT);
2342
2343 // If Identity shuffle return that node.
2344 bool Identity = true, AllSame = true;
2345 for (int i = 0; i != NElts; ++i) {
2346 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2347 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2348 }
2349 if (Identity && NElts)
2350 return N1;
2351
2352 // Shuffling a constant splat doesn't change the result.
2353 if (N2Undef) {
2354 SDValue V = N1;
2355
2356 // Look through any bitcasts. We check that these don't change the number
2357 // (and size) of elements and just changes their types.
2358 while (V.getOpcode() == ISD::BITCAST)
2359 V = V->getOperand(0);
2360
2361 // A splat should always show up as a build vector node.
2362 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2363 BitVector UndefElements;
2364 SDValue Splat = BV->getSplatValue(&UndefElements);
2365 // If this is a splat of an undef, shuffling it is also undef.
2366 if (Splat && Splat.isUndef())
2367 return getUNDEF(VT);
2368
2369 bool SameNumElts =
2370 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2371
2372 // We only have a splat which can skip shuffles if there is a splatted
2373 // value and no undef lanes rearranged by the shuffle.
2374 if (Splat && UndefElements.none()) {
2375 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2376 // number of elements match or the value splatted is a zero constant.
2377 if (SameNumElts || isNullConstant(Splat))
2378 return N1;
2379 }
2380
2381 // If the shuffle itself creates a splat, build the vector directly.
2382 if (AllSame && SameNumElts) {
2383 EVT BuildVT = BV->getValueType(0);
2384 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2385 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2386
2387 // We may have jumped through bitcasts, so the type of the
2388 // BUILD_VECTOR may not match the type of the shuffle.
2389 if (BuildVT != VT)
2390 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2391 return NewBV;
2392 }
2393 }
2394 }
2395
2396 SDVTList VTs = getVTList(VT);
2398 SDValue Ops[2] = { N1, N2 };
2400 for (int i = 0; i != NElts; ++i)
2401 ID.AddInteger(MaskVec[i]);
2402
2403 void* IP = nullptr;
2404 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2405 return SDValue(E, 0);
2406
2407 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2408 // SDNode doesn't have access to it. This memory will be "leaked" when
2409 // the node is deallocated, but recovered when the NodeAllocator is released.
2410 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2411 llvm::copy(MaskVec, MaskAlloc);
2412
2413 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2414 dl.getDebugLoc(), MaskAlloc);
2415 createOperands(N, Ops);
2416
2417 CSEMap.InsertNode(N, IP);
2418 InsertNode(N);
2419 SDValue V = SDValue(N, 0);
2420 NewSDValueDbgMsg(V, "Creating new node: ", this);
2421 return V;
2422}
2423
2425 EVT VT = SV.getValueType(0);
2426 SmallVector<int, 8> MaskVec(SV.getMask());
2428
2429 SDValue Op0 = SV.getOperand(0);
2430 SDValue Op1 = SV.getOperand(1);
2431 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2432}
2433
2435 SDVTList VTs = getVTList(VT);
2437 AddNodeIDNode(ID, ISD::Register, VTs, {});
2438 ID.AddInteger(Reg.id());
2439 void *IP = nullptr;
2440 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2441 return SDValue(E, 0);
2442
2443 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2444 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2445 CSEMap.InsertNode(N, IP);
2446 InsertNode(N);
2447 return SDValue(N, 0);
2448}
2449
2452 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2453 ID.AddPointer(RegMask);
2454 void *IP = nullptr;
2455 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2456 return SDValue(E, 0);
2457
2458 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2459 CSEMap.InsertNode(N, IP);
2460 InsertNode(N);
2461 return SDValue(N, 0);
2462}
2463
2465 MCSymbol *Label) {
2466 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2467}
2468
2469SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2470 SDValue Root, MCSymbol *Label) {
2472 SDValue Ops[] = { Root };
2473 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2474 ID.AddPointer(Label);
2475 void *IP = nullptr;
2476 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2477 return SDValue(E, 0);
2478
2479 auto *N =
2480 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2481 createOperands(N, Ops);
2482
2483 CSEMap.InsertNode(N, IP);
2484 InsertNode(N);
2485 return SDValue(N, 0);
2486}
2487
2489 int64_t Offset, bool isTarget,
2490 unsigned TargetFlags) {
2491 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2492 SDVTList VTs = getVTList(VT);
2493
2495 AddNodeIDNode(ID, Opc, VTs, {});
2496 ID.AddPointer(BA);
2497 ID.AddInteger(Offset);
2498 ID.AddInteger(TargetFlags);
2499 void *IP = nullptr;
2500 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2501 return SDValue(E, 0);
2502
2503 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2504 CSEMap.InsertNode(N, IP);
2505 InsertNode(N);
2506 return SDValue(N, 0);
2507}
2508
2511 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2512 ID.AddPointer(V);
2513
2514 void *IP = nullptr;
2515 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2516 return SDValue(E, 0);
2517
2518 auto *N = newSDNode<SrcValueSDNode>(V);
2519 CSEMap.InsertNode(N, IP);
2520 InsertNode(N);
2521 return SDValue(N, 0);
2522}
2523
2526 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2527 ID.AddPointer(MD);
2528
2529 void *IP = nullptr;
2530 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2531 return SDValue(E, 0);
2532
2533 auto *N = newSDNode<MDNodeSDNode>(MD);
2534 CSEMap.InsertNode(N, IP);
2535 InsertNode(N);
2536 return SDValue(N, 0);
2537}
2538
2540 if (VT == V.getValueType())
2541 return V;
2542
2543 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2544}
2545
2547 unsigned SrcAS, unsigned DestAS) {
2548 SDVTList VTs = getVTList(VT);
2549 SDValue Ops[] = {Ptr};
2552 ID.AddInteger(SrcAS);
2553 ID.AddInteger(DestAS);
2554
2555 void *IP = nullptr;
2556 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2557 return SDValue(E, 0);
2558
2559 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2560 VTs, SrcAS, DestAS);
2561 createOperands(N, Ops);
2562
2563 CSEMap.InsertNode(N, IP);
2564 InsertNode(N);
2565 return SDValue(N, 0);
2566}
2567
2569 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2570}
2571
2573 UndefPoisonKind Kind) {
2574 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind))
2575 return V;
2576 return getFreeze(V);
2577}
2578
2579/// getShiftAmountOperand - Return the specified value casted to
2580/// the target's desired shift amount type.
2582 EVT OpTy = Op.getValueType();
2583 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2584 if (OpTy == ShTy || OpTy.isVector()) return Op;
2585
2586 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2587}
2588
2590 SDLoc dl(Node);
2592 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2593 EVT VT = Node->getValueType(0);
2594 SDValue Tmp1 = Node->getOperand(0);
2595 SDValue Tmp2 = Node->getOperand(1);
2596 const MaybeAlign MA(Node->getConstantOperandVal(3));
2597
2598 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2599 Tmp2, MachinePointerInfo(V));
2600 SDValue VAList = VAListLoad;
2601
2602 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2603 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2604 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2605
2606 VAList = getNode(
2607 ISD::AND, dl, VAList.getValueType(), VAList,
2608 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2609 }
2610
2611 // Increment the pointer, VAList, to the next vaarg
2612 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2613 getConstant(getDataLayout().getTypeAllocSize(
2614 VT.getTypeForEVT(*getContext())),
2615 dl, VAList.getValueType()));
2616 // Store the incremented VAList to the legalized pointer
2617 Tmp1 =
2618 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2619 // Load the actual argument out of the pointer VAList
2620 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2621}
2622
2624 SDLoc dl(Node);
2626 // This defaults to loading a pointer from the input and storing it to the
2627 // output, returning the chain.
2628 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2629 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2630 SDValue Tmp1 =
2631 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2632 Node->getOperand(2), MachinePointerInfo(VS));
2633 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2634 MachinePointerInfo(VD));
2635}
2636
2638 const DataLayout &DL = getDataLayout();
2639 Type *Ty = VT.getTypeForEVT(*getContext());
2640 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2641
2642 if (TLI->isTypeLegal(VT) || !VT.isVector())
2643 return RedAlign;
2644
2645 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2646 const Align StackAlign = TFI->getStackAlign();
2647
2648 // See if we can choose a smaller ABI alignment in cases where it's an
2649 // illegal vector type that will get broken down.
2650 if (RedAlign > StackAlign) {
2651 EVT IntermediateVT;
2652 MVT RegisterVT;
2653 unsigned NumIntermediates;
2654 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2655 NumIntermediates, RegisterVT);
2656 Ty = IntermediateVT.getTypeForEVT(*getContext());
2657 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2658 if (RedAlign2 < RedAlign)
2659 RedAlign = RedAlign2;
2660
2661 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2662 // If the stack is not realignable, the alignment should be limited to the
2663 // StackAlignment
2664 RedAlign = std::min(RedAlign, StackAlign);
2665 }
2666
2667 return RedAlign;
2668}
2669
2671 MachineFrameInfo &MFI = MF->getFrameInfo();
2672 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2673 int StackID = 0;
2674 if (Bytes.isScalable())
2675 StackID = TFI->getStackIDForScalableVectors();
2676 // The stack id gives an indication of whether the object is scalable or
2677 // not, so it's safe to pass in the minimum size here.
2678 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2679 false, nullptr, StackID);
2680 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2681}
2682
2684 Type *Ty = VT.getTypeForEVT(*getContext());
2685 Align StackAlign =
2686 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2687 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2688}
2689
2691 TypeSize VT1Size = VT1.getStoreSize();
2692 TypeSize VT2Size = VT2.getStoreSize();
2693 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2694 "Don't know how to choose the maximum size when creating a stack "
2695 "temporary");
2696 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2697 ? VT1Size
2698 : VT2Size;
2699
2700 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2701 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2702 const DataLayout &DL = getDataLayout();
2703 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2704 return CreateStackTemporary(Bytes, Align);
2705}
2706
2708 ISD::CondCode Cond, const SDLoc &dl,
2709 SDNodeFlags Flags) {
2710 EVT OpVT = N1.getValueType();
2711
2712 auto GetUndefBooleanConstant = [&]() {
2713 if (VT.getScalarType() == MVT::i1 ||
2714 TLI->getBooleanContents(OpVT) ==
2716 return getUNDEF(VT);
2717 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2718 // so we cannot use getUNDEF(). Return zero instead.
2719 return getConstant(0, dl, VT);
2720 };
2721
2722 // These setcc operations always fold.
2723 switch (Cond) {
2724 default: break;
2725 case ISD::SETFALSE:
2726 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2727 case ISD::SETTRUE:
2728 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2729
2730 case ISD::SETOEQ:
2731 case ISD::SETOGT:
2732 case ISD::SETOGE:
2733 case ISD::SETOLT:
2734 case ISD::SETOLE:
2735 case ISD::SETONE:
2736 case ISD::SETO:
2737 case ISD::SETUO:
2738 case ISD::SETUEQ:
2739 case ISD::SETUNE:
2740 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2741 break;
2742 }
2743
2744 if (OpVT.isInteger()) {
2745 // For EQ and NE, we can always pick a value for the undef to make the
2746 // predicate pass or fail, so we can return undef.
2747 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2748 // icmp eq/ne X, undef -> undef.
2749 if ((N1.isUndef() || N2.isUndef()) &&
2750 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2751 return GetUndefBooleanConstant();
2752
2753 // If both operands are undef, we can return undef for int comparison.
2754 // icmp undef, undef -> undef.
2755 if (N1.isUndef() && N2.isUndef())
2756 return GetUndefBooleanConstant();
2757
2758 // icmp X, X -> true/false
2759 // icmp X, undef -> true/false because undef could be X.
2760 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2761 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2762 }
2763
2765 const APInt &C2 = N2C->getAPIntValue();
2767 const APInt &C1 = N1C->getAPIntValue();
2768
2770 dl, VT, OpVT);
2771 }
2772 }
2773
2774 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2775 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2776
2777 if (N1CFP && N2CFP) {
2778 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2779 switch (Cond) {
2780 default: break;
2781 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2782 return GetUndefBooleanConstant();
2783 [[fallthrough]];
2784 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2785 OpVT);
2786 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2787 return GetUndefBooleanConstant();
2788 [[fallthrough]];
2790 R==APFloat::cmpLessThan, dl, VT,
2791 OpVT);
2792 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2793 return GetUndefBooleanConstant();
2794 [[fallthrough]];
2795 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2796 OpVT);
2797 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2798 return GetUndefBooleanConstant();
2799 [[fallthrough]];
2801 VT, OpVT);
2802 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2803 return GetUndefBooleanConstant();
2804 [[fallthrough]];
2806 R==APFloat::cmpEqual, dl, VT,
2807 OpVT);
2808 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2809 return GetUndefBooleanConstant();
2810 [[fallthrough]];
2812 R==APFloat::cmpEqual, dl, VT, OpVT);
2813 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2814 OpVT);
2815 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2816 OpVT);
2818 R==APFloat::cmpEqual, dl, VT,
2819 OpVT);
2820 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2821 OpVT);
2823 R==APFloat::cmpLessThan, dl, VT,
2824 OpVT);
2826 R==APFloat::cmpUnordered, dl, VT,
2827 OpVT);
2829 VT, OpVT);
2830 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2831 OpVT);
2832 }
2833 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2834 // Ensure that the constant occurs on the RHS.
2836 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2837 return SDValue();
2838 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2839 /*IsSignaling=*/false, Flags);
2840 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2841 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2842 // If an operand is known to be a nan (or undef that could be a nan), we can
2843 // fold it.
2844 // Choosing NaN for the undef will always make unordered comparison succeed
2845 // and ordered comparison fails.
2846 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2847 switch (ISD::getUnorderedFlavor(Cond)) {
2848 default:
2849 llvm_unreachable("Unknown flavor!");
2850 case 0: // Known false.
2851 return getBoolConstant(false, dl, VT, OpVT);
2852 case 1: // Known true.
2853 return getBoolConstant(true, dl, VT, OpVT);
2854 case 2: // Undefined.
2855 return GetUndefBooleanConstant();
2856 }
2857 }
2858
2859 // Could not fold it.
2860 return SDValue();
2861}
2862
2863/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2864/// use this predicate to simplify operations downstream.
2866 unsigned BitWidth = Op.getScalarValueSizeInBits();
2868}
2869
2870// TODO: Should have argument to specify if sign bit of nan is ignorable.
2872 if (Depth >= MaxRecursionDepth)
2873 return false; // Limit search depth.
2874
2875 unsigned Opc = Op.getOpcode();
2876 switch (Opc) {
2877 case ISD::FABS:
2878 return true;
2879 case ISD::AssertNoFPClass: {
2880 FPClassTest NoFPClass =
2881 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2882
2883 const FPClassTest TestMask = fcNan | fcNegative;
2884 return (NoFPClass & TestMask) == TestMask;
2885 }
2886 case ISD::ARITH_FENCE:
2887 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2888 case ISD::FEXP:
2889 case ISD::FEXP2:
2890 case ISD::FEXP10:
2891 return Op->getFlags().hasNoNaNs();
2892 case ISD::FMINNUM:
2893 case ISD::FMINNUM_IEEE:
2894 case ISD::FMINIMUM:
2895 case ISD::FMINIMUMNUM:
2896 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2897 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2898 case ISD::FMAXNUM:
2899 case ISD::FMAXNUM_IEEE:
2900 case ISD::FMAXIMUM:
2901 case ISD::FMAXIMUMNUM:
2902 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2903 // is sufficient.
2904 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2905 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2906 default:
2907 return false;
2908 }
2909
2910 llvm_unreachable("covered opcode switch");
2911}
2912
2913/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2914/// this predicate to simplify operations downstream. Mask is known to be zero
2915/// for bits that V cannot have.
2917 unsigned Depth) const {
2918 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2919}
2920
2921/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2922/// DemandedElts. We use this predicate to simplify operations downstream.
2923/// Mask is known to be zero for bits that V cannot have.
2925 const APInt &DemandedElts,
2926 unsigned Depth) const {
2927 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2928}
2929
2930/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2931/// DemandedElts. We use this predicate to simplify operations downstream.
2933 unsigned Depth /* = 0 */) const {
2934 return computeKnownBits(V, DemandedElts, Depth).isZero();
2935}
2936
2937/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2939 unsigned Depth) const {
2940 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2941}
2942
2944 const APInt &DemandedElts,
2945 unsigned Depth) const {
2946 EVT VT = Op.getValueType();
2947 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2948
2949 unsigned NumElts = VT.getVectorNumElements();
2950 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2951
2952 APInt KnownZeroElements = APInt::getZero(NumElts);
2953 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2954 if (!DemandedElts[EltIdx])
2955 continue; // Don't query elements that are not demanded.
2956 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2957 if (MaskedVectorIsZero(Op, Mask, Depth))
2958 KnownZeroElements.setBit(EltIdx);
2959 }
2960 return KnownZeroElements;
2961}
2962
2963/// isSplatValue - Return true if the vector V has the same value
2964/// across all DemandedElts. For scalable vectors, we don't know the
2965/// number of lanes at compile time. Instead, we use a 1 bit APInt
2966/// to represent a conservative value for all lanes; that is, that
2967/// one bit value is implicitly splatted across all lanes.
2968bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2969 APInt &UndefElts, unsigned Depth) const {
2970 unsigned Opcode = V.getOpcode();
2971 EVT VT = V.getValueType();
2972 assert(VT.isVector() && "Vector type expected");
2973 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2974 "scalable demanded bits are ignored");
2975
2976 if (!DemandedElts)
2977 return false; // No demanded elts, better to assume we don't know anything.
2978
2979 if (Depth >= MaxRecursionDepth)
2980 return false; // Limit search depth.
2981
2982 // Deal with some common cases here that work for both fixed and scalable
2983 // vector types.
2984 switch (Opcode) {
2985 case ISD::SPLAT_VECTOR:
2986 UndefElts = V.getOperand(0).isUndef()
2987 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2988 : APInt(DemandedElts.getBitWidth(), 0);
2989 return true;
2990 case ISD::ADD:
2991 case ISD::SUB:
2992 case ISD::AND:
2993 case ISD::XOR:
2994 case ISD::OR: {
2995 APInt UndefLHS, UndefRHS;
2996 SDValue LHS = V.getOperand(0);
2997 SDValue RHS = V.getOperand(1);
2998 // Only recognize splats with the same demanded undef elements for both
2999 // operands, otherwise we might fail to handle binop-specific undef
3000 // handling.
3001 // e.g. (and undef, 0) -> 0 etc.
3002 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
3003 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
3004 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
3005 UndefElts = UndefLHS | UndefRHS;
3006 return true;
3007 }
3008 return false;
3009 }
3010 case ISD::ABS:
3012 case ISD::TRUNCATE:
3013 case ISD::SIGN_EXTEND:
3014 case ISD::ZERO_EXTEND:
3015 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3016 default:
3017 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3018 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3019 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3020 Depth);
3021 break;
3022 }
3023
3024 // We don't support other cases than those above for scalable vectors at
3025 // the moment.
3026 if (VT.isScalableVector())
3027 return false;
3028
3029 unsigned NumElts = VT.getVectorNumElements();
3030 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3031 UndefElts = APInt::getZero(NumElts);
3032
3033 switch (Opcode) {
3034 case ISD::BUILD_VECTOR: {
3035 SDValue Scl;
3036 for (unsigned i = 0; i != NumElts; ++i) {
3037 SDValue Op = V.getOperand(i);
3038 if (Op.isUndef()) {
3039 UndefElts.setBit(i);
3040 continue;
3041 }
3042 if (!DemandedElts[i])
3043 continue;
3044 if (Scl && Scl != Op)
3045 return false;
3046 Scl = Op;
3047 }
3048 return true;
3049 }
3050 case ISD::VECTOR_SHUFFLE: {
3051 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3052 APInt DemandedLHS = APInt::getZero(NumElts);
3053 APInt DemandedRHS = APInt::getZero(NumElts);
3054 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3055 for (int i = 0; i != (int)NumElts; ++i) {
3056 int M = Mask[i];
3057 if (M < 0) {
3058 UndefElts.setBit(i);
3059 continue;
3060 }
3061 if (!DemandedElts[i])
3062 continue;
3063 if (M < (int)NumElts)
3064 DemandedLHS.setBit(M);
3065 else
3066 DemandedRHS.setBit(M - NumElts);
3067 }
3068
3069 // If we aren't demanding either op, assume there's no splat.
3070 // If we are demanding both ops, assume there's no splat.
3071 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3072 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3073 return false;
3074
3075 // See if the demanded elts of the source op is a splat or we only demand
3076 // one element, which should always be a splat.
3077 // TODO: Handle source ops splats with undefs.
3078 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3079 APInt SrcUndefs;
3080 return (SrcElts.popcount() == 1) ||
3081 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3082 (SrcElts & SrcUndefs).isZero());
3083 };
3084 if (!DemandedLHS.isZero())
3085 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3086 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3087 }
3089 // Offset the demanded elts by the subvector index.
3090 SDValue Src = V.getOperand(0);
3091 // We don't support scalable vectors at the moment.
3092 if (Src.getValueType().isScalableVector())
3093 return false;
3094 uint64_t Idx = V.getConstantOperandVal(1);
3095 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3096 APInt UndefSrcElts;
3097 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3098 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3099 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3100 return true;
3101 }
3102 break;
3103 }
3107 // Widen the demanded elts by the src element count.
3108 SDValue Src = V.getOperand(0);
3109 // We don't support scalable vectors at the moment.
3110 if (Src.getValueType().isScalableVector())
3111 return false;
3112 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3113 APInt UndefSrcElts;
3114 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3115 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3116 UndefElts = UndefSrcElts.trunc(NumElts);
3117 return true;
3118 }
3119 break;
3120 }
3121 case ISD::BITCAST: {
3122 SDValue Src = V.getOperand(0);
3123 EVT SrcVT = Src.getValueType();
3124 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3125 unsigned BitWidth = VT.getScalarSizeInBits();
3126
3127 // Ignore bitcasts from unsupported types.
3128 // TODO: Add fp support?
3129 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3130 break;
3131
3132 // Bitcast 'small element' vector to 'large element' vector.
3133 if ((BitWidth % SrcBitWidth) == 0) {
3134 // See if each sub element is a splat.
3135 unsigned Scale = BitWidth / SrcBitWidth;
3136 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3137 APInt ScaledDemandedElts =
3138 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3139 for (unsigned I = 0; I != Scale; ++I) {
3140 APInt SubUndefElts;
3141 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3142 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3143 SubDemandedElts &= ScaledDemandedElts;
3144 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3145 return false;
3146 // TODO: Add support for merging sub undef elements.
3147 if (!SubUndefElts.isZero())
3148 return false;
3149 }
3150 return true;
3151 }
3152 break;
3153 }
3154 }
3155
3156 return false;
3157}
3158
3159/// Helper wrapper to main isSplatValue function.
3160bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3161 EVT VT = V.getValueType();
3162 assert(VT.isVector() && "Vector type expected");
3163
3164 APInt UndefElts;
3165 // Since the number of lanes in a scalable vector is unknown at compile time,
3166 // we track one bit which is implicitly broadcast to all lanes. This means
3167 // that all lanes in a scalable vector are considered demanded.
3168 APInt DemandedElts
3170 return isSplatValue(V, DemandedElts, UndefElts) &&
3171 (AllowUndefs || !UndefElts);
3172}
3173
3176
3177 EVT VT = V.getValueType();
3178 unsigned Opcode = V.getOpcode();
3179 switch (Opcode) {
3180 default: {
3181 APInt UndefElts;
3182 // Since the number of lanes in a scalable vector is unknown at compile time,
3183 // we track one bit which is implicitly broadcast to all lanes. This means
3184 // that all lanes in a scalable vector are considered demanded.
3185 APInt DemandedElts
3187
3188 if (isSplatValue(V, DemandedElts, UndefElts)) {
3189 if (VT.isScalableVector()) {
3190 // DemandedElts and UndefElts are ignored for scalable vectors, since
3191 // the only supported cases are SPLAT_VECTOR nodes.
3192 SplatIdx = 0;
3193 } else {
3194 // Handle case where all demanded elements are UNDEF.
3195 if (DemandedElts.isSubsetOf(UndefElts)) {
3196 SplatIdx = 0;
3197 return getUNDEF(VT);
3198 }
3199 SplatIdx = (UndefElts & DemandedElts).countr_one();
3200 }
3201 return V;
3202 }
3203 break;
3204 }
3205 case ISD::SPLAT_VECTOR:
3206 SplatIdx = 0;
3207 return V;
3208 case ISD::VECTOR_SHUFFLE: {
3209 assert(!VT.isScalableVector());
3210 // Check if this is a shuffle node doing a splat.
3211 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3212 // getTargetVShiftNode currently struggles without the splat source.
3213 auto *SVN = cast<ShuffleVectorSDNode>(V);
3214 if (!SVN->isSplat())
3215 break;
3216 int Idx = SVN->getSplatIndex();
3217 int NumElts = V.getValueType().getVectorNumElements();
3218 SplatIdx = Idx % NumElts;
3219 return V.getOperand(Idx / NumElts);
3220 }
3221 }
3222
3223 return SDValue();
3224}
3225
3227 int SplatIdx;
3228 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3229 EVT SVT = SrcVector.getValueType().getScalarType();
3230 EVT LegalSVT = SVT;
3231 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3232 if (!SVT.isInteger())
3233 return SDValue();
3234 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3235 if (LegalSVT.bitsLT(SVT))
3236 return SDValue();
3237 }
3238 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3239 }
3240 return SDValue();
3241}
3242
3243std::optional<ConstantRange>
3245 unsigned Depth) const {
3246 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3247 V.getOpcode() == ISD::SRA) &&
3248 "Unknown shift node");
3249 // Shifting more than the bitwidth is not valid.
3250 unsigned BitWidth = V.getScalarValueSizeInBits();
3251
3252 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3253 const APInt &ShAmt = Cst->getAPIntValue();
3254 if (ShAmt.uge(BitWidth))
3255 return std::nullopt;
3256 return ConstantRange(ShAmt);
3257 }
3258
3259 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3260 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3261 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3262 if (!DemandedElts[i])
3263 continue;
3264 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3265 if (!SA) {
3266 MinAmt = MaxAmt = nullptr;
3267 break;
3268 }
3269 const APInt &ShAmt = SA->getAPIntValue();
3270 if (ShAmt.uge(BitWidth))
3271 return std::nullopt;
3272 if (!MinAmt || MinAmt->ugt(ShAmt))
3273 MinAmt = &ShAmt;
3274 if (!MaxAmt || MaxAmt->ult(ShAmt))
3275 MaxAmt = &ShAmt;
3276 }
3277 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3278 "Failed to find matching min/max shift amounts");
3279 if (MinAmt && MaxAmt)
3280 return ConstantRange(*MinAmt, *MaxAmt + 1);
3281 }
3282
3283 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3284 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3285 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3286 if (KnownAmt.getMaxValue().ult(BitWidth))
3287 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3288
3289 return std::nullopt;
3290}
3291
3292std::optional<unsigned>
3294 unsigned Depth) const {
3295 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3296 V.getOpcode() == ISD::SRA) &&
3297 "Unknown shift node");
3298 if (std::optional<ConstantRange> AmtRange =
3299 getValidShiftAmountRange(V, DemandedElts, Depth))
3300 if (const APInt *ShAmt = AmtRange->getSingleElement())
3301 return ShAmt->getZExtValue();
3302 return std::nullopt;
3303}
3304
3305std::optional<unsigned>
3307 APInt DemandedElts = getDemandAllEltsMask(V);
3308 return getValidShiftAmount(V, DemandedElts, Depth);
3309}
3310
3311std::optional<unsigned>
3313 unsigned Depth) const {
3314 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3315 V.getOpcode() == ISD::SRA) &&
3316 "Unknown shift node");
3317 if (std::optional<ConstantRange> AmtRange =
3318 getValidShiftAmountRange(V, DemandedElts, Depth))
3319 return AmtRange->getUnsignedMin().getZExtValue();
3320 return std::nullopt;
3321}
3322
3323std::optional<unsigned>
3325 APInt DemandedElts = getDemandAllEltsMask(V);
3326 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3327}
3328
3329std::optional<unsigned>
3331 unsigned Depth) const {
3332 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3333 V.getOpcode() == ISD::SRA) &&
3334 "Unknown shift node");
3335 if (std::optional<ConstantRange> AmtRange =
3336 getValidShiftAmountRange(V, DemandedElts, Depth))
3337 return AmtRange->getUnsignedMax().getZExtValue();
3338 return std::nullopt;
3339}
3340
3341std::optional<unsigned>
3343 APInt DemandedElts = getDemandAllEltsMask(V);
3344 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3345}
3346
3347/// Determine which bits of Op are known to be either zero or one and return
3348/// them in Known. For vectors, the known bits are those that are shared by
3349/// every vector element.
3351 APInt DemandedElts = getDemandAllEltsMask(Op);
3352 return computeKnownBits(Op, DemandedElts, Depth);
3353}
3354
3355/// Determine which bits of Op are known to be either zero or one and return
3356/// them in Known. The DemandedElts argument allows us to only collect the known
3357/// bits that are shared by the requested vector elements.
3359 unsigned Depth) const {
3360 unsigned BitWidth = Op.getScalarValueSizeInBits();
3361
3362 KnownBits Known(BitWidth); // Don't know anything.
3363
3364 if (auto OptAPInt = Op->bitcastToAPInt()) {
3365 // We know all of the bits for a constant!
3366 return KnownBits::makeConstant(*std::move(OptAPInt));
3367 }
3368
3369 if (Depth >= MaxRecursionDepth)
3370 return Known; // Limit search depth.
3371
3372 KnownBits Known2;
3373 unsigned NumElts = DemandedElts.getBitWidth();
3374 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3375 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3376 assert((!Op.getValueType().isFixedLengthVector() ||
3377 NumElts == Op.getValueType().getVectorNumElements()) &&
3378 "Unexpected vector size");
3379
3380 if (!DemandedElts)
3381 return Known; // No demanded elts, better to assume we don't know anything.
3382
3383 unsigned Opcode = Op.getOpcode();
3384 switch (Opcode) {
3385 case ISD::MERGE_VALUES:
3386 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3387 Depth + 1);
3388 case ISD::SPLAT_VECTOR: {
3389 SDValue SrcOp = Op.getOperand(0);
3390 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3391 "Expected SPLAT_VECTOR implicit truncation");
3392 // Implicitly truncate the bits to match the official semantics of
3393 // SPLAT_VECTOR.
3395 break;
3396 }
3398 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3399 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3400 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3401 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3402 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3403 }
3404 break;
3405 }
3406 case ISD::STEP_VECTOR: {
3407 const APInt &Step = Op.getConstantOperandAPInt(0);
3408
3409 if (Step.isPowerOf2())
3410 Known.Zero.setLowBits(Step.logBase2());
3411
3413
3414 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3415 break;
3416 const APInt MinNumElts =
3417 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3418
3419 bool Overflow;
3420 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3422 .umul_ov(MinNumElts, Overflow);
3423 if (Overflow)
3424 break;
3425
3426 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3427 if (Overflow)
3428 break;
3429
3430 Known.Zero.setHighBits(MaxValue.countl_zero());
3431 break;
3432 }
3433 case ISD::BUILD_VECTOR:
3434 assert(!Op.getValueType().isScalableVector());
3435 // Collect the known bits that are shared by every demanded vector element.
3436 Known.setAllConflict();
3437 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3438 if (!DemandedElts[i])
3439 continue;
3440
3441 SDValue SrcOp = Op.getOperand(i);
3442 Known2 = computeKnownBits(SrcOp, Depth + 1);
3443
3444 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3445 if (SrcOp.getValueSizeInBits() != BitWidth) {
3446 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3447 "Expected BUILD_VECTOR implicit truncation");
3448 Known2 = Known2.trunc(BitWidth);
3449 }
3450
3451 // Known bits are the values that are shared by every demanded element.
3452 Known = Known.intersectWith(Known2);
3453
3454 // If we don't know any bits, early out.
3455 if (Known.isUnknown())
3456 break;
3457 }
3458 break;
3459 case ISD::VECTOR_COMPRESS: {
3460 SDValue Vec = Op.getOperand(0);
3461 SDValue PassThru = Op.getOperand(2);
3462 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3463 // If we don't know any bits, early out.
3464 if (Known.isUnknown())
3465 break;
3466 Known2 = computeKnownBits(Vec, Depth + 1);
3467 Known = Known.intersectWith(Known2);
3468 break;
3469 }
3470 case ISD::VECTOR_SHUFFLE: {
3471 assert(!Op.getValueType().isScalableVector());
3472 // Collect the known bits that are shared by every vector element referenced
3473 // by the shuffle.
3474 APInt DemandedLHS, DemandedRHS;
3476 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3477 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3478 DemandedLHS, DemandedRHS))
3479 break;
3480
3481 // Known bits are the values that are shared by every demanded element.
3482 Known.setAllConflict();
3483 if (!!DemandedLHS) {
3484 SDValue LHS = Op.getOperand(0);
3485 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3486 Known = Known.intersectWith(Known2);
3487 }
3488 // If we don't know any bits, early out.
3489 if (Known.isUnknown())
3490 break;
3491 if (!!DemandedRHS) {
3492 SDValue RHS = Op.getOperand(1);
3493 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3494 Known = Known.intersectWith(Known2);
3495 }
3496 break;
3497 }
3498 case ISD::VSCALE: {
3500 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3502 break;
3503 }
3504 case ISD::CONCAT_VECTORS: {
3505 if (Op.getValueType().isScalableVector())
3506 break;
3507 // Split DemandedElts and test each of the demanded subvectors.
3508 Known.setAllConflict();
3509 EVT SubVectorVT = Op.getOperand(0).getValueType();
3510 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3511 unsigned NumSubVectors = Op.getNumOperands();
3512 for (unsigned i = 0; i != NumSubVectors; ++i) {
3513 APInt DemandedSub =
3514 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3515 if (!!DemandedSub) {
3516 SDValue Sub = Op.getOperand(i);
3517 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3518 Known = Known.intersectWith(Known2);
3519 }
3520 // If we don't know any bits, early out.
3521 if (Known.isUnknown())
3522 break;
3523 }
3524 break;
3525 }
3526 case ISD::INSERT_SUBVECTOR: {
3527 if (Op.getValueType().isScalableVector())
3528 break;
3529 // Demand any elements from the subvector and the remainder from the src its
3530 // inserted into.
3531 SDValue Src = Op.getOperand(0);
3532 SDValue Sub = Op.getOperand(1);
3533 uint64_t Idx = Op.getConstantOperandVal(2);
3534 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3535 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3536 APInt DemandedSrcElts = DemandedElts;
3537 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3538
3539 Known.setAllConflict();
3540 if (!!DemandedSubElts) {
3541 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3542 if (Known.isUnknown())
3543 break; // early-out.
3544 }
3545 if (!!DemandedSrcElts) {
3546 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3547 Known = Known.intersectWith(Known2);
3548 }
3549 break;
3550 }
3552 // Offset the demanded elts by the subvector index.
3553 SDValue Src = Op.getOperand(0);
3554
3555 APInt DemandedSrcElts;
3556 if (Src.getValueType().isScalableVector())
3557 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3558 else {
3559 uint64_t Idx = Op.getConstantOperandVal(1);
3560 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3561 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3562 }
3563 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3564 break;
3565 }
3566 case ISD::SCALAR_TO_VECTOR: {
3567 if (Op.getValueType().isScalableVector())
3568 break;
3569 // We know about scalar_to_vector as much as we know about it source,
3570 // which becomes the first element of otherwise unknown vector.
3571 if (DemandedElts != 1)
3572 break;
3573
3574 SDValue N0 = Op.getOperand(0);
3575 Known = computeKnownBits(N0, Depth + 1);
3576 if (N0.getValueSizeInBits() != BitWidth)
3577 Known = Known.trunc(BitWidth);
3578
3579 break;
3580 }
3581 case ISD::BITCAST: {
3582 if (Op.getValueType().isScalableVector())
3583 break;
3584
3585 SDValue N0 = Op.getOperand(0);
3586 EVT SubVT = N0.getValueType();
3587 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3588
3589 // Ignore bitcasts from unsupported types.
3590 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3591 break;
3592
3593 // Fast handling of 'identity' bitcasts.
3594 if (BitWidth == SubBitWidth) {
3595 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3596 break;
3597 }
3598
3599 bool IsLE = getDataLayout().isLittleEndian();
3600
3601 // Bitcast 'small element' vector to 'large element' scalar/vector.
3602 if ((BitWidth % SubBitWidth) == 0) {
3603 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3604
3605 // Collect known bits for the (larger) output by collecting the known
3606 // bits from each set of sub elements and shift these into place.
3607 // We need to separately call computeKnownBits for each set of
3608 // sub elements as the knownbits for each is likely to be different.
3609 unsigned SubScale = BitWidth / SubBitWidth;
3610 APInt SubDemandedElts(NumElts * SubScale, 0);
3611 for (unsigned i = 0; i != NumElts; ++i)
3612 if (DemandedElts[i])
3613 SubDemandedElts.setBit(i * SubScale);
3614
3615 for (unsigned i = 0; i != SubScale; ++i) {
3616 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3617 Depth + 1);
3618 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3619 Known.insertBits(Known2, SubBitWidth * Shifts);
3620 }
3621 }
3622
3623 // Bitcast 'large element' scalar/vector to 'small element' vector.
3624 if ((SubBitWidth % BitWidth) == 0) {
3625 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3626
3627 // Collect known bits for the (smaller) output by collecting the known
3628 // bits from the overlapping larger input elements and extracting the
3629 // sub sections we actually care about.
3630 unsigned SubScale = SubBitWidth / BitWidth;
3631 APInt SubDemandedElts =
3632 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3633 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3634
3635 Known.setAllConflict();
3636 for (unsigned i = 0; i != NumElts; ++i)
3637 if (DemandedElts[i]) {
3638 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3639 unsigned Offset = (Shifts % SubScale) * BitWidth;
3640 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3641 // If we don't know any bits, early out.
3642 if (Known.isUnknown())
3643 break;
3644 }
3645 }
3646 break;
3647 }
3648 case ISD::AND:
3649 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3650 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3651
3652 Known &= Known2;
3653 break;
3654 case ISD::OR:
3655 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3656 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3657
3658 Known |= Known2;
3659 break;
3660 case ISD::XOR:
3661 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3662 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3663
3664 Known ^= Known2;
3665 break;
3666 case ISD::MUL: {
3667 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3668 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3669 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3670 // TODO: SelfMultiply can be poison, but not undef.
3671 if (SelfMultiply)
3672 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3673 Op.getOperand(0), DemandedElts, UndefPoisonKind::UndefOrPoison,
3674 Depth + 1);
3675 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3676
3677 // If the multiplication is known not to overflow, the product of a number
3678 // with itself is non-negative. Only do this if we didn't already computed
3679 // the opposite value for the sign bit.
3680 if (Op->getFlags().hasNoSignedWrap() &&
3681 Op.getOperand(0) == Op.getOperand(1) &&
3682 !Known.isNegative())
3683 Known.makeNonNegative();
3684 break;
3685 }
3686 case ISD::MULHU: {
3687 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3688 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3689 Known = KnownBits::mulhu(Known, Known2);
3690 break;
3691 }
3692 case ISD::MULHS: {
3693 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3694 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3695 Known = KnownBits::mulhs(Known, Known2);
3696 break;
3697 }
3698 case ISD::ABDU: {
3699 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3700 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3701 Known = KnownBits::abdu(Known, Known2);
3702 break;
3703 }
3704 case ISD::ABDS: {
3705 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3706 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3707 Known = KnownBits::abds(Known, Known2);
3708 unsigned SignBits1 =
3709 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3710 if (SignBits1 == 1)
3711 break;
3712 unsigned SignBits0 =
3713 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3714 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3715 break;
3716 }
3717 case ISD::UMUL_LOHI: {
3718 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3719 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3720 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3721 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3722 if (Op.getResNo() == 0)
3723 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3724 else
3725 Known = KnownBits::mulhu(Known, Known2);
3726 break;
3727 }
3728 case ISD::SMUL_LOHI: {
3729 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3730 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3731 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3732 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3733 if (Op.getResNo() == 0)
3734 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3735 else
3736 Known = KnownBits::mulhs(Known, Known2);
3737 break;
3738 }
3739 case ISD::AVGFLOORU: {
3740 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3741 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3742 Known = KnownBits::avgFloorU(Known, Known2);
3743 break;
3744 }
3745 case ISD::AVGCEILU: {
3746 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3747 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3748 Known = KnownBits::avgCeilU(Known, Known2);
3749 break;
3750 }
3751 case ISD::AVGFLOORS: {
3752 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3753 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3754 Known = KnownBits::avgFloorS(Known, Known2);
3755 break;
3756 }
3757 case ISD::AVGCEILS: {
3758 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3759 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3760 Known = KnownBits::avgCeilS(Known, Known2);
3761 break;
3762 }
3763 case ISD::SELECT:
3764 case ISD::VSELECT:
3765 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3766 // If we don't know any bits, early out.
3767 if (Known.isUnknown())
3768 break;
3769 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3770
3771 // Only known if known in both the LHS and RHS.
3772 Known = Known.intersectWith(Known2);
3773 break;
3774 case ISD::SELECT_CC:
3775 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3776 // If we don't know any bits, early out.
3777 if (Known.isUnknown())
3778 break;
3779 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3780
3781 // Only known if known in both the LHS and RHS.
3782 Known = Known.intersectWith(Known2);
3783 break;
3784 case ISD::SMULO:
3785 case ISD::UMULO:
3786 if (Op.getResNo() != 1)
3787 break;
3788 // The boolean result conforms to getBooleanContents.
3789 // If we know the result of a setcc has the top bits zero, use this info.
3790 // We know that we have an integer-based boolean since these operations
3791 // are only available for integer.
3792 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3794 BitWidth > 1)
3795 Known.Zero.setBitsFrom(1);
3796 break;
3797 case ISD::SETCC:
3798 case ISD::SETCCCARRY:
3799 case ISD::STRICT_FSETCC:
3800 case ISD::STRICT_FSETCCS: {
3801 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3802 // If we know the result of a setcc has the top bits zero, use this info.
3803 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3805 BitWidth > 1)
3806 Known.Zero.setBitsFrom(1);
3807 break;
3808 }
3809 case ISD::SHL: {
3810 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3811 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3812
3813 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3814 bool NSW = Op->getFlags().hasNoSignedWrap();
3815
3816 bool ShAmtNonZero = Known2.isNonZero();
3817
3818 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3819
3820 // Minimum shift low bits are known zero.
3821 if (std::optional<unsigned> ShMinAmt =
3822 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3823 Known.Zero.setLowBits(*ShMinAmt);
3824 break;
3825 }
3826 case ISD::SRL:
3827 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3828 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3829 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3830 Op->getFlags().hasExact());
3831
3832 // Minimum shift high bits are known zero.
3833 if (std::optional<unsigned> ShMinAmt =
3834 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3835 Known.Zero.setHighBits(*ShMinAmt);
3836 break;
3837 case ISD::SRA:
3838 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3839 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3840 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3841 Op->getFlags().hasExact());
3842 break;
3843 case ISD::ROTL:
3844 case ISD::ROTR:
3845 if (ConstantSDNode *C =
3846 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3847 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3848
3849 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3850
3851 // Canonicalize to ROTR.
3852 if (Opcode == ISD::ROTL && Amt != 0)
3853 Amt = BitWidth - Amt;
3854
3855 Known.Zero = Known.Zero.rotr(Amt);
3856 Known.One = Known.One.rotr(Amt);
3857 }
3858 break;
3859 case ISD::FSHL:
3860 case ISD::FSHR:
3861 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3862 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3863
3864 // For fshl, 0-shift returns the 1st arg.
3865 // For fshr, 0-shift returns the 2nd arg.
3866 if (Amt == 0) {
3867 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3868 DemandedElts, Depth + 1);
3869 break;
3870 }
3871
3872 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3873 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3874 const APInt ShAmt(BitWidth, Amt);
3875 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3876 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3877 Known = Opcode == ISD::FSHL ? KnownBits::fshl(Known, Known2, ShAmt)
3878 : KnownBits::fshr(Known, Known2, ShAmt);
3879 }
3880 break;
3881 case ISD::SHL_PARTS:
3882 case ISD::SRA_PARTS:
3883 case ISD::SRL_PARTS: {
3884 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3885
3886 // Collect lo/hi source values and concatenate.
3887 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3888 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3889 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3890 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3891 Known = Known2.concat(Known);
3892
3893 // Collect shift amount.
3894 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3895
3896 if (Opcode == ISD::SHL_PARTS)
3897 Known = KnownBits::shl(Known, Known2);
3898 else if (Opcode == ISD::SRA_PARTS)
3899 Known = KnownBits::ashr(Known, Known2);
3900 else // if (Opcode == ISD::SRL_PARTS)
3901 Known = KnownBits::lshr(Known, Known2);
3902
3903 // TODO: Minimum shift low/high bits are known zero.
3904
3905 if (Op.getResNo() == 0)
3906 Known = Known.extractBits(LoBits, 0);
3907 else
3908 Known = Known.extractBits(HiBits, LoBits);
3909 break;
3910 }
3912 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3913 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3914 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3915 break;
3916 }
3917 case ISD::CTTZ:
3918 case ISD::CTTZ_ZERO_POISON: {
3919 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3920 // If we have a known 1, its position is our upper bound.
3921 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3922 unsigned LowBits = llvm::bit_width(PossibleTZ);
3923 Known.Zero.setBitsFrom(LowBits);
3924 break;
3925 }
3926 case ISD::CTLZ:
3927 case ISD::CTLZ_ZERO_POISON: {
3928 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3929 // If we have a known 1, its position is our upper bound.
3930 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3931 unsigned LowBits = llvm::bit_width(PossibleLZ);
3932 Known.Zero.setBitsFrom(LowBits);
3933 break;
3934 }
3935 case ISD::CTLS: {
3936 unsigned MinRedundantSignBits =
3937 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3938 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3940 Known = Range.toKnownBits();
3941 break;
3942 }
3943 case ISD::CTPOP: {
3944 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3945 // If we know some of the bits are zero, they can't be one.
3946 unsigned PossibleOnes = Known2.countMaxPopulation();
3947 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3948 break;
3949 }
3950 case ISD::PARITY: {
3951 // Parity returns 0 everywhere but the LSB.
3952 Known.Zero.setBitsFrom(1);
3953 break;
3954 }
3955 case ISD::PDEP: {
3956 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3957 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3958 Known = KnownBits::pdep(Known2, Known);
3959 break;
3960 }
3961 case ISD::PEXT: {
3962 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3963 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3964 Known = KnownBits::pext(Known2, Known);
3965 break;
3966 }
3967 case ISD::CLMUL: {
3968 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3969 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3970 Known = KnownBits::clmul(Known, Known2);
3971 break;
3972 }
3973 case ISD::MGATHER:
3974 case ISD::MLOAD: {
3975 ISD::LoadExtType ETy =
3976 (Opcode == ISD::MGATHER)
3977 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3978 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3979 if (ETy == ISD::ZEXTLOAD) {
3980 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3981 KnownBits Known0(MemVT.getScalarSizeInBits());
3982 return Known0.zext(BitWidth);
3983 }
3984 break;
3985 }
3986 case ISD::LOAD: {
3988 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3989 if (ISD::isNON_EXTLoad(LD) && Cst) {
3990 // Determine any common known bits from the loaded constant pool value.
3991 Type *CstTy = Cst->getType();
3992 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3993 !Op.getValueType().isScalableVector()) {
3994 // If its a vector splat, then we can (quickly) reuse the scalar path.
3995 // NOTE: We assume all elements match and none are UNDEF.
3996 if (CstTy->isVectorTy()) {
3997 if (const Constant *Splat = Cst->getSplatValue()) {
3998 Cst = Splat;
3999 CstTy = Cst->getType();
4000 }
4001 }
4002 // TODO - do we need to handle different bitwidths?
4003 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
4004 // Iterate across all vector elements finding common known bits.
4005 Known.setAllConflict();
4006 for (unsigned i = 0; i != NumElts; ++i) {
4007 if (!DemandedElts[i])
4008 continue;
4009 if (Constant *Elt = Cst->getAggregateElement(i)) {
4010 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
4011 const APInt &Value = CInt->getValue();
4012 Known.One &= Value;
4013 Known.Zero &= ~Value;
4014 continue;
4015 }
4016 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4017 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4018 Known.One &= Value;
4019 Known.Zero &= ~Value;
4020 continue;
4021 }
4022 }
4023 Known.One.clearAllBits();
4024 Known.Zero.clearAllBits();
4025 break;
4026 }
4027 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4028 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4029 Known = KnownBits::makeConstant(CInt->getValue());
4030 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4031 Known =
4032 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4033 }
4034 }
4035 }
4036 } else if (Op.getResNo() == 0) {
4037 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4038 KnownBits KnownScalarMemory(ScalarMemorySize);
4039 if (const MDNode *MD = LD->getRanges())
4040 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4041
4042 // Extend the Known bits from memory to the size of the scalar result.
4043 if (ISD::isZEXTLoad(Op.getNode()))
4044 Known = KnownScalarMemory.zext(BitWidth);
4045 else if (ISD::isSEXTLoad(Op.getNode()))
4046 Known = KnownScalarMemory.sext(BitWidth);
4047 else if (ISD::isEXTLoad(Op.getNode()))
4048 Known = KnownScalarMemory.anyext(BitWidth);
4049 else
4050 Known = KnownScalarMemory;
4051 assert(Known.getBitWidth() == BitWidth);
4052 return Known;
4053 }
4054 break;
4055 }
4057 if (Op.getValueType().isScalableVector())
4058 break;
4059 EVT InVT = Op.getOperand(0).getValueType();
4060 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4061 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4062 Known = Known.zext(BitWidth);
4063 break;
4064 }
4065 case ISD::ZERO_EXTEND: {
4066 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4067 Known = Known.zext(BitWidth);
4068 break;
4069 }
4071 if (Op.getValueType().isScalableVector())
4072 break;
4073 EVT InVT = Op.getOperand(0).getValueType();
4074 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4075 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4076 // If the sign bit is known to be zero or one, then sext will extend
4077 // it to the top bits, else it will just zext.
4078 Known = Known.sext(BitWidth);
4079 break;
4080 }
4081 case ISD::SIGN_EXTEND: {
4082 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4083 // If the sign bit is known to be zero or one, then sext will extend
4084 // it to the top bits, else it will just zext.
4085 Known = Known.sext(BitWidth);
4086 break;
4087 }
4089 if (Op.getValueType().isScalableVector())
4090 break;
4091 EVT InVT = Op.getOperand(0).getValueType();
4092 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4093 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4094 Known = Known.anyext(BitWidth);
4095 break;
4096 }
4097 case ISD::ANY_EXTEND: {
4098 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4099 Known = Known.anyext(BitWidth);
4100 break;
4101 }
4102 case ISD::TRUNCATE: {
4103 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4104 Known = Known.trunc(BitWidth);
4105 break;
4106 }
4107 case ISD::TRUNCATE_SSAT_S: {
4108 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4109 Known = Known.truncSSat(BitWidth);
4110 break;
4111 }
4112 case ISD::TRUNCATE_SSAT_U: {
4113 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4114 Known = Known.truncSSatU(BitWidth);
4115 break;
4116 }
4117 case ISD::TRUNCATE_USAT_U: {
4118 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4119 Known = Known.truncUSat(BitWidth);
4120 break;
4121 }
4122 case ISD::AssertZext: {
4123 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4125 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4126 Known.Zero |= (~InMask);
4127 Known.One &= (~Known.Zero);
4128 break;
4129 }
4130 case ISD::AssertAlign: {
4131 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4132 assert(LogOfAlign != 0);
4133
4134 // TODO: Should use maximum with source
4135 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4136 // well as clearing one bits.
4137 Known.Zero.setLowBits(LogOfAlign);
4138 Known.One.clearLowBits(LogOfAlign);
4139 break;
4140 }
4141 case ISD::AssertNoFPClass: {
4142 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4143
4144 FPClassTest NoFPClass =
4145 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4146 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4147 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4148 // Cannot be negative.
4149 Known.makeNonNegative();
4150 }
4151
4152 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4153 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4154 // Cannot be positive.
4155 Known.makeNegative();
4156 }
4157
4158 break;
4159 }
4160 case ISD::FABS:
4161 // fabs clears the sign bit
4162 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4163 Known.makeNonNegative();
4164 break;
4165 case ISD::FGETSIGN:
4166 // All bits are zero except the low bit.
4167 Known.Zero.setBitsFrom(1);
4168 break;
4169 case ISD::ADD: {
4170 SDNodeFlags Flags = Op.getNode()->getFlags();
4171 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4172 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4173 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4175 Op.getOperand(0), DemandedElts,
4177 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4178 Flags.hasNoUnsignedWrap(), SelfAdd);
4179 break;
4180 }
4181 case ISD::SUB: {
4182 SDNodeFlags Flags = Op.getNode()->getFlags();
4183 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4184 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4185 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4186 Flags.hasNoUnsignedWrap());
4187 break;
4188 }
4189 case ISD::USUBO:
4190 case ISD::SSUBO:
4191 case ISD::USUBO_CARRY:
4192 case ISD::SSUBO_CARRY:
4193 if (Op.getResNo() == 1) {
4194 // If we know the result of a setcc has the top bits zero, use this info.
4195 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4197 BitWidth > 1)
4198 Known.Zero.setBitsFrom(1);
4199 break;
4200 }
4201 [[fallthrough]];
4202 case ISD::SUBC: {
4203 assert(Op.getResNo() == 0 &&
4204 "We only compute knownbits for the difference here.");
4205
4206 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4207 KnownBits Borrow(1);
4208 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4209 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4210 // Borrow has bit width 1
4211 Borrow = Borrow.trunc(1);
4212 } else {
4213 Borrow.setAllZero();
4214 }
4215
4216 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4217 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4218 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4219 break;
4220 }
4221 case ISD::UADDO:
4222 case ISD::SADDO:
4223 case ISD::UADDO_CARRY:
4224 case ISD::SADDO_CARRY:
4225 if (Op.getResNo() == 1) {
4226 // If we know the result of a setcc has the top bits zero, use this info.
4227 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4229 BitWidth > 1)
4230 Known.Zero.setBitsFrom(1);
4231 break;
4232 }
4233 [[fallthrough]];
4234 case ISD::ADDC:
4235 case ISD::ADDE: {
4236 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4237
4238 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4239 KnownBits Carry(1);
4240 if (Opcode == ISD::ADDE)
4241 // Can't track carry from glue, set carry to unknown.
4242 Carry.resetAll();
4243 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4244 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4245 // Carry has bit width 1
4246 Carry = Carry.trunc(1);
4247 } else {
4248 Carry.setAllZero();
4249 }
4250
4251 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4252 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4253 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4254 break;
4255 }
4256 case ISD::UDIV: {
4257 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4258 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4259 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4260 break;
4261 }
4262 case ISD::SDIV: {
4263 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4264 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4265 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4266 break;
4267 }
4268 case ISD::SREM: {
4269 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4270 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4271 Known = KnownBits::srem(Known, Known2);
4272 break;
4273 }
4274 case ISD::UREM: {
4275 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4276 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4277 Known = KnownBits::urem(Known, Known2);
4278 break;
4279 }
4280 case ISD::EXTRACT_ELEMENT: {
4281 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4282 const unsigned Index = Op.getConstantOperandVal(1);
4283 const unsigned EltBitWidth = Op.getValueSizeInBits();
4284
4285 // Remove low part of known bits mask
4286 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4287 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4288
4289 // Remove high part of known bit mask
4290 Known = Known.trunc(EltBitWidth);
4291 break;
4292 }
4294 SDValue InVec = Op.getOperand(0);
4295 SDValue EltNo = Op.getOperand(1);
4296 EVT VecVT = InVec.getValueType();
4297 // computeKnownBits not yet implemented for scalable vectors.
4298 if (VecVT.isScalableVector())
4299 break;
4300 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4301 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4302
4303 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4304 // anything about the extended bits.
4305 if (BitWidth > EltBitWidth)
4306 Known = Known.trunc(EltBitWidth);
4307
4308 // If we know the element index, just demand that vector element, else for
4309 // an unknown element index, ignore DemandedElts and demand them all.
4310 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4311 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4312 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4313 DemandedSrcElts =
4314 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4315
4316 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4317 if (BitWidth > EltBitWidth)
4318 Known = Known.anyext(BitWidth);
4319 break;
4320 }
4322 if (Op.getValueType().isScalableVector())
4323 break;
4324
4325 // If we know the element index, split the demand between the
4326 // source vector and the inserted element, otherwise assume we need
4327 // the original demanded vector elements and the value.
4328 SDValue InVec = Op.getOperand(0);
4329 SDValue InVal = Op.getOperand(1);
4330 SDValue EltNo = Op.getOperand(2);
4331 bool DemandedVal = true;
4332 APInt DemandedVecElts = DemandedElts;
4333 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4334 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4335 unsigned EltIdx = CEltNo->getZExtValue();
4336 DemandedVal = !!DemandedElts[EltIdx];
4337 DemandedVecElts.clearBit(EltIdx);
4338 }
4339 Known.setAllConflict();
4340 if (DemandedVal) {
4341 Known2 = computeKnownBits(InVal, Depth + 1);
4342 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4343 }
4344 if (!!DemandedVecElts) {
4345 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4346 Known = Known.intersectWith(Known2);
4347 }
4348 break;
4349 }
4350 case ISD::BITREVERSE: {
4351 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4352 Known = Known2.reverseBits();
4353 break;
4354 }
4355 case ISD::BSWAP: {
4356 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4357 Known = Known2.byteSwap();
4358 break;
4359 }
4360 case ISD::ABS:
4361 case ISD::ABS_MIN_POISON: {
4362 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4363 Known = Known2.abs();
4364 Known.Zero.setHighBits(
4365 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4366 break;
4367 }
4368 case ISD::USUBSAT: {
4369 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4370 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4371 Known = KnownBits::usub_sat(Known, Known2);
4372 break;
4373 }
4374 case ISD::UMIN: {
4375 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4376 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4377 Known = KnownBits::umin(Known, Known2);
4378 break;
4379 }
4380 case ISD::UMAX: {
4381 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4382 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4383 Known = KnownBits::umax(Known, Known2);
4384 break;
4385 }
4386 case ISD::SMIN:
4387 case ISD::SMAX: {
4388 // If we have a clamp pattern, we know that the number of sign bits will be
4389 // the minimum of the clamp min/max range.
4390 bool IsMax = (Opcode == ISD::SMAX);
4391 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4392 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4393 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4394 CstHigh =
4395 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4396 if (CstLow && CstHigh) {
4397 if (!IsMax)
4398 std::swap(CstLow, CstHigh);
4399
4400 const APInt &ValueLow = CstLow->getAPIntValue();
4401 const APInt &ValueHigh = CstHigh->getAPIntValue();
4402 if (ValueLow.sle(ValueHigh)) {
4403 unsigned LowSignBits = ValueLow.getNumSignBits();
4404 unsigned HighSignBits = ValueHigh.getNumSignBits();
4405 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4406 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4407 Known.One.setHighBits(MinSignBits);
4408 break;
4409 }
4410 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4411 Known.Zero.setHighBits(MinSignBits);
4412 break;
4413 }
4414 }
4415 }
4416
4417 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4418 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4419 if (IsMax)
4420 Known = KnownBits::smax(Known, Known2);
4421 else
4422 Known = KnownBits::smin(Known, Known2);
4423
4424 // For SMAX, if CstLow is non-negative we know the result will be
4425 // non-negative and thus all sign bits are 0.
4426 // TODO: There's an equivalent of this for smin with negative constant for
4427 // known ones.
4428 if (IsMax && CstLow) {
4429 const APInt &ValueLow = CstLow->getAPIntValue();
4430 if (ValueLow.isNonNegative()) {
4431 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4432 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4433 }
4434 }
4435
4436 break;
4437 }
4438 case ISD::UINT_TO_FP: {
4439 Known.makeNonNegative();
4440 break;
4441 }
4442 case ISD::SINT_TO_FP: {
4443 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4444 if (Known2.isNonNegative())
4445 Known.makeNonNegative();
4446 else if (Known2.isNegative())
4447 Known.makeNegative();
4448 break;
4449 }
4450 case ISD::FP_TO_UINT_SAT: {
4451 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4452 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4454 break;
4455 }
4456 case ISD::ATOMIC_LOAD: {
4457 // If we are looking at the loaded value.
4458 if (Op.getResNo() == 0) {
4459 auto *AT = cast<AtomicSDNode>(Op);
4460 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4461 KnownBits KnownScalarMemory(ScalarMemorySize);
4462 if (const MDNode *MD = AT->getRanges())
4463 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4464
4465 switch (AT->getExtensionType()) {
4466 case ISD::ZEXTLOAD:
4467 Known = KnownScalarMemory.zext(BitWidth);
4468 break;
4469 case ISD::SEXTLOAD:
4470 Known = KnownScalarMemory.sext(BitWidth);
4471 break;
4472 case ISD::EXTLOAD:
4473 switch (TLI->getExtendForAtomicOps()) {
4474 case ISD::ZERO_EXTEND:
4475 Known = KnownScalarMemory.zext(BitWidth);
4476 break;
4477 case ISD::SIGN_EXTEND:
4478 Known = KnownScalarMemory.sext(BitWidth);
4479 break;
4480 default:
4481 Known = KnownScalarMemory.anyext(BitWidth);
4482 break;
4483 }
4484 break;
4485 case ISD::NON_EXTLOAD:
4486 Known = KnownScalarMemory;
4487 break;
4488 }
4489 assert(Known.getBitWidth() == BitWidth);
4490 }
4491 break;
4492 }
4494 if (Op.getResNo() == 1) {
4495 // The boolean result conforms to getBooleanContents.
4496 // If we know the result of a setcc has the top bits zero, use this info.
4497 // We know that we have an integer-based boolean since these operations
4498 // are only available for integer.
4499 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4501 BitWidth > 1)
4502 Known.Zero.setBitsFrom(1);
4503 break;
4504 }
4505 [[fallthrough]];
4507 case ISD::ATOMIC_SWAP:
4518 case ISD::ATOMIC_LOAD_UMAX: {
4519 // If we are looking at the loaded value.
4520 if (Op.getResNo() == 0) {
4521 auto *AT = cast<AtomicSDNode>(Op);
4522 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4523
4524 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4525 Known.Zero.setBitsFrom(MemBits);
4526 }
4527 break;
4528 }
4529 case ISD::FrameIndex:
4530 case ISD::TargetFrameIndex: {
4531 const MachineFunction &MF = getMachineFunction();
4532 int FrameIdx = cast<FrameIndexSDNode>(Op)->getIndex();
4533 TLI->computeKnownBitsForStackObjectPointer(
4534 Known, MF, MF.getFrameInfo().getObjectAlign(FrameIdx));
4535 break;
4536 }
4537
4538 default:
4539 if (Opcode < ISD::BUILTIN_OP_END)
4540 break;
4541 [[fallthrough]];
4545 // Allow the target to implement this method for its nodes.
4546 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4547 break;
4548 }
4549
4550 return Known;
4551}
4552
4553/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4566
4569 // X + 0 never overflow
4570 if (isNullConstant(N1))
4571 return OFK_Never;
4572
4573 // If both operands each have at least two sign bits, the addition
4574 // cannot overflow.
4575 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4576 return OFK_Never;
4577
4578 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4579 return OFK_Sometime;
4580}
4581
4584 // X + 0 never overflow
4585 if (isNullConstant(N1))
4586 return OFK_Never;
4587
4588 // mulhi + 1 never overflow
4589 KnownBits N1Known = computeKnownBits(N1);
4590 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4591 N1Known.getMaxValue().ult(2))
4592 return OFK_Never;
4593
4594 KnownBits N0Known = computeKnownBits(N0);
4595 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4596 N0Known.getMaxValue().ult(2))
4597 return OFK_Never;
4598
4599 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4600 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4601 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4602 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4603}
4604
4607 // X - 0 never overflow
4608 if (isNullConstant(N1))
4609 return OFK_Never;
4610
4611 // If both operands each have at least two sign bits, the subtraction
4612 // cannot overflow.
4613 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4614 return OFK_Never;
4615
4616 KnownBits N0Known = computeKnownBits(N0);
4617 KnownBits N1Known = computeKnownBits(N1);
4618 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4619 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4620 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4621}
4622
4625 // X - 0 never overflow
4626 if (isNullConstant(N1))
4627 return OFK_Never;
4628
4629 ConstantRange N0Range =
4630 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4631 ConstantRange N1Range =
4632 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4633 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4634}
4635
4638 // X * 0 and X * 1 never overflow.
4639 if (isNullConstant(N1) || isOneConstant(N1))
4640 return OFK_Never;
4641
4644 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4645}
4646
4649 // X * 0 and X * 1 never overflow.
4650 if (isNullConstant(N1) || isOneConstant(N1))
4651 return OFK_Never;
4652
4653 // Get the size of the result.
4654 unsigned BitWidth = N0.getScalarValueSizeInBits();
4655
4656 // Sum of the sign bits.
4657 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4658
4659 // If we have enough sign bits, then there's no overflow.
4660 if (SignBits > BitWidth + 1)
4661 return OFK_Never;
4662
4663 if (SignBits == BitWidth + 1) {
4664 // The overflow occurs when the true multiplication of the
4665 // the operands is the minimum negative number.
4666 KnownBits N0Known = computeKnownBits(N0);
4667 KnownBits N1Known = computeKnownBits(N1);
4668 // If one of the operands is non-negative, then there's no
4669 // overflow.
4670 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4671 return OFK_Never;
4672 }
4673
4674 return OFK_Sometime;
4675}
4676
4678 unsigned Depth) const {
4679 APInt DemandedElts = getDemandAllEltsMask(Op);
4680 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4681}
4682
4684 const APInt &DemandedElts,
4685 bool ForSigned,
4686 unsigned Depth) const {
4687 EVT VT = Op.getValueType();
4688 unsigned BitWidth = VT.getScalarSizeInBits();
4689
4690 if (Depth >= MaxRecursionDepth)
4691 return ConstantRange::getFull(BitWidth);
4692
4693 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4694 return ConstantRange(C->getAPIntValue());
4695
4696 unsigned Opcode = Op.getOpcode();
4697 switch (Opcode) {
4698 case ISD::VSCALE: {
4700 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4701 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4702 }
4703 default:
4704 break;
4705 }
4706
4707 return ConstantRange::getFull(BitWidth);
4708}
4709
4712 unsigned Depth) const {
4713 APInt DemandedElts = getDemandAllEltsMask(Op);
4714 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4715 Depth);
4716}
4717
4719 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4720 unsigned Depth) const {
4721 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4723 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4726 return CR1.intersectWith(CR2, RangeType);
4727}
4728
4730 unsigned Depth) const {
4731 APInt DemandedElts = getDemandAllEltsMask(Val);
4732 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4733}
4734
4736 const APInt &DemandedElts,
4737 bool OrZero, unsigned Depth) const {
4738 if (Depth >= MaxRecursionDepth)
4739 return false; // Limit search depth.
4740
4741 EVT OpVT = Val.getValueType();
4742 unsigned BitWidth = OpVT.getScalarSizeInBits();
4743 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4744 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4745 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4746 assert(
4747 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4748 "Unexpected vector size");
4749
4750 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4751 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4752 return (OrZero && V.isZero()) || V.isPowerOf2();
4753 };
4754
4755 // Is the constant a known power of 2 or zero?
4756 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4757 return true;
4758
4759 switch (Val.getOpcode()) {
4760 case ISD::BUILD_VECTOR:
4761 // Are all operands of a build vector constant powers of two or zero?
4762 if (all_of(enumerate(Val->ops()), [&](auto P) {
4763 auto *C = dyn_cast<ConstantSDNode>(P.value());
4764 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4765 }))
4766 return true;
4767 break;
4768
4769 case ISD::SPLAT_VECTOR:
4770 // Is the operand of a splat vector a constant power of two?
4771 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4772 if (IsPowerOfTwoOrZero(C))
4773 return true;
4774 break;
4775
4777 SDValue InVec = Val.getOperand(0);
4778 SDValue EltNo = Val.getOperand(1);
4779 EVT VecVT = InVec.getValueType();
4780
4781 // Skip scalable vectors or implicit extensions.
4782 if (VecVT.isScalableVector() ||
4783 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4784 break;
4785
4786 // If we know the element index, just demand that vector element, else for
4787 // an unknown element index, ignore DemandedElts and demand them all.
4788 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4789 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4790 APInt DemandedSrcElts =
4791 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4792 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4793 : APInt::getAllOnes(NumSrcElts);
4794 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4795 }
4796
4797 case ISD::AND: {
4798 // Looking for `x & -x` pattern:
4799 // If x == 0:
4800 // x & -x -> 0
4801 // If x != 0:
4802 // x & -x -> non-zero pow2
4803 // so if we find the pattern return whether we know `x` is non-zero.
4804 SDValue X, Z;
4805 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4806 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4807 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4808 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4809 break;
4810 }
4811
4812 case ISD::SHL: {
4813 // A left-shift of a constant one will have exactly one bit set because
4814 // shifting the bit off the end is undefined.
4815 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4816 if (C && C->getAPIntValue() == 1)
4817 return true;
4818 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4819 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4820 Depth + 1);
4821 }
4822
4823 case ISD::SRL: {
4824 // A logical right-shift of a constant sign-bit will have exactly
4825 // one bit set.
4826 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4827 if (C && C->getAPIntValue().isSignMask())
4828 return true;
4829 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4830 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4831 Depth + 1);
4832 }
4833
4834 case ISD::TRUNCATE:
4835 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4836 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4837 Depth + 1);
4838
4839 case ISD::ROTL:
4840 case ISD::ROTR:
4841 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4842 Depth + 1);
4843 case ISD::BSWAP:
4844 case ISD::BITREVERSE:
4845 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4846 Depth + 1);
4847
4848 case ISD::SMIN:
4849 case ISD::SMAX:
4850 case ISD::UMIN:
4851 case ISD::UMAX:
4852 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4853 Depth + 1) &&
4854 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4855 Depth + 1);
4856
4857 case ISD::SELECT:
4858 case ISD::VSELECT:
4859 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4860 Depth + 1) &&
4861 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4862 Depth + 1);
4863
4864 case ISD::ZERO_EXTEND:
4865 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4866 Depth + 1);
4867
4868 case ISD::VSCALE:
4869 // vscale(power-of-two) is a power-of-two
4870 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4871 Depth + 1);
4872
4873 case ISD::VECTOR_SHUFFLE: {
4875 // Demanded elements with undef shuffle mask elements are unknown
4876 // - we cannot guarantee they are a power of two, so return false.
4877 APInt DemandedLHS, DemandedRHS;
4879 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4880 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4881 DemandedLHS, DemandedRHS))
4882 return false;
4883
4884 // All demanded elements from LHS must be known power of two.
4885 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4886 OrZero, Depth + 1))
4887 return false;
4888
4889 // All demanded elements from RHS must be known power of two.
4890 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4891 OrZero, Depth + 1))
4892 return false;
4893
4894 return true;
4895 }
4896 }
4897
4898 // More could be done here, though the above checks are enough
4899 // to handle some common cases.
4900 return false;
4901}
4902
4904 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4905 return C1->getValueAPF().getExactLog2Abs() >= 0;
4906
4907 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4908 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4909
4910 return false;
4911}
4912
4914 APInt DemandedElts = getDemandAllEltsMask(Op);
4915 return ComputeNumSignBits(Op, DemandedElts, Depth);
4916}
4917
4918unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4919 unsigned Depth) const {
4920 EVT VT = Op.getValueType();
4921 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4922 unsigned VTBits = VT.getScalarSizeInBits();
4923 unsigned NumElts = DemandedElts.getBitWidth();
4924 unsigned Tmp, Tmp2;
4925 unsigned FirstAnswer = 1;
4926
4927 assert((!VT.isScalableVector() || NumElts == 1) &&
4928 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4929
4930 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4931 const APInt &Val = C->getAPIntValue();
4932 return Val.getNumSignBits();
4933 }
4934
4935 if (Depth >= MaxRecursionDepth)
4936 return 1; // Limit search depth.
4937
4938 if (!DemandedElts)
4939 return 1; // No demanded elts, better to assume we don't know anything.
4940
4941 unsigned Opcode = Op.getOpcode();
4942 switch (Opcode) {
4943 default: break;
4944 case ISD::AssertSext:
4945 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4946 return VTBits-Tmp+1;
4947 case ISD::AssertZext:
4948 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4949 return VTBits-Tmp;
4950 case ISD::FREEZE:
4951 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4953 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4954 break;
4955 case ISD::MERGE_VALUES:
4956 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4957 Depth + 1);
4958 case ISD::SPLAT_VECTOR: {
4959 // Check if the sign bits of source go down as far as the truncated value.
4960 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4961 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4962 if (NumSrcSignBits > (NumSrcBits - VTBits))
4963 return NumSrcSignBits - (NumSrcBits - VTBits);
4964 break;
4965 }
4966 case ISD::BUILD_VECTOR:
4967 assert(!VT.isScalableVector());
4968 Tmp = VTBits;
4969 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4970 if (!DemandedElts[i])
4971 continue;
4972
4973 SDValue SrcOp = Op.getOperand(i);
4974 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4975 // for constant nodes to ensure we only look at the sign bits.
4977 APInt T = C->getAPIntValue().trunc(VTBits);
4978 Tmp2 = T.getNumSignBits();
4979 } else {
4980 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4981
4982 if (SrcOp.getValueSizeInBits() != VTBits) {
4983 assert(SrcOp.getValueSizeInBits() > VTBits &&
4984 "Expected BUILD_VECTOR implicit truncation");
4985 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4986 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4987 }
4988 }
4989 Tmp = std::min(Tmp, Tmp2);
4990 }
4991 return Tmp;
4992
4993 case ISD::VECTOR_COMPRESS: {
4994 SDValue Vec = Op.getOperand(0);
4995 SDValue PassThru = Op.getOperand(2);
4996 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4997 if (Tmp == 1)
4998 return 1;
4999 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
5000 Tmp = std::min(Tmp, Tmp2);
5001 return Tmp;
5002 }
5003
5004 case ISD::VECTOR_SHUFFLE: {
5005 // Collect the minimum number of sign bits that are shared by every vector
5006 // element referenced by the shuffle.
5007 APInt DemandedLHS, DemandedRHS;
5009 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5010 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5011 DemandedLHS, DemandedRHS))
5012 return 1;
5013
5014 Tmp = std::numeric_limits<unsigned>::max();
5015 if (!!DemandedLHS)
5016 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5017 if (!!DemandedRHS) {
5018 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5019 Tmp = std::min(Tmp, Tmp2);
5020 }
5021 // If we don't know anything, early out and try computeKnownBits fall-back.
5022 if (Tmp == 1)
5023 break;
5024 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5025 return Tmp;
5026 }
5027
5028 case ISD::BITCAST: {
5029 if (VT.isScalableVector())
5030 break;
5031 SDValue N0 = Op.getOperand(0);
5032 EVT SrcVT = N0.getValueType();
5033 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5034
5035 // Ignore bitcasts from unsupported types..
5036 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5037 break;
5038
5039 // Fast handling of 'identity' bitcasts.
5040 if (VTBits == SrcBits)
5041 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5042
5043 bool IsLE = getDataLayout().isLittleEndian();
5044
5045 // Bitcast 'large element' scalar/vector to 'small element' vector.
5046 if ((SrcBits % VTBits) == 0) {
5047 assert(VT.isVector() && "Expected bitcast to vector");
5048
5049 unsigned Scale = SrcBits / VTBits;
5050 APInt SrcDemandedElts =
5051 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5052
5053 // Fast case - sign splat can be simply split across the small elements.
5054 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5055 if (Tmp == SrcBits)
5056 return VTBits;
5057
5058 // Slow case - determine how far the sign extends into each sub-element.
5059 Tmp2 = VTBits;
5060 for (unsigned i = 0; i != NumElts; ++i)
5061 if (DemandedElts[i]) {
5062 unsigned SubOffset = i % Scale;
5063 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5064 SubOffset = SubOffset * VTBits;
5065 if (Tmp <= SubOffset)
5066 return 1;
5067 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5068 }
5069 return Tmp2;
5070 }
5071 break;
5072 }
5073
5075 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5076 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5077 return VTBits - Tmp + 1;
5078 case ISD::SIGN_EXTEND:
5079 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5080 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5082 // Max of the input and what this extends.
5083 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5084 Tmp = VTBits-Tmp+1;
5085 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5086 return std::max(Tmp, Tmp2);
5088 if (VT.isScalableVector())
5089 break;
5090 SDValue Src = Op.getOperand(0);
5091 EVT SrcVT = Src.getValueType();
5092 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5093 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5094 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5095 }
5096 case ISD::SRA:
5097 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5098 // SRA X, C -> adds C sign bits.
5099 if (std::optional<unsigned> ShAmt =
5100 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5101 Tmp = std::min(Tmp + *ShAmt, VTBits);
5102 return Tmp;
5103 case ISD::SHL:
5104 if (std::optional<ConstantRange> ShAmtRange =
5105 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5106 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5107 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5108 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5109 // shifted out, then we can compute the number of sign bits for the
5110 // operand being extended. A future improvement could be to pass along the
5111 // "shifted left by" information in the recursive calls to
5112 // ComputeKnownSignBits. Allowing us to handle this more generically.
5113 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5114 SDValue Ext = Op.getOperand(0);
5115 EVT ExtVT = Ext.getValueType();
5116 SDValue Extendee = Ext.getOperand(0);
5117 EVT ExtendeeVT = Extendee.getValueType();
5118 unsigned SizeDifference =
5119 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5120 if (SizeDifference <= MinShAmt) {
5121 Tmp = SizeDifference +
5122 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5123 if (MaxShAmt < Tmp)
5124 return Tmp - MaxShAmt;
5125 }
5126 }
5127 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5128 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5129 if (MaxShAmt < Tmp)
5130 return Tmp - MaxShAmt;
5131 }
5132 break;
5133 case ISD::AND:
5134 case ISD::OR:
5135 case ISD::XOR: // NOT is handled here.
5136 // Logical binary ops preserve the number of sign bits at the worst.
5137 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5138 if (Tmp != 1) {
5139 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5140 FirstAnswer = std::min(Tmp, Tmp2);
5141 // We computed what we know about the sign bits as our first
5142 // answer. Now proceed to the generic code that uses
5143 // computeKnownBits, and pick whichever answer is better.
5144 }
5145 break;
5146
5147 case ISD::SELECT:
5148 case ISD::VSELECT:
5149 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5150 if (Tmp == 1) return 1; // Early out.
5151 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5152 return std::min(Tmp, Tmp2);
5153 case ISD::SELECT_CC:
5154 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5155 if (Tmp == 1) return 1; // Early out.
5156 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5157 return std::min(Tmp, Tmp2);
5158
5159 case ISD::SMIN:
5160 case ISD::SMAX: {
5161 // If we have a clamp pattern, we know that the number of sign bits will be
5162 // the minimum of the clamp min/max range.
5163 bool IsMax = (Opcode == ISD::SMAX);
5164 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5165 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5166 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5167 CstHigh =
5168 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5169 if (CstLow && CstHigh) {
5170 if (!IsMax)
5171 std::swap(CstLow, CstHigh);
5172 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5173 Tmp = CstLow->getAPIntValue().getNumSignBits();
5174 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5175 return std::min(Tmp, Tmp2);
5176 }
5177 }
5178
5179 // Fallback - just get the minimum number of sign bits of the operands.
5180 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5181 if (Tmp == 1)
5182 return 1; // Early out.
5183 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5184 return std::min(Tmp, Tmp2);
5185 }
5186 case ISD::UMIN:
5187 case ISD::UMAX:
5188 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5189 if (Tmp == 1)
5190 return 1; // Early out.
5191 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5192 return std::min(Tmp, Tmp2);
5193 case ISD::SSUBO_CARRY:
5194 case ISD::USUBO_CARRY:
5195 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5196 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5197 return VTBits;
5198 [[fallthrough]];
5199 case ISD::SADDO:
5200 case ISD::UADDO:
5201 case ISD::SADDO_CARRY:
5202 case ISD::UADDO_CARRY:
5203 case ISD::SSUBO:
5204 case ISD::USUBO:
5205 case ISD::SMULO:
5206 case ISD::UMULO:
5207 if (Op.getResNo() != 1)
5208 break;
5209 // The boolean result conforms to getBooleanContents. Fall through.
5210 // If setcc returns 0/-1, all bits are sign bits.
5211 // We know that we have an integer-based boolean since these operations
5212 // are only available for integer.
5213 if (TLI->getBooleanContents(VT.isVector(), false) ==
5215 return VTBits;
5216 break;
5217 case ISD::SETCC:
5218 case ISD::SETCCCARRY:
5219 case ISD::STRICT_FSETCC:
5220 case ISD::STRICT_FSETCCS: {
5221 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5222 // If setcc returns 0/-1, all bits are sign bits.
5223 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5225 return VTBits;
5226 break;
5227 }
5229 // Semantically similar to icmp ult.
5230 if (TLI->getBooleanContents(VT.isVector(), /*isFloat=*/false) ==
5232 return VTBits;
5233 break;
5234 case ISD::ROTL:
5235 case ISD::ROTR:
5236 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5237
5238 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5239 if (Tmp == VTBits)
5240 return VTBits;
5241
5242 if (ConstantSDNode *C =
5243 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5244 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5245
5246 // Handle rotate right by N like a rotate left by 32-N.
5247 if (Opcode == ISD::ROTR)
5248 RotAmt = (VTBits - RotAmt) % VTBits;
5249
5250 // If we aren't rotating out all of the known-in sign bits, return the
5251 // number that are left. This handles rotl(sext(x), 1) for example.
5252 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5253 }
5254 break;
5255 case ISD::ADD:
5256 case ISD::ADDC:
5257 // TODO: Move Operand 1 check before Operand 0 check
5258 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5259 if (Tmp == 1) return 1; // Early out.
5260
5261 // Special case decrementing a value (ADD X, -1):
5262 if (ConstantSDNode *CRHS =
5263 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5264 if (CRHS->isAllOnes()) {
5266 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5267
5268 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5269 // sign bits set.
5270 if ((Known.Zero | 1).isAllOnes())
5271 return VTBits;
5272
5273 // If we are subtracting one from a positive number, there is no carry
5274 // out of the result.
5275 if (Known.isNonNegative())
5276 return Tmp;
5277 }
5278
5279 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5280 if (Tmp2 == 1) return 1; // Early out.
5281
5282 // Add can have at most one carry bit. Thus we know that the output
5283 // is, at worst, one more bit than the inputs.
5284 return std::min(Tmp, Tmp2) - 1;
5285 case ISD::SUB:
5286 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5287 if (Tmp2 == 1) return 1; // Early out.
5288
5289 // Handle NEG.
5290 if (ConstantSDNode *CLHS =
5291 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5292 if (CLHS->isZero()) {
5294 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5295 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5296 // sign bits set.
5297 if ((Known.Zero | 1).isAllOnes())
5298 return VTBits;
5299
5300 // If the input is known to be positive (the sign bit is known clear),
5301 // the output of the NEG has the same number of sign bits as the input.
5302 if (Known.isNonNegative())
5303 return Tmp2;
5304
5305 // Otherwise, we treat this like a SUB.
5306 }
5307
5308 // Sub can have at most one carry bit. Thus we know that the output
5309 // is, at worst, one more bit than the inputs.
5310 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5311 if (Tmp == 1) return 1; // Early out.
5312 return std::min(Tmp, Tmp2) - 1;
5313 case ISD::MUL: {
5314 // The output of the Mul can be at most twice the valid bits in the inputs.
5315 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5316 if (SignBitsOp0 == 1)
5317 break;
5318 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5319 if (SignBitsOp1 == 1)
5320 break;
5321 unsigned OutValidBits =
5322 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5323 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5324 }
5325 case ISD::AVGCEILS:
5326 case ISD::AVGFLOORS:
5327 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5328 if (Tmp == 1)
5329 return 1; // Early out.
5330 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5331 return std::min(Tmp, Tmp2);
5332 case ISD::SREM:
5333 // The sign bit is the LHS's sign bit, except when the result of the
5334 // remainder is zero. The magnitude of the result should be less than or
5335 // equal to the magnitude of the LHS. Therefore, the result should have
5336 // at least as many sign bits as the left hand side.
5337 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5338 case ISD::TRUNCATE: {
5339 // Check if the sign bits of source go down as far as the truncated value.
5340 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5341 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5342 if (NumSrcSignBits > (NumSrcBits - VTBits))
5343 return NumSrcSignBits - (NumSrcBits - VTBits);
5344 break;
5345 }
5346 case ISD::EXTRACT_ELEMENT: {
5347 if (VT.isScalableVector())
5348 break;
5349 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5350 const int BitWidth = Op.getValueSizeInBits();
5351 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5352
5353 // Get reverse index (starting from 1), Op1 value indexes elements from
5354 // little end. Sign starts at big end.
5355 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5356
5357 // If the sign portion ends in our element the subtraction gives correct
5358 // result. Otherwise it gives either negative or > bitwidth result
5359 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5360 }
5362 if (VT.isScalableVector())
5363 break;
5364 // If we know the element index, split the demand between the
5365 // source vector and the inserted element, otherwise assume we need
5366 // the original demanded vector elements and the value.
5367 SDValue InVec = Op.getOperand(0);
5368 SDValue InVal = Op.getOperand(1);
5369 SDValue EltNo = Op.getOperand(2);
5370 bool DemandedVal = true;
5371 APInt DemandedVecElts = DemandedElts;
5372 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5373 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5374 unsigned EltIdx = CEltNo->getZExtValue();
5375 DemandedVal = !!DemandedElts[EltIdx];
5376 DemandedVecElts.clearBit(EltIdx);
5377 }
5378 Tmp = std::numeric_limits<unsigned>::max();
5379 if (DemandedVal) {
5380 // TODO - handle implicit truncation of inserted elements.
5381 if (InVal.getScalarValueSizeInBits() != VTBits)
5382 break;
5383 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5384 Tmp = std::min(Tmp, Tmp2);
5385 }
5386 if (!!DemandedVecElts) {
5387 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5388 Tmp = std::min(Tmp, Tmp2);
5389 }
5390 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5391 return Tmp;
5392 }
5394 SDValue InVec = Op.getOperand(0);
5395 SDValue EltNo = Op.getOperand(1);
5396 EVT VecVT = InVec.getValueType();
5397 // ComputeNumSignBits not yet implemented for scalable vectors.
5398 if (VecVT.isScalableVector())
5399 break;
5400 const unsigned BitWidth = Op.getValueSizeInBits();
5401 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5402 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5403
5404 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5405 // anything about sign bits. But if the sizes match we can derive knowledge
5406 // about sign bits from the vector operand.
5407 if (BitWidth != EltBitWidth)
5408 break;
5409
5410 // If we know the element index, just demand that vector element, else for
5411 // an unknown element index, ignore DemandedElts and demand them all.
5412 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5413 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5414 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5415 DemandedSrcElts =
5416 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5417
5418 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5419 }
5421 // Offset the demanded elts by the subvector index.
5422 SDValue Src = Op.getOperand(0);
5423
5424 APInt DemandedSrcElts;
5425 if (Src.getValueType().isScalableVector())
5426 DemandedSrcElts = APInt(1, 1);
5427 else {
5428 uint64_t Idx = Op.getConstantOperandVal(1);
5429 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5430 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5431 }
5432 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5433 }
5434 case ISD::CONCAT_VECTORS: {
5435 if (VT.isScalableVector())
5436 break;
5437 // Determine the minimum number of sign bits across all demanded
5438 // elts of the input vectors. Early out if the result is already 1.
5439 Tmp = std::numeric_limits<unsigned>::max();
5440 EVT SubVectorVT = Op.getOperand(0).getValueType();
5441 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5442 unsigned NumSubVectors = Op.getNumOperands();
5443 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5444 APInt DemandedSub =
5445 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5446 if (!DemandedSub)
5447 continue;
5448 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5449 Tmp = std::min(Tmp, Tmp2);
5450 }
5451 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5452 return Tmp;
5453 }
5454 case ISD::INSERT_SUBVECTOR: {
5455 if (VT.isScalableVector())
5456 break;
5457 // Demand any elements from the subvector and the remainder from the src its
5458 // inserted into.
5459 SDValue Src = Op.getOperand(0);
5460 SDValue Sub = Op.getOperand(1);
5461 uint64_t Idx = Op.getConstantOperandVal(2);
5462 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5463 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5464 APInt DemandedSrcElts = DemandedElts;
5465 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5466
5467 Tmp = std::numeric_limits<unsigned>::max();
5468 if (!!DemandedSubElts) {
5469 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5470 if (Tmp == 1)
5471 return 1; // early-out
5472 }
5473 if (!!DemandedSrcElts) {
5474 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5475 Tmp = std::min(Tmp, Tmp2);
5476 }
5477 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5478 return Tmp;
5479 }
5480 case ISD::LOAD: {
5481 // If we are looking at the loaded value of the SDNode.
5482 if (Op.getResNo() != 0)
5483 break;
5484
5486 if (const MDNode *Ranges = LD->getRanges()) {
5487 if (DemandedElts != 1)
5488 break;
5489
5491 if (VTBits > CR.getBitWidth()) {
5492 switch (LD->getExtensionType()) {
5493 case ISD::SEXTLOAD:
5494 CR = CR.signExtend(VTBits);
5495 break;
5496 case ISD::ZEXTLOAD:
5497 CR = CR.zeroExtend(VTBits);
5498 break;
5499 default:
5500 break;
5501 }
5502 }
5503
5504 if (VTBits != CR.getBitWidth())
5505 break;
5506 return std::min(CR.getSignedMin().getNumSignBits(),
5508 }
5509
5510 unsigned ExtType = LD->getExtensionType();
5511 switch (ExtType) {
5512 default:
5513 break;
5514 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5515 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5516 return VTBits - Tmp + 1;
5517 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5518 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5519 return VTBits - Tmp;
5520 case ISD::NON_EXTLOAD:
5521 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5522 // We only need to handle vectors - computeKnownBits should handle
5523 // scalar cases.
5524 Type *CstTy = Cst->getType();
5525 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5526 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5527 VTBits == CstTy->getScalarSizeInBits()) {
5528 Tmp = VTBits;
5529 for (unsigned i = 0; i != NumElts; ++i) {
5530 if (!DemandedElts[i])
5531 continue;
5532 if (Constant *Elt = Cst->getAggregateElement(i)) {
5533 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5534 const APInt &Value = CInt->getValue();
5535 Tmp = std::min(Tmp, Value.getNumSignBits());
5536 continue;
5537 }
5538 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5539 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5540 Tmp = std::min(Tmp, Value.getNumSignBits());
5541 continue;
5542 }
5543 }
5544 // Unknown type. Conservatively assume no bits match sign bit.
5545 return 1;
5546 }
5547 return Tmp;
5548 }
5549 }
5550 break;
5551 }
5552
5553 break;
5554 }
5557 case ISD::ATOMIC_SWAP:
5569 case ISD::ATOMIC_LOAD: {
5570 auto *AT = cast<AtomicSDNode>(Op);
5571 // If we are looking at the loaded value.
5572 if (Op.getResNo() == 0) {
5573 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5574 if (Tmp == VTBits)
5575 return 1; // early-out
5576
5577 // For atomic_load, prefer to use the extension type.
5578 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5579 switch (AT->getExtensionType()) {
5580 default:
5581 break;
5582 case ISD::SEXTLOAD:
5583 return VTBits - Tmp + 1;
5584 case ISD::ZEXTLOAD:
5585 return VTBits - Tmp;
5586 }
5587 }
5588
5589 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5590 return VTBits - Tmp + 1;
5591 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5592 return VTBits - Tmp;
5593 }
5594 break;
5595 }
5596 }
5597
5598 // Allow the target to implement this method for its nodes.
5599 if (Opcode >= ISD::BUILTIN_OP_END ||
5600 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5601 Opcode == ISD::INTRINSIC_W_CHAIN ||
5602 Opcode == ISD::INTRINSIC_VOID) {
5603 // TODO: This can probably be removed once target code is audited. This
5604 // is here purely to reduce patch size and review complexity.
5605 if (!VT.isScalableVector()) {
5606 unsigned NumBits =
5607 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5608 if (NumBits > 1)
5609 FirstAnswer = std::max(FirstAnswer, NumBits);
5610 }
5611 }
5612
5613 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5614 // use this information.
5615 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5616 return std::max(FirstAnswer, Known.countMinSignBits());
5617}
5618
5620 unsigned Depth) const {
5621 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5622 return Op.getScalarValueSizeInBits() - SignBits + 1;
5623}
5624
5626 const APInt &DemandedElts,
5627 unsigned Depth) const {
5628 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5629 return Op.getScalarValueSizeInBits() - SignBits + 1;
5630}
5631
5633 UndefPoisonKind Kind,
5634 unsigned Depth) const {
5635 // Early out for FREEZE.
5636 if (Op.getOpcode() == ISD::FREEZE)
5637 return true;
5638
5639 APInt DemandedElts = getDemandAllEltsMask(Op);
5640 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5641}
5642
5644 const APInt &DemandedElts,
5645 UndefPoisonKind Kind,
5646 unsigned Depth) const {
5647 unsigned Opcode = Op.getOpcode();
5648
5649 // Early out for FREEZE.
5650 if (Opcode == ISD::FREEZE)
5651 return true;
5652
5653 if (Depth >= MaxRecursionDepth)
5654 return false; // Limit search depth.
5655
5656 if (isIntOrFPConstant(Op))
5657 return true;
5658
5659 switch (Opcode) {
5660 case ISD::CONDCODE:
5661 case ISD::VALUETYPE:
5662 case ISD::FrameIndex:
5664 case ISD::CopyFromReg:
5665 return true;
5666
5667 case ISD::POISON:
5668 return !includesPoison(Kind);
5669
5670 case ISD::UNDEF:
5671 return !includesUndef(Kind);
5672
5673 case ISD::BITCAST: {
5674 SDValue Src = Op.getOperand(0);
5675 EVT SrcVT = Src.getValueType();
5676 EVT DstVT = Op.getValueType();
5677
5678 if (!SrcVT.isVector() || !DstVT.isVector())
5679 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5680
5681 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5682 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5683 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5684 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5685
5686 if (SrcEltBits == DstEltBits)
5687 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5688 Depth + 1);
5689
5690 if (SrcEltBits < DstEltBits) {
5691 if (DstEltBits % SrcEltBits != 0)
5692 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5693
5694 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5695 "Unexpected vector bitcast");
5696 APInt DemandedSrcElts =
5697 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5698 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5699 Depth + 1);
5700 }
5701
5702 if (SrcEltBits % DstEltBits != 0)
5703 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5704
5705 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5706 "Unexpected vector bitcast");
5707 APInt DemandedSrcElts =
5708 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5709 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5710 Depth + 1);
5711 }
5712
5713 case ISD::BUILD_VECTOR:
5714 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5715 // this shouldn't affect the result.
5716 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5717 if (!DemandedElts[i])
5718 continue;
5719 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5720 return false;
5721 }
5722 return true;
5723
5724 case ISD::CONCAT_VECTORS: {
5725 EVT VT = Op.getValueType();
5726 if (!VT.isFixedLengthVector())
5727 break;
5728
5729 EVT SubVT = Op.getOperand(0).getValueType();
5730 unsigned NumSubElts = SubVT.getVectorNumElements();
5731 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5732 APInt DemandedSubElts =
5733 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5734 if (!!DemandedSubElts &&
5735 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5736 Kind, Depth + 1))
5737 return false;
5738 }
5739 return true;
5740 }
5741
5743 SDValue Src = Op.getOperand(0);
5744 if (Src.getValueType().isScalableVector())
5745 break;
5746 uint64_t Idx = Op.getConstantOperandVal(1);
5747 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5748 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5749 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5750 Depth + 1);
5751 }
5752
5753 case ISD::INSERT_SUBVECTOR: {
5754 if (Op.getValueType().isScalableVector())
5755 break;
5756 SDValue Src = Op.getOperand(0);
5757 SDValue Sub = Op.getOperand(1);
5758 uint64_t Idx = Op.getConstantOperandVal(2);
5759 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5760 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5761 APInt DemandedSrcElts = DemandedElts;
5762 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5763
5764 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5765 Sub, DemandedSubElts, Kind, Depth + 1))
5766 return false;
5767 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5768 Src, DemandedSrcElts, Kind, Depth + 1))
5769 return false;
5770 return true;
5771 }
5772
5774 SDValue Src = Op.getOperand(0);
5775 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5776 EVT SrcVT = Src.getValueType();
5777 if (SrcVT.isFixedLengthVector() && IndexC &&
5778 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5779 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5780 IndexC->getZExtValue());
5781 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5782 Depth + 1);
5783 }
5784 break;
5785 }
5786
5788 SDValue InVec = Op.getOperand(0);
5789 SDValue InVal = Op.getOperand(1);
5790 SDValue EltNo = Op.getOperand(2);
5791 EVT VT = InVec.getValueType();
5792 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5793 if (IndexC && VT.isFixedLengthVector() &&
5794 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5795 if (DemandedElts[IndexC->getZExtValue()] &&
5796 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5797 return false;
5798 APInt InVecDemandedElts = DemandedElts;
5799 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5800 if (!!InVecDemandedElts &&
5802 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5803 InVecDemandedElts, Kind, Depth + 1))
5804 return false;
5805 return true;
5806 }
5807 break;
5808 }
5809
5811 // Check upper (known undef) elements.
5812 if (DemandedElts.ugt(1) && includesUndef(Kind))
5813 return false;
5814 // Check element zero.
5815 if (DemandedElts[0] &&
5816 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5817 return false;
5818 return true;
5819
5820 case ISD::SPLAT_VECTOR:
5821 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5822
5823 case ISD::SELECT: {
5824 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5825 /*ConsiderFlags*/ true, Depth) &&
5826 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5827 Depth + 1) &&
5828 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5829 Kind, Depth + 1) &&
5830 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5831 Kind, Depth + 1);
5832 }
5833
5834 case ISD::VECTOR_SHUFFLE: {
5835 APInt DemandedLHS, DemandedRHS;
5836 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5837 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5838 DemandedElts, DemandedLHS, DemandedRHS,
5839 /*AllowUndefElts=*/false))
5840 return false;
5841 if (!DemandedLHS.isZero() &&
5842 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5843 Depth + 1))
5844 return false;
5845 if (!DemandedRHS.isZero() &&
5846 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5847 Depth + 1))
5848 return false;
5849 return true;
5850 }
5851
5852 case ISD::SHL:
5853 case ISD::SRL:
5854 case ISD::SRA:
5855 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5856 // enough to check operand 0 if Op can't create undef/poison.
5857 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5858 /*ConsiderFlags*/ true, Depth) &&
5859 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5860 Kind, Depth + 1);
5861
5862 case ISD::BSWAP:
5863 case ISD::CTPOP:
5864 case ISD::BITREVERSE:
5865 case ISD::AND:
5866 case ISD::OR:
5867 case ISD::XOR:
5868 case ISD::ADD:
5869 case ISD::SUB:
5870 case ISD::MUL:
5871 case ISD::SADDSAT:
5872 case ISD::UADDSAT:
5873 case ISD::SSUBSAT:
5874 case ISD::USUBSAT:
5875 case ISD::SSHLSAT:
5876 case ISD::USHLSAT:
5877 case ISD::SMIN:
5878 case ISD::SMAX:
5879 case ISD::UMIN:
5880 case ISD::UMAX:
5881 case ISD::ZERO_EXTEND:
5882 case ISD::SIGN_EXTEND:
5883 case ISD::ANY_EXTEND:
5884 case ISD::TRUNCATE:
5885 case ISD::VSELECT: {
5886 // If Op can't create undef/poison and none of its operands are undef/poison
5887 // then Op is never undef/poison. A difference from the more common check
5888 // below, outside the switch, is that we handle elementwise operations for
5889 // which the DemandedElts mask is valid for all operands here.
5890 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5891 /*ConsiderFlags*/ true, Depth) &&
5892 all_of(Op->ops(), [&](SDValue V) {
5893 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5894 Depth + 1);
5895 });
5896 }
5897
5898 // TODO: Search for noundef attributes from library functions.
5899
5900 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5901
5902 default:
5903 // Allow the target to implement this method for its nodes.
5904 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5905 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5906 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5907 Op, DemandedElts, *this, Kind, Depth);
5908 break;
5909 }
5910
5911 // If Op can't create undef/poison and none of its operands are undef/poison
5912 // then Op is never undef/poison.
5913 // NOTE: TargetNodes can handle this in themselves in
5914 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5915 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5916 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5917 all_of(Op->ops(), [&](SDValue V) {
5918 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5919 });
5920}
5921
5923 bool ConsiderFlags,
5924 unsigned Depth) const {
5925 APInt DemandedElts = getDemandAllEltsMask(Op);
5926 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5927}
5928
5930 UndefPoisonKind Kind,
5931 bool ConsiderFlags,
5932 unsigned Depth) const {
5933 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5934 return true;
5935
5936 unsigned Opcode = Op.getOpcode();
5937 switch (Opcode) {
5938 case ISD::AssertSext:
5939 case ISD::AssertZext:
5940 case ISD::AssertAlign:
5942 // Assertion nodes can create poison if the assertion fails.
5943 return includesPoison(Kind);
5944
5945 case ISD::FREEZE:
5949 case ISD::SADDSAT:
5950 case ISD::UADDSAT:
5951 case ISD::SSUBSAT:
5952 case ISD::USUBSAT:
5953 case ISD::MULHU:
5954 case ISD::MULHS:
5955 case ISD::AVGFLOORS:
5956 case ISD::AVGFLOORU:
5957 case ISD::AVGCEILS:
5958 case ISD::AVGCEILU:
5959 case ISD::ABDU:
5960 case ISD::ABDS:
5961 case ISD::SMIN:
5962 case ISD::SMAX:
5963 case ISD::SCMP:
5964 case ISD::UMIN:
5965 case ISD::UMAX:
5966 case ISD::UCMP:
5967 case ISD::AND:
5968 case ISD::XOR:
5969 case ISD::ROTL:
5970 case ISD::ROTR:
5971 case ISD::FSHL:
5972 case ISD::FSHR:
5973 case ISD::BSWAP:
5974 case ISD::CTTZ:
5975 case ISD::CTLZ:
5976 case ISD::CTLS:
5977 case ISD::CTPOP:
5978 case ISD::BITREVERSE:
5979 case ISD::PARITY:
5980 case ISD::SIGN_EXTEND:
5981 case ISD::TRUNCATE:
5985 case ISD::BITCAST:
5986 case ISD::BUILD_VECTOR:
5987 case ISD::BUILD_PAIR:
5988 case ISD::SPLAT_VECTOR:
5989 case ISD::FABS:
5990 case ISD::FCEIL:
5991 case ISD::FFLOOR:
5992 case ISD::FTRUNC:
5993 case ISD::FRINT:
5994 case ISD::FNEARBYINT:
5995 case ISD::FROUND:
5996 case ISD::FROUNDEVEN:
5997 return false;
5998
5999 case ISD::ABS:
6000 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
6001 // Different to Intrinsic::abs.
6002 return false;
6004 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
6005 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
6006
6007 case ISD::ADDC:
6008 case ISD::SUBC:
6009 case ISD::ADDE:
6010 case ISD::SUBE:
6011 case ISD::SADDO:
6012 case ISD::SSUBO:
6013 case ISD::SMULO:
6014 case ISD::SADDO_CARRY:
6015 case ISD::SSUBO_CARRY:
6016 case ISD::UADDO:
6017 case ISD::USUBO:
6018 case ISD::UMULO:
6019 case ISD::UADDO_CARRY:
6020 case ISD::USUBO_CARRY:
6021 // No poison on result or overflow flags.
6022 return false;
6023
6024 case ISD::SELECT_CC:
6025 case ISD::SETCC: {
6026 // Integer setcc cannot create undef or poison.
6027 if (Op.getOperand(0).getValueType().isInteger())
6028 return false;
6029
6030 // FP compares are more complicated. They can create poison for nan/infinity
6031 // based on options and flags. The options and flags also cause special
6032 // nonan condition codes to be used. Those condition codes may be preserved
6033 // even if the nonan flag is dropped somewhere.
6034 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6035 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6036 return (unsigned)CCCode & 0x10U;
6037 }
6038
6039 case ISD::OR:
6040 case ISD::ZERO_EXTEND:
6041 case ISD::SELECT:
6042 case ISD::VSELECT:
6043 case ISD::ADD:
6044 case ISD::SUB:
6045 case ISD::MUL:
6046 case ISD::FNEG:
6047 case ISD::FADD:
6048 case ISD::FSUB:
6049 case ISD::FMUL:
6050 case ISD::FDIV:
6051 case ISD::FREM:
6052 case ISD::FCOPYSIGN:
6053 case ISD::FMA:
6054 case ISD::FMAD:
6055 case ISD::FMULADD:
6056 case ISD::FP_EXTEND:
6057 case ISD::FMINNUM:
6058 case ISD::FMAXNUM:
6059 case ISD::FMINNUM_IEEE:
6060 case ISD::FMAXNUM_IEEE:
6061 case ISD::FMINIMUM:
6062 case ISD::FMAXIMUM:
6063 case ISD::FMINIMUMNUM:
6064 case ISD::FMAXIMUMNUM:
6070 // No poison except from flags (which is handled above)
6071 return false;
6072
6073 case ISD::SHL:
6074 case ISD::SRL:
6075 case ISD::SRA:
6076 // If the max shift amount isn't in range, then the shift can
6077 // create poison.
6078 return includesPoison(Kind) &&
6079 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6080
6083 // If the amount is zero then the result will be poison.
6084 // TODO: Add isKnownNeverZero DemandedElts handling.
6085 return includesPoison(Kind) &&
6086 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6087
6089 // Check if we demand any upper (undef) elements.
6090 return includesUndef(Kind) && DemandedElts.ugt(1);
6091
6094 // Ensure that the element index is in bounds.
6095 if (includesPoison(Kind)) {
6096 EVT VecVT = Op.getOperand(0).getValueType();
6097 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6098 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6099 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6100 }
6101 return false;
6102 }
6103
6104 case ISD::VECTOR_SHUFFLE: {
6105 // Check for any demanded shuffle element that is undef.
6106 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6107 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6108 if (Elt < 0 && DemandedElts[Idx])
6109 return true;
6110 return false;
6111 }
6112
6114 return false;
6115
6116 default:
6117 // Allow the target to implement this method for its nodes.
6118 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6119 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6120 return TLI->canCreateUndefOrPoisonForTargetNode(
6121 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6122 break;
6123 }
6124
6125 // Be conservative and return true.
6126 return true;
6127}
6128
6129bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6130 unsigned Opcode = Op.getOpcode();
6131 if (Opcode == ISD::OR)
6132 return Op->getFlags().hasDisjoint() ||
6133 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6134 if (Opcode == ISD::XOR)
6135 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6136 return false;
6137}
6138
6140 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6141 (Op.isAnyAdd() || isADDLike(Op));
6142}
6143
6145 FPClassTest InterestedClasses,
6146 unsigned Depth) const {
6147 APInt DemandedElts = getDemandAllEltsMask(Op);
6148 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6149}
6150
6152 const APInt &DemandedElts,
6153 FPClassTest InterestedClasses,
6154 unsigned Depth) const {
6156
6157 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6158 return KnownFPClass(CFP->getValueAPF());
6159
6160 if (Depth >= MaxRecursionDepth)
6161 return Known;
6162
6163 if (Op.getOpcode() == ISD::UNDEF)
6164 return Known;
6165
6166 EVT VT = Op.getValueType();
6167 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6168 assert((!VT.isFixedLengthVector() ||
6169 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6170 "Unexpected vector size");
6171
6172 if (!DemandedElts)
6173 return Known;
6174
6175 unsigned Opcode = Op.getOpcode();
6176 switch (Opcode) {
6177 case ISD::POISON: {
6178 Known.KnownFPClasses = fcNone;
6179 Known.SignBit = false;
6180 break;
6181 }
6182 case ISD::FNEG: {
6183 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6184 InterestedClasses, Depth + 1);
6185 Known.fneg();
6186 break;
6187 }
6188 case ISD::BUILD_VECTOR: {
6189 assert(!VT.isScalableVector());
6190 bool First = true;
6191 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6192 if (!DemandedElts[I])
6193 continue;
6194
6195 if (First) {
6196 Known =
6197 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6198 First = false;
6199 } else {
6200 Known |=
6201 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6202 }
6203
6204 if (Known.isUnknown())
6205 break;
6206 }
6207 break;
6208 }
6210 SDValue Src = Op.getOperand(0);
6211 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6212 EVT SrcVT = Src.getValueType();
6213 if (SrcVT.isFixedLengthVector() && CIdx) {
6214 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6215 APInt DemandedSrcElts = APInt::getOneBitSet(
6216 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6217 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6218 Depth + 1);
6219 } else {
6220 // Out of bounds index is poison.
6221 Known.KnownFPClasses = fcNone;
6222 }
6223 } else {
6224 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6225 }
6226 break;
6227 }
6228 case ISD::SPLAT_VECTOR: {
6229 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6230 break;
6231 }
6232 case ISD::BITCAST: {
6233 // FIXME: It should not be necessary to check for an elementwise bitcast.
6234 // If a bitcast is not elementwise between vector / scalar types,
6235 // computeKnownBits already splices the known bits of the source elements
6236 // appropriately so as to line up with the bits of the result's demanded
6237 // elements.
6238 EVT SrcVT = Op.getOperand(0).getValueType();
6239 if (VT.isScalableVector() || SrcVT.isScalableVector())
6240 break;
6241 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6242 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6243 if (VTNumElts != SrcVTNumElts)
6244 break;
6245
6246 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6248 break;
6249 }
6250 case ISD::FABS: {
6251 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6252 InterestedClasses, Depth + 1);
6253 Known.fabs();
6254 break;
6255 }
6256 case ISD::FCOPYSIGN: {
6257 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6258 InterestedClasses, Depth + 1);
6259 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6260 InterestedClasses, Depth + 1);
6261 Known.copysign(KnownSign);
6262 break;
6263 }
6264 case ISD::AssertNoFPClass: {
6265 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6266 InterestedClasses, Depth + 1);
6267 FPClassTest AssertedClasses =
6268 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6269 Known.KnownFPClasses &= ~AssertedClasses;
6270 break;
6271 }
6273 SDValue Src = Op.getOperand(0);
6274 EVT SrcVT = Src.getValueType();
6275 if (SrcVT.isFixedLengthVector()) {
6276 unsigned Idx = Op.getConstantOperandVal(1);
6277 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6278
6279 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6280 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6281 Depth + 1);
6282 } else {
6283 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6284 }
6285 break;
6286 }
6287 case ISD::INSERT_SUBVECTOR: {
6288 SDValue BaseVector = Op.getOperand(0);
6289 SDValue SubVector = Op.getOperand(1);
6290 EVT BaseVT = BaseVector.getValueType();
6291 if (BaseVT.isFixedLengthVector()) {
6292 unsigned Idx = Op.getConstantOperandVal(2);
6293 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6294 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6295
6296 APInt DemandedMask =
6297 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6298 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6299 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6300
6301 if (!DemandedSrcElts.isZero())
6302 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6303 InterestedClasses, Depth + 1);
6304 if (!DemandedSubElts.isZero()) {
6306 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6307 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6308 }
6309 } else {
6310 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6311 if (!Known.isUnknown())
6312 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6313 }
6314 break;
6315 }
6316 case ISD::SELECT:
6317 case ISD::VSELECT: {
6318 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6319 // IR-level ValueTracking.
6320 KnownFPClass KnownFalseClass = computeKnownFPClass(
6321 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6322 if (KnownFalseClass.isUnknown())
6323 break;
6324 KnownFPClass KnownTrueClass = computeKnownFPClass(
6325 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6326 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6327 break;
6328 }
6329 default:
6330 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6331 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6332 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6333 Depth);
6334 }
6335 break;
6336 }
6337
6338 return Known;
6339}
6340
6342 unsigned Depth) const {
6343 APInt DemandedElts = getDemandAllEltsMask(Op);
6344 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6345}
6346
6348 bool SNaN, unsigned Depth) const {
6349 assert(!DemandedElts.isZero() && "No demanded elements");
6350
6351 // If we're told that NaNs won't happen, assume they won't.
6352 if (Op->getFlags().hasNoNaNs())
6353 return true;
6354
6355 if (Depth >= MaxRecursionDepth)
6356 return false; // Limit search depth.
6357
6358 unsigned Opcode = Op.getOpcode();
6359 switch (Opcode) {
6360 case ISD::FADD:
6361 case ISD::FSUB:
6362 case ISD::FMUL:
6363 case ISD::FDIV:
6364 case ISD::FREM:
6365 case ISD::FSIN:
6366 case ISD::FCOS:
6367 case ISD::FTAN:
6368 case ISD::FASIN:
6369 case ISD::FACOS:
6370 case ISD::FATAN:
6371 case ISD::FATAN2:
6372 case ISD::FSINH:
6373 case ISD::FCOSH:
6374 case ISD::FTANH:
6375 case ISD::FMA:
6376 case ISD::FMULADD:
6377 case ISD::FMAD: {
6378 if (SNaN)
6379 return true;
6380 // TODO: Need isKnownNeverInfinity
6381 return false;
6382 }
6383 case ISD::FCANONICALIZE:
6384 case ISD::FEXP:
6385 case ISD::FEXP2:
6386 case ISD::FEXP10:
6387 case ISD::FTRUNC:
6388 case ISD::FFLOOR:
6389 case ISD::FCEIL:
6390 case ISD::FROUND:
6391 case ISD::FROUNDEVEN:
6392 case ISD::LROUND:
6393 case ISD::LLROUND:
6394 case ISD::FRINT:
6395 case ISD::LRINT:
6396 case ISD::LLRINT:
6397 case ISD::FNEARBYINT:
6398 case ISD::FLDEXP: {
6399 if (SNaN)
6400 return true;
6401 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6402 }
6403 case ISD::FABS:
6404 case ISD::FNEG:
6405 case ISD::FCOPYSIGN: {
6406 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6407 }
6408 case ISD::SELECT:
6409 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6410 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6411 case ISD::FP_EXTEND:
6412 case ISD::FP_ROUND: {
6413 if (SNaN)
6414 return true;
6415 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6416 }
6417 case ISD::SINT_TO_FP:
6418 case ISD::UINT_TO_FP:
6419 return true;
6420 case ISD::FSQRT: // Need is known positive
6421 case ISD::FLOG:
6422 case ISD::FLOG2:
6423 case ISD::FLOG10:
6424 case ISD::FPOWI:
6425 case ISD::FPOW: {
6426 if (SNaN)
6427 return true;
6428 // TODO: Refine on operand
6429 return false;
6430 }
6431 case ISD::FMINNUM:
6432 case ISD::FMAXNUM:
6433 case ISD::FMINIMUMNUM:
6434 case ISD::FMAXIMUMNUM: {
6435 // Only one needs to be known not-nan, since it will be returned if the
6436 // other ends up being one.
6437 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6438 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6439 }
6440 case ISD::FMINNUM_IEEE:
6441 case ISD::FMAXNUM_IEEE: {
6442 if (SNaN)
6443 return true;
6444 // This can return a NaN if either operand is an sNaN, or if both operands
6445 // are NaN.
6446 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6447 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6448 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6449 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6450 }
6451 case ISD::FMINIMUM:
6452 case ISD::FMAXIMUM: {
6453 // TODO: Does this quiet or return the origina NaN as-is?
6454 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6455 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6456 }
6458 SDValue Src = Op.getOperand(0);
6459 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6460 EVT SrcVT = Src.getValueType();
6461 if (SrcVT.isFixedLengthVector() && Idx &&
6462 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6463 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6464 Idx->getZExtValue());
6465 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6466 }
6467 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6468 }
6470 SDValue Src = Op.getOperand(0);
6471 if (Src.getValueType().isFixedLengthVector()) {
6472 unsigned Idx = Op.getConstantOperandVal(1);
6473 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6474 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6475 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6476 }
6477 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6478 }
6479 case ISD::INSERT_SUBVECTOR: {
6480 SDValue BaseVector = Op.getOperand(0);
6481 SDValue SubVector = Op.getOperand(1);
6482 EVT BaseVectorVT = BaseVector.getValueType();
6483 if (BaseVectorVT.isFixedLengthVector()) {
6484 unsigned Idx = Op.getConstantOperandVal(2);
6485 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6486 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6487
6488 // Clear/Extract the bits at the position where the subvector will be
6489 // inserted.
6490 APInt DemandedMask =
6491 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6492 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6493 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6494
6495 bool NeverNaN = true;
6496 if (!DemandedSrcElts.isZero())
6497 NeverNaN &=
6498 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6499 if (NeverNaN && !DemandedSubElts.isZero())
6500 NeverNaN &=
6501 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6502 return NeverNaN;
6503 }
6504 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6505 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6506 }
6507 case ISD::BUILD_VECTOR: {
6508 unsigned NumElts = Op.getNumOperands();
6509 for (unsigned I = 0; I != NumElts; ++I)
6510 if (DemandedElts[I] &&
6511 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6512 return false;
6513 return true;
6514 }
6515 case ISD::SPLAT_VECTOR:
6516 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6517 case ISD::AssertNoFPClass: {
6518 FPClassTest NoFPClass =
6519 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6520 if ((NoFPClass & fcNan) == fcNan)
6521 return true;
6522 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6523 return true;
6524 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6525 }
6526 default:
6527 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6528 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6529 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6530 Depth);
6531 }
6532 break;
6533 }
6534
6535 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6536 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6537 return Known.isKnownNever(NanMask);
6538}
6539
6541 APInt DemandedElts = getDemandAllEltsMask(Op);
6542 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6543}
6544
6546 const APInt &DemandedElts,
6547 unsigned Depth) const {
6548 assert(!DemandedElts.isZero() && "No demanded elements");
6549 EVT VT = Op.getValueType();
6551 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6552 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6553}
6554
6556 APInt DemandedElts = getDemandAllEltsMask(Op);
6557 return isKnownNeverZero(Op, DemandedElts, Depth);
6558}
6559
6561 unsigned Depth) const {
6562 if (Depth >= MaxRecursionDepth)
6563 return false; // Limit search depth.
6564
6565 EVT OpVT = Op.getValueType();
6566 unsigned BitWidth = OpVT.getScalarSizeInBits();
6567
6568 assert(!Op.getValueType().isFloatingPoint() &&
6569 "Floating point types unsupported - use isKnownNeverLogicalZero");
6570
6571 // If the value is a constant, we can obviously see if it is a zero or not.
6572 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6573 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6574 return !V.isZero();
6575 };
6576
6577 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6578 return true;
6579
6580 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6581 // some degree.
6582 switch (Op.getOpcode()) {
6583 default:
6584 break;
6585
6586 case ISD::BUILD_VECTOR:
6587 // Are all operands of a build vector constant non-zero?
6588 if (all_of(enumerate(Op->ops()), [&](auto P) {
6589 auto *C = dyn_cast<ConstantSDNode>(P.value());
6590 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6591 }))
6592 return true;
6593 break;
6594
6595 case ISD::SPLAT_VECTOR:
6596 // Is the operand of a splat vector a constant non-zero?
6597 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6598 if (IsNeverZero(C))
6599 return true;
6600 break;
6601
6603 SDValue InVec = Op.getOperand(0);
6604 SDValue EltNo = Op.getOperand(1);
6605 EVT VecVT = InVec.getValueType();
6606
6607 // Skip scalable vectors or implicit extensions.
6608 if (VecVT.isScalableVector() ||
6609 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6610 break;
6611
6612 // If we know the element index, just demand that vector element, else for
6613 // an unknown element index, ignore DemandedElts and demand them all.
6614 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6615 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6616 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6617 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6618 DemandedSrcElts =
6619 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6620
6621 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6622 }
6623
6624 case ISD::OR:
6625 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6626 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6627
6628 case ISD::VSELECT:
6629 case ISD::SELECT:
6630 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6631 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6632
6633 case ISD::SHL: {
6634 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6635 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6636 KnownBits ValKnown =
6637 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6638 // 1 << X is never zero.
6639 if (ValKnown.One[0])
6640 return true;
6641 // If max shift cnt of known ones is non-zero, result is non-zero.
6642 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6643 .getMaxValue();
6644 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6645 !ValKnown.One.shl(MaxCnt).isZero())
6646 return true;
6647 break;
6648 }
6649
6650 case ISD::VECTOR_SHUFFLE: {
6651 if (Op.getValueType().isScalableVector())
6652 return false;
6653
6654 unsigned NumElts = DemandedElts.getBitWidth();
6655
6656 // All demanded elements from LHS and RHS must be known non-zero.
6657 // Demanded elements with undef shuffle mask elements are unknown.
6658
6659 APInt DemandedLHS, DemandedRHS;
6660 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6661 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6662 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6663 DemandedLHS, DemandedRHS))
6664 return false;
6665
6666 return (!DemandedLHS ||
6667 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6668 (!DemandedRHS ||
6669 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6670 }
6671
6672 case ISD::UADDSAT:
6673 case ISD::UMAX:
6674 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6675 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6676
6677 case ISD::UMIN:
6678 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6679 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6680
6681 // For smin/smax: If either operand is known negative/positive
6682 // respectively we don't need the other to be known at all.
6683 case ISD::SMAX: {
6684 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6685 if (Op1.isStrictlyPositive())
6686 return true;
6687
6688 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6689 if (Op0.isStrictlyPositive())
6690 return true;
6691
6692 if (Op1.isNonZero() && Op0.isNonZero())
6693 return true;
6694
6695 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6696 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6697 }
6698 case ISD::SMIN: {
6699 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6700 if (Op1.isNegative())
6701 return true;
6702
6703 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6704 if (Op0.isNegative())
6705 return true;
6706
6707 if (Op1.isNonZero() && Op0.isNonZero())
6708 return true;
6709
6710 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6711 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6712 }
6713
6714 case ISD::ROTL:
6715 case ISD::ROTR:
6716 case ISD::BITREVERSE:
6717 case ISD::BSWAP:
6718 case ISD::CTPOP:
6719 case ISD::ABS:
6721 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6722
6723 case ISD::SRA:
6724 case ISD::SRL: {
6725 if (Op->getFlags().hasExact())
6726 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6727 KnownBits ValKnown =
6728 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6729 if (ValKnown.isNegative())
6730 return true;
6731 // If max shift cnt of known ones is non-zero, result is non-zero.
6732 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6733 .getMaxValue();
6734 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6735 !ValKnown.One.lshr(MaxCnt).isZero())
6736 return true;
6737 break;
6738 }
6739 case ISD::UDIV:
6740 case ISD::SDIV:
6741 // div exact can only produce a zero if the dividend is zero.
6742 // TODO: For udiv this is also true if Op1 u<= Op0
6743 if (Op->getFlags().hasExact())
6744 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6745 break;
6746
6747 case ISD::ADD:
6748 if (Op->getFlags().hasNoUnsignedWrap())
6749 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6750 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6751 return true;
6752 // TODO: There are a lot more cases we can prove for add.
6753 break;
6754
6755 case ISD::SUB: {
6756 if (isNullConstant(Op.getOperand(0)))
6757 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6758
6759 std::optional<bool> ne = KnownBits::ne(
6760 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6761 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6762 return ne && *ne;
6763 }
6764
6765 case ISD::MUL:
6766 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6767 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6768 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6769 return true;
6770 break;
6771
6772 case ISD::ZERO_EXTEND:
6773 case ISD::SIGN_EXTEND:
6774 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6775 case ISD::VSCALE: {
6777 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6778 ConstantRange CR =
6779 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6780 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6781 return true;
6782 break;
6783 }
6784 }
6785
6786 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6787}
6788
6790 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6791 return !C1->isNegative();
6792
6793 switch (Op.getOpcode()) {
6794 case ISD::FABS:
6795 case ISD::FEXP:
6796 case ISD::FEXP2:
6797 case ISD::FEXP10:
6798 return true;
6799 default:
6800 return false;
6801 }
6802
6803 llvm_unreachable("covered opcode switch");
6804}
6805
6807 assert(Use.getValueType().isFloatingPoint());
6808 const SDNode *User = Use.getUser();
6809 if (User->getFlags().hasNoSignedZeros())
6810 return true;
6811
6812 unsigned OperandNo = Use.getOperandNo();
6813 // Check if this use is insensitive to the sign of zero
6814 switch (User->getOpcode()) {
6815 case ISD::SETCC:
6816 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6817 case ISD::FABS:
6818 // fabs always produces +0.0.
6819 return true;
6820 case ISD::FCOPYSIGN:
6821 // copysign overwrites the sign bit of the first operand.
6822 return OperandNo == 0;
6823 case ISD::FADD:
6824 case ISD::FSUB: {
6825 // Arithmetic with non-zero constants fixes the uncertainty around the
6826 // sign bit.
6827 SDValue Other = User->getOperand(1 - OperandNo);
6829 }
6830 case ISD::FP_TO_SINT:
6831 case ISD::FP_TO_UINT:
6832 // fp-to-int conversions normalize signed zeros.
6833 return true;
6834 default:
6835 return false;
6836 }
6837}
6838
6840 if (Op->getFlags().hasNoSignedZeros())
6841 return true;
6842 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6843 // regression. Ideally, this should be implemented as a demanded-bits
6844 // optimization that stems from the users.
6845 if (Op->use_size() > 2)
6846 return false;
6847 return all_of(Op->uses(),
6848 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6849}
6850
6852 // Check the obvious case.
6853 if (A == B) return true;
6854
6855 // For negative and positive zero.
6858 if (CA->isZero() && CB->isZero()) return true;
6859
6860 // Otherwise they may not be equal.
6861 return false;
6862}
6863
6864// Only bits set in Mask must be negated, other bits may be arbitrary.
6866 if (isBitwiseNot(V, AllowUndefs))
6867 return V.getOperand(0);
6868
6869 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6870 // bits in the non-extended part.
6871 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6872 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6873 return SDValue();
6874 SDValue ExtArg = V.getOperand(0);
6875 if (ExtArg.getScalarValueSizeInBits() >=
6876 MaskC->getAPIntValue().getActiveBits() &&
6877 isBitwiseNot(ExtArg, AllowUndefs) &&
6878 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6879 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6880 return ExtArg.getOperand(0).getOperand(0);
6881 return SDValue();
6882}
6883
6885 // Match masked merge pattern (X & ~M) op (Y & M)
6886 // Including degenerate case (X & ~M) op M
6887 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6888 SDValue Other) {
6889 if (SDValue NotOperand =
6890 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6891 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6892 NotOperand->getOpcode() == ISD::TRUNCATE)
6893 NotOperand = NotOperand->getOperand(0);
6894
6895 if (Other == NotOperand)
6896 return true;
6897 if (Other->getOpcode() == ISD::AND)
6898 return NotOperand == Other->getOperand(0) ||
6899 NotOperand == Other->getOperand(1);
6900 }
6901 return false;
6902 };
6903
6904 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6905 A = A->getOperand(0);
6906
6907 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6908 B = B->getOperand(0);
6909
6910 if (A->getOpcode() == ISD::AND)
6911 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6912 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6913 return false;
6914}
6915
6916// FIXME: unify with llvm::haveNoCommonBitsSet.
6918 assert(A.getValueType() == B.getValueType() &&
6919 "Values must have the same type");
6922 return true;
6925}
6926
6927static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6928 SelectionDAG &DAG) {
6929 if (cast<ConstantSDNode>(Step)->isZero())
6930 return DAG.getConstant(0, DL, VT);
6931
6932 return SDValue();
6933}
6934
6937 SelectionDAG &DAG) {
6938 int NumOps = Ops.size();
6939 assert(NumOps != 0 && "Can't build an empty vector!");
6940 assert(!VT.isScalableVector() &&
6941 "BUILD_VECTOR cannot be used with scalable types");
6942 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6943 "Incorrect element count in BUILD_VECTOR!");
6944
6945 // BUILD_VECTOR of UNDEFs is UNDEF.
6946 bool AllPoison = true;
6947 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6948 AllPoison &= Op.getOpcode() == ISD::POISON;
6949 return Op.isUndef();
6950 }))
6951 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6952
6953 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6954 SDValue IdentitySrc;
6955 bool IsIdentity = true;
6956 for (int i = 0; i != NumOps; ++i) {
6957 if (Ops[i].getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
6958 Ops[i].getOperand(0).getValueType() != VT ||
6959 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6960 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6961 Ops[i].getConstantOperandAPInt(1) != i) {
6962 IsIdentity = false;
6963 break;
6964 }
6965 IdentitySrc = Ops[i].getOperand(0);
6966 }
6967 if (IsIdentity)
6968 return IdentitySrc;
6969
6970 return SDValue();
6971}
6972
6973/// Try to simplify vector concatenation to an input value, undef, or build
6974/// vector.
6977 SelectionDAG &DAG) {
6978 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6980 [Ops](SDValue Op) {
6981 return Ops[0].getValueType() == Op.getValueType();
6982 }) &&
6983 "Concatenation of vectors with inconsistent value types!");
6984 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6985 VT.getVectorElementCount() &&
6986 "Incorrect element count in vector concatenation!");
6987
6988 if (Ops.size() == 1)
6989 return Ops[0];
6990
6991 // Concat of UNDEFs is UNDEF.
6992 bool AllPoison = true;
6993 if (llvm::all_of(Ops, [&AllPoison](SDValue Op) {
6994 AllPoison &= Op.getOpcode() == ISD::POISON;
6995 return Op.isUndef();
6996 }))
6997 return AllPoison ? DAG.getPOISON(VT) : DAG.getUNDEF(VT);
6998
6999 // Scan the operands and look for extract operations from a single source
7000 // that correspond to insertion at the same location via this concatenation:
7001 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
7002 SDValue IdentitySrc;
7003 bool IsIdentity = true;
7004 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
7005 SDValue Op = Ops[i];
7006 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
7007 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
7008 Op.getOperand(0).getValueType() != VT ||
7009 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
7010 Op.getConstantOperandVal(1) != IdentityIndex) {
7011 IsIdentity = false;
7012 break;
7013 }
7014 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
7015 "Unexpected identity source vector for concat of extracts");
7016 IdentitySrc = Op.getOperand(0);
7017 }
7018 if (IsIdentity) {
7019 assert(IdentitySrc && "Failed to set source vector of extracts");
7020 return IdentitySrc;
7021 }
7022
7023 // The code below this point is only designed to work for fixed width
7024 // vectors, so we bail out for now.
7025 if (VT.isScalableVector())
7026 return SDValue();
7027
7028 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7029 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7030 // BUILD_VECTOR.
7031 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7032 EVT SVT = VT.getScalarType();
7034 for (SDValue Op : Ops) {
7035 EVT OpVT = Op.getValueType();
7036 if (Op.getOpcode() == ISD::POISON)
7037 Elts.append(OpVT.getVectorNumElements(), DAG.getPOISON(SVT));
7038 else if (Op.getOpcode() == ISD::UNDEF)
7039 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7040 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7041 Elts.append(Op->op_begin(), Op->op_end());
7042 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7043 OpVT.getVectorNumElements() == 1 &&
7044 isNullConstant(Op.getOperand(2)))
7045 Elts.push_back(Op.getOperand(1));
7046 else
7047 return SDValue();
7048 }
7049
7050 // BUILD_VECTOR requires all inputs to be of the same type, find the
7051 // maximum type and extend them all.
7052 for (SDValue Op : Elts)
7053 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7054
7055 if (SVT.bitsGT(VT.getScalarType())) {
7056 for (SDValue &Op : Elts) {
7057 if (Op.getOpcode() == ISD::POISON)
7058 Op = DAG.getPOISON(SVT);
7059 else if (Op.getOpcode() == ISD::UNDEF)
7060 Op = DAG.getUNDEF(SVT);
7061 else
7062 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7063 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7064 : DAG.getSExtOrTrunc(Op, DL, SVT);
7065 }
7066 }
7067
7068 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7069 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7070 return V;
7071}
7072
7073/// Gets or creates the specified node.
7074SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7075 SDVTList VTs = getVTList(VT);
7077 AddNodeIDNode(ID, Opcode, VTs, {});
7078 void *IP = nullptr;
7079 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
7080 return SDValue(E, 0);
7081
7082 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7083 CSEMap.InsertNode(N, IP);
7084
7085 InsertNode(N);
7086 SDValue V = SDValue(N, 0);
7087 NewSDValueDbgMsg(V, "Creating new node: ", this);
7088 return V;
7089}
7090
7091SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7092 SDValue N1) {
7093 SDNodeFlags Flags;
7094 if (Inserter)
7095 Flags = Inserter->getFlags();
7096 return getNode(Opcode, DL, VT, N1, Flags);
7097}
7098
7099SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7100 SDValue N1, const SDNodeFlags Flags) {
7101 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7102
7103 // Constant fold unary operations with a vector integer or float operand.
7104 switch (Opcode) {
7105 default:
7106 // FIXME: Entirely reasonable to perform folding of other unary
7107 // operations here as the need arises.
7108 break;
7109 case ISD::FNEG:
7110 case ISD::FABS:
7111 case ISD::FCEIL:
7112 case ISD::FTRUNC:
7113 case ISD::FFLOOR:
7114 case ISD::FP_EXTEND:
7115 case ISD::FP_TO_SINT:
7116 case ISD::FP_TO_UINT:
7117 case ISD::FP_TO_FP16:
7118 case ISD::FP_TO_BF16:
7119 case ISD::TRUNCATE:
7120 case ISD::ANY_EXTEND:
7121 case ISD::ZERO_EXTEND:
7122 case ISD::SIGN_EXTEND:
7123 case ISD::UINT_TO_FP:
7124 case ISD::SINT_TO_FP:
7125 case ISD::FP16_TO_FP:
7126 case ISD::BF16_TO_FP:
7127 case ISD::BITCAST:
7128 case ISD::ABS:
7130 case ISD::BITREVERSE:
7131 case ISD::BSWAP:
7132 case ISD::CTLZ:
7134 case ISD::CTTZ:
7136 case ISD::CTPOP:
7137 case ISD::CTLS:
7138 case ISD::VECREDUCE_ADD:
7143 case ISD::STEP_VECTOR: {
7144 SDValue Ops = {N1};
7145 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7146 return Fold;
7147 }
7148 }
7149
7150 unsigned OpOpcode = N1.getNode()->getOpcode();
7151 switch (Opcode) {
7152 case ISD::STEP_VECTOR:
7153 assert(VT.isScalableVector() &&
7154 "STEP_VECTOR can only be used with scalable types");
7155 assert(OpOpcode == ISD::TargetConstant &&
7156 VT.getVectorElementType() == N1.getValueType() &&
7157 "Unexpected step operand");
7158 break;
7159 case ISD::FREEZE:
7160 assert(VT == N1.getValueType() && "Unexpected VT!");
7162 return N1;
7163 break;
7164 case ISD::TokenFactor:
7165 case ISD::MERGE_VALUES:
7167 return N1; // Factor, merge or concat of one node? No need.
7168 case ISD::BUILD_VECTOR: {
7169 // Attempt to simplify BUILD_VECTOR.
7170 SDValue Ops[] = {N1};
7171 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7172 return V;
7173 break;
7174 }
7175 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7176 case ISD::FP_EXTEND:
7178 "Invalid FP cast!");
7179 if (N1.getValueType() == VT) return N1; // noop conversion.
7180 assert((!VT.isVector() || VT.getVectorElementCount() ==
7182 "Vector element count mismatch!");
7183 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7184 if (N1.isUndef())
7185 return getUNDEF(VT);
7186 break;
7187 case ISD::FP_TO_SINT:
7188 case ISD::FP_TO_UINT:
7189 if (N1.isUndef())
7190 return getUNDEF(VT);
7191 break;
7192 case ISD::SINT_TO_FP:
7193 case ISD::UINT_TO_FP:
7194 // [us]itofp(undef) = 0, because the result value is bounded.
7195 if (N1.isUndef())
7196 return getConstantFP(0.0, DL, VT);
7197 break;
7198 case ISD::SIGN_EXTEND:
7199 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7200 "Invalid SIGN_EXTEND!");
7201 assert(VT.isVector() == N1.getValueType().isVector() &&
7202 "SIGN_EXTEND result type type should be vector iff the operand "
7203 "type is vector!");
7204 if (N1.getValueType() == VT) return N1; // noop extension
7205 assert((!VT.isVector() || VT.getVectorElementCount() ==
7207 "Vector element count mismatch!");
7208 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7209 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7210 SDNodeFlags Flags;
7211 if (OpOpcode == ISD::ZERO_EXTEND)
7212 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7213 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7214 transferDbgValues(N1, NewVal);
7215 return NewVal;
7216 }
7217
7218 if (OpOpcode == ISD::POISON)
7219 return getPOISON(VT);
7220
7221 if (N1.isUndef())
7222 // sext(undef) = 0, because the top bits will all be the same.
7223 return getConstant(0, DL, VT);
7224
7225 // Skip unnecessary sext_inreg pattern:
7226 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7227 if (OpOpcode == ISD::TRUNCATE) {
7228 SDValue OpOp = N1.getOperand(0);
7229 if (OpOp.getValueType() == VT) {
7230 unsigned NumSignExtBits =
7232 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7233 transferDbgValues(N1, OpOp);
7234 return OpOp;
7235 }
7236 }
7237 }
7238 break;
7239 case ISD::ZERO_EXTEND:
7240 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7241 "Invalid ZERO_EXTEND!");
7242 assert(VT.isVector() == N1.getValueType().isVector() &&
7243 "ZERO_EXTEND result type type should be vector iff the operand "
7244 "type is vector!");
7245 if (N1.getValueType() == VT) return N1; // noop extension
7246 assert((!VT.isVector() || VT.getVectorElementCount() ==
7248 "Vector element count mismatch!");
7249 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7250 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7251 SDNodeFlags Flags;
7252 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7253 SDValue NewVal =
7254 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7255 transferDbgValues(N1, NewVal);
7256 return NewVal;
7257 }
7258
7259 if (OpOpcode == ISD::POISON)
7260 return getPOISON(VT);
7261
7262 if (N1.isUndef())
7263 // zext(undef) = 0, because the top bits will be zero.
7264 return getConstant(0, DL, VT);
7265
7266 // Skip unnecessary zext_inreg pattern:
7267 // (zext (trunc x)) -> x iff the upper bits are known zero.
7268 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7269 // use to recognise zext_inreg patterns.
7270 if (OpOpcode == ISD::TRUNCATE) {
7271 SDValue OpOp = N1.getOperand(0);
7272 if (OpOp.getValueType() == VT) {
7273 if (OpOp.getOpcode() != ISD::AND) {
7276 if (MaskedValueIsZero(OpOp, HiBits)) {
7277 transferDbgValues(N1, OpOp);
7278 return OpOp;
7279 }
7280 }
7281 }
7282 }
7283 break;
7284 case ISD::ANY_EXTEND:
7285 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7286 "Invalid ANY_EXTEND!");
7287 assert(VT.isVector() == N1.getValueType().isVector() &&
7288 "ANY_EXTEND result type type should be vector iff the operand "
7289 "type is vector!");
7290 if (N1.getValueType() == VT) return N1; // noop extension
7291 assert((!VT.isVector() || VT.getVectorElementCount() ==
7293 "Vector element count mismatch!");
7294 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7295
7296 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7297 OpOpcode == ISD::ANY_EXTEND) {
7298 SDNodeFlags Flags;
7299 if (OpOpcode == ISD::ZERO_EXTEND)
7300 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7301 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7302 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7303 }
7304 if (N1.isUndef())
7305 return getUNDEF(VT);
7306
7307 // (ext (trunc x)) -> x
7308 if (OpOpcode == ISD::TRUNCATE) {
7309 SDValue OpOp = N1.getOperand(0);
7310 if (OpOp.getValueType() == VT) {
7311 transferDbgValues(N1, OpOp);
7312 return OpOp;
7313 }
7314 }
7315 break;
7316 case ISD::TRUNCATE:
7317 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7318 "Invalid TRUNCATE!");
7319 assert(VT.isVector() == N1.getValueType().isVector() &&
7320 "TRUNCATE result type type should be vector iff the operand "
7321 "type is vector!");
7322 if (N1.getValueType() == VT) return N1; // noop truncate
7323 assert((!VT.isVector() || VT.getVectorElementCount() ==
7325 "Vector element count mismatch!");
7326 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7327 if (OpOpcode == ISD::TRUNCATE)
7328 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7329 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7330 OpOpcode == ISD::ANY_EXTEND) {
7331 // If the source is smaller than the dest, we still need an extend.
7333 VT.getScalarType())) {
7334 SDNodeFlags Flags;
7335 if (OpOpcode == ISD::ZERO_EXTEND)
7336 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7337 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7338 }
7339 if (N1.getOperand(0).getValueType().bitsGT(VT))
7340 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7341 return N1.getOperand(0);
7342 }
7343 if (N1.isUndef())
7344 return getUNDEF(VT);
7345 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7346 return getVScale(DL, VT,
7348 break;
7352 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7353 assert(N1.getValueType().bitsLE(VT) &&
7354 "The input must be the same size or smaller than the result.");
7357 "The destination vector type must have fewer lanes than the input.");
7358 break;
7359 case ISD::ABS:
7360 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7361 if (N1.isUndef())
7362 return getConstant(0, DL, VT);
7363 break;
7365 assert(VT.isInteger() && VT == N1.getValueType() &&
7366 "Invalid ABS_MIN_POISON!");
7367 if (N1.isUndef())
7368 return getConstant(0, DL, VT);
7369 break;
7370 case ISD::BSWAP:
7371 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7372 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7373 "BSWAP types must be a multiple of 16 bits!");
7374 if (N1.isUndef())
7375 return getUNDEF(VT);
7376 // bswap(bswap(X)) -> X.
7377 if (OpOpcode == ISD::BSWAP)
7378 return N1.getOperand(0);
7379 break;
7380 case ISD::BITREVERSE:
7381 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7382 if (N1.isUndef())
7383 return getUNDEF(VT);
7384 break;
7385 case ISD::BITCAST:
7387 "Cannot BITCAST between types of different sizes!");
7388 if (VT == N1.getValueType()) return N1; // noop conversion.
7389 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7390 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7391 if (N1.isUndef())
7392 return getUNDEF(VT);
7393 break;
7395 assert(VT.isVector() && !N1.getValueType().isVector() &&
7396 (VT.getVectorElementType() == N1.getValueType() ||
7398 N1.getValueType().isInteger() &&
7400 "Illegal SCALAR_TO_VECTOR node!");
7401 if (N1.isUndef())
7402 return getUNDEF(VT);
7403 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7404 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7406 N1.getConstantOperandVal(1) == 0 &&
7407 N1.getOperand(0).getValueType() == VT)
7408 return N1.getOperand(0);
7409 break;
7410 case ISD::FNEG:
7411 // Negation of an unknown bag of bits is still completely undefined.
7412 if (N1.isUndef())
7413 return getUNDEF(VT);
7414
7415 if (OpOpcode == ISD::FNEG) // --X -> X
7416 return N1.getOperand(0);
7417 break;
7418 case ISD::FABS:
7419 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7420 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7421 break;
7422 case ISD::VSCALE:
7423 assert(VT == N1.getValueType() && "Unexpected VT!");
7424 break;
7425 case ISD::CTPOP:
7426 if (N1.getValueType().getScalarType() == MVT::i1)
7427 return N1;
7428 break;
7429 case ISD::CTLZ:
7430 case ISD::CTTZ:
7431 if (N1.getValueType().getScalarType() == MVT::i1)
7432 return getNOT(DL, N1, N1.getValueType());
7433 break;
7434 case ISD::CTLS:
7435 if (N1.getValueType().getScalarType() == MVT::i1)
7436 return getConstant(0, DL, VT);
7437 break;
7438 case ISD::VECREDUCE_ADD:
7439 if (N1.getValueType().getScalarType() == MVT::i1)
7440 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7441 break;
7444 if (N1.getValueType().getScalarType() == MVT::i1)
7445 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7446 break;
7449 if (N1.getValueType().getScalarType() == MVT::i1)
7450 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7451 break;
7452 case ISD::SPLAT_VECTOR:
7453 assert(VT.isVector() && "Wrong return type!");
7454 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7455 // that for now.
7457 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7459 N1.getValueType().isInteger() &&
7461 "Wrong operand type!");
7462 break;
7463 }
7464
7465 SDNode *N;
7466 SDVTList VTs = getVTList(VT);
7467 SDValue Ops[] = {N1};
7468 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7470 AddNodeIDNode(ID, Opcode, VTs, Ops);
7471 void *IP = nullptr;
7472 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7473 E->intersectFlagsWith(Flags);
7474 return SDValue(E, 0);
7475 }
7476
7477 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7478 N->setFlags(Flags);
7479 createOperands(N, Ops);
7480 CSEMap.InsertNode(N, IP);
7481 } else {
7482 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7483 createOperands(N, Ops);
7484 }
7485
7486 InsertNode(N);
7487 SDValue V = SDValue(N, 0);
7488 NewSDValueDbgMsg(V, "Creating new node: ", this);
7489 return V;
7490}
7491
7492static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth) {
7493 switch (Opcode) {
7494 default:
7495 llvm_unreachable("Unexpected integer identity opcode");
7496 case ISD::ADD:
7497 case ISD::OR:
7498 case ISD::XOR:
7499 case ISD::UMAX:
7500 return APInt::getZero(BitWidth);
7501 case ISD::MUL:
7502 return APInt(BitWidth, 1);
7503 case ISD::AND:
7504 case ISD::UMIN:
7506 case ISD::SMAX:
7508 case ISD::SMIN:
7510 }
7511}
7512
7513static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7514 const APInt &C2) {
7515 switch (Opcode) {
7516 case ISD::ADD: return C1 + C2;
7517 case ISD::SUB: return C1 - C2;
7518 case ISD::MUL: return C1 * C2;
7519 case ISD::AND: return C1 & C2;
7520 case ISD::OR: return C1 | C2;
7521 case ISD::XOR: return C1 ^ C2;
7522 case ISD::SHL: return C1 << C2;
7523 case ISD::SRL: return C1.lshr(C2);
7524 case ISD::SRA: return C1.ashr(C2);
7525 case ISD::ROTL: return C1.rotl(C2);
7526 case ISD::ROTR: return C1.rotr(C2);
7527 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7528 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7529 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7530 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7531 case ISD::SADDSAT: return C1.sadd_sat(C2);
7532 case ISD::UADDSAT: return C1.uadd_sat(C2);
7533 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7534 case ISD::USUBSAT: return C1.usub_sat(C2);
7535 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7536 case ISD::USHLSAT: return C1.ushl_sat(C2);
7537 case ISD::UDIV:
7538 if (!C2.getBoolValue())
7539 break;
7540 return C1.udiv(C2);
7541 case ISD::UREM:
7542 if (!C2.getBoolValue())
7543 break;
7544 return C1.urem(C2);
7545 case ISD::SDIV:
7546 if (!C2.getBoolValue())
7547 break;
7548 return C1.sdiv(C2);
7549 case ISD::SREM:
7550 if (!C2.getBoolValue())
7551 break;
7552 return C1.srem(C2);
7553 case ISD::AVGFLOORS:
7554 return APIntOps::avgFloorS(C1, C2);
7555 case ISD::AVGFLOORU:
7556 return APIntOps::avgFloorU(C1, C2);
7557 case ISD::AVGCEILS:
7558 return APIntOps::avgCeilS(C1, C2);
7559 case ISD::AVGCEILU:
7560 return APIntOps::avgCeilU(C1, C2);
7561 case ISD::ABDS:
7562 return APIntOps::abds(C1, C2);
7563 case ISD::ABDU:
7564 return APIntOps::abdu(C1, C2);
7565 case ISD::MULHS:
7566 return APIntOps::mulhs(C1, C2);
7567 case ISD::MULHU:
7568 return APIntOps::mulhu(C1, C2);
7569 case ISD::CLMUL:
7570 return APIntOps::clmul(C1, C2);
7571 case ISD::CLMULR:
7572 return APIntOps::clmulr(C1, C2);
7573 case ISD::CLMULH:
7574 return APIntOps::clmulh(C1, C2);
7575 case ISD::PEXT:
7576 return APIntOps::pext(C1, C2);
7577 case ISD::PDEP:
7578 return APIntOps::pdep(C1, C2);
7579 }
7580 return std::nullopt;
7581}
7582// Handle constant folding with UNDEF.
7583// TODO: Handle more cases.
7584static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7585 bool IsUndef1, const APInt &C2,
7586 bool IsUndef2) {
7587 if (!(IsUndef1 || IsUndef2))
7588 return FoldValue(Opcode, C1, C2);
7589
7590 // Fold and(x, undef) -> 0
7591 // Fold mul(x, undef) -> 0
7592 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7593 return APInt::getZero(C1.getBitWidth());
7594
7595 return std::nullopt;
7596}
7597
7599 const GlobalAddressSDNode *GA,
7600 const SDNode *N2) {
7601 if (GA->getOpcode() != ISD::GlobalAddress)
7602 return SDValue();
7603 if (!TLI->isOffsetFoldingLegal(GA))
7604 return SDValue();
7605 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7606 if (!C2)
7607 return SDValue();
7608 int64_t Offset = C2->getSExtValue();
7609 switch (Opcode) {
7610 case ISD::ADD:
7611 case ISD::PTRADD:
7612 break;
7613 case ISD::SUB: Offset = -uint64_t(Offset); break;
7614 default: return SDValue();
7615 }
7616 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7617 GA->getOffset() + uint64_t(Offset));
7618}
7619
7621 switch (Opcode) {
7622 case ISD::SDIV:
7623 case ISD::UDIV:
7624 case ISD::SREM:
7625 case ISD::UREM: {
7626 // If a divisor is zero/undef or any element of a divisor vector is
7627 // zero/undef, the whole op is undef.
7628 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7629 SDValue Divisor = Ops[1];
7630 if (Divisor.isUndef() || isNullConstant(Divisor))
7631 return true;
7632
7633 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7634 llvm::any_of(Divisor->op_values(),
7635 [](SDValue V) { return V.isUndef() ||
7636 isNullConstant(V); });
7637 // TODO: Handle signed overflow.
7638 }
7639 // TODO: Handle oversized shifts.
7640 default:
7641 return false;
7642 }
7643}
7644
7647 SDNodeFlags Flags) {
7648 // If the opcode is a target-specific ISD node, there's nothing we can
7649 // do here and the operand rules may not line up with the below, so
7650 // bail early.
7651 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7652 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7653 // foldCONCAT_VECTORS in getNode before this is called.
7654 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7655 return SDValue();
7656
7657 unsigned NumOps = Ops.size();
7658 if (NumOps == 0)
7659 return SDValue();
7660
7661 if (isUndef(Opcode, Ops))
7662 return getUNDEF(VT);
7663
7664 // Handle unary special cases.
7665 if (NumOps == 1) {
7666 SDValue N1 = Ops[0];
7667
7668 // Constant fold unary operations with an integer constant operand. Even
7669 // opaque constant will be folded, because the folding of unary operations
7670 // doesn't create new constants with different values. Nevertheless, the
7671 // opaque flag is preserved during folding to prevent future folding with
7672 // other constants.
7673 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7674 const APInt &Val = C->getAPIntValue();
7675 switch (Opcode) {
7676 case ISD::SIGN_EXTEND:
7677 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7678 C->isTargetOpcode(), C->isOpaque());
7679 case ISD::TRUNCATE:
7680 if (C->isOpaque())
7681 break;
7682 [[fallthrough]];
7683 case ISD::ZERO_EXTEND:
7684 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7685 C->isTargetOpcode(), C->isOpaque());
7686 case ISD::ANY_EXTEND:
7687 // Some targets like RISCV prefer to sign extend some types.
7688 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7689 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7690 C->isTargetOpcode(), C->isOpaque());
7691 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7692 C->isTargetOpcode(), C->isOpaque());
7693 case ISD::ABS:
7694 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7695 C->isOpaque());
7697 if (Val.isMinSignedValue())
7698 return getPOISON(VT);
7699 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7700 C->isOpaque());
7701 case ISD::BITREVERSE:
7702 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7703 C->isOpaque());
7704 case ISD::BSWAP:
7705 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7706 C->isOpaque());
7707 case ISD::CTPOP:
7708 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7709 C->isOpaque());
7710 case ISD::CTLZ:
7712 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7713 C->isOpaque());
7714 case ISD::CTTZ:
7716 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7717 C->isOpaque());
7718 case ISD::CTLS:
7719 // CTLS returns the number of extra sign bits so subtract one.
7720 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7721 C->isTargetOpcode(), C->isOpaque());
7722 case ISD::UINT_TO_FP:
7723 case ISD::SINT_TO_FP: {
7725 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7727 return getConstantFP(FPV, DL, VT);
7728 }
7729 case ISD::FP16_TO_FP:
7730 case ISD::BF16_TO_FP: {
7731 bool Ignored;
7732 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7733 : APFloat::BFloat(),
7734 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7735
7736 // This can return overflow, underflow, or inexact; we don't care.
7737 // FIXME need to be more flexible about rounding mode.
7739 &Ignored);
7740 return getConstantFP(FPV, DL, VT);
7741 }
7742 case ISD::STEP_VECTOR:
7743 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7744 return V;
7745 break;
7746 case ISD::BITCAST:
7747 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7748 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7749 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7750 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7751 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7752 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7753 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7754 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7755 break;
7756 }
7757 }
7758
7759 // Constant fold unary operations with a floating point constant operand.
7760 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7761 APFloat V = C->getValueAPF(); // make copy
7762 switch (Opcode) {
7763 case ISD::FNEG:
7764 V.changeSign();
7765 return getConstantFP(V, DL, VT);
7766 case ISD::FABS:
7767 V.clearSign();
7768 return getConstantFP(V, DL, VT);
7769 case ISD::FCEIL: {
7770 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7772 return getConstantFP(V, DL, VT);
7773 return SDValue();
7774 }
7775 case ISD::FTRUNC: {
7776 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7778 return getConstantFP(V, DL, VT);
7779 return SDValue();
7780 }
7781 case ISD::FFLOOR: {
7782 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7784 return getConstantFP(V, DL, VT);
7785 return SDValue();
7786 }
7787 case ISD::FP_EXTEND: {
7788 bool ignored;
7789 // This can return overflow, underflow, or inexact; we don't care.
7790 // FIXME need to be more flexible about rounding mode.
7791 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7792 &ignored);
7793 return getConstantFP(V, DL, VT);
7794 }
7795 case ISD::FP_TO_SINT:
7796 case ISD::FP_TO_UINT: {
7797 bool ignored;
7798 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7799 // FIXME need to be more flexible about rounding mode.
7801 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7802 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7803 break;
7804 return getConstant(IntVal, DL, VT);
7805 }
7806 case ISD::FP_TO_FP16:
7807 case ISD::FP_TO_BF16: {
7808 bool Ignored;
7809 // This can return overflow, underflow, or inexact; we don't care.
7810 // FIXME need to be more flexible about rounding mode.
7811 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7812 : APFloat::BFloat(),
7814 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7815 }
7816 case ISD::BITCAST:
7817 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7818 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7819 VT);
7820 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7821 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7822 VT);
7823 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7824 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7825 VT);
7826 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7827 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7828 break;
7829 }
7830 }
7831
7832 // Early-out if we failed to constant fold a bitcast.
7833 if (Opcode == ISD::BITCAST)
7834 return SDValue();
7835
7836 // Constant fold integer vector reductions with constant BUILD_VECTORs.
7837 if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
7838 Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
7839 Opcode == ISD::VECREDUCE_UMIN) &&
7841 unsigned EltBits = N1.getValueType().getScalarSizeInBits();
7842 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
7843 APInt Acc = getIntegerIdentity(BaseOpcode, EltBits);
7844 for (SDValue Elt : N1->op_values()) {
7845 if (Elt.getOpcode() == ISD::POISON)
7846 return getPOISON(VT);
7847 if (Elt.isUndef() || cast<ConstantSDNode>(Elt)->isOpaque())
7848 return SDValue();
7849 APInt Value = cast<ConstantSDNode>(Elt)->getAPIntValue().trunc(EltBits);
7850 std::optional<APInt> Folded = FoldValue(BaseOpcode, Acc, Value);
7851 assert(Folded &&
7852 "Expected vector reduction base opcode to be foldable");
7853 Acc = *Folded;
7854 }
7855 EVT EltVT = N1.getValueType().getScalarType();
7856 return getAnyExtOrTrunc(getConstant(Acc, DL, EltVT), DL, VT);
7857 }
7858 }
7859
7860 // Handle binops special cases.
7861 if (NumOps == 2) {
7862 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7863 return CFP;
7864
7865 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7866 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7867 if (C1->isOpaque() || C2->isOpaque())
7868 return SDValue();
7869
7870 std::optional<APInt> FoldAttempt =
7871 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7872 if (!FoldAttempt)
7873 return SDValue();
7874
7875 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7876 assert((!Folded || !VT.isVector()) &&
7877 "Can't fold vectors ops with scalar operands");
7878 return Folded;
7879 }
7880 }
7881
7882 // fold (add Sym, c) -> Sym+c
7884 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7885 if (TLI->isCommutativeBinOp(Opcode))
7887 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7888
7889 // fold (sext_in_reg c1) -> c2
7890 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7891 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7892
7893 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7894 unsigned FromBits = EVT.getScalarSizeInBits();
7895 Val <<= Val.getBitWidth() - FromBits;
7896 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7897 return getConstant(Val, DL, ConstantVT);
7898 };
7899
7900 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7901 const APInt &Val = C1->getAPIntValue();
7902 return SignExtendInReg(Val, VT);
7903 }
7904
7906 SmallVector<SDValue, 8> ScalarOps;
7907 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7908 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7909 SDValue Op = Ops[0].getOperand(I);
7910 if (Op.isUndef()) {
7911 ScalarOps.push_back(getUNDEF(OpVT));
7912 continue;
7913 }
7914 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7915 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7916 }
7917 return getBuildVector(VT, DL, ScalarOps);
7918 }
7919
7920 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7921 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7922 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7923 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7924 Ops[0].getOperand(0).getValueType()));
7925 }
7926 }
7927
7928 // Handle fshl/fshr special cases.
7929 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7930 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7931 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7932 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7933
7934 if (C1 && C2 && C3) {
7935 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7936 return SDValue();
7937 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7938 &V3 = C3->getAPIntValue();
7939
7940 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7941 : APIntOps::fshr(V1, V2, V3);
7942 return getConstant(FoldedVal, DL, VT);
7943 }
7944 }
7945
7946 // Handle fma/fmad special cases.
7947 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7948 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7949 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7950 Ops[2].getValueType() == VT && "FMA types must match!");
7954 if (C1 && C2 && C3) {
7955 APFloat V1 = C1->getValueAPF();
7956 const APFloat &V2 = C2->getValueAPF();
7957 const APFloat &V3 = C3->getValueAPF();
7958 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7959 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7961 } else
7962 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7963 return getConstantFP(V1, DL, VT);
7964 }
7965 }
7966
7967 // This is for vector folding only from here on.
7968 if (!VT.isVector())
7969 return SDValue();
7970
7971 ElementCount NumElts = VT.getVectorElementCount();
7972
7973 // See if we can fold through any bitcasted integer ops.
7974 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7975 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7976 (Ops[0].getOpcode() == ISD::BITCAST ||
7977 Ops[1].getOpcode() == ISD::BITCAST)) {
7980 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7981 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7982 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7983 N2.getValueType().isInteger()) {
7984 bool IsLE = getDataLayout().isLittleEndian();
7985 unsigned EltBits = VT.getScalarSizeInBits();
7986 SmallVector<APInt> RawBits1, RawBits2;
7987 BitVector UndefElts1, UndefElts2;
7988 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7989 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7990 SmallVector<APInt> RawBits;
7991 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7992 std::optional<APInt> Fold = FoldValueWithUndef(
7993 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7994 if (!Fold)
7995 break;
7996 RawBits.push_back(*Fold);
7997 }
7998 if (RawBits.size() == NumElts.getFixedValue()) {
7999 // We have constant folded, but we might need to cast this again back
8000 // to the original (possibly legalized) type.
8001 EVT BVVT, BVEltVT;
8002 if (N1.getValueType() == VT) {
8003 BVVT = N1.getValueType();
8004 BVEltVT = BV1->getOperand(0).getValueType();
8005 } else {
8006 BVVT = N2.getValueType();
8007 BVEltVT = BV2->getOperand(0).getValueType();
8008 }
8009 unsigned BVEltBits = BVEltVT.getSizeInBits();
8010 SmallVector<APInt> DstBits;
8011 BitVector DstUndefs;
8013 DstBits, RawBits, DstUndefs,
8014 BitVector(RawBits.size(), false));
8015 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
8016 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
8017 if (DstUndefs[I])
8018 continue;
8019 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
8020 }
8021 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
8022 }
8023 }
8024 }
8025 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
8026 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
8027 isa<ConstantSDNode>(N2)) {
8028 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
8029 {N1, N2}, Flags))
8030 return getBitcast(VT, Res);
8031 }
8032 }
8033
8034 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
8035 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
8036 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
8037 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
8038 APInt RHSVal;
8039 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
8040 APInt NewStep = Opcode == ISD::MUL
8041 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
8042 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
8043 return getStepVector(DL, VT, NewStep);
8044 }
8045 }
8046
8047 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
8048 return !Op.getValueType().isVector() ||
8049 Op.getValueType().getVectorElementCount() == NumElts;
8050 };
8051
8052 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
8053 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
8054 Op.getOpcode() == ISD::BUILD_VECTOR ||
8055 Op.getOpcode() == ISD::SPLAT_VECTOR;
8056 };
8057
8058 // All operands must be vector types with the same number of elements as
8059 // the result type and must be either UNDEF or a build/splat vector
8060 // or UNDEF scalars.
8061 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
8062 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
8063 return SDValue();
8064
8065 // If we are comparing vectors, then the result needs to be a i1 boolean that
8066 // is then extended back to the legal result type depending on how booleans
8067 // are represented.
8068 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
8069 ISD::NodeType ExtendCode =
8070 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
8071 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
8073
8074 // Find legal integer scalar type for constant promotion and
8075 // ensure that its scalar size is at least as large as source.
8076 EVT LegalSVT = VT.getScalarType();
8077 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
8078 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
8079 if (LegalSVT.bitsLT(VT.getScalarType()))
8080 return SDValue();
8081 }
8082
8083 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8084 // only have one operand to check. For fixed-length vector types we may have
8085 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8086 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8087
8088 // Constant fold each scalar lane separately.
8089 SmallVector<SDValue, 4> ScalarResults;
8090 for (unsigned I = 0; I != NumVectorElts; I++) {
8091 SmallVector<SDValue, 4> ScalarOps;
8092 for (SDValue Op : Ops) {
8093 EVT InSVT = Op.getValueType().getScalarType();
8094 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8095 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8096 if (Op.isUndef())
8097 ScalarOps.push_back(getUNDEF(InSVT));
8098 else
8099 ScalarOps.push_back(Op);
8100 continue;
8101 }
8102
8103 SDValue ScalarOp =
8104 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8105 EVT ScalarVT = ScalarOp.getValueType();
8106
8107 // Build vector (integer) scalar operands may need implicit
8108 // truncation - do this before constant folding.
8109 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8110 // Don't create illegally-typed nodes unless they're constants or undef
8111 // - if we fail to constant fold we can't guarantee the (dead) nodes
8112 // we're creating will be cleaned up before being visited for
8113 // legalization.
8114 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8115 !isa<ConstantSDNode>(ScalarOp) &&
8116 TLI->getTypeAction(*getContext(), InSVT) !=
8118 return SDValue();
8119 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8120 }
8121
8122 ScalarOps.push_back(ScalarOp);
8123 }
8124
8125 // Constant fold the scalar operands.
8126 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8127
8128 // Scalar folding only succeeded if the result is a constant or UNDEF.
8129 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8130 ScalarResult.getOpcode() != ISD::ConstantFP)
8131 return SDValue();
8132
8133 // Legalize the (integer) scalar constant if necessary. We only do
8134 // this once we know the folding succeeded, since otherwise we would
8135 // get a node with illegal type which has a user.
8136 if (LegalSVT != SVT)
8137 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8138
8139 ScalarResults.push_back(ScalarResult);
8140 }
8141
8142 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8143 : getBuildVector(VT, DL, ScalarResults);
8144 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8145 return V;
8146}
8147
8150 // TODO: Add support for unary/ternary fp opcodes.
8151 if (Ops.size() != 2)
8152 return SDValue();
8153
8154 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8155 // should. That will require dealing with a potentially non-default
8156 // rounding mode, checking the "opStatus" return value from the APFloat
8157 // math calculations, and possibly other variations.
8158 SDValue N1 = Ops[0];
8159 SDValue N2 = Ops[1];
8160 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8161 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8162 if (N1CFP && N2CFP) {
8163 APFloat C1 = N1CFP->getValueAPF(); // make copy
8164 const APFloat &C2 = N2CFP->getValueAPF();
8165 switch (Opcode) {
8166 case ISD::FADD:
8168 return getConstantFP(C1, DL, VT);
8169 case ISD::FSUB:
8171 return getConstantFP(C1, DL, VT);
8172 case ISD::FMUL:
8174 return getConstantFP(C1, DL, VT);
8175 case ISD::FDIV:
8177 return getConstantFP(C1, DL, VT);
8178 case ISD::FREM:
8179 C1.mod(C2);
8180 return getConstantFP(C1, DL, VT);
8181 case ISD::FCOPYSIGN:
8182 C1.copySign(C2);
8183 return getConstantFP(C1, DL, VT);
8184 case ISD::FMINNUM:
8185 return getConstantFP(minnum(C1, C2), DL, VT);
8186 case ISD::FMAXNUM:
8187 return getConstantFP(maxnum(C1, C2), DL, VT);
8188 case ISD::FMINIMUM:
8189 return getConstantFP(minimum(C1, C2), DL, VT);
8190 case ISD::FMAXIMUM:
8191 return getConstantFP(maximum(C1, C2), DL, VT);
8192 case ISD::FMINIMUMNUM:
8193 return getConstantFP(minimumnum(C1, C2), DL, VT);
8194 case ISD::FMAXIMUMNUM:
8195 return getConstantFP(maximumnum(C1, C2), DL, VT);
8196 default: break;
8197 }
8198 }
8199 if (N1CFP && Opcode == ISD::FP_ROUND) {
8200 APFloat C1 = N1CFP->getValueAPF(); // make copy
8201 bool Unused;
8202 // This can return overflow, underflow, or inexact; we don't care.
8203 // FIXME need to be more flexible about rounding mode.
8205 &Unused);
8206 return getConstantFP(C1, DL, VT);
8207 }
8208
8209 switch (Opcode) {
8210 case ISD::FSUB:
8211 // -0.0 - undef --> undef (consistent with "fneg undef")
8212 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8213 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8214 return getUNDEF(VT);
8215 [[fallthrough]];
8216
8217 case ISD::FADD:
8218 case ISD::FMUL:
8219 case ISD::FDIV:
8220 case ISD::FREM:
8221 // If both operands are undef, the result is undef. If 1 operand is undef,
8222 // the result is NaN. This should match the behavior of the IR optimizer.
8223 if (N1.isUndef() && N2.isUndef())
8224 return getUNDEF(VT);
8225 if (N1.isUndef() || N2.isUndef())
8227 }
8228 return SDValue();
8229}
8230
8232 const SDLoc &DL, EVT DstEltVT) {
8233 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8234
8235 // If this is already the right type, we're done.
8236 if (SrcEltVT == DstEltVT)
8237 return SDValue(BV, 0);
8238
8239 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8240 unsigned DstBitSize = DstEltVT.getSizeInBits();
8241
8242 // If this is a conversion of N elements of one type to N elements of another
8243 // type, convert each element. This handles FP<->INT cases.
8244 if (SrcBitSize == DstBitSize) {
8246 for (SDValue Op : BV->op_values()) {
8247 // If the vector element type is not legal, the BUILD_VECTOR operands
8248 // are promoted and implicitly truncated. Make that explicit here.
8249 if (Op.getValueType() != SrcEltVT)
8250 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8251 Ops.push_back(getBitcast(DstEltVT, Op));
8252 }
8253 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8255 return getBuildVector(VT, DL, Ops);
8256 }
8257
8258 // Otherwise, we're growing or shrinking the elements. To avoid having to
8259 // handle annoying details of growing/shrinking FP values, we convert them to
8260 // int first.
8261 if (SrcEltVT.isFloatingPoint()) {
8262 // Convert the input float vector to a int vector where the elements are the
8263 // same sizes.
8264 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8265 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8267 DstEltVT);
8268 return SDValue();
8269 }
8270
8271 // Now we know the input is an integer vector. If the output is a FP type,
8272 // convert to integer first, then to FP of the right size.
8273 if (DstEltVT.isFloatingPoint()) {
8274 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8275 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8277 DstEltVT);
8278 return SDValue();
8279 }
8280
8281 // Okay, we know the src/dst types are both integers of differing types.
8282 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8283
8284 // Extract the constant raw bit data.
8285 BitVector UndefElements;
8286 SmallVector<APInt> RawBits;
8287 bool IsLE = getDataLayout().isLittleEndian();
8288 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8289 return SDValue();
8290
8292 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8293 if (UndefElements[I])
8294 Ops.push_back(getUNDEF(DstEltVT));
8295 else
8296 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8297 }
8298
8299 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8300 return getBuildVector(VT, DL, Ops);
8301}
8302
8304 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8305
8306 // There's no need to assert on a byte-aligned pointer. All pointers are at
8307 // least byte aligned.
8308 if (A == Align(1))
8309 return Val;
8310
8311 SDVTList VTs = getVTList(Val.getValueType());
8313 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
8314 ID.AddInteger(A.value());
8315
8316 void *IP = nullptr;
8317 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
8318 return SDValue(E, 0);
8319
8320 auto *N =
8321 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8322 createOperands(N, {Val});
8323
8324 CSEMap.InsertNode(N, IP);
8325 InsertNode(N);
8326
8327 SDValue V(N, 0);
8328 NewSDValueDbgMsg(V, "Creating new node: ", this);
8329 return V;
8330}
8331
8332SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8333 SDValue N1, SDValue N2) {
8334 SDNodeFlags Flags;
8335 if (Inserter)
8336 Flags = Inserter->getFlags();
8337 return getNode(Opcode, DL, VT, N1, N2, Flags);
8338}
8339
8341 SDValue &N2) const {
8342 if (!TLI->isCommutativeBinOp(Opcode))
8343 return;
8344
8345 // Canonicalize:
8346 // binop(const, nonconst) -> binop(nonconst, const)
8349 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8350 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8351 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8352 std::swap(N1, N2);
8353
8354 // Canonicalize:
8355 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8356 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8358 std::swap(N1, N2);
8359}
8360
8361SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8362 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8364 N2.getOpcode() != ISD::DELETED_NODE &&
8365 "Operand is DELETED_NODE!");
8366
8367 canonicalizeCommutativeBinop(Opcode, N1, N2);
8368
8369 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8370 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8371
8372 // Don't allow undefs in vector splats - we might be returning N2 when folding
8373 // to zero etc.
8374 ConstantSDNode *N2CV =
8375 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8376
8377 switch (Opcode) {
8378 default: break;
8379 case ISD::TokenFactor:
8380 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8381 N2.getValueType() == MVT::Other && "Invalid token factor!");
8382 // Fold trivial token factors.
8383 if (N1.getOpcode() == ISD::EntryToken) return N2;
8384 if (N2.getOpcode() == ISD::EntryToken) return N1;
8385 if (N1 == N2) return N1;
8386 break;
8387 case ISD::BUILD_VECTOR: {
8388 // Attempt to simplify BUILD_VECTOR.
8389 SDValue Ops[] = {N1, N2};
8390 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8391 return V;
8392 break;
8393 }
8394 case ISD::CONCAT_VECTORS: {
8395 SDValue Ops[] = {N1, N2};
8396 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8397 return V;
8398 break;
8399 }
8400 case ISD::AND:
8401 assert(VT.isInteger() && "This operator does not apply to FP types!");
8402 assert(N1.getValueType() == N2.getValueType() &&
8403 N1.getValueType() == VT && "Binary operator types must match!");
8404 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8405 // worth handling here.
8406 if (N2CV && N2CV->isZero())
8407 return N2;
8408 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8409 return N1;
8410 break;
8411 case ISD::OR:
8412 case ISD::XOR:
8413 case ISD::ADD:
8414 case ISD::PTRADD:
8415 case ISD::SUB:
8416 assert(VT.isInteger() && "This operator does not apply to FP types!");
8417 assert(N1.getValueType() == N2.getValueType() &&
8418 N1.getValueType() == VT && "Binary operator types must match!");
8419 // The equal operand types requirement is unnecessarily strong for PTRADD.
8420 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8421 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8422 // logic everywhere where PTRADDs may be folded or combined to properly
8423 // support them. If/when we introduce pointer types to the SDAG, we will
8424 // need to relax this constraint.
8425
8426 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8427 // it's worth handling here.
8428 if (N2CV && N2CV->isZero())
8429 return N1;
8430 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8431 VT.getScalarType() == MVT::i1)
8432 return getNode(ISD::XOR, DL, VT, N1, N2);
8433 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8434 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8435 N2.getOpcode() == ISD::VSCALE) {
8436 const APInt &C1 = N1->getConstantOperandAPInt(0);
8437 const APInt &C2 = N2->getConstantOperandAPInt(0);
8438 return getVScale(DL, VT, C1 + C2);
8439 }
8440 break;
8441 case ISD::MUL:
8442 assert(VT.isInteger() && "This operator does not apply to FP types!");
8443 assert(N1.getValueType() == N2.getValueType() &&
8444 N1.getValueType() == VT && "Binary operator types must match!");
8445 if (VT.getScalarType() == MVT::i1)
8446 return getNode(ISD::AND, DL, VT, N1, N2);
8447 if (N2CV && N2CV->isZero())
8448 return N2;
8449 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8450 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8451 const APInt &N2CImm = N2C->getAPIntValue();
8452 return getVScale(DL, VT, MulImm * N2CImm);
8453 }
8454 break;
8455 case ISD::UDIV:
8456 case ISD::UREM:
8457 case ISD::MULHU:
8458 case ISD::MULHS:
8459 case ISD::SDIV:
8460 case ISD::SREM:
8461 case ISD::SADDSAT:
8462 case ISD::SSUBSAT:
8463 case ISD::UADDSAT:
8464 case ISD::USUBSAT:
8465 assert(VT.isInteger() && "This operator does not apply to FP types!");
8466 assert(N1.getValueType() == N2.getValueType() &&
8467 N1.getValueType() == VT && "Binary operator types must match!");
8468 if (VT.getScalarType() == MVT::i1) {
8469 // fold (add_sat x, y) -> (or x, y) for bool types.
8470 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8471 return getNode(ISD::OR, DL, VT, N1, N2);
8472 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8473 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8474 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8475 }
8476 break;
8477 case ISD::SCMP:
8478 case ISD::UCMP:
8479 assert(N1.getValueType() == N2.getValueType() &&
8480 "Types of operands of UCMP/SCMP must match");
8481 assert(N1.getValueType().isVector() == VT.isVector() &&
8482 "Operands and return type of must both be scalars or vectors");
8483 if (VT.isVector())
8486 "Result and operands must have the same number of elements");
8487 break;
8488 case ISD::AVGFLOORS:
8489 case ISD::AVGFLOORU:
8490 case ISD::AVGCEILS:
8491 case ISD::AVGCEILU:
8492 assert(VT.isInteger() && "This operator does not apply to FP types!");
8493 assert(N1.getValueType() == N2.getValueType() &&
8494 N1.getValueType() == VT && "Binary operator types must match!");
8495 break;
8496 case ISD::ABDS:
8497 case ISD::ABDU:
8498 assert(VT.isInteger() && "This operator does not apply to FP types!");
8499 assert(N1.getValueType() == N2.getValueType() &&
8500 N1.getValueType() == VT && "Binary operator types must match!");
8501 if (VT.getScalarType() == MVT::i1)
8502 return getNode(ISD::XOR, DL, VT, N1, N2);
8503 break;
8504 case ISD::SMIN:
8505 case ISD::UMAX:
8506 assert(VT.isInteger() && "This operator does not apply to FP types!");
8507 assert(N1.getValueType() == N2.getValueType() &&
8508 N1.getValueType() == VT && "Binary operator types must match!");
8509 if (VT.getScalarType() == MVT::i1)
8510 return getNode(ISD::OR, DL, VT, N1, N2);
8511 break;
8512 case ISD::SMAX:
8513 case ISD::UMIN:
8514 assert(VT.isInteger() && "This operator does not apply to FP types!");
8515 assert(N1.getValueType() == N2.getValueType() &&
8516 N1.getValueType() == VT && "Binary operator types must match!");
8517 if (VT.getScalarType() == MVT::i1)
8518 return getNode(ISD::AND, DL, VT, N1, N2);
8519 break;
8520 case ISD::FADD:
8521 case ISD::FSUB:
8522 case ISD::FMUL:
8523 case ISD::FDIV:
8524 case ISD::FREM:
8525 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8526 assert(N1.getValueType() == N2.getValueType() &&
8527 N1.getValueType() == VT && "Binary operator types must match!");
8528 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8529 return V;
8530 break;
8531 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8532 assert(N1.getValueType() == VT &&
8535 "Invalid FCOPYSIGN!");
8536 break;
8537 case ISD::SHL:
8538 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8539 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8540 const APInt &ShiftImm = N2C->getAPIntValue();
8541 return getVScale(DL, VT, MulImm << ShiftImm);
8542 }
8543 [[fallthrough]];
8544 case ISD::SRA:
8545 case ISD::SRL:
8546 if (SDValue V = simplifyShift(N1, N2))
8547 return V;
8548 [[fallthrough]];
8549 case ISD::ROTL:
8550 case ISD::ROTR:
8551 case ISD::SSHLSAT:
8552 case ISD::USHLSAT:
8553 assert(VT == N1.getValueType() &&
8554 "Shift operators return type must be the same as their first arg");
8555 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8556 "Shifts only work on integers");
8557 assert((!VT.isVector() || VT == N2.getValueType()) &&
8558 "Vector shift amounts must be in the same as their first arg");
8559 // Verify that the shift amount VT is big enough to hold valid shift
8560 // amounts. This catches things like trying to shift an i1024 value by an
8561 // i8, which is easy to fall into in generic code that uses
8562 // TLI.getShiftAmount().
8565 "Invalid use of small shift amount with oversized value!");
8566
8567 // Always fold shifts of i1 values so the code generator doesn't need to
8568 // handle them. Since we know the size of the shift has to be less than the
8569 // size of the value, the shift/rotate count is guaranteed to be zero.
8570 if (VT == MVT::i1)
8571 return N1;
8572 if (N2CV && N2CV->isZero())
8573 return N1;
8574 break;
8575 case ISD::FP_ROUND:
8577 VT.bitsLE(N1.getValueType()) && N2C &&
8578 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8579 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8580 if (N1.getValueType() == VT) return N1; // noop conversion.
8581 break;
8582 case ISD::IS_FPCLASS: {
8584 "IS_FPCLASS is used for a non-floating type");
8585 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8586 // is.fpclass(poison, mask) -> poison
8587 if (N1.getOpcode() == ISD::POISON)
8588 return getPOISON(VT);
8589 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8590 // If all tests are made, it doesn't matter what the value is.
8591 if ((Mask & fcAllFlags) == fcAllFlags)
8592 return getBoolConstant(true, DL, VT, N1.getValueType());
8593 if ((Mask & fcAllFlags) == 0)
8594 return getBoolConstant(false, DL, VT, N1.getValueType());
8595 break;
8596 }
8597 case ISD::AssertNoFPClass: {
8599 "AssertNoFPClass is used for a non-floating type");
8600 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8601 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8602 assert(llvm::to_underlying(NoFPClass) <=
8604 "FPClassTest value too large");
8605 (void)NoFPClass;
8606 break;
8607 }
8608 case ISD::AssertSext:
8609 case ISD::AssertZext: {
8610 EVT EVT = cast<VTSDNode>(N2)->getVT();
8611 assert(VT == N1.getValueType() && "Not an inreg extend!");
8612 assert(VT.isInteger() && EVT.isInteger() &&
8613 "Cannot *_EXTEND_INREG FP types");
8614 assert(!EVT.isVector() &&
8615 "AssertSExt/AssertZExt type should be the vector element type "
8616 "rather than the vector type!");
8617 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8618 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8619 break;
8620 }
8622 EVT EVT = cast<VTSDNode>(N2)->getVT();
8623 assert(VT == N1.getValueType() && "Not an inreg extend!");
8624 assert(VT.isInteger() && EVT.isInteger() &&
8625 "Cannot *_EXTEND_INREG FP types");
8626 assert(EVT.isVector() == VT.isVector() &&
8627 "SIGN_EXTEND_INREG type should be vector iff the operand "
8628 "type is vector!");
8629 assert((!EVT.isVector() ||
8631 "Vector element counts must match in SIGN_EXTEND_INREG");
8632 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8633 if (EVT == VT) return N1; // Not actually extending
8634 break;
8635 }
8637 case ISD::FP_TO_UINT_SAT: {
8638 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8639 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8640 assert(N1.getValueType().isVector() == VT.isVector() &&
8641 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8642 "vector!");
8643 assert((!VT.isVector() || VT.getVectorElementCount() ==
8645 "Vector element counts must match in FP_TO_*INT_SAT");
8646 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8647 "Type to saturate to must be a scalar.");
8648 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8649 "Not extending!");
8650 break;
8651 }
8654 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8655 element type of the vector.");
8656
8657 // Extract from an undefined value or using an undefined index is undefined.
8658 if (N1.isUndef() || N2.isUndef())
8659 return getUNDEF(VT);
8660
8661 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8662 // vectors. For scalable vectors we will provide appropriate support for
8663 // dealing with arbitrary indices.
8664 if (N2C && N1.getValueType().isFixedLengthVector() &&
8665 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8666 return getPOISON(VT);
8667
8668 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8669 // expanding copies of large vectors from registers. This only works for
8670 // fixed length vectors, since we need to know the exact number of
8671 // elements.
8672 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8674 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8675 return getExtractVectorElt(DL, VT,
8676 N1.getOperand(N2C->getZExtValue() / Factor),
8677 N2C->getZExtValue() % Factor);
8678 }
8679
8680 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8681 // lowering is expanding large vector constants.
8682 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8683 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8686 "BUILD_VECTOR used for scalable vectors");
8687 unsigned Index =
8688 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8689 SDValue Elt = N1.getOperand(Index);
8690
8691 if (VT != Elt.getValueType())
8692 // If the vector element type is not legal, the BUILD_VECTOR operands
8693 // are promoted and implicitly truncated, and the result implicitly
8694 // extended. Make that explicit here.
8695 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8696
8697 return Elt;
8698 }
8699
8700 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8701 // operations are lowered to scalars.
8702 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8703 // If the indices are the same, return the inserted element else
8704 // if the indices are known different, extract the element from
8705 // the original vector.
8706 SDValue N1Op2 = N1.getOperand(2);
8708
8709 if (N1Op2C && N2C) {
8710 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8711 if (VT == N1.getOperand(1).getValueType())
8712 return N1.getOperand(1);
8713 if (VT.isFloatingPoint()) {
8715 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8716 }
8717 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8718 }
8719 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8720 }
8721 }
8722
8723 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8724 // when vector types are scalarized and v1iX is legal.
8725 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8726 // Here we are completely ignoring the extract element index (N2),
8727 // which is fine for fixed width vectors, since any index other than 0
8728 // is undefined anyway. However, this cannot be ignored for scalable
8729 // vectors - in theory we could support this, but we don't want to do this
8730 // without a profitability check.
8731 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8733 N1.getValueType().getVectorNumElements() == 1) {
8734 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8735 N1.getOperand(1));
8736 }
8737 break;
8739 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8740 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8741 (N1.getValueType().isInteger() == VT.isInteger()) &&
8742 N1.getValueType() != VT &&
8743 "Wrong types for EXTRACT_ELEMENT!");
8744
8745 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8746 // 64-bit integers into 32-bit parts. Instead of building the extract of
8747 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8748 if (N1.getOpcode() == ISD::BUILD_PAIR)
8749 return N1.getOperand(N2C->getZExtValue());
8750
8751 // EXTRACT_ELEMENT of a constant int is also very common.
8752 if (N1C) {
8753 unsigned ElementSize = VT.getSizeInBits();
8754 unsigned Shift = ElementSize * N2C->getZExtValue();
8755 const APInt &Val = N1C->getAPIntValue();
8756 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8757 }
8758 break;
8760 EVT N1VT = N1.getValueType();
8761 assert(VT.isVector() && N1VT.isVector() &&
8762 "Extract subvector VTs must be vectors!");
8764 "Extract subvector VTs must have the same element type!");
8765 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8766 "Cannot extract a scalable vector from a fixed length vector!");
8767 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8769 "Extract subvector must be from larger vector to smaller vector!");
8770 assert(N2C && "Extract subvector index must be a constant");
8771 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8772 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8773 N1VT.getVectorMinNumElements()) &&
8774 "Extract subvector overflow!");
8775 assert(N2C->getAPIntValue().getBitWidth() ==
8776 TLI->getVectorIdxWidth(getDataLayout()) &&
8777 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8778 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8779 "Extract index is not a multiple of the output vector length");
8780
8781 // Trivial extraction.
8782 if (VT == N1VT)
8783 return N1;
8784
8785 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8786 if (N1.isUndef())
8787 return getUNDEF(VT);
8788
8789 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8790 // the concat have the same type as the extract.
8791 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8792 VT == N1.getOperand(0).getValueType()) {
8793 unsigned Factor = VT.getVectorMinNumElements();
8794 return N1.getOperand(N2C->getZExtValue() / Factor);
8795 }
8796
8797 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8798 // during shuffle legalization.
8799 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8800 VT == N1.getOperand(1).getValueType())
8801 return N1.getOperand(1);
8802 break;
8803 }
8804 }
8805
8806 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8807 switch (Opcode) {
8808 case ISD::XOR:
8809 case ISD::ADD:
8810 case ISD::PTRADD:
8811 case ISD::SUB:
8813 case ISD::UDIV:
8814 case ISD::SDIV:
8815 case ISD::UREM:
8816 case ISD::SREM:
8817 case ISD::MUL:
8818 case ISD::AND:
8819 case ISD::SSUBSAT:
8820 case ISD::USUBSAT:
8821 case ISD::UMIN:
8822 case ISD::OR:
8823 case ISD::SADDSAT:
8824 case ISD::UADDSAT:
8825 case ISD::UMAX:
8826 case ISD::SMAX:
8827 case ISD::SMIN:
8828 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8829 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8830 }
8831 }
8832
8833 // Canonicalize an UNDEF to the RHS, even over a constant.
8834 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8835 if (TLI->isCommutativeBinOp(Opcode)) {
8836 std::swap(N1, N2);
8837 } else {
8838 switch (Opcode) {
8839 case ISD::PTRADD:
8840 case ISD::SUB:
8841 // fold op(undef, non_undef_arg2) -> undef.
8842 return N1;
8844 case ISD::UDIV:
8845 case ISD::SDIV:
8846 case ISD::UREM:
8847 case ISD::SREM:
8848 case ISD::SSUBSAT:
8849 case ISD::USUBSAT:
8850 // fold op(undef, non_undef_arg2) -> 0.
8851 return getConstant(0, DL, VT);
8852 }
8853 }
8854 }
8855
8856 // Fold a bunch of operators when the RHS is undef.
8857 if (N2.getOpcode() == ISD::UNDEF) {
8858 switch (Opcode) {
8859 case ISD::XOR:
8860 if (N1.getOpcode() == ISD::UNDEF)
8861 // Handle undef ^ undef -> 0 special case. This is a common
8862 // idiom (misuse).
8863 return getConstant(0, DL, VT);
8864 [[fallthrough]];
8865 case ISD::ADD:
8866 case ISD::PTRADD:
8867 case ISD::SUB:
8868 // fold op(arg1, undef) -> undef.
8869 return N2;
8870 case ISD::UDIV:
8871 case ISD::SDIV:
8872 case ISD::UREM:
8873 case ISD::SREM:
8874 // fold op(arg1, undef) -> poison.
8875 return getPOISON(VT);
8876 case ISD::MUL:
8877 case ISD::AND:
8878 case ISD::SSUBSAT:
8879 case ISD::USUBSAT:
8880 case ISD::UMIN:
8881 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8882 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8883 case ISD::OR:
8884 case ISD::SADDSAT:
8885 case ISD::UADDSAT:
8886 case ISD::UMAX:
8887 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8888 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8889 case ISD::SMAX:
8890 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8891 return N1.getOpcode() == ISD::UNDEF
8892 ? N2
8893 : getConstant(
8895 VT);
8896 case ISD::SMIN:
8897 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8898 return N1.getOpcode() == ISD::UNDEF
8899 ? N2
8900 : getConstant(
8902 VT);
8903 }
8904 }
8905
8906 // Perform trivial constant folding.
8907 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8908 return SV;
8909
8910 // Memoize this node if possible.
8911 SDNode *N;
8912 SDVTList VTs = getVTList(VT);
8913 SDValue Ops[] = {N1, N2};
8914 if (VT != MVT::Glue) {
8916 AddNodeIDNode(ID, Opcode, VTs, Ops);
8917 void *IP = nullptr;
8918 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8919 E->intersectFlagsWith(Flags);
8920 return SDValue(E, 0);
8921 }
8922
8923 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8924 N->setFlags(Flags);
8925 createOperands(N, Ops);
8926 CSEMap.InsertNode(N, IP);
8927 } else {
8928 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8929 createOperands(N, Ops);
8930 }
8931
8932 InsertNode(N);
8933 SDValue V = SDValue(N, 0);
8934 NewSDValueDbgMsg(V, "Creating new node: ", this);
8935 return V;
8936}
8937
8938SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8939 SDValue N1, SDValue N2, SDValue N3) {
8940 SDNodeFlags Flags;
8941 if (Inserter)
8942 Flags = Inserter->getFlags();
8943 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8944}
8945
8946SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8947 SDValue N1, SDValue N2, SDValue N3,
8948 const SDNodeFlags Flags) {
8950 N2.getOpcode() != ISD::DELETED_NODE &&
8951 N3.getOpcode() != ISD::DELETED_NODE &&
8952 "Operand is DELETED_NODE!");
8953 // Perform various simplifications.
8954 switch (Opcode) {
8955 case ISD::BUILD_VECTOR: {
8956 // Attempt to simplify BUILD_VECTOR.
8957 SDValue Ops[] = {N1, N2, N3};
8958 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8959 return V;
8960 break;
8961 }
8962 case ISD::CONCAT_VECTORS: {
8963 SDValue Ops[] = {N1, N2, N3};
8964 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8965 return V;
8966 break;
8967 }
8968 case ISD::SETCC: {
8969 assert(VT.isInteger() && "SETCC result type must be an integer!");
8970 assert(N1.getValueType() == N2.getValueType() &&
8971 "SETCC operands must have the same type!");
8972 assert(VT.isVector() == N1.getValueType().isVector() &&
8973 "SETCC type should be vector iff the operand type is vector!");
8974 assert((!VT.isVector() || VT.getVectorElementCount() ==
8976 "SETCC vector element counts must match!");
8977 // Use FoldSetCC to simplify SETCC's.
8978 if (SDValue V =
8979 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8980 return V;
8981 break;
8982 }
8983 case ISD::SELECT:
8984 case ISD::VSELECT:
8985 if (SDValue V = simplifySelect(N1, N2, N3))
8986 return V;
8987 break;
8989 llvm_unreachable("should use getVectorShuffle constructor!");
8991 if (isNullConstant(N3))
8992 return N1;
8993 break;
8995 if (isNullConstant(N3))
8996 return N2;
8997 break;
8999 assert(VT.isVector() && VT == N1.getValueType() &&
9000 "INSERT_VECTOR_ELT vector type mismatch");
9002 "INSERT_VECTOR_ELT scalar fp/int mismatch");
9003 assert((!VT.isFloatingPoint() ||
9004 VT.getVectorElementType() == N2.getValueType()) &&
9005 "INSERT_VECTOR_ELT fp scalar type mismatch");
9006 assert((!VT.isInteger() ||
9008 "INSERT_VECTOR_ELT int scalar size mismatch");
9009
9010 auto *N3C = dyn_cast<ConstantSDNode>(N3);
9011 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
9012 // for scalable vectors where we will generate appropriate code to
9013 // deal with out-of-bounds cases correctly.
9014 if (N3C && VT.isFixedLengthVector() &&
9015 N3C->getZExtValue() >= VT.getVectorNumElements())
9016 return getUNDEF(VT);
9017
9018 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
9019 if (N3.isUndef())
9020 return getUNDEF(VT);
9021
9022 // If inserting poison, just use the input vector.
9023 if (N2.getOpcode() == ISD::POISON)
9024 return N1;
9025
9026 // Inserting undef into undef/poison is still undef.
9027 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9028 return getUNDEF(VT);
9029
9030 // If the inserted element is an UNDEF, just use the input vector.
9031 // But not if skipping the insert could make the result more poisonous.
9032 if (N2.isUndef()) {
9033 if (N3C && VT.isFixedLengthVector()) {
9034 APInt EltMask =
9035 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
9036 if (isGuaranteedNotToBePoison(N1, EltMask))
9037 return N1;
9038 } else if (isGuaranteedNotToBePoison(N1))
9039 return N1;
9040 }
9041 break;
9042 }
9043 case ISD::INSERT_SUBVECTOR: {
9044 // If inserting poison, just use the input vector,
9045 if (N2.getOpcode() == ISD::POISON)
9046 return N1;
9047
9048 // Inserting undef into undef/poison is still undef.
9049 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
9050 return getUNDEF(VT);
9051
9052 EVT N2VT = N2.getValueType();
9053 assert(VT == N1.getValueType() &&
9054 "Dest and insert subvector source types must match!");
9055 assert(VT.isVector() && N2VT.isVector() &&
9056 "Insert subvector VTs must be vectors!");
9058 "Insert subvector VTs must have the same element type!");
9059 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
9060 "Cannot insert a scalable vector into a fixed length vector!");
9061 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9063 "Insert subvector must be from smaller vector to larger vector!");
9065 "Insert subvector index must be constant");
9066 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
9067 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
9069 "Insert subvector overflow!");
9071 TLI->getVectorIdxWidth(getDataLayout()) &&
9072 "Constant index for INSERT_SUBVECTOR has an invalid size");
9073
9074 // Trivial insertion.
9075 if (VT == N2VT)
9076 return N2;
9077
9078 // If this is an insert of an extracted vector into an undef/poison vector,
9079 // we can just use the input to the extract. But not if skipping the
9080 // extract+insert could make the result more poisonous.
9081 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9082 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9083 if (N1.getOpcode() == ISD::POISON)
9084 return N2.getOperand(0);
9085 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9086 unsigned LoBit = N3->getAsZExtVal();
9087 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9088 APInt EltMask =
9089 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9090 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9091 return N2.getOperand(0);
9092 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9093 return N2.getOperand(0);
9094 }
9095
9096 // If the inserted subvector is UNDEF, just use the input vector.
9097 // But not if skipping the insert could make the result more poisonous.
9098 if (N2.isUndef()) {
9099 if (VT.isFixedLengthVector()) {
9100 unsigned LoBit = N3->getAsZExtVal();
9101 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9102 APInt EltMask =
9103 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9104 if (isGuaranteedNotToBePoison(N1, EltMask))
9105 return N1;
9106 } else if (isGuaranteedNotToBePoison(N1))
9107 return N1;
9108 }
9109 break;
9110 }
9111 case ISD::BITCAST:
9112 // Fold bit_convert nodes from a type to themselves.
9113 if (N1.getValueType() == VT)
9114 return N1;
9115 break;
9116 case ISD::VP_TRUNCATE:
9117 case ISD::VP_SIGN_EXTEND:
9118 case ISD::VP_ZERO_EXTEND:
9119 // Don't create noop casts.
9120 if (N1.getValueType() == VT)
9121 return N1;
9122 break;
9123 case ISD::VECTOR_COMPRESS: {
9124 [[maybe_unused]] EVT VecVT = N1.getValueType();
9125 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9126 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9127 assert(VT == VecVT && "Vector and result type don't match.");
9128 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9129 "All inputs must be vectors.");
9130 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9132 "Vector and mask must have same number of elements.");
9133
9134 if (N1.isUndef() || N2.isUndef())
9135 return N3;
9136
9137 break;
9138 }
9143 [[maybe_unused]] EVT AccVT = N1.getValueType();
9144 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9145 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9146 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9147 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9148 "node to have the same type!");
9149 assert(VT.isVector() && VT == AccVT &&
9150 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9151 "the same type as its result!");
9153 AccVT.getVectorElementCount()) &&
9154 "Expected the element count of the second and third operands of the "
9155 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9156 "element count of the first operand and the result!");
9158 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9159 "node to have an element type which is the same as or smaller than "
9160 "the element type of the first operand and result!");
9161 break;
9162 }
9163 }
9164
9165 // Perform trivial constant folding for arithmetic operators.
9166 switch (Opcode) {
9167 case ISD::FMA:
9168 case ISD::FMAD:
9169 case ISD::SETCC:
9170 case ISD::FSHL:
9171 case ISD::FSHR:
9172 if (SDValue SV =
9173 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9174 return SV;
9175 break;
9176 }
9177
9178 // Memoize node if it doesn't produce a glue result.
9179 SDNode *N;
9180 SDVTList VTs = getVTList(VT);
9181 SDValue Ops[] = {N1, N2, N3};
9182 if (VT != MVT::Glue) {
9184 AddNodeIDNode(ID, Opcode, VTs, Ops);
9185 void *IP = nullptr;
9186 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9187 E->intersectFlagsWith(Flags);
9188 return SDValue(E, 0);
9189 }
9190
9191 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9192 N->setFlags(Flags);
9193 createOperands(N, Ops);
9194 CSEMap.InsertNode(N, IP);
9195 } else {
9196 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9197 createOperands(N, Ops);
9198 }
9199
9200 InsertNode(N);
9201 SDValue V = SDValue(N, 0);
9202 NewSDValueDbgMsg(V, "Creating new node: ", this);
9203 return V;
9204}
9205
9206SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9207 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9208 const SDNodeFlags Flags) {
9209 SDValue Ops[] = { N1, N2, N3, N4 };
9210 return getNode(Opcode, DL, VT, Ops, Flags);
9211}
9212
9213SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9214 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9215 SDNodeFlags Flags;
9216 if (Inserter)
9217 Flags = Inserter->getFlags();
9218 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9219}
9220
9221SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9222 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9223 SDValue N5, const SDNodeFlags Flags) {
9224 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9225 return getNode(Opcode, DL, VT, Ops, Flags);
9226}
9227
9228SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9229 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9230 SDValue N5) {
9231 SDNodeFlags Flags;
9232 if (Inserter)
9233 Flags = Inserter->getFlags();
9234 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9235}
9236
9237/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9238/// the incoming stack arguments to be loaded from the stack.
9240 SmallVector<SDValue, 8> ArgChains;
9241
9242 // Include the original chain at the beginning of the list. When this is
9243 // used by target LowerCall hooks, this helps legalize find the
9244 // CALLSEQ_BEGIN node.
9245 ArgChains.push_back(Chain);
9246
9247 // Add a chain value for each stack argument.
9248 for (SDNode *U : getEntryNode().getNode()->users())
9249 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9250 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9251 if (FI->getIndex() < 0)
9252 ArgChains.push_back(SDValue(L, 1));
9253
9254 // Build a tokenfactor for all the chains.
9255 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9256}
9257
9258/// getMemsetValue - Vectorized representation of the memset value
9259/// operand.
9261 const SDLoc &dl) {
9262 assert(!Value.isUndef());
9263
9264 unsigned NumBits = VT.getScalarSizeInBits();
9266 assert(C->getAPIntValue().getBitWidth() == 8);
9267 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9268 if (VT.isInteger()) {
9269 bool IsOpaque = VT.getSizeInBits() > 64 ||
9270 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9271 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9272 }
9273 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9274 }
9275
9276 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9277 EVT IntVT = VT.getScalarType();
9278 if (!IntVT.isInteger())
9279 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9280
9281 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9282 if (NumBits > 8) {
9283 // Use a multiplication with 0x010101... to extend the input to the
9284 // required length.
9285 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9286 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9287 DAG.getConstant(Magic, dl, IntVT));
9288 }
9289
9290 if (VT != Value.getValueType() && !VT.isInteger())
9291 Value = DAG.getBitcast(VT.getScalarType(), Value);
9292 if (VT != Value.getValueType())
9293 Value = DAG.getSplatBuildVector(VT, dl, Value);
9294
9295 return Value;
9296}
9297
9298/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9299/// used when a memcpy is turned into a memset when the source is a constant
9300/// string ptr.
9302 const TargetLowering &TLI,
9303 const ConstantDataArraySlice &Slice) {
9304 // Handle vector with all elements zero.
9305 if (Slice.Array == nullptr) {
9306 if (VT.isInteger())
9307 return DAG.getConstant(0, dl, VT);
9308 return DAG.getNode(ISD::BITCAST, dl, VT,
9309 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9310 }
9311
9312 assert(!VT.isVector() && "Can't handle vector type here!");
9313 unsigned NumVTBits = VT.getSizeInBits();
9314 unsigned NumVTBytes = NumVTBits / 8;
9315 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9316
9317 APInt Val(NumVTBits, 0);
9318 if (DAG.getDataLayout().isLittleEndian()) {
9319 for (unsigned i = 0; i != NumBytes; ++i)
9320 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9321 } else {
9322 for (unsigned i = 0; i != NumBytes; ++i)
9323 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9324 }
9325
9326 // If the "cost" of materializing the integer immediate is less than the cost
9327 // of a load, then it is cost effective to turn the load into the immediate.
9328 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9329 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9330 return DAG.getConstant(Val, dl, VT);
9331 return SDValue();
9332}
9333
9335 const SDLoc &DL,
9336 const SDNodeFlags Flags) {
9337 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9338 return getMemBasePlusOffset(Base, Index, DL, Flags);
9339}
9340
9342 const SDLoc &DL,
9343 const SDNodeFlags Flags) {
9344 assert(Offset.getValueType().isInteger());
9345 EVT BasePtrVT = Ptr.getValueType();
9346 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9347 BasePtrVT))
9348 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9349 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9350 SDNodeFlags AddFlags = Flags;
9351 AddFlags.setInBounds(false);
9352 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9353}
9354
9355/// Returns true if memcpy source is constant data.
9357 uint64_t SrcDelta = 0;
9358 GlobalAddressSDNode *G = nullptr;
9359 if (Src.getOpcode() == ISD::GlobalAddress)
9361 else if (Src->isAnyAdd() &&
9362 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9363 Src.getOperand(1).getOpcode() == ISD::Constant) {
9364 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9365 SrcDelta = Src.getConstantOperandVal(1);
9366 }
9367 if (!G)
9368 return false;
9369
9370 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9371 SrcDelta + G->getOffset());
9372}
9373
9375 SelectionDAG &DAG) {
9376 // On Darwin, -Os means optimize for size without hurting performance, so
9377 // only really optimize for size when -Oz (MinSize) is used.
9379 return MF.getFunction().hasMinSize();
9380 return DAG.shouldOptForSize();
9381}
9382
9384 SmallVector<SDValue, 32> &OutChains, unsigned From,
9385 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9386 SmallVector<SDValue, 16> &OutStoreChains) {
9387 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9388 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9389 SmallVector<SDValue, 16> GluedLoadChains;
9390 for (unsigned i = From; i < To; ++i) {
9391 OutChains.push_back(OutLoadChains[i]);
9392 GluedLoadChains.push_back(OutLoadChains[i]);
9393 }
9394
9395 // Chain for all loads.
9396 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9397 GluedLoadChains);
9398
9399 for (unsigned i = From; i < To; ++i) {
9400 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9401 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9402 ST->getBasePtr(), ST->getMemoryVT(),
9403 ST->getMemOperand());
9404 OutChains.push_back(NewStore);
9405 }
9406}
9407
9408static SDValue
9410 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9411 Align SrcAlign, bool isVol, bool AlwaysInline,
9412 MachinePointerInfo DstPtrInfo,
9413 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9414 BatchAAResults *BatchAA) {
9415 // Turn a memcpy of undef to nop.
9416 // FIXME: We need to honor volatile even is Src is undef.
9417 if (Src.isUndef())
9418 return Chain;
9419
9420 // Expand memcpy to a series of load and store ops if the size operand falls
9421 // below a certain threshold.
9422 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9423 // rather than maybe a humongous number of loads and stores.
9424 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9425 const DataLayout &DL = DAG.getDataLayout();
9426 LLVMContext &C = *DAG.getContext();
9427 std::vector<EVT> MemOps;
9428 bool DstAlignCanChange = false;
9430 MachineFrameInfo &MFI = MF.getFrameInfo();
9431 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9433 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9434 DstAlignCanChange = true;
9435 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9437 // If marked as volatile, perform a copy even when marked as constant.
9438 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9439 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9440 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9441 const MemOp Op = isZeroConstant
9442 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9443 /*IsZeroMemset*/ true, isVol)
9444 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9445 SrcAlign, isVol, CopyFromConstant);
9446 if (!TLI.findOptimalMemOpLowering(
9447 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9448 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9449 return SDValue();
9450
9451 if (DstAlignCanChange) {
9452 Type *Ty = MemOps[0].getTypeForEVT(C);
9453 Align NewDstAlign = DL.getABITypeAlign(Ty);
9454
9455 // Don't promote to an alignment that would require dynamic stack
9456 // realignment which may conflict with optimizations such as tail call
9457 // optimization.
9459 if (!TRI->hasStackRealignment(MF))
9460 if (MaybeAlign StackAlign = DL.getStackAlignment())
9461 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9462
9463 if (NewDstAlign > DstAlign) {
9464 // Give the stack frame object a larger alignment if needed.
9465 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9466 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9467 DstAlign = NewDstAlign;
9468 }
9469 }
9470
9471 // Prepare AAInfo for loads/stores after lowering this memcpy.
9472 AAMDNodes NewAAInfo = AAInfo;
9473 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9474
9475 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9476 bool isConstant =
9477 BatchAA && SrcVal &&
9478 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9479
9480 MachineMemOperand::Flags MMOFlags =
9482 SmallVector<SDValue, 16> OutLoadChains;
9483 SmallVector<SDValue, 16> OutStoreChains;
9484 SmallVector<SDValue, 32> OutChains;
9485 unsigned NumMemOps = MemOps.size();
9486 uint64_t SrcOff = 0, DstOff = 0;
9487 for (unsigned i = 0; i != NumMemOps; ++i) {
9488 EVT VT = MemOps[i];
9489 unsigned VTSize = VT.getSizeInBits() / 8;
9491
9492 if (VTSize > Size) {
9493 // Issuing an unaligned load / store pair that overlaps with the previous
9494 // pair. Adjust the offset accordingly.
9495 assert(i == NumMemOps-1 && i != 0);
9496 SrcOff -= VTSize - Size;
9497 DstOff -= VTSize - Size;
9498 }
9499
9500 if (CopyFromConstant &&
9501 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9502 // It's unlikely a store of a vector immediate can be done in a single
9503 // instruction. It would require a load from a constantpool first.
9504 // We only handle zero vectors here.
9505 // FIXME: Handle other cases where store of vector immediate is done in
9506 // a single instruction.
9507 ConstantDataArraySlice SubSlice;
9508 if (SrcOff < Slice.Length) {
9509 SubSlice = Slice;
9510 SubSlice.move(SrcOff);
9511 } else {
9512 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9513 SubSlice.Array = nullptr;
9514 SubSlice.Offset = 0;
9515 SubSlice.Length = VTSize;
9516 }
9517 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9518 if (Value.getNode()) {
9519 Store = DAG.getStore(
9520 Chain, dl, Value,
9521 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9522 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags, NewAAInfo);
9523 OutChains.push_back(Store);
9524 }
9525 }
9526
9527 if (!Store.getNode()) {
9528 // The type might not be legal for the target. This should only happen
9529 // if the type is smaller than a legal type, as on PPC, so the right
9530 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9531 // to Load/Store if NVT==VT.
9532 // FIXME does the case above also need this?
9533 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9534 assert(NVT.bitsGE(VT));
9535
9536 bool isDereferenceable =
9537 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9538 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9539 if (isDereferenceable)
9541 if (isConstant)
9542 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9543
9544 Value = DAG.getExtLoad(
9545 ISD::EXTLOAD, dl, NVT, Chain,
9546 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9547 SrcPtrInfo.getWithOffset(SrcOff), VT,
9548 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9549 OutLoadChains.push_back(Value.getValue(1));
9550
9551 Store = DAG.getTruncStore(
9552 Chain, dl, Value,
9553 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9554 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags, NewAAInfo);
9555 OutStoreChains.push_back(Store);
9556 }
9557 SrcOff += VTSize;
9558 DstOff += VTSize;
9559 Size -= VTSize;
9560 }
9561
9562 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9564 unsigned NumLdStInMemcpy = OutStoreChains.size();
9565
9566 if (NumLdStInMemcpy) {
9567 // It may be that memcpy might be converted to memset if it's memcpy
9568 // of constants. In such a case, we won't have loads and stores, but
9569 // just stores. In the absence of loads, there is nothing to gang up.
9570 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9571 // If target does not care, just leave as it.
9572 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9573 OutChains.push_back(OutLoadChains[i]);
9574 OutChains.push_back(OutStoreChains[i]);
9575 }
9576 } else {
9577 // Ld/St less than/equal limit set by target.
9578 if (NumLdStInMemcpy <= GluedLdStLimit) {
9579 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9580 NumLdStInMemcpy, OutLoadChains,
9581 OutStoreChains);
9582 } else {
9583 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9584 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9585 unsigned GlueIter = 0;
9586
9587 // Residual ld/st.
9588 if (RemainingLdStInMemcpy) {
9590 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9591 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9592 }
9593
9594 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9595 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9596 GlueIter - GluedLdStLimit;
9597 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9598 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9599 OutLoadChains, OutStoreChains);
9600 GlueIter += GluedLdStLimit;
9601 }
9602 }
9603 }
9604 }
9605 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9606}
9607
9609 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9610 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9611 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9612 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9613 // Turn a memmove of undef to nop.
9614 // FIXME: We need to honor volatile even is Src is undef.
9615 if (Src.isUndef())
9616 return Chain;
9617
9618 // Expand memmove to a series of load and store ops if the size operand falls
9619 // below a certain threshold.
9620 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9621 const DataLayout &DL = DAG.getDataLayout();
9622 LLVMContext &C = *DAG.getContext();
9623 std::vector<EVT> MemOps;
9624 bool DstAlignCanChange = false;
9626 MachineFrameInfo &MFI = MF.getFrameInfo();
9627 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9629 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9630 DstAlignCanChange = true;
9631 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9632 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9633 if (!TLI.findOptimalMemOpLowering(
9634 C, MemOps, Limit,
9635 MemOp::Move(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9636 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9637 MF.getFunction().getAttributes(), nullptr))
9638 return SDValue();
9639
9640 if (DstAlignCanChange) {
9641 Type *Ty = MemOps[0].getTypeForEVT(C);
9642 Align NewDstAlign = DL.getABITypeAlign(Ty);
9643
9644 // Don't promote to an alignment that would require dynamic stack
9645 // realignment which may conflict with optimizations such as tail call
9646 // optimization.
9648 if (!TRI->hasStackRealignment(MF))
9649 if (MaybeAlign StackAlign = DL.getStackAlignment())
9650 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9651
9652 if (NewDstAlign > DstAlign) {
9653 // Give the stack frame object a larger alignment if needed.
9654 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9655 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9656 DstAlign = NewDstAlign;
9657 }
9658 }
9659
9660 // Prepare AAInfo for loads/stores after lowering this memmove.
9661 AAMDNodes NewAAInfo = AAInfo;
9662 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9663
9664 MachineMemOperand::Flags MMOFlags =
9666 uint64_t SrcOff = 0;
9667 SmallVector<SDValue, 8> LoadValues;
9668 SmallVector<SDValue, 8> LoadChains;
9669 SmallVector<SDValue, 8> OutChains;
9670 unsigned NumMemOps = MemOps.size();
9671 for (unsigned i = 0; i < NumMemOps; i++) {
9672 EVT VT = MemOps[i];
9673 unsigned VTSize = VT.getSizeInBits() / 8;
9674 SDValue Value;
9675 bool IsOverlapping = false;
9676
9677 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9678 // Issuing an unaligned load / store pair that overlaps with the previous
9679 // pair. Adjust the offset accordingly.
9680 SrcOff = Size - VTSize;
9681 IsOverlapping = true;
9682 }
9683
9684 // Calculate the actual alignment at the current offset. The alignment at
9685 // SrcOff may be lower than the base alignment, especially when using
9686 // overlapping loads.
9687 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9688 if (IsOverlapping) {
9689 // Verify that the target allows misaligned memory accesses at the
9690 // adjusted offset when using overlapping loads.
9691 unsigned Fast;
9692 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9693 SrcAlignAtOffset, MMOFlags,
9694 &Fast) ||
9695 !Fast) {
9696 // This should have been caught by findOptimalMemOpLowering, but verify
9697 // here for safety.
9698 return SDValue();
9699 }
9700 }
9701
9702 bool isDereferenceable =
9703 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9704 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9705 if (isDereferenceable)
9707 Value =
9708 DAG.getLoad(VT, dl, Chain,
9709 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9710 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9711 SrcMMOFlags, NewAAInfo);
9712 LoadValues.push_back(Value);
9713 LoadChains.push_back(Value.getValue(1));
9714 SrcOff += VTSize;
9715 }
9716 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9717 OutChains.clear();
9718 uint64_t DstOff = 0;
9719 for (unsigned i = 0; i < NumMemOps; i++) {
9720 EVT VT = MemOps[i];
9721 unsigned VTSize = VT.getSizeInBits() / 8;
9722 SDValue Store;
9723 bool IsOverlapping = false;
9724
9725 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9726 // Issuing an unaligned load / store pair that overlaps with the previous
9727 // pair. Adjust the offset accordingly.
9728 DstOff = Size - VTSize;
9729 IsOverlapping = true;
9730 }
9731
9732 // Calculate the actual alignment at the current offset. The alignment at
9733 // DstOff may be lower than the base alignment, especially when using
9734 // overlapping stores.
9735 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9736 if (IsOverlapping) {
9737 // Verify that the target allows misaligned memory accesses at the
9738 // adjusted offset when using overlapping stores.
9739 unsigned Fast;
9740 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9741 DstAlignAtOffset, MMOFlags,
9742 &Fast) ||
9743 !Fast) {
9744 // This should have been caught by findOptimalMemOpLowering, but verify
9745 // here for safety.
9746 return SDValue();
9747 }
9748 }
9749 Store = DAG.getStore(
9750 Chain, dl, LoadValues[i],
9751 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9752 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9753 NewAAInfo);
9754 OutChains.push_back(Store);
9755 DstOff += VTSize;
9756 }
9757
9758 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9759}
9760
9761/// Lower the call to 'memset' intrinsic function into a series of store
9762/// operations.
9763///
9764/// \param DAG Selection DAG where lowered code is placed.
9765/// \param dl Link to corresponding IR location.
9766/// \param Chain Control flow dependency.
9767/// \param Dst Pointer to destination memory location.
9768/// \param Src Value of byte to write into the memory.
9769/// \param Size Number of bytes to write.
9770/// \param Alignment Alignment of the destination in bytes.
9771/// \param isVol True if destination is volatile.
9772/// \param AlwaysInline Makes sure no function call is generated.
9773/// \param DstPtrInfo IR information on the memory pointer.
9774/// \returns New head in the control flow, if lowering was successful, empty
9775/// SDValue otherwise.
9776///
9777/// The function tries to replace 'llvm.memset' intrinsic with several store
9778/// operations and value calculation code. This is usually profitable for small
9779/// memory size or when the semantic requires inlining.
9781 SDValue Chain, SDValue Dst, SDValue Src,
9782 uint64_t Size, Align Alignment, bool isVol,
9783 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9784 const AAMDNodes &AAInfo) {
9785 // Turn a memset of undef to nop.
9786 // FIXME: We need to honor volatile even is Src is undef.
9787 if (Src.isUndef())
9788 return Chain;
9789
9790 // Expand memset to a series of load/store ops if the size operand
9791 // falls below a certain threshold.
9792 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9793 std::vector<EVT> MemOps;
9794 bool DstAlignCanChange = false;
9795 LLVMContext &C = *DAG.getContext();
9797 MachineFrameInfo &MFI = MF.getFrameInfo();
9798 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9800 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9801 DstAlignCanChange = true;
9802 bool IsZeroVal = isNullConstant(Src);
9803 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9804
9805 EVT LargestVT;
9806 if (!TLI.findOptimalMemOpLowering(
9807 C, MemOps, Limit,
9808 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9809 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9810 &LargestVT))
9811 return SDValue();
9812
9813 if (DstAlignCanChange) {
9814 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9815 const DataLayout &DL = DAG.getDataLayout();
9816 Align NewAlign = DL.getABITypeAlign(Ty);
9817
9818 // Don't promote to an alignment that would require dynamic stack
9819 // realignment which may conflict with optimizations such as tail call
9820 // optimization.
9822 if (!TRI->hasStackRealignment(MF))
9823 if (MaybeAlign StackAlign = DL.getStackAlignment())
9824 NewAlign = std::min(NewAlign, *StackAlign);
9825
9826 if (NewAlign > Alignment) {
9827 // Give the stack frame object a larger alignment if needed.
9828 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9829 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9830 Alignment = NewAlign;
9831 }
9832 }
9833
9834 SmallVector<SDValue, 8> OutChains;
9835 uint64_t DstOff = 0;
9836 unsigned NumMemOps = MemOps.size();
9837
9838 // Find the largest store and generate the bit pattern for it.
9839 // If target didn't set LargestVT, compute it from MemOps.
9840 if (!LargestVT.isSimple()) {
9841 LargestVT = MemOps[0];
9842 for (unsigned i = 1; i < NumMemOps; i++)
9843 if (MemOps[i].bitsGT(LargestVT))
9844 LargestVT = MemOps[i];
9845 }
9846 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9847
9848 // Prepare AAInfo for loads/stores after lowering this memset.
9849 AAMDNodes NewAAInfo = AAInfo;
9850 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9851
9852 for (unsigned i = 0; i < NumMemOps; i++) {
9853 EVT VT = MemOps[i];
9854 unsigned VTSize = VT.getSizeInBits() / 8;
9855 // The target should specify store types that exactly cover the memset size
9856 // (with the last store potentially being oversized for overlapping stores).
9857 assert(Size > 0 && "Target specified more stores than needed in "
9858 "findOptimalMemOpLowering");
9859 if (VTSize > Size) {
9860 // Issuing an unaligned load / store pair that overlaps with the previous
9861 // pair. Adjust the offset accordingly.
9862 assert(i == NumMemOps-1 && i != 0);
9863 DstOff -= VTSize - Size;
9864 }
9865
9866 // If this store is smaller than the largest store see whether we can get
9867 // the smaller value for free with a truncate or extract vector element and
9868 // then store.
9869 SDValue Value = MemSetValue;
9870 if (VT.bitsLT(LargestVT)) {
9871 unsigned Index;
9872 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9873 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9874 if (!LargestVT.isVector() && !VT.isVector() &&
9875 TLI.isTruncateFree(LargestVT, VT))
9876 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9877 else if (LargestVT.isVector() && !VT.isVector() &&
9879 LargestVT.getTypeForEVT(*DAG.getContext()),
9880 VT.getSizeInBits(), Index) &&
9881 TLI.isTypeLegal(SVT) &&
9882 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9883 // Target which can combine store(extractelement VectorTy, Idx) can get
9884 // the smaller value for free.
9885 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9886 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9887 } else
9888 Value = getMemsetValue(Src, VT, DAG, dl);
9889 }
9890 assert(Value.getValueType() == VT && "Value with wrong type.");
9891 SDValue Store = DAG.getStore(
9892 Chain, dl, Value,
9893 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9894 DstPtrInfo.getWithOffset(DstOff), Alignment,
9896 NewAAInfo);
9897 OutChains.push_back(Store);
9898 DstOff += VT.getSizeInBits() / 8;
9899 // For oversized overlapping stores, only subtract the remaining bytes.
9900 // For normal stores, subtract the full store size.
9901 if (VTSize > Size) {
9902 Size = 0;
9903 } else {
9904 Size -= VTSize;
9905 }
9906 }
9907
9908 // After processing all stores, Size should be exactly 0. Any remaining bytes
9909 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9910 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9911 "stores that exactly cover the memset size");
9912
9913 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9914}
9915
9917 unsigned AS) {
9918 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9919 // pointer operands can be losslessly bitcasted to pointers of address space 0
9920 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9921 report_fatal_error("cannot lower memory intrinsic in address space " +
9922 Twine(AS));
9923 }
9924}
9925
9927 const SelectionDAG *SelDAG,
9928 bool AllowReturnsFirstArg) {
9929 if (!CI || !CI->isTailCall())
9930 return false;
9931 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9932 // helper symbol we lower to.
9933 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9934 AllowReturnsFirstArg &&
9936}
9937
9938static std::pair<SDValue, SDValue>
9941 const CallInst *CI, RTLIB::Libcall Call,
9942 SelectionDAG *DAG, const TargetLowering *TLI) {
9943 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9944
9945 if (LCImpl == RTLIB::Unsupported)
9946 return {};
9947
9949 bool IsTailCall =
9950 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9951 SDValue Callee =
9952 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9953
9954 CLI.setDebugLoc(dl)
9955 .setChain(Chain)
9957 CI->getType(), Callee, std::move(Args))
9958 .setTailCall(IsTailCall);
9959
9960 return TLI->LowerCallTo(CLI);
9961}
9962
9963std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9964 const SDLoc &dl, SDValue S1,
9965 SDValue S2,
9966 const CallInst *CI) {
9968 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9969 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9970 RTLIB::STRCMP, this, TLI);
9971}
9972
9973std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9974 const SDLoc &dl, SDValue S1,
9975 SDValue S2,
9976 const CallInst *CI) {
9978 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9979 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9980 RTLIB::STRSTR, this, TLI);
9981}
9982
9983std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9984 const SDLoc &dl,
9985 SDValue Dst, SDValue Src,
9987 const CallInst *CI) {
9989
9991 {Dst, PT},
9992 {Src, PT},
9995 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9996 RTLIB::MEMCCPY, this, TLI);
9997}
9998
9999std::pair<SDValue, SDValue>
10001 SDValue Mem1, SDValue Size, const CallInst *CI) {
10004 {Mem0, PT},
10005 {Mem1, PT},
10007 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10008 RTLIB::MEMCMP, this, TLI);
10009}
10010
10011std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
10012 const SDLoc &dl,
10013 SDValue Dst, SDValue Src,
10014 const CallInst *CI) {
10016 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
10017 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10018 RTLIB::STRCPY, this, TLI);
10019}
10020
10021std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
10022 const SDLoc &dl,
10023 SDValue Src,
10024 const CallInst *CI) {
10025 // Emit a library call.
10028 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
10029 RTLIB::STRLEN, this, TLI);
10030}
10031
10033 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
10034 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
10035 const CallInst *CI, std::optional<bool> OverrideTailCall,
10036 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
10037 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
10038 // Check to see if we should lower the memcpy to loads and stores first.
10039 // For cases within the target-specified limits, this is the best choice.
10041 if (ConstantSize) {
10042 // Memcpy with size zero? Just return the original chain.
10043 if (ConstantSize->isZero())
10044 return Chain;
10045
10047 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10048 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
10049 if (Result.getNode())
10050 return Result;
10051 }
10052
10053 // Then check to see if we should lower the memcpy with target-specific
10054 // code. If the target chooses to do this, this is the next best.
10055 if (TSI) {
10056 SDValue Result = TSI->EmitTargetCodeForMemcpy(
10057 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
10058 AlwaysInline, DstPtrInfo, SrcPtrInfo);
10059 if (Result.getNode())
10060 return Result;
10061 }
10062
10063 // If we really need inline code and the target declined to provide it,
10064 // use a (potentially long) sequence of loads and stores.
10065 if (AlwaysInline) {
10066 assert(ConstantSize && "AlwaysInline requires a constant size!");
10068 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10069 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
10070 }
10071
10074
10075 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
10076 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
10077 // respect volatile, so they may do things like read or write memory
10078 // beyond the given memory regions. But fixing this isn't easy, and most
10079 // people don't care.
10080
10081 // Emit a library call.
10084 Args.emplace_back(Dst, PtrTy);
10085 Args.emplace_back(Src, PtrTy);
10086 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10087 // FIXME: pass in SDLoc
10089 bool IsTailCall = false;
10090 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10091
10092 if (OverrideTailCall.has_value()) {
10093 IsTailCall = *OverrideTailCall;
10094 } else {
10095 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10096 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10097 }
10098
10099 CLI.setDebugLoc(dl)
10100 .setChain(Chain)
10101 .setLibCallee(
10102 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10103 Dst.getValueType().getTypeForEVT(*getContext()),
10104 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10105 std::move(Args))
10107 .setTailCall(IsTailCall);
10108
10109 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10110 return CallResult.second;
10111}
10112
10114 SDValue Dst, SDValue Src, SDValue Size,
10115 Type *SizeTy, unsigned ElemSz,
10116 bool isTailCall,
10117 MachinePointerInfo DstPtrInfo,
10118 MachinePointerInfo SrcPtrInfo) {
10119 // Emit a library call.
10122 Args.emplace_back(Dst, ArgTy);
10123 Args.emplace_back(Src, ArgTy);
10124 Args.emplace_back(Size, SizeTy);
10125
10126 RTLIB::Libcall LibraryCall =
10128 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10129 if (LibcallImpl == RTLIB::Unsupported)
10130 report_fatal_error("Unsupported element size");
10131
10133 CLI.setDebugLoc(dl)
10134 .setChain(Chain)
10135 .setLibCallee(
10136 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10138 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10139 std::move(Args))
10141 .setTailCall(isTailCall);
10142
10143 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10144 return CallResult.second;
10145}
10146
10148 SDValue Src, SDValue Size, Align DstAlign,
10149 Align SrcAlign, bool isVol, const CallInst *CI,
10150 std::optional<bool> OverrideTailCall,
10151 MachinePointerInfo DstPtrInfo,
10152 MachinePointerInfo SrcPtrInfo,
10153 const AAMDNodes &AAInfo,
10154 BatchAAResults *BatchAA) {
10155 // Check to see if we should lower the memmove to loads and stores first.
10156 // For cases within the target-specified limits, this is the best choice.
10158 if (ConstantSize) {
10159 // Memmove with size zero? Just return the original chain.
10160 if (ConstantSize->isZero())
10161 return Chain;
10162
10164 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10165 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10166 if (Result.getNode())
10167 return Result;
10168 }
10169
10170 // Then check to see if we should lower the memmove with target-specific
10171 // code. If the target chooses to do this, this is the next best.
10172 if (TSI) {
10173 SDValue Result = TSI->EmitTargetCodeForMemmove(
10174 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10175 SrcPtrInfo);
10176 if (Result.getNode())
10177 return Result;
10178 }
10179
10182
10183 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10184 // not be safe. See memcpy above for more details.
10185
10186 // Emit a library call.
10189 Args.emplace_back(Dst, PtrTy);
10190 Args.emplace_back(Src, PtrTy);
10191 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10192 // FIXME: pass in SDLoc
10194
10195 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10196
10197 bool IsTailCall = false;
10198 if (OverrideTailCall.has_value()) {
10199 IsTailCall = *OverrideTailCall;
10200 } else {
10201 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10202 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10203 }
10204
10205 CLI.setDebugLoc(dl)
10206 .setChain(Chain)
10207 .setLibCallee(
10208 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10209 Dst.getValueType().getTypeForEVT(*getContext()),
10210 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10211 std::move(Args))
10213 .setTailCall(IsTailCall);
10214
10215 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10216 return CallResult.second;
10217}
10218
10220 SDValue Dst, SDValue Src, SDValue Size,
10221 Type *SizeTy, unsigned ElemSz,
10222 bool isTailCall,
10223 MachinePointerInfo DstPtrInfo,
10224 MachinePointerInfo SrcPtrInfo) {
10225 // Emit a library call.
10228 Args.emplace_back(Dst, IntPtrTy);
10229 Args.emplace_back(Src, IntPtrTy);
10230 Args.emplace_back(Size, SizeTy);
10231
10232 RTLIB::Libcall LibraryCall =
10234 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10235 if (LibcallImpl == RTLIB::Unsupported)
10236 report_fatal_error("Unsupported element size");
10237
10239 CLI.setDebugLoc(dl)
10240 .setChain(Chain)
10241 .setLibCallee(
10242 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10244 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10245 std::move(Args))
10247 .setTailCall(isTailCall);
10248
10249 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10250 return CallResult.second;
10251}
10252
10254 SDValue Src, SDValue Size, Align Alignment,
10255 bool isVol, bool AlwaysInline,
10256 const CallInst *CI,
10257 MachinePointerInfo DstPtrInfo,
10258 const AAMDNodes &AAInfo) {
10259 // Check to see if we should lower the memset to stores first.
10260 // For cases within the target-specified limits, this is the best choice.
10262 if (ConstantSize) {
10263 // Memset with size zero? Just return the original chain.
10264 if (ConstantSize->isZero())
10265 return Chain;
10266
10267 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10268 ConstantSize->getZExtValue(), Alignment,
10269 isVol, false, DstPtrInfo, AAInfo);
10270
10271 if (Result.getNode())
10272 return Result;
10273 }
10274
10275 // Then check to see if we should lower the memset with target-specific
10276 // code. If the target chooses to do this, this is the next best.
10277 if (TSI) {
10278 SDValue Result = TSI->EmitTargetCodeForMemset(
10279 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10280 if (Result.getNode())
10281 return Result;
10282 }
10283
10284 // If we really need inline code and the target declined to provide it,
10285 // use a (potentially long) sequence of loads and stores.
10286 if (AlwaysInline) {
10287 assert(ConstantSize && "AlwaysInline requires a constant size!");
10288 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10289 ConstantSize->getZExtValue(), Alignment,
10290 isVol, true, DstPtrInfo, AAInfo);
10291 assert(Result &&
10292 "getMemsetStores must return a valid sequence when AlwaysInline");
10293 return Result;
10294 }
10295
10297
10298 // Emit a library call.
10299 auto &Ctx = *getContext();
10300 const auto& DL = getDataLayout();
10301
10303 // FIXME: pass in SDLoc
10304 CLI.setDebugLoc(dl).setChain(Chain);
10305
10306 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10307 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10308
10309 // If zeroing out and bzero is present, use it.
10310 if (UseBZero) {
10312 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10313 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10314 CLI.setLibCallee(
10315 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10316 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10317 } else {
10318 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10319
10321 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10322 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10323 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10324 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10325 Dst.getValueType().getTypeForEVT(Ctx),
10326 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10327 std::move(Args));
10328 }
10329
10330 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10331 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10332
10333 // If we're going to use bzero, make sure not to tail call unless the
10334 // subsequent return doesn't need a value, as bzero doesn't return the first
10335 // arg unlike memset.
10336 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10337 bool IsTailCall =
10338 CI && CI->isTailCall() &&
10339 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
10340 CLI.setDiscardResult().setTailCall(IsTailCall);
10341
10342 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10343 return CallResult.second;
10344}
10345
10348 Type *SizeTy, unsigned ElemSz,
10349 bool isTailCall,
10350 MachinePointerInfo DstPtrInfo) {
10351 // Emit a library call.
10353 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10354 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10355 Args.emplace_back(Size, SizeTy);
10356
10357 RTLIB::Libcall LibraryCall =
10359 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10360 if (LibcallImpl == RTLIB::Unsupported)
10361 report_fatal_error("Unsupported element size");
10362
10364 CLI.setDebugLoc(dl)
10365 .setChain(Chain)
10366 .setLibCallee(
10367 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10369 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10370 std::move(Args))
10372 .setTailCall(isTailCall);
10373
10374 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10375 return CallResult.second;
10376}
10377
10378SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10380 MachineMemOperand *MMO,
10381 ISD::LoadExtType ExtType) {
10383 AddNodeIDNode(ID, Opcode, VTList, Ops);
10384 ID.AddInteger(MemVT.getRawBits());
10385 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10386 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10387 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10388 ID.AddInteger(MMO->getFlags());
10389 void* IP = nullptr;
10390 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10391 E->refineAlignment(MMO);
10392 E->refineRanges(MMO);
10393 return SDValue(E, 0);
10394 }
10395
10396 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10397 VTList, MemVT, MMO, ExtType);
10398 createOperands(N, Ops);
10399
10400 CSEMap.InsertNode(N, IP);
10401 InsertNode(N);
10402 SDValue V(N, 0);
10403 NewSDValueDbgMsg(V, "Creating new node: ", this);
10404 return V;
10405}
10406
10408 EVT MemVT, SDVTList VTs, SDValue Chain,
10409 SDValue Ptr, SDValue Cmp, SDValue Swp,
10410 MachineMemOperand *MMO) {
10411 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10413 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10414
10415 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10416 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10417}
10418
10419SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10420 SDValue Chain, SDValue Ptr, SDValue Val,
10421 MachineMemOperand *MMO) {
10422 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10423 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10424 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10425 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10426 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10427 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10428 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10429 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10430 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10431 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10432 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10433 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10434 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10435 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10436 Opcode == ISD::ATOMIC_STORE) &&
10437 "Invalid Atomic Op");
10438
10439 EVT VT = Val.getValueType();
10440
10441 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10442 getVTList(VT, MVT::Other);
10443 SDValue Ops[] = {Chain, Ptr, Val};
10444 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10445}
10446
10448 EVT MemVT, EVT VT, SDValue Chain,
10449 SDValue Ptr, MachineMemOperand *MMO) {
10450 SDVTList VTs = getVTList(VT, MVT::Other);
10451 SDValue Ops[] = {Chain, Ptr};
10452 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10453}
10454
10455/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10457 if (Ops.size() == 1)
10458 return Ops[0];
10459
10461 VTs.reserve(Ops.size());
10462 for (const SDValue &Op : Ops)
10463 VTs.push_back(Op.getValueType());
10464 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10465}
10466
10468 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10469 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10471 const AAMDNodes &AAInfo) {
10472 if (Size.hasValue() && !Size.getValue())
10474
10476 MachineMemOperand *MMO =
10477 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10478
10479 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10480}
10481
10483 SDVTList VTList,
10484 ArrayRef<SDValue> Ops, EVT MemVT,
10485 MachineMemOperand *MMO) {
10486 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10487}
10488
10490 SDVTList VTList,
10491 ArrayRef<SDValue> Ops, EVT MemVT,
10493 assert(!MMOs.empty() && "Must have at least one MMO");
10494 assert(
10495 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10496 Opcode == ISD::PREFETCH ||
10497 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10498 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10499 "Opcode is not a memory-accessing opcode!");
10500
10502 if (MMOs.size() == 1) {
10503 MemRefs = MMOs[0];
10504 } else {
10505 // Allocate: [size_t count][MMO*][MMO*]...
10506 size_t AllocSize =
10507 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10508 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10509 size_t *CountPtr = static_cast<size_t *>(Buffer);
10510 *CountPtr = MMOs.size();
10511 MachineMemOperand **Array =
10512 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10513 llvm::copy(MMOs, Array);
10514 MemRefs = Array;
10515 }
10516
10517 // Memoize the node unless it returns a glue result.
10519 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10521 AddNodeIDNode(ID, Opcode, VTList, Ops);
10522 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10523 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10524 ID.AddInteger(MemVT.getRawBits());
10525 for (const MachineMemOperand *MMO : MMOs) {
10526 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10527 ID.AddInteger(MMO->getFlags());
10528 }
10529 void *IP = nullptr;
10530 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10531 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10532 return SDValue(E, 0);
10533 }
10534
10535 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10536 VTList, MemVT, MemRefs);
10537 createOperands(N, Ops);
10538 CSEMap.InsertNode(N, IP);
10539 } else {
10540 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10541 VTList, MemVT, MemRefs);
10542 createOperands(N, Ops);
10543 }
10544 InsertNode(N);
10545 SDValue V(N, 0);
10546 NewSDValueDbgMsg(V, "Creating new node: ", this);
10547 return V;
10548}
10549
10551 SDValue Chain, int FrameIndex) {
10552 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10553 const auto VTs = getVTList(MVT::Other);
10554 SDValue Ops[2] = {
10555 Chain,
10556 getFrameIndex(FrameIndex,
10557 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10558 true)};
10559
10561 AddNodeIDNode(ID, Opcode, VTs, Ops);
10562 ID.AddInteger(FrameIndex);
10563 void *IP = nullptr;
10564 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10565 return SDValue(E, 0);
10566
10567 LifetimeSDNode *N =
10568 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10569 createOperands(N, Ops);
10570 CSEMap.InsertNode(N, IP);
10571 InsertNode(N);
10572 SDValue V(N, 0);
10573 NewSDValueDbgMsg(V, "Creating new node: ", this);
10574 return V;
10575}
10576
10578 uint64_t Guid, uint64_t Index,
10579 uint32_t Attr) {
10580 const unsigned Opcode = ISD::PSEUDO_PROBE;
10581 const auto VTs = getVTList(MVT::Other);
10582 SDValue Ops[] = {Chain};
10584 AddNodeIDNode(ID, Opcode, VTs, Ops);
10585 ID.AddInteger(Guid);
10586 ID.AddInteger(Index);
10587 void *IP = nullptr;
10588 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10589 return SDValue(E, 0);
10590
10591 auto *N = newSDNode<PseudoProbeSDNode>(
10592 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10593 createOperands(N, Ops);
10594 CSEMap.InsertNode(N, IP);
10595 InsertNode(N);
10596 SDValue V(N, 0);
10597 NewSDValueDbgMsg(V, "Creating new node: ", this);
10598 return V;
10599}
10600
10601/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10602/// MachinePointerInfo record from it. This is particularly useful because the
10603/// code generator has many cases where it doesn't bother passing in a
10604/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10606 SelectionDAG &DAG, SDValue Ptr,
10607 int64_t Offset = 0) {
10608 // If this is FI+Offset, we can model it.
10609 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10611 FI->getIndex(), Offset);
10612
10613 // If this is (FI+Offset1)+Offset2, we can model it.
10614 if (Ptr.getOpcode() != ISD::ADD ||
10617 return Info;
10618
10619 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10621 DAG.getMachineFunction(), FI,
10622 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10623}
10624
10625/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10626/// MachinePointerInfo record from it. This is particularly useful because the
10627/// code generator has many cases where it doesn't bother passing in a
10628/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10630 SelectionDAG &DAG, SDValue Ptr,
10631 SDValue OffsetOp) {
10632 // If the 'Offset' value isn't a constant, we can't handle this.
10634 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10635 if (OffsetOp.isUndef())
10636 return InferPointerInfo(Info, DAG, Ptr);
10637 return Info;
10638}
10639
10641 EVT VT, const SDLoc &dl, SDValue Chain,
10642 SDValue Ptr, SDValue Offset,
10643 MachinePointerInfo PtrInfo, EVT MemVT,
10644 Align Alignment,
10645 MachineMemOperand::Flags MMOFlags,
10646 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10647 assert(Chain.getValueType() == MVT::Other &&
10648 "Invalid chain type");
10649
10650 MMOFlags |= MachineMemOperand::MOLoad;
10651 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10652 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10653 // clients.
10654 if (PtrInfo.V.isNull())
10655 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10656
10657 TypeSize Size = MemVT.getStoreSize();
10659 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10660 Alignment, AAInfo, Ranges);
10661 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10662}
10663
10665 EVT VT, const SDLoc &dl, SDValue Chain,
10666 SDValue Ptr, SDValue Offset, EVT MemVT,
10667 MachineMemOperand *MMO) {
10668 if (VT == MemVT) {
10669 ExtType = ISD::NON_EXTLOAD;
10670 } else if (ExtType == ISD::NON_EXTLOAD) {
10671 assert(VT == MemVT && "Non-extending load from different memory type!");
10672 } else {
10673 // Extending load.
10674 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10675 "Should only be an extending load, not truncating!");
10676 assert(VT.isInteger() == MemVT.isInteger() &&
10677 "Cannot convert from FP to Int or Int -> FP!");
10678 assert(VT.isVector() == MemVT.isVector() &&
10679 "Cannot use an ext load to convert to or from a vector!");
10680 assert((!VT.isVector() ||
10682 "Cannot use an ext load to change the number of vector elements!");
10683 }
10684
10685 assert((!MMO->getRanges() ||
10687 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10688 MemVT.isInteger())) &&
10689 "Range metadata and load type must match!");
10690
10691 bool Indexed = AM != ISD::UNINDEXED;
10692 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10693
10694 SDVTList VTs = Indexed ?
10695 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10696 SDValue Ops[] = { Chain, Ptr, Offset };
10698 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10699 ID.AddInteger(MemVT.getRawBits());
10700 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10701 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10702 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10703 ID.AddInteger(MMO->getFlags());
10704 void *IP = nullptr;
10705 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10706 E->refineAlignment(MMO);
10707 E->refineRanges(MMO);
10708 return SDValue(E, 0);
10709 }
10710 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10711 ExtType, MemVT, MMO);
10712 createOperands(N, Ops);
10713
10714 CSEMap.InsertNode(N, IP);
10715 InsertNode(N);
10716 SDValue V(N, 0);
10717 NewSDValueDbgMsg(V, "Creating new node: ", this);
10718 return V;
10719}
10720
10722 SDValue Ptr, MachinePointerInfo PtrInfo,
10723 MaybeAlign Alignment,
10724 MachineMemOperand::Flags MMOFlags,
10725 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10727 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10728 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10729}
10730
10732 SDValue Ptr, MachineMemOperand *MMO) {
10734 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10735 VT, MMO);
10736}
10737
10739 EVT VT, SDValue Chain, SDValue Ptr,
10740 MachinePointerInfo PtrInfo, EVT MemVT,
10741 MaybeAlign Alignment,
10742 MachineMemOperand::Flags MMOFlags,
10743 const AAMDNodes &AAInfo) {
10745 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10746 MemVT, Alignment, MMOFlags, AAInfo);
10747}
10748
10750 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10751 MachineMemOperand *MMO) {
10753 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10754 MemVT, MMO);
10755}
10756
10760 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10761 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10762 // Don't propagate the invariant or dereferenceable flags.
10763 auto MMOFlags =
10764 LD->getMemOperand()->getFlags() &
10766 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10767 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10768 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10769}
10770
10772 SDValue Ptr, MachinePointerInfo PtrInfo,
10773 Align Alignment,
10774 MachineMemOperand::Flags MMOFlags,
10775 const AAMDNodes &AAInfo) {
10776 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10777
10778 MMOFlags |= MachineMemOperand::MOStore;
10779 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10780
10781 if (PtrInfo.V.isNull())
10782 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10783
10786 MachineMemOperand *MMO =
10787 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10788 return getStore(Chain, dl, Val, Ptr, MMO);
10789}
10790
10792 SDValue Ptr, MachineMemOperand *MMO) {
10794 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10796}
10797
10799 SDValue Ptr, SDValue Offset, EVT SVT,
10801 bool IsTruncating) {
10802 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10803 EVT VT = Val.getValueType();
10804 if (VT == SVT) {
10805 IsTruncating = false;
10806 } else if (!IsTruncating) {
10807 assert(VT == SVT && "No-truncating store from different memory type!");
10808 } else {
10810 "Should only be a truncating store, not extending!");
10811 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10812 assert(VT.isVector() == SVT.isVector() &&
10813 "Cannot use trunc store to convert to or from a vector!");
10814 assert((!VT.isVector() ||
10816 "Cannot use trunc store to change the number of vector elements!");
10817 }
10818
10819 bool Indexed = AM != ISD::UNINDEXED;
10820 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10821 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10822 : getVTList(MVT::Other);
10823 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10826 ID.AddInteger(SVT.getRawBits());
10827 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10828 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10829 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10830 ID.AddInteger(MMO->getFlags());
10831 void *IP = nullptr;
10832 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10833 cast<StoreSDNode>(E)->refineAlignment(MMO);
10834 return SDValue(E, 0);
10835 }
10836 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10837 IsTruncating, SVT, MMO);
10838 createOperands(N, Ops);
10839
10840 CSEMap.InsertNode(N, IP);
10841 InsertNode(N);
10842 SDValue V(N, 0);
10843 NewSDValueDbgMsg(V, "Creating new node: ", this);
10844 return V;
10845}
10846
10848 SDValue Ptr, MachinePointerInfo PtrInfo,
10849 EVT SVT, Align Alignment,
10850 MachineMemOperand::Flags MMOFlags,
10851 const AAMDNodes &AAInfo) {
10852 assert(Chain.getValueType() == MVT::Other &&
10853 "Invalid chain type");
10854
10855 MMOFlags |= MachineMemOperand::MOStore;
10856 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10857
10858 if (PtrInfo.V.isNull())
10859 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10860
10862 MachineMemOperand *MMO = MF.getMachineMemOperand(
10863 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10864 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10865}
10866
10868 SDValue Ptr, EVT SVT,
10869 MachineMemOperand *MMO) {
10871 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10872}
10873
10877 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10878 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10879 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10880 ST->getMemoryVT(), ST->getMemOperand(), AM,
10881 ST->isTruncatingStore());
10882}
10883
10885 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10886 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10887 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10888 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10889 const MDNode *Ranges, bool IsExpanding) {
10890 MMOFlags |= MachineMemOperand::MOLoad;
10891 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10892 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10893 // clients.
10894 if (PtrInfo.V.isNull())
10895 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10896
10897 TypeSize Size = MemVT.getStoreSize();
10899 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10900 Alignment, AAInfo, Ranges);
10901 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10902 MMO, IsExpanding);
10903}
10904
10906 ISD::LoadExtType ExtType, EVT VT,
10907 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10908 SDValue Offset, SDValue Mask, SDValue EVL,
10909 EVT MemVT, MachineMemOperand *MMO,
10910 bool IsExpanding) {
10911 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10912 assert(Mask.getValueType().getVectorElementCount() ==
10913 VT.getVectorElementCount() &&
10914 "Vector width mismatch between mask and data");
10915
10916 bool Indexed = AM != ISD::UNINDEXED;
10917 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10918
10919 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10920 : getVTList(VT, MVT::Other);
10921 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10923 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10924 ID.AddInteger(MemVT.getRawBits());
10925 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10926 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10927 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10928 ID.AddInteger(MMO->getFlags());
10929 void *IP = nullptr;
10930 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10931 E->refineAlignment(MMO);
10932 E->refineRanges(MMO);
10933 return SDValue(E, 0);
10934 }
10935 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10936 ExtType, IsExpanding, MemVT, MMO);
10937 createOperands(N, Ops);
10938
10939 CSEMap.InsertNode(N, IP);
10940 InsertNode(N);
10941 SDValue V(N, 0);
10942 NewSDValueDbgMsg(V, "Creating new node: ", this);
10943 return V;
10944}
10945
10947 SDValue Ptr, SDValue Mask, SDValue EVL,
10948 MachinePointerInfo PtrInfo,
10949 MaybeAlign Alignment,
10950 MachineMemOperand::Flags MMOFlags,
10951 const AAMDNodes &AAInfo, const MDNode *Ranges,
10952 bool IsExpanding) {
10954 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10955 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10956 IsExpanding);
10957}
10958
10960 SDValue Ptr, SDValue Mask, SDValue EVL,
10961 MachineMemOperand *MMO, bool IsExpanding) {
10963 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10964 Mask, EVL, VT, MMO, IsExpanding);
10965}
10966
10968 EVT VT, SDValue Chain, SDValue Ptr,
10969 SDValue Mask, SDValue EVL,
10970 MachinePointerInfo PtrInfo, EVT MemVT,
10971 MaybeAlign Alignment,
10972 MachineMemOperand::Flags MMOFlags,
10973 const AAMDNodes &AAInfo, bool IsExpanding) {
10975 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10976 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10977 IsExpanding);
10978}
10979
10981 EVT VT, SDValue Chain, SDValue Ptr,
10982 SDValue Mask, SDValue EVL, EVT MemVT,
10983 MachineMemOperand *MMO, bool IsExpanding) {
10985 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10986 EVL, MemVT, MMO, IsExpanding);
10987}
10988
10992 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10993 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10994 // Don't propagate the invariant or dereferenceable flags.
10995 auto MMOFlags =
10996 LD->getMemOperand()->getFlags() &
10998 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10999 LD->getChain(), Base, Offset, LD->getMask(),
11000 LD->getVectorLength(), LD->getPointerInfo(),
11001 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
11002 nullptr, LD->isExpandingLoad());
11003}
11004
11006 SDValue Ptr, SDValue Offset, SDValue Mask,
11007 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
11008 ISD::MemIndexedMode AM, bool IsTruncating,
11009 bool IsCompressing) {
11010 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11011 assert(Mask.getValueType().getVectorElementCount() ==
11013 "Vector width mismatch between mask and data");
11014
11015 bool Indexed = AM != ISD::UNINDEXED;
11016 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11017 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11018 : getVTList(MVT::Other);
11019 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
11021 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11022 ID.AddInteger(MemVT.getRawBits());
11023 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11024 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11025 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11026 ID.AddInteger(MMO->getFlags());
11027 void *IP = nullptr;
11028 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11029 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11030 return SDValue(E, 0);
11031 }
11032 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11033 IsTruncating, IsCompressing, MemVT, MMO);
11034 createOperands(N, Ops);
11035
11036 CSEMap.InsertNode(N, IP);
11037 InsertNode(N);
11038 SDValue V(N, 0);
11039 NewSDValueDbgMsg(V, "Creating new node: ", this);
11040 return V;
11041}
11042
11044 SDValue Val, SDValue Ptr, SDValue Mask,
11045 SDValue EVL, MachinePointerInfo PtrInfo,
11046 EVT SVT, Align Alignment,
11047 MachineMemOperand::Flags MMOFlags,
11048 const AAMDNodes &AAInfo,
11049 bool IsCompressing) {
11050 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11051
11052 MMOFlags |= MachineMemOperand::MOStore;
11053 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
11054
11055 if (PtrInfo.V.isNull())
11056 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
11057
11059 MachineMemOperand *MMO = MF.getMachineMemOperand(
11060 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
11061 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
11062 IsCompressing);
11063}
11064
11066 SDValue Val, SDValue Ptr, SDValue Mask,
11067 SDValue EVL, EVT SVT,
11068 MachineMemOperand *MMO,
11069 bool IsCompressing) {
11070 EVT VT = Val.getValueType();
11071
11072 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11073 if (VT == SVT)
11074 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
11075 EVL, VT, MMO, ISD::UNINDEXED,
11076 /*IsTruncating*/ false, IsCompressing);
11077
11079 "Should only be a truncating store, not extending!");
11080 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11081 assert(VT.isVector() == SVT.isVector() &&
11082 "Cannot use trunc store to convert to or from a vector!");
11083 assert((!VT.isVector() ||
11085 "Cannot use trunc store to change the number of vector elements!");
11086
11087 SDVTList VTs = getVTList(MVT::Other);
11089 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11091 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11092 ID.AddInteger(SVT.getRawBits());
11093 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11094 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11095 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11096 ID.AddInteger(MMO->getFlags());
11097 void *IP = nullptr;
11098 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11099 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11100 return SDValue(E, 0);
11101 }
11102 auto *N =
11103 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11104 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11105 createOperands(N, Ops);
11106
11107 CSEMap.InsertNode(N, IP);
11108 InsertNode(N);
11109 SDValue V(N, 0);
11110 NewSDValueDbgMsg(V, "Creating new node: ", this);
11111 return V;
11112}
11113
11117 auto *ST = cast<VPStoreSDNode>(OrigStore);
11118 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
11119 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
11120 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
11121 Offset, ST->getMask(), ST->getVectorLength()};
11123 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11124 ID.AddInteger(ST->getMemoryVT().getRawBits());
11125 ID.AddInteger(ST->getRawSubclassData());
11126 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
11127 ID.AddInteger(ST->getMemOperand()->getFlags());
11128 void *IP = nullptr;
11129 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11130 return SDValue(E, 0);
11131
11132 auto *N = newSDNode<VPStoreSDNode>(
11133 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
11134 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
11135 createOperands(N, Ops);
11136
11137 CSEMap.InsertNode(N, IP);
11138 InsertNode(N);
11139 SDValue V(N, 0);
11140 NewSDValueDbgMsg(V, "Creating new node: ", this);
11141 return V;
11142}
11143
11145 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11146 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11147 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11148 bool Indexed = AM != ISD::UNINDEXED;
11149 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
11150
11151 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11152 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11153 : getVTList(VT, MVT::Other);
11155 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11156 ID.AddInteger(VT.getRawBits());
11157 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11158 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11159 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11160
11161 void *IP = nullptr;
11162 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11163 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11164 return SDValue(E, 0);
11165 }
11166
11167 auto *N =
11168 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11169 ExtType, IsExpanding, MemVT, MMO);
11170 createOperands(N, Ops);
11171 CSEMap.InsertNode(N, IP);
11172 InsertNode(N);
11173 SDValue V(N, 0);
11174 NewSDValueDbgMsg(V, "Creating new node: ", this);
11175 return V;
11176}
11177
11179 SDValue Ptr, SDValue Stride,
11180 SDValue Mask, SDValue EVL,
11181 MachineMemOperand *MMO,
11182 bool IsExpanding) {
11184 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11185 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11186}
11187
11189 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11190 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11191 MachineMemOperand *MMO, bool IsExpanding) {
11193 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11194 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11195}
11196
11198 SDValue Val, SDValue Ptr,
11199 SDValue Offset, SDValue Stride,
11200 SDValue Mask, SDValue EVL, EVT MemVT,
11201 MachineMemOperand *MMO,
11203 bool IsTruncating, bool IsCompressing) {
11204 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11205 bool Indexed = AM != ISD::UNINDEXED;
11206 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11207 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11208 : getVTList(MVT::Other);
11209 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11211 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11212 ID.AddInteger(MemVT.getRawBits());
11213 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11214 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11215 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11216 void *IP = nullptr;
11217 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11218 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11219 return SDValue(E, 0);
11220 }
11221 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11222 VTs, AM, IsTruncating,
11223 IsCompressing, MemVT, MMO);
11224 createOperands(N, Ops);
11225
11226 CSEMap.InsertNode(N, IP);
11227 InsertNode(N);
11228 SDValue V(N, 0);
11229 NewSDValueDbgMsg(V, "Creating new node: ", this);
11230 return V;
11231}
11232
11234 SDValue Val, SDValue Ptr,
11235 SDValue Stride, SDValue Mask,
11236 SDValue EVL, EVT SVT,
11237 MachineMemOperand *MMO,
11238 bool IsCompressing) {
11239 EVT VT = Val.getValueType();
11240
11241 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11242 if (VT == SVT)
11243 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
11244 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
11245 /*IsTruncating*/ false, IsCompressing);
11246
11248 "Should only be a truncating store, not extending!");
11249 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11250 assert(VT.isVector() == SVT.isVector() &&
11251 "Cannot use trunc store to convert to or from a vector!");
11252 assert((!VT.isVector() ||
11254 "Cannot use trunc store to change the number of vector elements!");
11255
11256 SDVTList VTs = getVTList(MVT::Other);
11258 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
11260 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11261 ID.AddInteger(SVT.getRawBits());
11262 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11263 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11264 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11265 void *IP = nullptr;
11266 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11267 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11268 return SDValue(E, 0);
11269 }
11270 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11271 VTs, ISD::UNINDEXED, true,
11272 IsCompressing, SVT, MMO);
11273 createOperands(N, Ops);
11274
11275 CSEMap.InsertNode(N, IP);
11276 InsertNode(N);
11277 SDValue V(N, 0);
11278 NewSDValueDbgMsg(V, "Creating new node: ", this);
11279 return V;
11280}
11281
11284 ISD::MemIndexType IndexType) {
11285 assert(Ops.size() == 6 && "Incompatible number of operands");
11286
11288 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
11289 ID.AddInteger(VT.getRawBits());
11290 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11291 dl.getIROrder(), VTs, VT, MMO, IndexType));
11292 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11293 ID.AddInteger(MMO->getFlags());
11294 void *IP = nullptr;
11295 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11296 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11297 return SDValue(E, 0);
11298 }
11299
11300 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11301 VT, MMO, IndexType);
11302 createOperands(N, Ops);
11303
11304 assert(N->getMask().getValueType().getVectorElementCount() ==
11305 N->getValueType(0).getVectorElementCount() &&
11306 "Vector width mismatch between mask and data");
11307 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11308 N->getValueType(0).getVectorElementCount().isScalable() &&
11309 "Scalable flags of index and data do not match");
11311 N->getIndex().getValueType().getVectorElementCount(),
11312 N->getValueType(0).getVectorElementCount()) &&
11313 "Vector width mismatch between index and data");
11314 assert(isa<ConstantSDNode>(N->getScale()) &&
11315 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11316 "Scale should be a constant power of 2");
11317
11318 CSEMap.InsertNode(N, IP);
11319 InsertNode(N);
11320 SDValue V(N, 0);
11321 NewSDValueDbgMsg(V, "Creating new node: ", this);
11322 return V;
11323}
11324
11327 MachineMemOperand *MMO,
11328 ISD::MemIndexType IndexType) {
11329 assert(Ops.size() == 7 && "Incompatible number of operands");
11330
11332 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
11333 ID.AddInteger(VT.getRawBits());
11334 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11335 dl.getIROrder(), VTs, VT, MMO, IndexType));
11336 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11337 ID.AddInteger(MMO->getFlags());
11338 void *IP = nullptr;
11339 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11340 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11341 return SDValue(E, 0);
11342 }
11343 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11344 VT, MMO, IndexType);
11345 createOperands(N, Ops);
11346
11347 assert(N->getMask().getValueType().getVectorElementCount() ==
11348 N->getValue().getValueType().getVectorElementCount() &&
11349 "Vector width mismatch between mask and data");
11350 assert(
11351 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11352 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11353 "Scalable flags of index and data do not match");
11355 N->getIndex().getValueType().getVectorElementCount(),
11356 N->getValue().getValueType().getVectorElementCount()) &&
11357 "Vector width mismatch between index and data");
11358 assert(isa<ConstantSDNode>(N->getScale()) &&
11359 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11360 "Scale should be a constant power of 2");
11361
11362 CSEMap.InsertNode(N, IP);
11363 InsertNode(N);
11364 SDValue V(N, 0);
11365 NewSDValueDbgMsg(V, "Creating new node: ", this);
11366 return V;
11367}
11368
11371 SDValue PassThru, EVT MemVT,
11372 MachineMemOperand *MMO,
11374 ISD::LoadExtType ExtTy, bool isExpanding) {
11375 bool Indexed = AM != ISD::UNINDEXED;
11376 assert((Indexed || Offset.isUndef()) &&
11377 "Unindexed masked load with an offset!");
11378 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11379 : getVTList(VT, MVT::Other);
11380 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11383 ID.AddInteger(MemVT.getRawBits());
11384 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11385 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11386 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11387 ID.AddInteger(MMO->getFlags());
11388 void *IP = nullptr;
11389 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11390 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11391 return SDValue(E, 0);
11392 }
11393 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11394 AM, ExtTy, isExpanding, MemVT, MMO);
11395 createOperands(N, Ops);
11396
11397 CSEMap.InsertNode(N, IP);
11398 InsertNode(N);
11399 SDValue V(N, 0);
11400 NewSDValueDbgMsg(V, "Creating new node: ", this);
11401 return V;
11402}
11403
11408 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
11409 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11410 Offset, LD->getMask(), LD->getPassThru(),
11411 LD->getMemoryVT(), LD->getMemOperand(), AM,
11412 LD->getExtensionType(), LD->isExpandingLoad());
11413}
11414
11417 SDValue Mask, EVT MemVT,
11418 MachineMemOperand *MMO,
11419 ISD::MemIndexedMode AM, bool IsTruncating,
11420 bool IsCompressing) {
11421 assert(Chain.getValueType() == MVT::Other &&
11422 "Invalid chain type");
11423 bool Indexed = AM != ISD::UNINDEXED;
11424 assert((Indexed || Offset.isUndef()) &&
11425 "Unindexed masked store with an offset!");
11426 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11427 : getVTList(MVT::Other);
11428 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11431 ID.AddInteger(MemVT.getRawBits());
11432 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11433 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11434 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11435 ID.AddInteger(MMO->getFlags());
11436 void *IP = nullptr;
11437 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11438 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11439 return SDValue(E, 0);
11440 }
11441 auto *N =
11442 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11443 IsTruncating, IsCompressing, MemVT, MMO);
11444 createOperands(N, Ops);
11445
11446 CSEMap.InsertNode(N, IP);
11447 InsertNode(N);
11448 SDValue V(N, 0);
11449 NewSDValueDbgMsg(V, "Creating new node: ", this);
11450 return V;
11451}
11452
11457 assert(ST->getOffset().isUndef() &&
11458 "Masked store is already a indexed store!");
11459 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11460 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11461 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11462}
11463
11466 MachineMemOperand *MMO,
11467 ISD::MemIndexType IndexType,
11468 ISD::LoadExtType ExtTy) {
11469 assert(Ops.size() == 6 && "Incompatible number of operands");
11470
11473 ID.AddInteger(MemVT.getRawBits());
11474 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11475 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11476 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11477 ID.AddInteger(MMO->getFlags());
11478 void *IP = nullptr;
11479 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11480 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11481 return SDValue(E, 0);
11482 }
11483
11484 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11485 VTs, MemVT, MMO, IndexType, ExtTy);
11486 createOperands(N, Ops);
11487
11488 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11489 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11490 assert(N->getMask().getValueType().getVectorElementCount() ==
11491 N->getValueType(0).getVectorElementCount() &&
11492 "Vector width mismatch between mask and data");
11493 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11494 N->getValueType(0).getVectorElementCount().isScalable() &&
11495 "Scalable flags of index and data do not match");
11497 N->getIndex().getValueType().getVectorElementCount(),
11498 N->getValueType(0).getVectorElementCount()) &&
11499 "Vector width mismatch between index and data");
11500 assert(isa<ConstantSDNode>(N->getScale()) &&
11501 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11502 "Scale should be a constant power of 2");
11503
11504 CSEMap.InsertNode(N, IP);
11505 InsertNode(N);
11506 SDValue V(N, 0);
11507 NewSDValueDbgMsg(V, "Creating new node: ", this);
11508 return V;
11509}
11510
11513 MachineMemOperand *MMO,
11514 ISD::MemIndexType IndexType,
11515 bool IsTrunc) {
11516 assert(Ops.size() == 6 && "Incompatible number of operands");
11517
11520 ID.AddInteger(MemVT.getRawBits());
11521 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11522 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11523 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11524 ID.AddInteger(MMO->getFlags());
11525 void *IP = nullptr;
11526 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11527 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11528 return SDValue(E, 0);
11529 }
11530
11531 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11532 VTs, MemVT, MMO, IndexType, IsTrunc);
11533 createOperands(N, Ops);
11534
11535 assert(N->getMask().getValueType().getVectorElementCount() ==
11536 N->getValue().getValueType().getVectorElementCount() &&
11537 "Vector width mismatch between mask and data");
11538 assert(
11539 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11540 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11541 "Scalable flags of index and data do not match");
11543 N->getIndex().getValueType().getVectorElementCount(),
11544 N->getValue().getValueType().getVectorElementCount()) &&
11545 "Vector width mismatch between index and data");
11546 assert(isa<ConstantSDNode>(N->getScale()) &&
11547 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11548 "Scale should be a constant power of 2");
11549
11550 CSEMap.InsertNode(N, IP);
11551 InsertNode(N);
11552 SDValue V(N, 0);
11553 NewSDValueDbgMsg(V, "Creating new node: ", this);
11554 return V;
11555}
11556
11558 const SDLoc &dl, ArrayRef<SDValue> Ops,
11559 MachineMemOperand *MMO,
11560 ISD::MemIndexType IndexType) {
11561 assert(Ops.size() == 7 && "Incompatible number of operands");
11562
11565 ID.AddInteger(MemVT.getRawBits());
11566 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11567 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11568 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11569 ID.AddInteger(MMO->getFlags());
11570 void *IP = nullptr;
11571 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11572 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11573 return SDValue(E, 0);
11574 }
11575
11576 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11577 VTs, MemVT, MMO, IndexType);
11578 createOperands(N, Ops);
11579
11580 assert(N->getMask().getValueType().getVectorElementCount() ==
11581 N->getIndex().getValueType().getVectorElementCount() &&
11582 "Vector width mismatch between mask and data");
11583 assert(isa<ConstantSDNode>(N->getScale()) &&
11584 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11585 "Scale should be a constant power of 2");
11586 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11587
11588 CSEMap.InsertNode(N, IP);
11589 InsertNode(N);
11590 SDValue V(N, 0);
11591 NewSDValueDbgMsg(V, "Creating new node: ", this);
11592 return V;
11593}
11594
11596 SDValue Ptr, SDValue Mask, SDValue EVL,
11597 MachineMemOperand *MMO) {
11598 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11599 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11601 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11602 ID.AddInteger(VT.getRawBits());
11603 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11604 VTs, VT, MMO));
11605 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11606 ID.AddInteger(MMO->getFlags());
11607 void *IP = nullptr;
11608 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11609 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11610 return SDValue(E, 0);
11611 }
11612 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11613 VT, MMO);
11614 createOperands(N, Ops);
11615
11616 CSEMap.InsertNode(N, IP);
11617 InsertNode(N);
11618 SDValue V(N, 0);
11619 NewSDValueDbgMsg(V, "Creating new node: ", this);
11620 return V;
11621}
11622
11624 EVT MemVT, MachineMemOperand *MMO) {
11625 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11626 SDVTList VTs = getVTList(MVT::Other);
11627 SDValue Ops[] = {Chain, Ptr};
11630 ID.AddInteger(MemVT.getRawBits());
11631 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11632 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11633 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11634 ID.AddInteger(MMO->getFlags());
11635 void *IP = nullptr;
11636 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11637 return SDValue(E, 0);
11638
11639 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11640 dl.getDebugLoc(), VTs, MemVT, MMO);
11641 createOperands(N, Ops);
11642
11643 CSEMap.InsertNode(N, IP);
11644 InsertNode(N);
11645 SDValue V(N, 0);
11646 NewSDValueDbgMsg(V, "Creating new node: ", this);
11647 return V;
11648}
11649
11651 EVT MemVT, MachineMemOperand *MMO) {
11652 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11653 SDVTList VTs = getVTList(MVT::Other);
11654 SDValue Ops[] = {Chain, Ptr};
11657 ID.AddInteger(MemVT.getRawBits());
11658 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11659 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11660 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11661 ID.AddInteger(MMO->getFlags());
11662 void *IP = nullptr;
11663 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11664 return SDValue(E, 0);
11665
11666 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11667 dl.getDebugLoc(), VTs, MemVT, MMO);
11668 createOperands(N, Ops);
11669
11670 CSEMap.InsertNode(N, IP);
11671 InsertNode(N);
11672 SDValue V(N, 0);
11673 NewSDValueDbgMsg(V, "Creating new node: ", this);
11674 return V;
11675}
11676
11678 // select undef, T, F --> T (if T is a constant), otherwise F
11679 // select, ?, undef, F --> F
11680 // select, ?, T, undef --> T
11681 if (Cond.isUndef())
11682 return isConstantValueOfAnyType(T) ? T : F;
11683 if (T.isUndef())
11685 if (F.isUndef())
11687
11688 // select true, T, F --> T
11689 // select false, T, F --> F
11690 if (auto C = isBoolConstant(Cond))
11691 return *C ? T : F;
11692
11693 // select ?, T, T --> T
11694 if (T == F)
11695 return T;
11696
11697 return SDValue();
11698}
11699
11701 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11702 if (X.isUndef())
11703 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11704 // shift X, undef --> undef (because it may shift by the bitwidth)
11705 if (Y.isUndef())
11706 return getUNDEF(X.getValueType());
11707
11708 // shift 0, Y --> 0
11709 // shift X, 0 --> X
11711 return X;
11712
11713 // shift X, C >= bitwidth(X) --> undef
11714 // All vector elements must be too big (or undef) to avoid partial undefs.
11715 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11716 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11717 };
11718 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11719 return getUNDEF(X.getValueType());
11720
11721 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11722 if (X.getValueType().getScalarType() == MVT::i1)
11723 return X;
11724
11725 return SDValue();
11726}
11727
11729 SDNodeFlags Flags) {
11730 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11731 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11732 // operation is poison. That result can be relaxed to undef.
11733 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11734 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11735 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11736 (YC && YC->getValueAPF().isNaN());
11737 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11738 (YC && YC->getValueAPF().isInfinity());
11739
11740 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11741 return getUNDEF(X.getValueType());
11742
11743 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11744 return getUNDEF(X.getValueType());
11745
11746 if (!YC)
11747 return SDValue();
11748
11749 // X + -0.0 --> X
11750 if (Opcode == ISD::FADD)
11751 if (YC->getValueAPF().isNegZero())
11752 return X;
11753
11754 // X - +0.0 --> X
11755 if (Opcode == ISD::FSUB)
11756 if (YC->getValueAPF().isPosZero())
11757 return X;
11758
11759 // X * 1.0 --> X
11760 // X / 1.0 --> X
11761 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11762 if (YC->getValueAPF().isOne())
11763 return X;
11764
11765 // X * 0.0 --> 0.0
11766 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11767 if (YC->getValueAPF().isZero())
11768 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11769
11770 return SDValue();
11771}
11772
11774 SDValue Ptr, SDValue SV, unsigned Align) {
11775 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11776 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11777}
11778
11779SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11781 switch (Ops.size()) {
11782 case 0: return getNode(Opcode, DL, VT);
11783 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11784 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11785 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11786 default: break;
11787 }
11788
11789 // Copy from an SDUse array into an SDValue array for use with
11790 // the regular getNode logic.
11792 return getNode(Opcode, DL, VT, NewOps);
11793}
11794
11795SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11797 SDNodeFlags Flags;
11798 if (Inserter)
11799 Flags = Inserter->getFlags();
11800 return getNode(Opcode, DL, VT, Ops, Flags);
11801}
11802
11803SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11804 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11805 unsigned NumOps = Ops.size();
11806 switch (NumOps) {
11807 case 0: return getNode(Opcode, DL, VT);
11808 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11809 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11810 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11811 default: break;
11812 }
11813
11814#ifndef NDEBUG
11815 for (const auto &Op : Ops)
11816 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11817 "Operand is DELETED_NODE!");
11818#endif
11819
11820 switch (Opcode) {
11821 default: break;
11822 case ISD::BUILD_VECTOR:
11823 // Attempt to simplify BUILD_VECTOR.
11824 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11825 return V;
11826 break;
11828 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11829 return V;
11830 break;
11831 case ISD::SELECT_CC:
11832 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11833 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11834 "LHS and RHS of condition must have same type!");
11835 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11836 "True and False arms of SelectCC must have same type!");
11837 assert(Ops[2].getValueType() == VT &&
11838 "select_cc node must be of same type as true and false value!");
11839 assert((!Ops[0].getValueType().isVector() ||
11840 Ops[0].getValueType().getVectorElementCount() ==
11841 VT.getVectorElementCount()) &&
11842 "Expected select_cc with vector result to have the same sized "
11843 "comparison type!");
11844 break;
11845 case ISD::BR_CC:
11846 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11847 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11848 "LHS/RHS of comparison should match types!");
11849 break;
11850 case ISD::VP_ADD:
11851 case ISD::VP_SUB:
11852 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11853 if (VT.getScalarType() == MVT::i1)
11854 Opcode = ISD::VP_XOR;
11855 break;
11856 case ISD::VP_MUL:
11857 // If it is VP_MUL mask operation then turn it to VP_AND
11858 if (VT.getScalarType() == MVT::i1)
11859 Opcode = ISD::VP_AND;
11860 break;
11861 case ISD::VP_REDUCE_MUL:
11862 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11863 if (VT == MVT::i1)
11864 Opcode = ISD::VP_REDUCE_AND;
11865 break;
11866 case ISD::VP_REDUCE_ADD:
11867 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11868 if (VT == MVT::i1)
11869 Opcode = ISD::VP_REDUCE_XOR;
11870 break;
11871 case ISD::VP_REDUCE_SMAX:
11872 case ISD::VP_REDUCE_UMIN:
11873 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11874 // VP_REDUCE_AND.
11875 if (VT == MVT::i1)
11876 Opcode = ISD::VP_REDUCE_AND;
11877 break;
11878 case ISD::VP_REDUCE_SMIN:
11879 case ISD::VP_REDUCE_UMAX:
11880 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11881 // VP_REDUCE_OR.
11882 if (VT == MVT::i1)
11883 Opcode = ISD::VP_REDUCE_OR;
11884 break;
11885 }
11886
11887 // Memoize nodes.
11888 SDNode *N;
11889 SDVTList VTs = getVTList(VT);
11890
11891 if (VT != MVT::Glue) {
11893 AddNodeIDNode(ID, Opcode, VTs, Ops);
11894 void *IP = nullptr;
11895
11896 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11897 E->intersectFlagsWith(Flags);
11898 return SDValue(E, 0);
11899 }
11900
11901 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11902 createOperands(N, Ops);
11903
11904 CSEMap.InsertNode(N, IP);
11905 } else {
11906 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11907 createOperands(N, Ops);
11908 }
11909
11910 N->setFlags(Flags);
11911 InsertNode(N);
11912 SDValue V(N, 0);
11913 NewSDValueDbgMsg(V, "Creating new node: ", this);
11914 return V;
11915}
11916
11917SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11918 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11919 SDNodeFlags Flags;
11920 if (Inserter)
11921 Flags = Inserter->getFlags();
11922 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11923}
11924
11925SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11927 const SDNodeFlags Flags) {
11928 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11929}
11930
11931SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11933 SDNodeFlags Flags;
11934 if (Inserter)
11935 Flags = Inserter->getFlags();
11936 return getNode(Opcode, DL, VTList, Ops, Flags);
11937}
11938
11939SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11940 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11941 if (VTList.NumVTs == 1)
11942 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11943
11944#ifndef NDEBUG
11945 for (const auto &Op : Ops)
11946 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11947 "Operand is DELETED_NODE!");
11948#endif
11949
11950 switch (Opcode) {
11951 case ISD::SADDO:
11952 case ISD::UADDO:
11953 case ISD::SSUBO:
11954 case ISD::USUBO: {
11955 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11956 "Invalid add/sub overflow op!");
11957 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11958 Ops[0].getValueType() == Ops[1].getValueType() &&
11959 Ops[0].getValueType() == VTList.VTs[0] &&
11960 "Binary operator types must match!");
11961 SDValue N1 = Ops[0], N2 = Ops[1];
11962 canonicalizeCommutativeBinop(Opcode, N1, N2);
11963
11964 // (X +- 0) -> X with zero-overflow.
11965 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11966 /*AllowTruncation*/ true);
11967 if (N2CV && N2CV->isZero()) {
11968 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11969 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11970 }
11971
11972 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11973 VTList.VTs[1].getScalarType() == MVT::i1) {
11974 SDValue F1 = getFreeze(N1);
11975 SDValue F2 = getFreeze(N2);
11976 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11977 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11978 return getNode(ISD::MERGE_VALUES, DL, VTList,
11979 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11980 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11981 Flags);
11982 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11983 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11984 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11985 return getNode(ISD::MERGE_VALUES, DL, VTList,
11986 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11987 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11988 Flags);
11989 }
11990 }
11991 break;
11992 }
11993 case ISD::SADDO_CARRY:
11994 case ISD::UADDO_CARRY:
11995 case ISD::SSUBO_CARRY:
11996 case ISD::USUBO_CARRY:
11997 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11998 "Invalid add/sub overflow op!");
11999 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
12000 Ops[0].getValueType() == Ops[1].getValueType() &&
12001 Ops[0].getValueType() == VTList.VTs[0] &&
12002 Ops[2].getValueType() == VTList.VTs[1] &&
12003 "Binary operator types must match!");
12004 break;
12005 case ISD::SMUL_LOHI:
12006 case ISD::UMUL_LOHI: {
12007 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
12008 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
12009 VTList.VTs[0] == Ops[0].getValueType() &&
12010 VTList.VTs[0] == Ops[1].getValueType() &&
12011 "Binary operator types must match!");
12012 // Constant fold.
12015 if (LHS && RHS) {
12016 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
12017 unsigned OutWidth = Width * 2;
12018 APInt Val = LHS->getAPIntValue();
12019 APInt Mul = RHS->getAPIntValue();
12020 if (Opcode == ISD::SMUL_LOHI) {
12021 Val = Val.sext(OutWidth);
12022 Mul = Mul.sext(OutWidth);
12023 } else {
12024 Val = Val.zext(OutWidth);
12025 Mul = Mul.zext(OutWidth);
12026 }
12027 Val *= Mul;
12028
12029 SDValue Hi =
12030 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
12031 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
12032 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
12033 }
12034 break;
12035 }
12036 case ISD::FFREXP: {
12037 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
12038 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
12039 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
12040
12042 int FrexpExp;
12043 APFloat FrexpMant =
12044 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
12045 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
12046 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
12047 DL, VTList.VTs[1]);
12048 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
12049 }
12050
12051 break;
12052 }
12054 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
12055 "Invalid STRICT_FP_EXTEND!");
12056 assert(VTList.VTs[0].isFloatingPoint() &&
12057 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
12058 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12059 "STRICT_FP_EXTEND result type should be vector iff the operand "
12060 "type is vector!");
12061 assert((!VTList.VTs[0].isVector() ||
12062 VTList.VTs[0].getVectorElementCount() ==
12063 Ops[1].getValueType().getVectorElementCount()) &&
12064 "Vector element count mismatch!");
12065 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
12066 "Invalid fpext node, dst <= src!");
12067 break;
12069 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
12070 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
12071 "STRICT_FP_ROUND result type should be vector iff the operand "
12072 "type is vector!");
12073 assert((!VTList.VTs[0].isVector() ||
12074 VTList.VTs[0].getVectorElementCount() ==
12075 Ops[1].getValueType().getVectorElementCount()) &&
12076 "Vector element count mismatch!");
12077 assert(VTList.VTs[0].isFloatingPoint() &&
12078 Ops[1].getValueType().isFloatingPoint() &&
12079 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
12080 Ops[2].getOpcode() == ISD::TargetConstant &&
12081 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12082 "Invalid STRICT_FP_ROUND!");
12083 break;
12084 }
12085
12086 // Memoize the node unless it returns a glue result.
12087 SDNode *N;
12088 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12090 AddNodeIDNode(ID, Opcode, VTList, Ops);
12091 void *IP = nullptr;
12092 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12093 E->intersectFlagsWith(Flags);
12094 return SDValue(E, 0);
12095 }
12096
12097 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12098 createOperands(N, Ops);
12099 CSEMap.InsertNode(N, IP);
12100 } else {
12101 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12102 createOperands(N, Ops);
12103 }
12104
12105 N->setFlags(Flags);
12106 InsertNode(N);
12107 SDValue V(N, 0);
12108 NewSDValueDbgMsg(V, "Creating new node: ", this);
12109 return V;
12110}
12111
12112SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12113 SDVTList VTList) {
12114 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12115}
12116
12117SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12118 SDValue N1) {
12119 SDValue Ops[] = { N1 };
12120 return getNode(Opcode, DL, VTList, Ops);
12121}
12122
12123SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12124 SDValue N1, SDValue N2) {
12125 SDValue Ops[] = { N1, N2 };
12126 return getNode(Opcode, DL, VTList, Ops);
12127}
12128
12129SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12130 SDValue N1, SDValue N2, SDValue N3) {
12131 SDValue Ops[] = { N1, N2, N3 };
12132 return getNode(Opcode, DL, VTList, Ops);
12133}
12134
12135SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12136 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12137 SDValue Ops[] = { N1, N2, N3, N4 };
12138 return getNode(Opcode, DL, VTList, Ops);
12139}
12140
12141SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12142 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12143 SDValue N5) {
12144 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12145 return getNode(Opcode, DL, VTList, Ops);
12146}
12147
12149 if (!VT.isExtended())
12150 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12151
12152 return makeVTList(&(*EVTs.insert(VT).first), 1);
12153}
12154
12157 ID.AddInteger(2U);
12158 ID.AddInteger(VT1.getRawBits());
12159 ID.AddInteger(VT2.getRawBits());
12160
12161 void *IP = nullptr;
12162 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12163 if (!Result) {
12164 EVT *Array = Allocator.Allocate<EVT>(2);
12165 Array[0] = VT1;
12166 Array[1] = VT2;
12167 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
12168 VTListMap.InsertNode(Result, IP);
12169 }
12170 return Result->getSDVTList();
12171}
12172
12175 ID.AddInteger(3U);
12176 ID.AddInteger(VT1.getRawBits());
12177 ID.AddInteger(VT2.getRawBits());
12178 ID.AddInteger(VT3.getRawBits());
12179
12180 void *IP = nullptr;
12181 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12182 if (!Result) {
12183 EVT *Array = Allocator.Allocate<EVT>(3);
12184 Array[0] = VT1;
12185 Array[1] = VT2;
12186 Array[2] = VT3;
12187 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
12188 VTListMap.InsertNode(Result, IP);
12189 }
12190 return Result->getSDVTList();
12191}
12192
12195 ID.AddInteger(4U);
12196 ID.AddInteger(VT1.getRawBits());
12197 ID.AddInteger(VT2.getRawBits());
12198 ID.AddInteger(VT3.getRawBits());
12199 ID.AddInteger(VT4.getRawBits());
12200
12201 void *IP = nullptr;
12202 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12203 if (!Result) {
12204 EVT *Array = Allocator.Allocate<EVT>(4);
12205 Array[0] = VT1;
12206 Array[1] = VT2;
12207 Array[2] = VT3;
12208 Array[3] = VT4;
12209 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
12210 VTListMap.InsertNode(Result, IP);
12211 }
12212 return Result->getSDVTList();
12213}
12214
12216 unsigned NumVTs = VTs.size();
12218 ID.AddInteger(NumVTs);
12219 for (unsigned index = 0; index < NumVTs; index++) {
12220 ID.AddInteger(VTs[index].getRawBits());
12221 }
12222
12223 void *IP = nullptr;
12224 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12225 if (!Result) {
12226 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
12227 llvm::copy(VTs, Array);
12228 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
12229 VTListMap.InsertNode(Result, IP);
12230 }
12231 return Result->getSDVTList();
12232}
12233
12234
12235/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12236/// specified operands. If the resultant node already exists in the DAG,
12237/// this does not modify the specified node, instead it returns the node that
12238/// already exists. If the resultant node does not exist in the DAG, the
12239/// input node is returned. As a degenerate case, if you specify the same
12240/// input operands as the node already has, the input node is returned.
12242 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12243
12244 // Check to see if there is no change.
12245 if (Op == N->getOperand(0)) return N;
12246
12247 // See if the modified node already exists.
12248 void *InsertPos = nullptr;
12249 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
12250 return Existing;
12251
12252 // Nope it doesn't. Remove the node from its current place in the maps.
12253 if (InsertPos)
12254 if (!RemoveNodeFromCSEMaps(N))
12255 InsertPos = nullptr;
12256
12257 // Now we update the operands.
12258 N->OperandList[0].set(Op);
12259
12261 // If this gets put into a CSE map, add it.
12262 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12263 return N;
12264}
12265
12267 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12268
12269 // Check to see if there is no change.
12270 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12271 return N; // No operands changed, just return the input node.
12272
12273 // See if the modified node already exists.
12274 void *InsertPos = nullptr;
12275 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
12276 return Existing;
12277
12278 // Nope it doesn't. Remove the node from its current place in the maps.
12279 if (InsertPos)
12280 if (!RemoveNodeFromCSEMaps(N))
12281 InsertPos = nullptr;
12282
12283 // Now we update the operands.
12284 if (N->OperandList[0] != Op1)
12285 N->OperandList[0].set(Op1);
12286 if (N->OperandList[1] != Op2)
12287 N->OperandList[1].set(Op2);
12288
12290 // If this gets put into a CSE map, add it.
12291 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12292 return N;
12293}
12294
12297 SDValue Ops[] = { Op1, Op2, Op3 };
12298 return UpdateNodeOperands(N, Ops);
12299}
12300
12303 SDValue Op3, SDValue Op4) {
12304 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12305 return UpdateNodeOperands(N, Ops);
12306}
12307
12310 SDValue Op3, SDValue Op4, SDValue Op5) {
12311 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12312 return UpdateNodeOperands(N, Ops);
12313}
12314
12317 unsigned NumOps = Ops.size();
12318 assert(N->getNumOperands() == NumOps &&
12319 "Update with wrong number of operands");
12320
12321 // If no operands changed just return the input node.
12322 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12323 return N;
12324
12325 // See if the modified node already exists.
12326 void *InsertPos = nullptr;
12327 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
12328 return Existing;
12329
12330 // Nope it doesn't. Remove the node from its current place in the maps.
12331 if (InsertPos)
12332 if (!RemoveNodeFromCSEMaps(N))
12333 InsertPos = nullptr;
12334
12335 // Now we update the operands.
12336 for (unsigned i = 0; i != NumOps; ++i)
12337 if (N->OperandList[i] != Ops[i])
12338 N->OperandList[i].set(Ops[i]);
12339
12341 // If this gets put into a CSE map, add it.
12342 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12343 return N;
12344}
12345
12346/// DropOperands - Release the operands and set this node to have
12347/// zero operands.
12349 // Unlike the code in MorphNodeTo that does this, we don't need to
12350 // watch for dead nodes here.
12351 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12352 SDUse &Use = *I++;
12353 Use.set(SDValue());
12354 }
12355}
12356
12358 ArrayRef<MachineMemOperand *> NewMemRefs) {
12359 if (NewMemRefs.empty()) {
12360 N->clearMemRefs();
12361 return;
12362 }
12363
12364 // Check if we can avoid allocating by storing a single reference directly.
12365 if (NewMemRefs.size() == 1) {
12366 N->MemRefs = NewMemRefs[0];
12367 N->NumMemRefs = 1;
12368 return;
12369 }
12370
12371 MachineMemOperand **MemRefsBuffer =
12372 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12373 llvm::copy(NewMemRefs, MemRefsBuffer);
12374 N->MemRefs = MemRefsBuffer;
12375 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12376}
12377
12378/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12379/// machine opcode.
12380///
12382 EVT VT) {
12383 SDVTList VTs = getVTList(VT);
12384 return SelectNodeTo(N, MachineOpc, VTs, {});
12385}
12386
12388 EVT VT, SDValue Op1) {
12389 SDVTList VTs = getVTList(VT);
12390 SDValue Ops[] = { Op1 };
12391 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12392}
12393
12395 EVT VT, SDValue Op1,
12396 SDValue Op2) {
12397 SDVTList VTs = getVTList(VT);
12398 SDValue Ops[] = { Op1, Op2 };
12399 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12400}
12401
12403 EVT VT, SDValue Op1,
12404 SDValue Op2, SDValue Op3) {
12405 SDVTList VTs = getVTList(VT);
12406 SDValue Ops[] = { Op1, Op2, Op3 };
12407 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12408}
12409
12412 SDVTList VTs = getVTList(VT);
12413 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12414}
12415
12417 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12418 SDVTList VTs = getVTList(VT1, VT2);
12419 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12420}
12421
12423 EVT VT1, EVT VT2) {
12424 SDVTList VTs = getVTList(VT1, VT2);
12425 return SelectNodeTo(N, MachineOpc, VTs, {});
12426}
12427
12429 EVT VT1, EVT VT2, EVT VT3,
12431 SDVTList VTs = getVTList(VT1, VT2, VT3);
12432 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12433}
12434
12436 EVT VT1, EVT VT2,
12437 SDValue Op1, SDValue Op2) {
12438 SDVTList VTs = getVTList(VT1, VT2);
12439 SDValue Ops[] = { Op1, Op2 };
12440 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12441}
12442
12445 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12446 // Reset the NodeID to -1.
12447 New->setNodeId(-1);
12448 if (New != N) {
12449 ReplaceAllUsesWith(N, New);
12451 }
12452 return New;
12453}
12454
12455/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12456/// the line number information on the merged node since it is not possible to
12457/// preserve the information that operation is associated with multiple lines.
12458/// This will make the debugger working better at -O0, were there is a higher
12459/// probability having other instructions associated with that line.
12460///
12461/// For IROrder, we keep the smaller of the two
12462SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12463 DebugLoc NLoc = N->getDebugLoc();
12464 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12465 N->setDebugLoc(DebugLoc());
12466 }
12467 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12468 N->setIROrder(Order);
12469 return N;
12470}
12471
12472/// MorphNodeTo - This *mutates* the specified node to have the specified
12473/// return type, opcode, and operands.
12474///
12475/// Note that MorphNodeTo returns the resultant node. If there is already a
12476/// node of the specified opcode and operands, it returns that node instead of
12477/// the current one. Note that the SDLoc need not be the same.
12478///
12479/// Using MorphNodeTo is faster than creating a new node and swapping it in
12480/// with ReplaceAllUsesWith both because it often avoids allocating a new
12481/// node, and because it doesn't require CSE recalculation for any of
12482/// the node's users.
12483///
12484/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12485/// As a consequence it isn't appropriate to use from within the DAG combiner or
12486/// the legalizer which maintain worklists that would need to be updated when
12487/// deleting things.
12490 // If an identical node already exists, use it.
12491 void *IP = nullptr;
12492 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12494 AddNodeIDNode(ID, Opc, VTs, Ops);
12495 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
12496 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12497 }
12498
12499 if (!RemoveNodeFromCSEMaps(N))
12500 IP = nullptr;
12501
12502 // Start the morphing.
12503 N->NodeType = Opc;
12504 N->ValueList = VTs.VTs;
12505 N->NumValues = VTs.NumVTs;
12506
12507 // Clear the operands list, updating used nodes to remove this from their
12508 // use list. Keep track of any operands that become dead as a result.
12509 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12510 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12511 SDUse &Use = *I++;
12512 SDNode *Used = Use.getNode();
12513 Use.set(SDValue());
12514 if (Used->use_empty())
12515 DeadNodeSet.insert(Used);
12516 }
12517
12518 // For MachineNode, initialize the memory references information.
12520 MN->clearMemRefs();
12521
12522 // Swap for an appropriately sized array from the recycler.
12523 removeOperands(N);
12524 createOperands(N, Ops);
12525
12526 // Delete any nodes that are still dead after adding the uses for the
12527 // new operands.
12528 if (!DeadNodeSet.empty()) {
12529 SmallVector<SDNode *, 16> DeadNodes;
12530 for (SDNode *N : DeadNodeSet)
12531 if (N->use_empty())
12532 DeadNodes.push_back(N);
12533 RemoveDeadNodes(DeadNodes);
12534 }
12535
12536 if (IP)
12537 CSEMap.InsertNode(N, IP); // Memoize the new node.
12538 return N;
12539}
12540
12542 unsigned OrigOpc = Node->getOpcode();
12543 unsigned NewOpc;
12544 switch (OrigOpc) {
12545 default:
12546 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12547#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12548 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12549#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12550 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12551#include "llvm/IR/ConstrainedOps.def"
12552 }
12553
12554 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12555
12556 // We're taking this node out of the chain, so we need to re-link things.
12557 SDValue InputChain = Node->getOperand(0);
12558 SDValue OutputChain = SDValue(Node, 1);
12559 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12560
12562 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12563 Ops.push_back(Node->getOperand(i));
12564
12565 SDVTList VTs = getVTList(Node->getValueType(0));
12566 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12567
12568 // MorphNodeTo can operate in two ways: if an existing node with the
12569 // specified operands exists, it can just return it. Otherwise, it
12570 // updates the node in place to have the requested operands.
12571 if (Res == Node) {
12572 // If we updated the node in place, reset the node ID. To the isel,
12573 // this should be just like a newly allocated machine node.
12574 Res->setNodeId(-1);
12575 } else {
12578 }
12579
12580 return Res;
12581}
12582
12583/// getMachineNode - These are used for target selectors to create a new node
12584/// with specified return type(s), MachineInstr opcode, and operands.
12585///
12586/// Note that getMachineNode returns the resultant node. If there is already a
12587/// node of the specified opcode and operands, it returns that node instead of
12588/// the current one.
12590 EVT VT) {
12591 SDVTList VTs = getVTList(VT);
12592 return getMachineNode(Opcode, dl, VTs, {});
12593}
12594
12596 EVT VT, SDValue Op1) {
12597 SDVTList VTs = getVTList(VT);
12598 SDValue Ops[] = { Op1 };
12599 return getMachineNode(Opcode, dl, VTs, Ops);
12600}
12601
12603 EVT VT, SDValue Op1, SDValue Op2) {
12604 SDVTList VTs = getVTList(VT);
12605 SDValue Ops[] = { Op1, Op2 };
12606 return getMachineNode(Opcode, dl, VTs, Ops);
12607}
12608
12610 EVT VT, SDValue Op1, SDValue Op2,
12611 SDValue Op3) {
12612 SDVTList VTs = getVTList(VT);
12613 SDValue Ops[] = { Op1, Op2, Op3 };
12614 return getMachineNode(Opcode, dl, VTs, Ops);
12615}
12616
12619 SDVTList VTs = getVTList(VT);
12620 return getMachineNode(Opcode, dl, VTs, Ops);
12621}
12622
12624 EVT VT1, EVT VT2, SDValue Op1,
12625 SDValue Op2) {
12626 SDVTList VTs = getVTList(VT1, VT2);
12627 SDValue Ops[] = { Op1, Op2 };
12628 return getMachineNode(Opcode, dl, VTs, Ops);
12629}
12630
12632 EVT VT1, EVT VT2, SDValue Op1,
12633 SDValue Op2, SDValue Op3) {
12634 SDVTList VTs = getVTList(VT1, VT2);
12635 SDValue Ops[] = { Op1, Op2, Op3 };
12636 return getMachineNode(Opcode, dl, VTs, Ops);
12637}
12638
12640 EVT VT1, EVT VT2,
12642 SDVTList VTs = getVTList(VT1, VT2);
12643 return getMachineNode(Opcode, dl, VTs, Ops);
12644}
12645
12647 EVT VT1, EVT VT2, EVT VT3,
12648 SDValue Op1, SDValue Op2) {
12649 SDVTList VTs = getVTList(VT1, VT2, VT3);
12650 SDValue Ops[] = { Op1, Op2 };
12651 return getMachineNode(Opcode, dl, VTs, Ops);
12652}
12653
12655 EVT VT1, EVT VT2, EVT VT3,
12656 SDValue Op1, SDValue Op2,
12657 SDValue Op3) {
12658 SDVTList VTs = getVTList(VT1, VT2, VT3);
12659 SDValue Ops[] = { Op1, Op2, Op3 };
12660 return getMachineNode(Opcode, dl, VTs, Ops);
12661}
12662
12664 EVT VT1, EVT VT2, EVT VT3,
12666 SDVTList VTs = getVTList(VT1, VT2, VT3);
12667 return getMachineNode(Opcode, dl, VTs, Ops);
12668}
12669
12671 ArrayRef<EVT> ResultTys,
12673 SDVTList VTs = getVTList(ResultTys);
12674 return getMachineNode(Opcode, dl, VTs, Ops);
12675}
12676
12678 SDVTList VTs,
12680 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12682 void *IP = nullptr;
12683
12684 if (DoCSE) {
12686 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12687 IP = nullptr;
12688 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12689 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12690 }
12691 }
12692
12693 // Allocate a new MachineSDNode.
12694 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12695 createOperands(N, Ops);
12696
12697 if (DoCSE)
12698 CSEMap.InsertNode(N, IP);
12699
12700 InsertNode(N);
12701 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12702 return N;
12703}
12704
12705/// getTargetExtractSubreg - A convenience function for creating
12706/// TargetOpcode::EXTRACT_SUBREG nodes.
12708 SDValue Operand) {
12709 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12710 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12711 VT, Operand, SRIdxVal);
12712 return SDValue(Subreg, 0);
12713}
12714
12715/// getTargetInsertSubreg - A convenience function for creating
12716/// TargetOpcode::INSERT_SUBREG nodes.
12718 SDValue Operand, SDValue Subreg) {
12719 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12720 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12721 VT, Operand, Subreg, SRIdxVal);
12722 return SDValue(Result, 0);
12723}
12724
12725/// getNodeIfExists - Get the specified node if it's already available, or
12726/// else return NULL.
12729 bool AllowCommute) {
12730 SDNodeFlags Flags;
12731 if (Inserter)
12732 Flags = Inserter->getFlags();
12733 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12734}
12735
12738 const SDNodeFlags Flags,
12739 bool AllowCommute) {
12740 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12741 return nullptr;
12742
12743 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12745 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12746 void *IP = nullptr;
12747 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12748 E->intersectFlagsWith(Flags);
12749 return E;
12750 }
12751 return nullptr;
12752 };
12753
12754 if (SDNode *Existing = Lookup(Ops))
12755 return Existing;
12756
12757 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12758 return Lookup({Ops[1], Ops[0]});
12759
12760 return nullptr;
12761}
12762
12763/// doesNodeExist - Check if a node exists without modifying its flags.
12764bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12766 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12768 AddNodeIDNode(ID, Opcode, VTList, Ops);
12769 void *IP = nullptr;
12770 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12771 return true;
12772 }
12773 return false;
12774}
12775
12776/// getDbgValue - Creates a SDDbgValue node.
12777///
12778/// SDNode
12780 SDNode *N, unsigned R, bool IsIndirect,
12781 const DebugLoc &DL, unsigned O) {
12782 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12783 "Expected inlined-at fields to agree");
12784 return new (DbgInfo->getAlloc())
12785 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12786 {}, IsIndirect, DL, O,
12787 /*IsVariadic=*/false);
12788}
12789
12790/// Constant
12792 DIExpression *Expr,
12793 const Value *C,
12794 const DebugLoc &DL, unsigned O) {
12795 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12796 "Expected inlined-at fields to agree");
12797 return new (DbgInfo->getAlloc())
12798 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12799 /*IsIndirect=*/false, DL, O,
12800 /*IsVariadic=*/false);
12801}
12802
12803/// FrameIndex
12805 DIExpression *Expr, unsigned FI,
12806 bool IsIndirect,
12807 const DebugLoc &DL,
12808 unsigned O) {
12809 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12810 "Expected inlined-at fields to agree");
12811 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12812}
12813
12814/// FrameIndex with dependencies
12816 DIExpression *Expr, unsigned FI,
12817 ArrayRef<SDNode *> Dependencies,
12818 bool IsIndirect,
12819 const DebugLoc &DL,
12820 unsigned O) {
12821 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12822 "Expected inlined-at fields to agree");
12823 return new (DbgInfo->getAlloc())
12824 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12825 Dependencies, IsIndirect, DL, O,
12826 /*IsVariadic=*/false);
12827}
12828
12829/// VReg
12831 Register VReg, bool IsIndirect,
12832 const DebugLoc &DL, unsigned O) {
12833 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12834 "Expected inlined-at fields to agree");
12835 return new (DbgInfo->getAlloc())
12836 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12837 {}, IsIndirect, DL, O,
12838 /*IsVariadic=*/false);
12839}
12840
12843 ArrayRef<SDNode *> Dependencies,
12844 bool IsIndirect, const DebugLoc &DL,
12845 unsigned O, bool IsVariadic) {
12846 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12847 "Expected inlined-at fields to agree");
12848 return new (DbgInfo->getAlloc())
12849 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12850 DL, O, IsVariadic);
12851}
12852
12854 unsigned OffsetInBits, unsigned SizeInBits,
12855 bool InvalidateDbg) {
12856 SDNode *FromNode = From.getNode();
12857 SDNode *ToNode = To.getNode();
12858 assert(FromNode && ToNode && "Can't modify dbg values");
12859
12860 // PR35338
12861 // TODO: assert(From != To && "Redundant dbg value transfer");
12862 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12863 if (From == To || FromNode == ToNode)
12864 return;
12865
12866 if (!FromNode->getHasDebugValue())
12867 return;
12868
12869 SDDbgOperand FromLocOp =
12870 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12872
12874 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12875 if (Dbg->isInvalidated())
12876 continue;
12877
12878 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12879
12880 // Create a new location ops vector that is equal to the old vector, but
12881 // with each instance of FromLocOp replaced with ToLocOp.
12882 bool Changed = false;
12883 auto NewLocOps = Dbg->copyLocationOps();
12884 std::replace_if(
12885 NewLocOps.begin(), NewLocOps.end(),
12886 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12887 bool Match = Op == FromLocOp;
12888 Changed |= Match;
12889 return Match;
12890 },
12891 ToLocOp);
12892 // Ignore this SDDbgValue if we didn't find a matching location.
12893 if (!Changed)
12894 continue;
12895
12896 DIVariable *Var = Dbg->getVariable();
12897 auto *Expr = Dbg->getExpression();
12898 // If a fragment is requested, update the expression.
12899 if (SizeInBits) {
12900 // When splitting a larger (e.g., sign-extended) value whose
12901 // lower bits are described with an SDDbgValue, do not attempt
12902 // to transfer the SDDbgValue to the upper bits.
12903 if (auto FI = Expr->getFragmentInfo())
12904 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12905 continue;
12906 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12907 SizeInBits);
12908 if (!Fragment)
12909 continue;
12910 Expr = *Fragment;
12911 }
12912
12913 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12914 // Clone the SDDbgValue and move it to To.
12915 SDDbgValue *Clone = getDbgValueList(
12916 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12917 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12918 Dbg->isVariadic());
12919 ClonedDVs.push_back(Clone);
12920
12921 if (InvalidateDbg) {
12922 // Invalidate value and indicate the SDDbgValue should not be emitted.
12923 Dbg->setIsInvalidated();
12924 Dbg->setIsEmitted();
12925 }
12926 }
12927
12928 for (SDDbgValue *Dbg : ClonedDVs) {
12929 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12930 "Transferred DbgValues should depend on the new SDNode");
12931 AddDbgValue(Dbg, false);
12932 }
12933}
12934
12936 if (!N.getHasDebugValue())
12937 return;
12938
12939 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12940 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12941 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12942 return SDDbgOperand::fromNode(Node, ResNo);
12943 };
12944
12946 for (auto *DV : GetDbgValues(&N)) {
12947 if (DV->isInvalidated())
12948 continue;
12949 switch (N.getOpcode()) {
12950 default:
12951 break;
12952 case ISD::ADD: {
12953 SDValue N0 = N.getOperand(0);
12954 SDValue N1 = N.getOperand(1);
12955 if (!isa<ConstantSDNode>(N0)) {
12956 bool RHSConstant = isa<ConstantSDNode>(N1);
12958 if (RHSConstant)
12959 Offset = N.getConstantOperandVal(1);
12960 // We are not allowed to turn indirect debug values variadic, so
12961 // don't salvage those.
12962 if (!RHSConstant && DV->isIndirect())
12963 continue;
12964
12965 // Rewrite an ADD constant node into a DIExpression. Since we are
12966 // performing arithmetic to compute the variable's *value* in the
12967 // DIExpression, we need to mark the expression with a
12968 // DW_OP_stack_value.
12969 auto *DIExpr = DV->getExpression();
12970 auto NewLocOps = DV->copyLocationOps();
12971 bool Changed = false;
12972 size_t OrigLocOpsSize = NewLocOps.size();
12973 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12974 // We're not given a ResNo to compare against because the whole
12975 // node is going away. We know that any ISD::ADD only has one
12976 // result, so we can assume any node match is using the result.
12977 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12978 NewLocOps[i].getSDNode() != &N)
12979 continue;
12980 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12981 if (RHSConstant) {
12984 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12985 } else {
12986 // Convert to a variadic expression (if not already).
12987 // convertToVariadicExpression() returns a const pointer, so we use
12988 // a temporary const variable here.
12989 const auto *TmpDIExpr =
12993 ExprOps.push_back(NewLocOps.size());
12994 ExprOps.push_back(dwarf::DW_OP_plus);
12995 SDDbgOperand RHS =
12997 NewLocOps.push_back(RHS);
12998 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12999 }
13000 Changed = true;
13001 }
13002 (void)Changed;
13003 assert(Changed && "Salvage target doesn't use N");
13004
13005 bool IsVariadic =
13006 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
13007
13008 auto AdditionalDependencies = DV->getAdditionalDependencies();
13009 SDDbgValue *Clone = getDbgValueList(
13010 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
13011 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
13012 ClonedDVs.push_back(Clone);
13013 DV->setIsInvalidated();
13014 DV->setIsEmitted();
13015 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
13016 N0.getNode()->dumprFull(this);
13017 dbgs() << " into " << *DIExpr << '\n');
13018 }
13019 break;
13020 }
13021 case ISD::TRUNCATE: {
13022 SDValue N0 = N.getOperand(0);
13023 TypeSize FromSize = N0.getValueSizeInBits();
13024 TypeSize ToSize = N.getValueSizeInBits(0);
13025
13026 DIExpression *DbgExpression = DV->getExpression();
13027 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
13028 auto NewLocOps = DV->copyLocationOps();
13029 bool Changed = false;
13030 for (size_t i = 0; i < NewLocOps.size(); ++i) {
13031 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
13032 NewLocOps[i].getSDNode() != &N)
13033 continue;
13034
13035 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
13036 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
13037 Changed = true;
13038 }
13039 assert(Changed && "Salvage target doesn't use N");
13040 (void)Changed;
13041
13042 SDDbgValue *Clone =
13043 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
13044 DV->getAdditionalDependencies(), DV->isIndirect(),
13045 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
13046
13047 ClonedDVs.push_back(Clone);
13048 DV->setIsInvalidated();
13049 DV->setIsEmitted();
13050 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
13051 dbgs() << " into " << *DbgExpression << '\n');
13052 break;
13053 }
13054 }
13055 }
13056
13057 for (SDDbgValue *Dbg : ClonedDVs) {
13058 assert((!Dbg->getSDNodes().empty() ||
13059 llvm::any_of(Dbg->getLocationOps(),
13060 [&](const SDDbgOperand &Op) {
13061 return Op.getKind() == SDDbgOperand::FRAMEIX;
13062 })) &&
13063 "Salvaged DbgValue should depend on a new SDNode");
13064 AddDbgValue(Dbg, false);
13065 }
13066}
13067
13068/// Creates a SDDbgLabel node.
13070 const DebugLoc &DL, unsigned O) {
13071 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
13072 "Expected inlined-at fields to agree");
13073 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
13074}
13075
13076namespace {
13077
13078/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
13079/// pointed to by a use iterator is deleted, increment the use iterator
13080/// so that it doesn't dangle.
13081///
13082class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13085
13086 void NodeDeleted(SDNode *N, SDNode *E) override {
13087 // Increment the iterator as needed.
13088 while (UI != UE && N == UI->getUser())
13089 ++UI;
13090 }
13091
13092public:
13093 RAUWUpdateListener(SelectionDAG &d,
13096 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13097};
13098
13099} // end anonymous namespace
13100
13101/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13102/// This can cause recursive merging of nodes in the DAG.
13103///
13104/// This version assumes From has a single result value.
13105///
13107 SDNode *From = FromN.getNode();
13108 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13109 "Cannot replace with this method!");
13110 assert(From != To.getNode() && "Cannot replace uses of with self");
13111
13112 // Preserve Debug Values
13113 transferDbgValues(FromN, To);
13114 // Preserve extra info.
13115 copyExtraInfo(From, To.getNode());
13116
13117 // Iterate over all the existing uses of From. New uses will be added
13118 // to the beginning of the use list, which we avoid visiting.
13119 // This specifically avoids visiting uses of From that arise while the
13120 // replacement is happening, because any such uses would be the result
13121 // of CSE: If an existing node looks like From after one of its operands
13122 // is replaced by To, we don't want to replace of all its users with To
13123 // too. See PR3018 for more info.
13124 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13125 RAUWUpdateListener Listener(*this, UI, UE);
13126 while (UI != UE) {
13127 SDNode *User = UI->getUser();
13128
13129 // This node is about to morph, remove its old self from the CSE maps.
13130 RemoveNodeFromCSEMaps(User);
13131
13132 // A user can appear in a use list multiple times, and when this
13133 // happens the uses are usually next to each other in the list.
13134 // To help reduce the number of CSE recomputations, process all
13135 // the uses of this user that we can find this way.
13136 do {
13137 SDUse &Use = *UI;
13138 ++UI;
13139 Use.set(To);
13140 if (To->isDivergent() != From->isDivergent())
13142 } while (UI != UE && UI->getUser() == User);
13143 // Now that we have modified User, add it back to the CSE maps. If it
13144 // already exists there, recursively merge the results together.
13145 AddModifiedNodeToCSEMaps(User);
13146 }
13147
13148 // If we just RAUW'd the root, take note.
13149 if (FromN == getRoot())
13150 setRoot(To);
13151}
13152
13153/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13154/// This can cause recursive merging of nodes in the DAG.
13155///
13156/// This version assumes that for each value of From, there is a
13157/// corresponding value in To in the same position with the same type.
13158///
13160#ifndef NDEBUG
13161 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13162 assert((!From->hasAnyUseOfValue(i) ||
13163 From->getValueType(i) == To->getValueType(i)) &&
13164 "Cannot use this version of ReplaceAllUsesWith!");
13165#endif
13166
13167 // Handle the trivial case.
13168 if (From == To)
13169 return;
13170
13171 // Preserve Debug Info. Only do this if there's a use.
13172 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13173 if (From->hasAnyUseOfValue(i)) {
13174 assert((i < To->getNumValues()) && "Invalid To location");
13175 transferDbgValues(SDValue(From, i), SDValue(To, i));
13176 }
13177 // Preserve extra info.
13178 copyExtraInfo(From, To);
13179
13180 // Iterate over just the existing users of From. See the comments in
13181 // the ReplaceAllUsesWith above.
13182 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13183 RAUWUpdateListener Listener(*this, UI, UE);
13184 while (UI != UE) {
13185 SDNode *User = UI->getUser();
13186
13187 // This node is about to morph, remove its old self from the CSE maps.
13188 RemoveNodeFromCSEMaps(User);
13189
13190 // A user can appear in a use list multiple times, and when this
13191 // happens the uses are usually next to each other in the list.
13192 // To help reduce the number of CSE recomputations, process all
13193 // the uses of this user that we can find this way.
13194 do {
13195 SDUse &Use = *UI;
13196 ++UI;
13197 Use.setNode(To);
13198 if (To->isDivergent() != From->isDivergent())
13200 } while (UI != UE && UI->getUser() == User);
13201
13202 // Now that we have modified User, add it back to the CSE maps. If it
13203 // already exists there, recursively merge the results together.
13204 AddModifiedNodeToCSEMaps(User);
13205 }
13206
13207 // If we just RAUW'd the root, take note.
13208 if (From == getRoot().getNode())
13209 setRoot(SDValue(To, getRoot().getResNo()));
13210}
13211
13212/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13213/// This can cause recursive merging of nodes in the DAG.
13214///
13215/// This version can replace From with any result values. To must match the
13216/// number and types of values returned by From.
13218 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13219 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13220
13221 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13222 // Preserve Debug Info.
13223 transferDbgValues(SDValue(From, i), To[i]);
13224 // Preserve extra info.
13225 copyExtraInfo(From, To[i].getNode());
13226 }
13227
13228 // Iterate over just the existing users of From. See the comments in
13229 // the ReplaceAllUsesWith above.
13230 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13231 RAUWUpdateListener Listener(*this, UI, UE);
13232 while (UI != UE) {
13233 SDNode *User = UI->getUser();
13234
13235 // This node is about to morph, remove its old self from the CSE maps.
13236 RemoveNodeFromCSEMaps(User);
13237
13238 // A user can appear in a use list multiple times, and when this happens the
13239 // uses are usually next to each other in the list. To help reduce the
13240 // number of CSE and divergence recomputations, process all the uses of this
13241 // user that we can find this way.
13242 bool To_IsDivergent = false;
13243 do {
13244 SDUse &Use = *UI;
13245 const SDValue &ToOp = To[Use.getResNo()];
13246 ++UI;
13247 Use.set(ToOp);
13248 if (ToOp.getValueType() != MVT::Other)
13249 To_IsDivergent |= ToOp->isDivergent();
13250 } while (UI != UE && UI->getUser() == User);
13251
13252 if (To_IsDivergent != From->isDivergent())
13254
13255 // Now that we have modified User, add it back to the CSE maps. If it
13256 // already exists there, recursively merge the results together.
13257 AddModifiedNodeToCSEMaps(User);
13258 }
13259
13260 // If we just RAUW'd the root, take note.
13261 if (From == getRoot().getNode())
13262 setRoot(SDValue(To[getRoot().getResNo()]));
13263}
13264
13265/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13266/// uses of other values produced by From.getNode() alone. The Deleted
13267/// vector is handled the same way as for ReplaceAllUsesWith.
13269 // Handle the really simple, really trivial case efficiently.
13270 if (From == To) return;
13271
13272 // Handle the simple, trivial, case efficiently.
13273 if (From.getNode()->getNumValues() == 1) {
13274 ReplaceAllUsesWith(From, To);
13275 return;
13276 }
13277
13278 // Preserve Debug Info.
13279 transferDbgValues(From, To);
13280 copyExtraInfo(From.getNode(), To.getNode());
13281
13282 // Iterate over just the existing users of From. See the comments in
13283 // the ReplaceAllUsesWith above.
13284 SDNode::use_iterator UI = From.getNode()->use_begin(),
13285 UE = From.getNode()->use_end();
13286 RAUWUpdateListener Listener(*this, UI, UE);
13287 while (UI != UE) {
13288 SDNode *User = UI->getUser();
13289 bool UserRemovedFromCSEMaps = false;
13290
13291 // A user can appear in a use list multiple times, and when this
13292 // happens the uses are usually next to each other in the list.
13293 // To help reduce the number of CSE recomputations, process all
13294 // the uses of this user that we can find this way.
13295 do {
13296 SDUse &Use = *UI;
13297
13298 // Skip uses of different values from the same node.
13299 if (Use.getResNo() != From.getResNo()) {
13300 ++UI;
13301 continue;
13302 }
13303
13304 // If this node hasn't been modified yet, it's still in the CSE maps,
13305 // so remove its old self from the CSE maps.
13306 if (!UserRemovedFromCSEMaps) {
13307 RemoveNodeFromCSEMaps(User);
13308 UserRemovedFromCSEMaps = true;
13309 }
13310
13311 ++UI;
13312 Use.set(To);
13313 if (To->isDivergent() != From->isDivergent())
13315 } while (UI != UE && UI->getUser() == User);
13316 // We are iterating over all uses of the From node, so if a use
13317 // doesn't use the specific value, no changes are made.
13318 if (!UserRemovedFromCSEMaps)
13319 continue;
13320
13321 // Now that we have modified User, add it back to the CSE maps. If it
13322 // already exists there, recursively merge the results together.
13323 AddModifiedNodeToCSEMaps(User);
13324 }
13325
13326 // If we just RAUW'd the root, take note.
13327 if (From == getRoot())
13328 setRoot(To);
13329}
13330
13331namespace {
13332
13333/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13334/// to record information about a use.
13335struct UseMemo {
13336 SDNode *User;
13337 unsigned Index;
13338 SDUse *Use;
13339};
13340
13341/// operator< - Sort Memos by User.
13342bool operator<(const UseMemo &L, const UseMemo &R) {
13343 return (intptr_t)L.User < (intptr_t)R.User;
13344}
13345
13346/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13347/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13348/// the node already has been taken care of recursively.
13349class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13350 SmallVectorImpl<UseMemo> &Uses;
13351
13352 void NodeDeleted(SDNode *N, SDNode *E) override {
13353 for (UseMemo &Memo : Uses)
13354 if (Memo.User == N)
13355 Memo.User = nullptr;
13356 }
13357
13358public:
13359 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13360 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13361};
13362
13363} // end anonymous namespace
13364
13365/// Return true if a glue output should propagate divergence information.
13367 switch (Node->getOpcode()) {
13368 case ISD::CopyFromReg:
13369 case ISD::CopyToReg:
13370 return false;
13371 default:
13372 return true;
13373 }
13374
13375 llvm_unreachable("covered opcode switch");
13376}
13377
13379 if (TLI->isSDNodeAlwaysUniform(N)) {
13380 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13381 "Conflicting divergence information!");
13382 return false;
13383 }
13384 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13385 return true;
13386 for (const auto &Op : N->ops()) {
13387 EVT VT = Op.getValueType();
13388
13389 // Skip Chain. It does not carry divergence.
13390 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13391 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13392 return true;
13393 }
13394 return false;
13395}
13396
13398 SmallVector<SDNode *, 16> Worklist(1, N);
13399 do {
13400 N = Worklist.pop_back_val();
13401 bool IsDivergent = calculateDivergence(N);
13402 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13403 N->SDNodeBits.IsDivergent = IsDivergent;
13404 llvm::append_range(Worklist, N->users());
13405 }
13406 } while (!Worklist.empty());
13407}
13408
13409void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13411 Order.reserve(AllNodes.size());
13412 for (auto &N : allnodes()) {
13413 unsigned NOps = N.getNumOperands();
13414 Degree[&N] = NOps;
13415 if (0 == NOps)
13416 Order.push_back(&N);
13417 }
13418 for (size_t I = 0; I != Order.size(); ++I) {
13419 SDNode *N = Order[I];
13420 for (auto *U : N->users()) {
13421 unsigned &UnsortedOps = Degree[U];
13422 if (0 == --UnsortedOps)
13423 Order.push_back(U);
13424 }
13425 }
13426}
13427
13428#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13429void SelectionDAG::VerifyDAGDivergence() {
13430 std::vector<SDNode *> TopoOrder;
13431 CreateTopologicalOrder(TopoOrder);
13432 for (auto *N : TopoOrder) {
13433 assert(calculateDivergence(N) == N->isDivergent() &&
13434 "Divergence bit inconsistency detected");
13435 }
13436}
13437#endif
13438
13439/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13440/// uses of other values produced by From.getNode() alone. The same value
13441/// may appear in both the From and To list. The Deleted vector is
13442/// handled the same way as for ReplaceAllUsesWith.
13444 const SDValue *To,
13445 unsigned Num){
13446 // Handle the simple, trivial case efficiently.
13447 if (Num == 1)
13448 return ReplaceAllUsesOfValueWith(*From, *To);
13449
13450 transferDbgValues(*From, *To);
13451 copyExtraInfo(From->getNode(), To->getNode());
13452
13453 // Read up all the uses and make records of them. This helps
13454 // processing new uses that are introduced during the
13455 // replacement process.
13457 for (unsigned i = 0; i != Num; ++i) {
13458 unsigned FromResNo = From[i].getResNo();
13459 SDNode *FromNode = From[i].getNode();
13460 for (SDUse &Use : FromNode->uses()) {
13461 if (Use.getResNo() == FromResNo) {
13462 UseMemo Memo = {Use.getUser(), i, &Use};
13463 Uses.push_back(Memo);
13464 }
13465 }
13466 }
13467
13468 // Sort the uses, so that all the uses from a given User are together.
13470 RAUOVWUpdateListener Listener(*this, Uses);
13471
13472 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13473 UseIndex != UseIndexEnd; ) {
13474 // We know that this user uses some value of From. If it is the right
13475 // value, update it.
13476 SDNode *User = Uses[UseIndex].User;
13477 // If the node has been deleted by recursive CSE updates when updating
13478 // another node, then just skip this entry.
13479 if (User == nullptr) {
13480 ++UseIndex;
13481 continue;
13482 }
13483
13484 // This node is about to morph, remove its old self from the CSE maps.
13485 RemoveNodeFromCSEMaps(User);
13486
13487 // The Uses array is sorted, so all the uses for a given User
13488 // are next to each other in the list.
13489 // To help reduce the number of CSE recomputations, process all
13490 // the uses of this user that we can find this way.
13491 do {
13492 unsigned i = Uses[UseIndex].Index;
13493 SDUse &Use = *Uses[UseIndex].Use;
13494 ++UseIndex;
13495
13496 Use.set(To[i]);
13497 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13498
13499 // Now that we have modified User, add it back to the CSE maps. If it
13500 // already exists there, recursively merge the results together.
13501 AddModifiedNodeToCSEMaps(User);
13502 }
13503}
13504
13505/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13506/// based on their topological order. It returns the maximum id and a vector
13507/// of the SDNodes* in assigned order by reference.
13509 unsigned DAGSize = 0;
13510
13511 // SortedPos tracks the progress of the algorithm. Nodes before it are
13512 // sorted, nodes after it are unsorted. When the algorithm completes
13513 // it is at the end of the list.
13514 allnodes_iterator SortedPos = allnodes_begin();
13515
13516 // Visit all the nodes. Move nodes with no operands to the front of
13517 // the list immediately. Annotate nodes that do have operands with their
13518 // operand count. Before we do this, the Node Id fields of the nodes
13519 // may contain arbitrary values. After, the Node Id fields for nodes
13520 // before SortedPos will contain the topological sort index, and the
13521 // Node Id fields for nodes At SortedPos and after will contain the
13522 // count of outstanding operands.
13524 checkForCycles(&N, this);
13525 unsigned Degree = N.getNumOperands();
13526 if (Degree == 0) {
13527 // A node with no uses, add it to the result array immediately.
13528 N.setNodeId(DAGSize++);
13529 allnodes_iterator Q(&N);
13530 if (Q != SortedPos)
13531 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13532 assert(SortedPos != AllNodes.end() && "Overran node list");
13533 ++SortedPos;
13534 } else {
13535 // Temporarily use the Node Id as scratch space for the degree count.
13536 N.setNodeId(Degree);
13537 }
13538 }
13539
13540 // Visit all the nodes. As we iterate, move nodes into sorted order,
13541 // such that by the time the end is reached all nodes will be sorted.
13542 for (SDNode &Node : allnodes()) {
13543 SDNode *N = &Node;
13544 checkForCycles(N, this);
13545 // N is in sorted position, so all its uses have one less operand
13546 // that needs to be sorted.
13547 for (SDNode *P : N->users()) {
13548 unsigned Degree = P->getNodeId();
13549 assert(Degree != 0 && "Invalid node degree");
13550 --Degree;
13551 if (Degree == 0) {
13552 // All of P's operands are sorted, so P may sorted now.
13553 P->setNodeId(DAGSize++);
13554 if (P->getIterator() != SortedPos)
13555 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13556 assert(SortedPos != AllNodes.end() && "Overran node list");
13557 ++SortedPos;
13558 } else {
13559 // Update P's outstanding operand count.
13560 P->setNodeId(Degree);
13561 }
13562 }
13563 if (Node.getIterator() == SortedPos) {
13564#ifndef NDEBUG
13566 SDNode *S = &*++I;
13567 dbgs() << "Overran sorted position:\n";
13568 S->dumprFull(this); dbgs() << "\n";
13569 dbgs() << "Checking if this is due to cycles\n";
13570 checkForCycles(this, true);
13571#endif
13572 llvm_unreachable(nullptr);
13573 }
13574 }
13575
13576 assert(SortedPos == AllNodes.end() &&
13577 "Topological sort incomplete!");
13578 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13579 "First node in topological sort is not the entry token!");
13580 assert(AllNodes.front().getNodeId() == 0 &&
13581 "First node in topological sort has non-zero id!");
13582 assert(AllNodes.front().getNumOperands() == 0 &&
13583 "First node in topological sort has operands!");
13584 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13585 "Last node in topologic sort has unexpected id!");
13586 assert(AllNodes.back().use_empty() &&
13587 "Last node in topologic sort has users!");
13588 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13589 return DAGSize;
13590}
13591
13593 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13594 SortedNodes.clear();
13595 // Node -> remaining number of outstanding operands.
13596 DenseMap<const SDNode *, unsigned> RemainingOperands;
13597
13598 // Put nodes without any operands into SortedNodes first.
13599 for (const SDNode &N : allnodes()) {
13600 checkForCycles(&N, this);
13601 unsigned NumOperands = N.getNumOperands();
13602 if (NumOperands == 0)
13603 SortedNodes.push_back(&N);
13604 else
13605 // Record their total number of outstanding operands.
13606 RemainingOperands[&N] = NumOperands;
13607 }
13608
13609 // A node is pushed into SortedNodes when all of its operands (predecessors in
13610 // the graph) are also in SortedNodes.
13611 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13612 const SDNode *N = SortedNodes[i];
13613 for (const SDNode *U : N->users()) {
13614 // HandleSDNode is never part of a DAG and therefore has no entry in
13615 // RemainingOperands.
13616 if (U->getOpcode() == ISD::HANDLENODE)
13617 continue;
13618 unsigned &NumRemOperands = RemainingOperands[U];
13619 assert(NumRemOperands && "Invalid number of remaining operands");
13620 --NumRemOperands;
13621 if (!NumRemOperands)
13622 SortedNodes.push_back(U);
13623 }
13624 }
13625
13626 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13627 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13628 "First node in topological sort is not the entry token");
13629 assert(SortedNodes.front()->getNumOperands() == 0 &&
13630 "First node in topological sort has operands");
13631}
13632
13633/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13634/// value is produced by SD.
13635void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13636 for (SDNode *SD : DB->getSDNodes()) {
13637 if (!SD)
13638 continue;
13639 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13640 SD->setHasDebugValue(true);
13641 }
13642 DbgInfo->add(DB, isParameter);
13643}
13644
13645void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13646
13648 SDValue NewMemOpChain) {
13649 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13650 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13651 // The new memory operation must have the same position as the old load in
13652 // terms of memory dependency. Create a TokenFactor for the old load and new
13653 // memory operation and update uses of the old load's output chain to use that
13654 // TokenFactor.
13655 if (OldChain == NewMemOpChain || OldChain.use_empty())
13656 return NewMemOpChain;
13657
13658 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13659 OldChain, NewMemOpChain);
13660 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13661 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13662 return TokenFactor;
13663}
13664
13666 SDValue NewMemOp) {
13667 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13668 SDValue OldChain = SDValue(OldLoad, 1);
13669 SDValue NewMemOpChain = NewMemOp.getValue(1);
13670 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13671}
13672
13674 Function **OutFunction) {
13675 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13676
13677 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13678 auto *Module = MF->getFunction().getParent();
13679 auto *Function = Module->getFunction(Symbol);
13680
13681 if (OutFunction != nullptr)
13682 *OutFunction = Function;
13683
13684 if (Function != nullptr) {
13685 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13686 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13687 }
13688
13689 std::string ErrorStr;
13690 raw_string_ostream ErrorFormatter(ErrorStr);
13691 ErrorFormatter << "Undefined external symbol ";
13692 ErrorFormatter << '"' << Symbol << '"';
13693 report_fatal_error(Twine(ErrorStr));
13694}
13695
13696//===----------------------------------------------------------------------===//
13697// SDNode Class
13698//===----------------------------------------------------------------------===//
13699
13702 return Const != nullptr && Const->isZero();
13703}
13704
13706 return V.isUndef() || isNullConstant(V);
13707}
13708
13711 return Const != nullptr && Const->isZero() && !Const->isNegative();
13712}
13713
13716 return Const != nullptr && Const->isAllOnes();
13717}
13718
13721 return Const != nullptr && Const->isOne();
13722}
13723
13726 return Const != nullptr && Const->isMinSignedValue();
13727}
13728
13730 SDValue V, unsigned OperandNo,
13731 unsigned Depth) const {
13732 APInt DemandedElts = getDemandAllEltsMask(V);
13733 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13734}
13735
13737 SDValue V, const APInt &DemandedElts,
13738 unsigned OperandNo, unsigned Depth) const {
13739 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13740 // TODO: Target-specific opcodes could be added.
13741 if (V.getValueType().isInteger()) {
13742 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13743 if (Known.isConstant()) {
13744 const APInt &Const = Known.getConstant();
13745 switch (Opcode) {
13746 case ISD::ADD:
13747 case ISD::OR:
13748 case ISD::XOR:
13749 case ISD::UMAX:
13750 return Const.isZero();
13751 case ISD::MUL:
13752 return Const.isOne();
13753 case ISD::AND:
13754 case ISD::UMIN:
13755 return Const.isAllOnes();
13756 case ISD::SMAX:
13757 return Const.isMinSignedValue();
13758 case ISD::SMIN:
13759 return Const.isMaxSignedValue();
13760 case ISD::SUB:
13761 case ISD::SHL:
13762 case ISD::SRA:
13763 case ISD::SRL:
13764 return OperandNo == 1 && Const.isZero();
13765 case ISD::UDIV:
13766 case ISD::SDIV:
13767 return OperandNo == 1 && Const.isOne();
13768 }
13769 }
13770 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13771 switch (Opcode) {
13772 case ISD::FADD:
13773 return ConstFP->isZero() &&
13774 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13775 case ISD::FSUB:
13776 return OperandNo == 1 && ConstFP->isZero() &&
13777 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13778 case ISD::FMUL:
13779 return ConstFP->isOne();
13780 case ISD::FDIV:
13781 return OperandNo == 1 && ConstFP->isOne();
13782 case ISD::FMINNUM:
13783 case ISD::FMAXNUM: {
13784 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13785 EVT VT = V.getValueType();
13786 const fltSemantics &Semantics = VT.getFltSemantics();
13787 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13788 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13789 : APFloat::getLargest(Semantics);
13790 if (Opcode == ISD::FMAXNUM)
13791 NeutralAF.changeSign();
13792
13793 return ConstFP->isExactlyValue(NeutralAF);
13794 }
13795 }
13796 }
13797 return false;
13798}
13799
13801 while (V.getOpcode() == ISD::BITCAST)
13802 V = V.getOperand(0);
13803 return V;
13804}
13805
13807 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13808 V = V.getOperand(0);
13809 return V;
13810}
13811
13813 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13814 V = V.getOperand(0);
13815 return V;
13816}
13817
13819 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13820 SDValue InVec = V.getOperand(0);
13821 SDValue EltNo = V.getOperand(2);
13822 EVT VT = InVec.getValueType();
13823 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13824 if (IndexC && VT.isFixedLengthVector() &&
13825 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13826 !DemandedElts[IndexC->getZExtValue()]) {
13827 V = InVec;
13828 continue;
13829 }
13830 break;
13831 }
13832 return V;
13833}
13834
13836 while (V.getOpcode() == ISD::TRUNCATE)
13837 V = V.getOperand(0);
13838 return V;
13839}
13840
13841bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13842 if (V.getOpcode() != ISD::XOR)
13843 return false;
13844 V = peekThroughBitcasts(V.getOperand(1));
13845 unsigned NumBits = V.getScalarValueSizeInBits();
13846 ConstantSDNode *C =
13847 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13848 return C && (C->getAPIntValue().countr_one() >= NumBits);
13849}
13850
13852 bool AllowTruncation) {
13853 APInt DemandedElts = getDemandAllEltsMask(N);
13854 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13855}
13856
13858 bool AllowUndefs,
13859 bool AllowTruncation) {
13861 return CN;
13862
13863 // SplatVectors can truncate their operands. Ignore that case here unless
13864 // AllowTruncation is set.
13865 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13866 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13867 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13868 EVT CVT = CN->getValueType(0);
13869 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13870 if (AllowTruncation || CVT == VecEltVT)
13871 return CN;
13872 }
13873 }
13874
13876 BitVector UndefElements;
13877 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13878
13879 // BuildVectors can truncate their operands. Ignore that case here unless
13880 // AllowTruncation is set.
13881 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13882 if (CN && (UndefElements.none() || AllowUndefs)) {
13883 EVT CVT = CN->getValueType(0);
13884 EVT NSVT = N.getValueType().getScalarType();
13885 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13886 if (AllowTruncation || (CVT == NSVT))
13887 return CN;
13888 }
13889 }
13890
13891 return nullptr;
13892}
13893
13895 APInt DemandedElts = getDemandAllEltsMask(N);
13896 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13897}
13898
13900 const APInt &DemandedElts,
13901 bool AllowUndefs) {
13903 return CN;
13904
13906 BitVector UndefElements;
13907 ConstantFPSDNode *CN =
13908 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13909 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13910 if (CN && (UndefElements.none() || AllowUndefs))
13911 return CN;
13912 }
13913
13914 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13915 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13916 return CN;
13917
13918 return nullptr;
13919}
13920
13921bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13922 // TODO: may want to use peekThroughBitcast() here.
13923 ConstantSDNode *C =
13924 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13925 return C && C->isZero();
13926}
13927
13928bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13929 ConstantSDNode *C =
13930 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13931 return C && C->isOne();
13932}
13933
13934bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13935 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13936 return C && C->isOne();
13937}
13938
13939bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13941 unsigned BitWidth = N.getScalarValueSizeInBits();
13942 ConstantSDNode *C =
13943 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13944 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13945}
13946
13947bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13948 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13949 return C && APInt::isSameValue(C->getAPIntValue(),
13950 APInt(C->getAPIntValue().getBitWidth(), 1));
13951}
13952
13953bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13955 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13956 return C && C->isZero();
13957}
13958
13959bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13960 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13961 return C && C->isZero();
13962}
13963
13967
13969 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13971 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13972 bool IsVolatile = false;
13973 bool IsNonTemporal = false;
13974 bool IsDereferenceable = true;
13975 bool IsInvariant = true;
13976 for (const MachineMemOperand *MMO : memoperands()) {
13977 IsVolatile |= MMO->isVolatile();
13978 IsNonTemporal |= MMO->isNonTemporal();
13979 IsDereferenceable &= MMO->isDereferenceable();
13980 IsInvariant &= MMO->isInvariant();
13981 }
13982 MemSDNodeBits.IsVolatile = IsVolatile;
13983 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13984 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13985 MemSDNodeBits.IsInvariant = IsInvariant;
13986
13987 // For the single-MMO case, we check here that the size of the memory operand
13988 // fits within the size of the MMO. This is because the MMO might indicate
13989 // only a possible address range instead of specifying the affected memory
13990 // addresses precisely.
13993 getMemOperand()->getSize().getValue())) &&
13994 "Size mismatch!");
13995}
13996
13997/// Profile - Gather unique data for the node.
13998///
14000 AddNodeIDNode(ID, this);
14001}
14002
14003namespace {
14004
14005 struct EVTArray {
14006 std::vector<EVT> VTs;
14007
14008 EVTArray() {
14009 VTs.reserve(MVT::VALUETYPE_SIZE);
14010 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
14011 VTs.push_back(MVT((MVT::SimpleValueType)i));
14012 }
14013 };
14014
14015} // end anonymous namespace
14016
14017/// getValueTypeList - Return a pointer to the specified value type.
14018///
14019const EVT *SDNode::getValueTypeList(MVT VT) {
14020 static EVTArray SimpleVTArray;
14021
14022 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
14023 return &SimpleVTArray.VTs[VT.SimpleTy];
14024}
14025
14026/// hasAnyUseOfValue - Return true if there are any use of the indicated
14027/// value. This method ignores uses of other values defined by this operation.
14028bool SDNode::hasAnyUseOfValue(unsigned Value) const {
14029 assert(Value < getNumValues() && "Bad value!");
14030
14031 for (SDUse &U : uses())
14032 if (U.getResNo() == Value)
14033 return true;
14034
14035 return false;
14036}
14037
14038/// isOnlyUserOf - Return true if this node is the only use of N.
14039bool SDNode::isOnlyUserOf(const SDNode *N) const {
14040 bool Seen = false;
14041 for (const SDNode *User : N->users()) {
14042 if (User == this)
14043 Seen = true;
14044 else
14045 return false;
14046 }
14047
14048 return Seen;
14049}
14050
14051/// Return true if the only users of N are contained in Nodes.
14053 bool Seen = false;
14054 for (const SDNode *User : N->users()) {
14055 if (llvm::is_contained(Nodes, User))
14056 Seen = true;
14057 else
14058 return false;
14059 }
14060
14061 return Seen;
14062}
14063
14064/// Return true if the referenced return value is an operand of N.
14065bool SDValue::isOperandOf(const SDNode *N) const {
14066 return is_contained(N->op_values(), *this);
14067}
14068
14069bool SDNode::isOperandOf(const SDNode *N) const {
14070 return any_of(N->op_values(),
14071 [this](SDValue Op) { return this == Op.getNode(); });
14072}
14073
14074/// reachesChainWithoutSideEffects - Return true if this operand (which must
14075/// be a chain) reaches the specified operand without crossing any
14076/// side-effecting instructions on any chain path. In practice, this looks
14077/// through token factors and non-volatile loads. In order to remain efficient,
14078/// this only looks a couple of nodes in, it does not do an exhaustive search.
14079///
14080/// Note that we only need to examine chains when we're searching for
14081/// side-effects; SelectionDAG requires that all side-effects are represented
14082/// by chains, even if another operand would force a specific ordering. This
14083/// constraint is necessary to allow transformations like splitting loads.
14085 unsigned Depth) const {
14086 if (*this == Dest) return true;
14087
14088 // Don't search too deeply, we just want to be able to see through
14089 // TokenFactor's etc.
14090 if (Depth == 0) return false;
14091
14092 // If this is a token factor, all inputs to the TF happen in parallel.
14093 if (getOpcode() == ISD::TokenFactor) {
14094 // First, try a shallow search.
14095 if (is_contained((*this)->ops(), Dest)) {
14096 // We found the chain we want as an operand of this TokenFactor.
14097 // Essentially, we reach the chain without side-effects if we could
14098 // serialize the TokenFactor into a simple chain of operations with
14099 // Dest as the last operation. This is automatically true if the
14100 // chain has one use: there are no other ordering constraints.
14101 // If the chain has more than one use, we give up: some other
14102 // use of Dest might force a side-effect between Dest and the current
14103 // node.
14104 if (Dest.hasOneUse())
14105 return true;
14106 }
14107 // Next, try a deep search: check whether every operand of the TokenFactor
14108 // reaches Dest.
14109 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14110 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14111 });
14112 }
14113
14114 // Loads don't have side effects, look through them.
14115 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14116 if (Ld->isUnordered())
14117 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14118 }
14119 return false;
14120}
14121
14122bool SDNode::hasPredecessor(const SDNode *N) const {
14125 Worklist.push_back(this);
14126 return hasPredecessorHelper(N, Visited, Worklist);
14127}
14128
14130 this->Flags &= Flags;
14131}
14132
14133SDValue
14135 ArrayRef<ISD::NodeType> CandidateBinOps,
14136 bool AllowPartials) {
14137 // The pattern must end in an extract from index 0.
14138 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14139 !isNullConstant(Extract->getOperand(1)))
14140 return SDValue();
14141
14142 // Match against one of the candidate binary ops.
14143 SDValue Op = Extract->getOperand(0);
14144 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14145 return Op.getOpcode() == unsigned(BinOp);
14146 }))
14147 return SDValue();
14148
14149 // Floating-point reductions may require relaxed constraints on the final step
14150 // of the reduction because they may reorder intermediate operations.
14151 unsigned CandidateBinOp = Op.getOpcode();
14152 if (Op.getValueType().isFloatingPoint()) {
14153 SDNodeFlags Flags = Op->getFlags();
14154 switch (CandidateBinOp) {
14155 case ISD::FADD:
14156 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14157 return SDValue();
14158 break;
14159 default:
14160 llvm_unreachable("Unhandled FP opcode for binop reduction");
14161 }
14162 }
14163
14164 // Matching failed - attempt to see if we did enough stages that a partial
14165 // reduction from a subvector is possible.
14166 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14167 if (!AllowPartials || !Op)
14168 return SDValue();
14169 EVT OpVT = Op.getValueType();
14170 EVT OpSVT = OpVT.getScalarType();
14171 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14172 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
14173 return SDValue();
14174 BinOp = (ISD::NodeType)CandidateBinOp;
14175 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14176 };
14177
14178 // At each stage, we're looking for something that looks like:
14179 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14180 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14181 // i32 undef, i32 undef, i32 undef, i32 undef>
14182 // %a = binop <8 x i32> %op, %s
14183 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14184 // we expect something like:
14185 // <4,5,6,7,u,u,u,u>
14186 // <2,3,u,u,u,u,u,u>
14187 // <1,u,u,u,u,u,u,u>
14188 // While a partial reduction match would be:
14189 // <2,3,u,u,u,u,u,u>
14190 // <1,u,u,u,u,u,u,u>
14191 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14192 SDValue PrevOp;
14193 for (unsigned i = 0; i < Stages; ++i) {
14194 unsigned MaskEnd = (1 << i);
14195
14196 if (Op.getOpcode() != CandidateBinOp)
14197 return PartialReduction(PrevOp, MaskEnd);
14198
14199 SDValue Op0 = Op.getOperand(0);
14200 SDValue Op1 = Op.getOperand(1);
14201
14203 if (Shuffle) {
14204 Op = Op1;
14205 } else {
14206 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14207 Op = Op0;
14208 }
14209
14210 // The first operand of the shuffle should be the same as the other operand
14211 // of the binop.
14212 if (!Shuffle || Shuffle->getOperand(0) != Op)
14213 return PartialReduction(PrevOp, MaskEnd);
14214
14215 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14216 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14217 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14218 return PartialReduction(PrevOp, MaskEnd);
14219
14220 PrevOp = Op;
14221 }
14222
14223 // Handle subvector reductions, which tend to appear after the shuffle
14224 // reduction stages.
14225 while (Op.getOpcode() == CandidateBinOp) {
14226 unsigned NumElts = Op.getValueType().getVectorNumElements();
14227 SDValue Op0 = Op.getOperand(0);
14228 SDValue Op1 = Op.getOperand(1);
14229 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14231 Op0.getOperand(0) != Op1.getOperand(0))
14232 break;
14233 SDValue Src = Op0.getOperand(0);
14234 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14235 if (NumSrcElts != (2 * NumElts))
14236 break;
14237 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14238 Op1.getConstantOperandAPInt(1) == NumElts) &&
14239 !(Op1.getConstantOperandAPInt(1) == 0 &&
14240 Op0.getConstantOperandAPInt(1) == NumElts))
14241 break;
14242 Op = Src;
14243 }
14244
14245 BinOp = (ISD::NodeType)CandidateBinOp;
14246 return Op;
14247}
14248
14250 EVT VT = N->getValueType(0);
14251 EVT EltVT = VT.getVectorElementType();
14252 unsigned NE = VT.getVectorNumElements();
14253
14254 SDLoc dl(N);
14255
14256 // If ResNE is 0, fully unroll the vector op.
14257 if (ResNE == 0)
14258 ResNE = NE;
14259 else if (NE > ResNE)
14260 NE = ResNE;
14261
14262 if (N->getNumValues() == 2) {
14263 SmallVector<SDValue, 8> Scalars0, Scalars1;
14264 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14265 EVT VT1 = N->getValueType(1);
14266 EVT EltVT1 = VT1.getVectorElementType();
14267
14268 unsigned i;
14269 for (i = 0; i != NE; ++i) {
14270 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14271 SDValue Operand = N->getOperand(j);
14272 EVT OperandVT = Operand.getValueType();
14273
14274 // A vector operand; extract a single element.
14275 EVT OperandEltVT = OperandVT.getVectorElementType();
14276 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14277 }
14278
14279 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14280 Scalars0.push_back(EltOp);
14281 Scalars1.push_back(EltOp.getValue(1));
14282 }
14283
14284 for (; i < ResNE; ++i) {
14285 Scalars0.push_back(getUNDEF(EltVT));
14286 Scalars1.push_back(getUNDEF(EltVT1));
14287 }
14288
14289 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14290 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
14291 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
14292 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
14293 return getMergeValues({Vec0, Vec1}, dl);
14294 }
14295
14296 assert(N->getNumValues() == 1 &&
14297 "Can't unroll a vector with multiple results!");
14298
14300 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14301
14302 unsigned i;
14303 for (i= 0; i != NE; ++i) {
14304 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14305 SDValue Operand = N->getOperand(j);
14306 EVT OperandVT = Operand.getValueType();
14307 if (OperandVT.isVector()) {
14308 // A vector operand; extract a single element.
14309 EVT OperandEltVT = OperandVT.getVectorElementType();
14310 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14311 } else {
14312 // A scalar operand; just use it as is.
14313 Operands[j] = Operand;
14314 }
14315 }
14316
14317 switch (N->getOpcode()) {
14318 default: {
14319 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14320 N->getFlags()));
14321 break;
14322 }
14323 case ISD::VSELECT:
14324 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
14325 break;
14326 case ISD::SHL:
14327 case ISD::SRA:
14328 case ISD::SRL:
14329 case ISD::ROTL:
14330 case ISD::ROTR:
14331 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14332 getShiftAmountOperand(Operands[0].getValueType(),
14333 Operands[1])));
14334 break;
14336 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14337 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14338 Operands[0],
14339 getValueType(ExtVT)));
14340 break;
14341 }
14342 case ISD::ADDRSPACECAST: {
14343 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14344 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
14345 ASC->getSrcAddressSpace(),
14346 ASC->getDestAddressSpace()));
14347 break;
14348 }
14349 }
14350 }
14351
14352 for (; i < ResNE; ++i)
14353 Scalars.push_back(getUNDEF(EltVT));
14354
14355 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14356 return getBuildVector(VecVT, dl, Scalars);
14357}
14358
14359std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14360 SDNode *N, unsigned ResNE) {
14361 unsigned Opcode = N->getOpcode();
14362 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14363 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14364 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14365 "Expected an overflow opcode");
14366
14367 EVT ResVT = N->getValueType(0);
14368 EVT OvVT = N->getValueType(1);
14369 EVT ResEltVT = ResVT.getVectorElementType();
14370 EVT OvEltVT = OvVT.getVectorElementType();
14371 SDLoc dl(N);
14372
14373 // If ResNE is 0, fully unroll the vector op.
14374 unsigned NE = ResVT.getVectorNumElements();
14375 if (ResNE == 0)
14376 ResNE = NE;
14377 else if (NE > ResNE)
14378 NE = ResNE;
14379
14380 SmallVector<SDValue, 8> LHSScalars;
14381 SmallVector<SDValue, 8> RHSScalars;
14382 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14383 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14384
14385 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14386 SDVTList VTs = getVTList(ResEltVT, SVT);
14387 SmallVector<SDValue, 8> ResScalars;
14388 SmallVector<SDValue, 8> OvScalars;
14389 for (unsigned i = 0; i < NE; ++i) {
14390 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14391 SDValue Ov =
14392 getSelect(dl, OvEltVT, Res.getValue(1),
14393 getBoolConstant(true, dl, OvEltVT, ResVT),
14394 getConstant(0, dl, OvEltVT));
14395
14396 ResScalars.push_back(Res);
14397 OvScalars.push_back(Ov);
14398 }
14399
14400 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14401 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14402
14403 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14404 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14405 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14406 getBuildVector(NewOvVT, dl, OvScalars));
14407}
14408
14411 unsigned Bytes,
14412 int Dist) const {
14413 if (LD->isVolatile() || Base->isVolatile())
14414 return false;
14415 // TODO: probably too restrictive for atomics, revisit
14416 if (!LD->isSimple())
14417 return false;
14418 if (LD->isIndexed() || Base->isIndexed())
14419 return false;
14420 if (LD->getChain() != Base->getChain())
14421 return false;
14422 EVT VT = LD->getMemoryVT();
14423 if (VT.getSizeInBits() / 8 != Bytes)
14424 return false;
14425
14426 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
14427 auto LocDecomp = BaseIndexOffset::match(LD, *this);
14428
14429 int64_t Offset = 0;
14430 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
14431 return (Dist * (int64_t)Bytes == Offset);
14432 return false;
14433}
14434
14435/// InferPtrAlignment - Infer alignment of a load / store address. Return
14436/// std::nullopt if it cannot be inferred.
14438 // If this is a GlobalAddress + cst, return the alignment.
14439 const GlobalValue *GV = nullptr;
14440 int64_t GVOffset = 0;
14441 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14442 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14443 KnownBits Known(PtrWidth);
14445 unsigned AlignBits = Known.countMinTrailingZeros();
14446 if (AlignBits)
14447 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14448 }
14449
14450 // If this is a direct reference to a stack slot, use information about the
14451 // stack slot's alignment.
14452 int FrameIdx = INT_MIN;
14453 int64_t FrameOffset = 0;
14455 FrameIdx = FI->getIndex();
14456 } else if (isBaseWithConstantOffset(Ptr) &&
14458 // Handle FI+Cst
14459 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14460 FrameOffset = Ptr.getConstantOperandVal(1);
14461 }
14462
14463 if (FrameIdx != INT_MIN) {
14465 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14466 }
14467
14468 return std::nullopt;
14469}
14470
14471/// Split the scalar node with EXTRACT_ELEMENT using the provided
14472/// VTs and return the low/high part.
14473std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14474 const SDLoc &DL,
14475 const EVT &LoVT,
14476 const EVT &HiVT) {
14477 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14478 "Split node must be a scalar type");
14479 SDValue Lo =
14481 SDValue Hi =
14483 return std::make_pair(Lo, Hi);
14484}
14485
14486/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14487/// which is split (or expanded) into two not necessarily identical pieces.
14488std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14489 // Currently all types are split in half.
14490 EVT LoVT, HiVT;
14491 if (!VT.isVector())
14492 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14493 else
14494 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14495
14496 return std::make_pair(LoVT, HiVT);
14497}
14498
14499/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14500/// type, dependent on an enveloping VT that has been split into two identical
14501/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14502std::pair<EVT, EVT>
14504 bool *HiIsEmpty) const {
14505 EVT EltTp = VT.getVectorElementType();
14506 // Examples:
14507 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14508 // custom VL=9 with enveloping VL=8/8 yields 8/1
14509 // custom VL=10 with enveloping VL=8/8 yields 8/2
14510 // etc.
14511 ElementCount VTNumElts = VT.getVectorElementCount();
14512 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14513 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14514 "Mixing fixed width and scalable vectors when enveloping a type");
14515 EVT LoVT, HiVT;
14516 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14517 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14518 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14519 *HiIsEmpty = false;
14520 } else {
14521 // Flag that hi type has zero storage size, but return split envelop type
14522 // (this would be easier if vector types with zero elements were allowed).
14523 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14524 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14525 *HiIsEmpty = true;
14526 }
14527 return std::make_pair(LoVT, HiVT);
14528}
14529
14530/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14531/// low/high part.
14532std::pair<SDValue, SDValue>
14533SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14534 const EVT &HiVT) {
14535 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14536 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14537 "Splitting vector with an invalid mixture of fixed and scalable "
14538 "vector types");
14540 N.getValueType().getVectorMinNumElements() &&
14541 "More vector elements requested than available!");
14542 SDValue Lo, Hi;
14543 Lo = getExtractSubvector(DL, LoVT, N, 0);
14544 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14545 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14546 // IDX with the runtime scaling factor of the result vector type. For
14547 // fixed-width result vectors, that runtime scaling factor is 1.
14549 return std::make_pair(Lo, Hi);
14550}
14551
14552std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14553 const SDLoc &DL) {
14554 // Split the vector length parameter.
14555 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14556 EVT VT = N.getValueType();
14558 "Expecting the mask to be an evenly-sized vector");
14559 SDValue HalfNumElts = getElementCount(
14561 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14562 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14563 return std::make_pair(Lo, Hi);
14564}
14565
14566/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14568 EVT VT = N.getValueType();
14571 return getInsertSubvector(DL, getPOISON(WideVT), N, 0);
14572}
14573
14576 unsigned Start, unsigned Count,
14577 EVT EltVT) {
14578 EVT VT = Op.getValueType();
14579 if (Count == 0)
14581 if (EltVT == EVT())
14582 EltVT = VT.getVectorElementType();
14583 SDLoc SL(Op);
14584 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14585 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14586 }
14587}
14588
14589// getAddressSpace - Return the address space this GlobalAddress belongs to.
14591 return getGlobal()->getType()->getAddressSpace();
14592}
14593
14596 return Val.MachineCPVal->getType();
14597 return Val.ConstVal->getType();
14598}
14599
14600bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14601 unsigned &SplatBitSize,
14602 bool &HasAnyUndefs,
14603 unsigned MinSplatBits,
14604 bool IsBigEndian) const {
14605 EVT VT = getValueType(0);
14606 assert(VT.isVector() && "Expected a vector type");
14607 unsigned VecWidth = VT.getSizeInBits();
14608 if (MinSplatBits > VecWidth)
14609 return false;
14610
14611 // FIXME: The widths are based on this node's type, but build vectors can
14612 // truncate their operands.
14613 SplatValue = APInt(VecWidth, 0);
14614 SplatUndef = APInt(VecWidth, 0);
14615
14616 // Get the bits. Bits with undefined values (when the corresponding element
14617 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14618 // in SplatValue. If any of the values are not constant, give up and return
14619 // false.
14620 unsigned int NumOps = getNumOperands();
14621 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14622 unsigned EltWidth = VT.getScalarSizeInBits();
14623
14624 for (unsigned j = 0; j < NumOps; ++j) {
14625 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14626 SDValue OpVal = getOperand(i);
14627 unsigned BitPos = j * EltWidth;
14628
14629 if (OpVal.isUndef())
14630 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14631 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14632 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14633 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14634 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14635 else
14636 return false;
14637 }
14638
14639 // The build_vector is all constants or undefs. Find the smallest element
14640 // size that splats the vector.
14641 HasAnyUndefs = (SplatUndef != 0);
14642
14643 // FIXME: This does not work for vectors with elements less than 8 bits.
14644 while (VecWidth > 8) {
14645 // If we can't split in half, stop here.
14646 if (VecWidth & 1)
14647 break;
14648
14649 unsigned HalfSize = VecWidth / 2;
14650 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14651 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14652 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14653 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14654
14655 // If the two halves do not match (ignoring undef bits), stop here.
14656 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14657 MinSplatBits > HalfSize)
14658 break;
14659
14660 SplatValue = HighValue | LowValue;
14661 SplatUndef = HighUndef & LowUndef;
14662
14663 VecWidth = HalfSize;
14664 }
14665
14666 // FIXME: The loop above only tries to split in halves. But if the input
14667 // vector for example is <3 x i16> it wouldn't be able to detect a
14668 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14669 // optimizations. I guess that back in the days when this helper was created
14670 // vectors normally was power-of-2 sized.
14671
14672 SplatBitSize = VecWidth;
14673 return true;
14674}
14675
14677 BitVector *UndefElements) const {
14678 unsigned NumOps = getNumOperands();
14679 if (UndefElements) {
14680 UndefElements->clear();
14681 UndefElements->resize(NumOps);
14682 }
14683 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14684 if (!DemandedElts)
14685 return SDValue();
14686 SDValue Splatted;
14687 for (unsigned i = 0; i != NumOps; ++i) {
14688 if (!DemandedElts[i])
14689 continue;
14690 SDValue Op = getOperand(i);
14691 if (Op.isUndef()) {
14692 if (UndefElements)
14693 (*UndefElements)[i] = true;
14694 } else if (!Splatted) {
14695 Splatted = Op;
14696 } else if (Splatted != Op) {
14697 return SDValue();
14698 }
14699 }
14700
14701 if (!Splatted) {
14702 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14703 assert(getOperand(FirstDemandedIdx).isUndef() &&
14704 "Can only have a splat without a constant for all undefs.");
14705 return getOperand(FirstDemandedIdx);
14706 }
14707
14708 return Splatted;
14709}
14710
14712 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14713 return getSplatValue(DemandedElts, UndefElements);
14714}
14715
14717 SmallVectorImpl<SDValue> &Sequence,
14718 BitVector *UndefElements) const {
14719 unsigned NumOps = getNumOperands();
14720 Sequence.clear();
14721 if (UndefElements) {
14722 UndefElements->clear();
14723 UndefElements->resize(NumOps);
14724 }
14725 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14726 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14727 return false;
14728
14729 // Set the undefs even if we don't find a sequence (like getSplatValue).
14730 if (UndefElements)
14731 for (unsigned I = 0; I != NumOps; ++I)
14732 if (DemandedElts[I] && getOperand(I).isUndef())
14733 (*UndefElements)[I] = true;
14734
14735 // Iteratively widen the sequence length looking for repetitions.
14736 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14737 Sequence.append(SeqLen, SDValue());
14738 for (unsigned I = 0; I != NumOps; ++I) {
14739 if (!DemandedElts[I])
14740 continue;
14741 SDValue &SeqOp = Sequence[I % SeqLen];
14743 if (Op.isUndef()) {
14744 if (!SeqOp)
14745 SeqOp = Op;
14746 continue;
14747 }
14748 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14749 Sequence.clear();
14750 break;
14751 }
14752 SeqOp = Op;
14753 }
14754 if (!Sequence.empty())
14755 return true;
14756 }
14757
14758 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14759 return false;
14760}
14761
14763 BitVector *UndefElements) const {
14764 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14765 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14766}
14767
14770 BitVector *UndefElements) const {
14772 getSplatValue(DemandedElts, UndefElements));
14773}
14774
14777 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14778}
14779
14782 BitVector *UndefElements) const {
14784 getSplatValue(DemandedElts, UndefElements));
14785}
14786
14791
14792int32_t
14794 uint32_t BitWidth) const {
14795 if (ConstantFPSDNode *CN =
14797 bool IsExact;
14798 APSInt IntVal(BitWidth);
14799 const APFloat &APF = CN->getValueAPF();
14800 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14801 APFloat::opOK ||
14802 !IsExact)
14803 return -1;
14804
14805 return IntVal.exactLogBase2();
14806 }
14807 return -1;
14808}
14809
14811 bool IsLittleEndian, unsigned DstEltSizeInBits,
14812 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14813 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14814 if (!isConstant())
14815 return false;
14816
14817 unsigned NumSrcOps = getNumOperands();
14818 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14819 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14820 "Invalid bitcast scale");
14821
14822 // Extract raw src bits.
14823 SmallVector<APInt> SrcBitElements(NumSrcOps,
14824 APInt::getZero(SrcEltSizeInBits));
14825 BitVector SrcUndeElements(NumSrcOps, false);
14826
14827 for (unsigned I = 0; I != NumSrcOps; ++I) {
14829 if (Op.isUndef()) {
14830 SrcUndeElements.set(I);
14831 continue;
14832 }
14833 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14834 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14835 assert((CInt || CFP) && "Unknown constant");
14836 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14837 : CFP->getValueAPF().bitcastToAPInt();
14838 }
14839
14840 // Recast to dst width.
14841 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14842 SrcBitElements, UndefElements, SrcUndeElements);
14843 return true;
14844}
14845
14846void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14847 unsigned DstEltSizeInBits,
14848 SmallVectorImpl<APInt> &DstBitElements,
14849 ArrayRef<APInt> SrcBitElements,
14850 BitVector &DstUndefElements,
14851 const BitVector &SrcUndefElements) {
14852 unsigned NumSrcOps = SrcBitElements.size();
14853 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14854 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14855 "Invalid bitcast scale");
14856 assert(NumSrcOps == SrcUndefElements.size() &&
14857 "Vector size mismatch");
14858
14859 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14860 DstUndefElements.clear();
14861 DstUndefElements.resize(NumDstOps, false);
14862 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14863
14864 // Concatenate src elements constant bits together into dst element.
14865 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14866 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14867 for (unsigned I = 0; I != NumDstOps; ++I) {
14868 DstUndefElements.set(I);
14869 APInt &DstBits = DstBitElements[I];
14870 for (unsigned J = 0; J != Scale; ++J) {
14871 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14872 if (SrcUndefElements[Idx])
14873 continue;
14874 DstUndefElements.reset(I);
14875 const APInt &SrcBits = SrcBitElements[Idx];
14876 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14877 "Illegal constant bitwidths");
14878 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14879 }
14880 }
14881 return;
14882 }
14883
14884 // Split src element constant bits into dst elements.
14885 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14886 for (unsigned I = 0; I != NumSrcOps; ++I) {
14887 if (SrcUndefElements[I]) {
14888 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14889 continue;
14890 }
14891 const APInt &SrcBits = SrcBitElements[I];
14892 for (unsigned J = 0; J != Scale; ++J) {
14893 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14894 APInt &DstBits = DstBitElements[Idx];
14895 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14896 }
14897 }
14898}
14899
14901 for (const SDValue &Op : op_values()) {
14902 unsigned Opc = Op.getOpcode();
14903 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14904 return false;
14905 }
14906 return true;
14907}
14908
14909std::optional<std::pair<APInt, APInt>>
14911 unsigned NumOps = getNumOperands();
14912 if (NumOps < 2)
14913 return std::nullopt;
14914
14915 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14916 APInt Start, Stride;
14917 int FirstIdx = -1, SecondIdx = -1;
14918
14919 // Find the first two non-undef constant elements to determine Start and
14920 // Stride, then verify all remaining elements match the sequence.
14921 for (unsigned I = 0; I < NumOps; ++I) {
14923 if (Op->isUndef())
14924 continue;
14925 if (!isa<ConstantSDNode>(Op))
14926 return std::nullopt;
14927
14928 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14929 if (FirstIdx < 0) {
14930 FirstIdx = I;
14931 Start = Val;
14932 } else if (SecondIdx < 0) {
14933 SecondIdx = I;
14934 // Compute stride using modular arithmetic. Simple division would handle
14935 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14936 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14937 // Note that modular arithmetic is agnostic to signed/unsigned.
14938 unsigned IdxDiff = I - FirstIdx;
14939 APInt ValDiff = Val - Start;
14940
14941 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14942 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14943 if (ValDiff.countr_zero() < CommonPow2Bits)
14944 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14945 IdxDiff >>= CommonPow2Bits;
14946 ValDiff.lshrInPlace(CommonPow2Bits);
14947
14948 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14949 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14950 // one, but we could try all candidates to handle more cases.
14951 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14952 if (Stride.isZero())
14953 return std::nullopt;
14954
14955 // Step 3: Adjust Start based on the first defined element's index.
14956 Start -= Stride * FirstIdx;
14957 } else {
14958 // Verify this element matches the sequence.
14959 if (Val != Start + Stride * I)
14960 return std::nullopt;
14961 }
14962 }
14963
14964 // Need at least two defined elements.
14965 if (SecondIdx < 0)
14966 return std::nullopt;
14967
14968 return std::make_pair(Start, Stride);
14969}
14970
14972 // Find the first non-undef value in the shuffle mask.
14973 unsigned i, e;
14974 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14975 /* search */;
14976
14977 // If all elements are undefined, this shuffle can be considered a splat
14978 // (although it should eventually get simplified away completely).
14979 if (i == e)
14980 return true;
14981
14982 // Make sure all remaining elements are either undef or the same as the first
14983 // non-undef value.
14984 for (int Idx = Mask[i]; i != e; ++i)
14985 if (Mask[i] >= 0 && Mask[i] != Idx)
14986 return false;
14987 return true;
14988}
14989
14990// Returns true if it is a constant integer BuildVector or constant integer,
14991// possibly hidden by a bitcast.
14993 SDValue N, bool AllowOpaques) const {
14995
14996 if (auto *C = dyn_cast<ConstantSDNode>(N))
14997 return AllowOpaques || !C->isOpaque();
14998
15000 return true;
15001
15002 // Treat a GlobalAddress supporting constant offset folding as a
15003 // constant integer.
15004 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
15005 if (GA->getOpcode() == ISD::GlobalAddress &&
15006 TLI->isOffsetFoldingLegal(GA))
15007 return true;
15008
15009 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15010 isa<ConstantSDNode>(N.getOperand(0)))
15011 return true;
15012 return false;
15013}
15014
15015// Returns true if it is a constant float BuildVector or constant float.
15018 return true;
15019
15021 return true;
15022
15023 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
15024 isa<ConstantFPSDNode>(N.getOperand(0)))
15025 return true;
15026
15027 return false;
15028}
15029
15030std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
15031 ConstantSDNode *Const =
15032 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
15033 if (!Const)
15034 return std::nullopt;
15035
15036 EVT VT = N->getValueType(0);
15037 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
15038 switch (TLI->getBooleanContents(N.getValueType())) {
15040 if (CVal.isOne())
15041 return true;
15042 if (CVal.isZero())
15043 return false;
15044 return std::nullopt;
15046 if (CVal.isAllOnes())
15047 return true;
15048 if (CVal.isZero())
15049 return false;
15050 return std::nullopt;
15052 return CVal[0];
15053 }
15054 llvm_unreachable("Unknown BooleanContent enum");
15055}
15056
15057void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
15058 assert(!Node->OperandList && "Node already has operands");
15060 "too many operands to fit into SDNode");
15061 SDUse *Ops = OperandRecycler.allocate(
15062 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
15063
15064 bool IsDivergent = false;
15065 for (unsigned I = 0; I != Vals.size(); ++I) {
15066 Ops[I].setUser(Node);
15067 Ops[I].setInitial(Vals[I]);
15068 EVT VT = Ops[I].getValueType();
15069
15070 // Skip Chain. It does not carry divergence.
15071 if (VT != MVT::Other &&
15072 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
15073 Ops[I].getNode()->isDivergent()) {
15074 IsDivergent = true;
15075 }
15076 }
15077 Node->NumOperands = Vals.size();
15078 Node->OperandList = Ops;
15079 if (!TLI->isSDNodeAlwaysUniform(Node)) {
15080 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15081 Node->SDNodeBits.IsDivergent = IsDivergent;
15082 }
15083 checkForCycles(Node);
15084}
15085
15088 size_t Limit = SDNode::getMaxNumOperands();
15089 while (Vals.size() > Limit) {
15090 unsigned SliceIdx = Vals.size() - Limit;
15091 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15092 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15093 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15094 Vals.emplace_back(NewTF);
15095 }
15096 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15097}
15098
15100 EVT VT, SDNodeFlags Flags) {
15101 switch (Opcode) {
15102 default:
15103 return SDValue();
15104 case ISD::ADD:
15105 case ISD::OR:
15106 case ISD::XOR:
15107 case ISD::UMAX:
15108 case ISD::MUL:
15109 case ISD::AND:
15110 case ISD::UMIN:
15111 case ISD::SMAX:
15112 case ISD::SMIN:
15114 VT);
15115 case ISD::FADD:
15116 // If flags allow, prefer positive zero since it's generally cheaper
15117 // to materialize on most targets.
15118 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15119 case ISD::FMUL:
15120 return getConstantFP(1.0, DL, VT);
15121 case ISD::FMINNUM:
15122 case ISD::FMAXNUM: {
15123 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
15124 const fltSemantics &Semantics = VT.getFltSemantics();
15125 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15126 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15127 APFloat::getLargest(Semantics);
15128 if (Opcode == ISD::FMAXNUM)
15129 NeutralAF.changeSign();
15130
15131 return getConstantFP(NeutralAF, DL, VT);
15132 }
15133 case ISD::FMINIMUM:
15134 case ISD::FMAXIMUM: {
15135 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15136 const fltSemantics &Semantics = VT.getFltSemantics();
15137 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15138 : APFloat::getLargest(Semantics);
15139 if (Opcode == ISD::FMAXIMUM)
15140 NeutralAF.changeSign();
15141
15142 return getConstantFP(NeutralAF, DL, VT);
15143 }
15144
15145 }
15146}
15147
15149 SDValue Acc, SDValue LHS,
15150 SDValue RHS) {
15151 EVT AccVT = Acc.getValueType();
15152 if (AccVT.isFloatingPoint()) {
15153 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15154 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15155 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15156 }
15158 "Unexpected opcode");
15159 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15160 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15161 return getNegative(MLA, DL, AccVT);
15162}
15163
15164/// Helper used to make a call to a library function that has one argument of
15165/// pointer type.
15166///
15167/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15168/// used to get or set floating-point state. They have one argument of pointer
15169/// type, which points to the memory region containing bits of the
15170/// floating-point state. The value returned by such function is ignored in the
15171/// created call.
15172///
15173/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15174/// \param Ptr Pointer used to save/load state.
15175/// \param InChain Ingoing token chain.
15176/// \returns Outgoing chain token.
15178 SDValue InChain,
15179 const SDLoc &DLoc) {
15180 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15182 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15183 RTLIB::LibcallImpl LibcallImpl =
15184 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15185 if (LibcallImpl == RTLIB::Unsupported)
15186 reportFatalUsageError("emitting call to unsupported libcall");
15187
15188 SDValue Callee =
15189 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15191 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15192 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15193 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15194 return TLI->LowerCallTo(CLI).second;
15195}
15196
15198 assert(From && To && "Invalid SDNode; empty source SDValue?");
15199 auto I = SDEI.find(From);
15200 if (I == SDEI.end())
15201 return;
15202
15203 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15204 // the iterator, hence the need to make a copy to prevent a use-after-free.
15205 NodeExtraInfo NEI = I->second;
15206 if (LLVM_LIKELY(!NEI.PCSections)) {
15207 // No deep copy required for the types of extra info set.
15208 //
15209 // FIXME: Investigate if other types of extra info also need deep copy. This
15210 // depends on the types of nodes they can be attached to: if some extra info
15211 // is only ever attached to nodes where a replacement To node is always the
15212 // node where later use and propagation of the extra info has the intended
15213 // semantics, no deep copy is required.
15214 SDEI[To] = std::move(NEI);
15215 return;
15216 }
15217
15218 const SDNode *EntrySDN = getEntryNode().getNode();
15219
15220 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15221 // through the replacement of From with To. Otherwise, replacements of a node
15222 // (From) with more complex nodes (To and its operands) may result in lost
15223 // extra info where the root node (To) is insignificant in further propagating
15224 // and using extra info when further lowering to MIR.
15225 //
15226 // In the first step pre-populate the visited set with the nodes reachable
15227 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15228 // DAG that is not new and should be left untouched.
15229 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15230 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15231 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15232 if (MaxDepth == 0) {
15233 // Remember this node in case we need to increase MaxDepth and continue
15234 // populating FromReach from this node.
15235 Leafs.emplace_back(N);
15236 return;
15237 }
15238 if (!FromReach.insert(N).second)
15239 return;
15240 for (const SDValue &Op : N->op_values())
15241 Self(Self, Op.getNode(), MaxDepth - 1);
15242 };
15243
15244 // Copy extra info to To and all its transitive operands (that are new).
15246 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15247 if (FromReach.contains(N))
15248 return true;
15249 if (!Visited.insert(N).second)
15250 return true;
15251 if (EntrySDN == N)
15252 return false;
15253 for (const SDValue &Op : N->op_values()) {
15254 if (N == To && Op.getNode() == EntrySDN) {
15255 // Special case: New node's operand is the entry node; just need to
15256 // copy extra info to new node.
15257 break;
15258 }
15259 if (!Self(Self, Op.getNode()))
15260 return false;
15261 }
15262 // Copy only if entry node was not reached.
15263 SDEI[N] = std::move(NEI);
15264 return true;
15265 };
15266
15267 // We first try with a lower MaxDepth, assuming that the path to common
15268 // operands between From and To is relatively short. This significantly
15269 // improves performance in the common case. The initial MaxDepth is big
15270 // enough to avoid retry in the common case; the last MaxDepth is large
15271 // enough to avoid having to use the fallback below (and protects from
15272 // potential stack exhaustion from recursion).
15273 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15274 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15275 // StartFrom is the previous (or initial) set of leafs reachable at the
15276 // previous maximum depth.
15278 std::swap(StartFrom, Leafs);
15279 for (const SDNode *N : StartFrom)
15280 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15281 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15282 return;
15283 // This should happen very rarely (reached the entry node).
15284 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15285 assert(!Leafs.empty());
15286 }
15287
15288 // This should not happen - but if it did, that means the subgraph reachable
15289 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15290 // could not visit all reachable common operands. Consequently, we were able
15291 // to reach the entry node.
15292 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15293 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15294 // Best-effort fallback if assertions disabled.
15295 SDEI[To] = std::move(NEI);
15296}
15297
15298#ifndef NDEBUG
15299static void checkForCyclesHelper(const SDNode *N,
15302 const llvm::SelectionDAG *DAG) {
15303 // If this node has already been checked, don't check it again.
15304 if (Checked.count(N))
15305 return;
15306
15307 // If a node has already been visited on this depth-first walk, reject it as
15308 // a cycle.
15309 if (!Visited.insert(N).second) {
15310 errs() << "Detected cycle in SelectionDAG\n";
15311 dbgs() << "Offending node:\n";
15312 N->dumprFull(DAG); dbgs() << "\n";
15313 abort();
15314 }
15315
15316 for (const SDValue &Op : N->op_values())
15317 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15318
15319 Checked.insert(N);
15320 Visited.erase(N);
15321}
15322#endif
15323
15325 const llvm::SelectionDAG *DAG,
15326 bool force) {
15327#ifndef NDEBUG
15328 bool check = force;
15329#ifdef EXPENSIVE_CHECKS
15330 check = true;
15331#endif // EXPENSIVE_CHECKS
15332 if (check) {
15333 assert(N && "Checking nonexistent SDNode");
15336 checkForCyclesHelper(N, visited, checked, DAG);
15337 }
15338#endif // !NDEBUG
15339}
15340
15341void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15342 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15343}
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
constexpr LLT S1
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition Compiler.h:603
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:337
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static MaybeAlign getAlign(Value *Ptr)
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static constexpr Value * getValue(Ty &ValueOrUse)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
static bool isConstantSplatVector(SDValue N, APInt &SplatValue, unsigned MinSizeInBits)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
const char * Msg
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF, SelectionDAG &DAG)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static APInt getIntegerIdentity(unsigned Opcode, unsigned BitWidth)
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:297
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:335
static constexpr roundingMode rmTowardZero
Definition APFloat.h:349
static const fltSemantics & BFloat()
Definition APFloat.h:296
static const fltSemantics & IEEEquad()
Definition APFloat.h:299
static const fltSemantics & IEEEdouble()
Definition APFloat.h:298
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:348
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:345
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:347
static const fltSemantics & IEEEhalf()
Definition APFloat.h:295
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:361
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1206
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1294
void copySign(const APFloat &RHS)
Definition APFloat.h:1388
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5920
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1276
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1267
bool isFinite() const
Definition APFloat.h:1570
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1433
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1285
bool isZero() const
Definition APFloat.h:1561
LLVM_READONLY bool isOne() const
Definition APFloat.h:1643
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1224
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1418
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1184
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1312
bool isPosZero() const
Definition APFloat.h:1576
bool isNegZero() const
Definition APFloat.h:1577
void changeSign()
Definition APFloat.h:1383
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1195
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2006
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2090
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1431
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1695
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1076
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1537
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1355
APInt abs() const
Get the absolute value.
Definition APInt.h:1820
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2061
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1191
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1692
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1120
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1670
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1197
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:790
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1175
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1653
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1623
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:652
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2121
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2135
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1084
static bool isSameValue(const APInt &I1, const APInt &I2, bool SignedCompare=false)
Determine if two APInts have the same value, after zero-extending or sign-extending (if SignedCompare...
Definition APInt.h:555
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition APInt.cpp:1184
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:398
unsigned logBase2() const
Definition APInt.h:1786
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2071
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1300
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1771
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1159
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1028
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1392
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:768
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1266
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1442
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:483
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1246
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1230
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2080
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
This is an SDNode representing atomic operations.
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Reset all bits in the bitvector.
Definition BitVector.h:409
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
bool none() const
Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1088
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static LLVM_ABI void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:126
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
const char * getSymbol() const
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:208
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:685
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:328
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
LLVM_ABI void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
LLVM_ABI bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
LLVM_ABI void Profile(FoldingSetNodeID &ID) const
Gather unique data for the node.
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
LLVM_ABI void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
static LLVM_ABI bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
std::optional< APInt > bitcastToAPInt() const
LLVM_ABI bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
LLVM_ABI bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool isUndef() const
Returns true if the node type is UNDEF or POISON.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
LLVM_ABI void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
Represents a use of a SDNode.
SDNode * getUser()
This returns the SDNode that contains this Use.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI std::pair< SDValue, SDValue > getMemccpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI)
Lower a memccpy operation into a target library call and return the resulting chain and call result a...
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI std::optional< bool > isBoolConstant(SDValue N) const
Check if a value \op N is a constant using the target's BooleanContent for its type.
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, MachineModuleInfo &MMI, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue getIdentityElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) identity element for the given opcode, if it exists.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
LLVM_ABI std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
allnodes_const_iterator allnodes_begin() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getPartialReduceMLS(unsigned Opc, const SDLoc &DL, SDValue Acc, SDValue LHS, SDValue RHS)
Get an expression that implements a partial multiply-subtract reduction.
LLVM_ABI SDValue expandVAArg(SDNode *Node)
Expand the specified ISD::VAARG node as the Legalize pass would.
LLVM_ABI SDValue getTokenFactor(const SDLoc &DL, SmallVectorImpl< SDValue > &Vals)
Creates a new TokenFactor containing Vals.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(SDValue Op, bool ForSigned, unsigned Depth=0) const
Combine constant ranges from computeConstantRange() and computeKnownBits().
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getLoadFFVP(EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachineMemOperand *MMO)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
LLVM_ABI std::pair< SDValue, SDValue > getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, const CallInst *CI)
Lower a memcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getIndexedLoadVP(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
LLVM_ABI MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
LLVM_ABI void dump() const
Dump the textual format of this DAG.
LLVM_ABI bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
LLVM_ABI SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
LLVM_ABI SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, Register VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
LLVM_ABI KnownFPClass computeKnownFPClass(SDValue Op, FPClassTest InterestedClasses, unsigned Depth=0) const
Determine floating-point class information about Op.
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask, SDValue EVL, EVT VT)
Create a vector-predicated logical NOT operation as (VP_XOR Val, BooleanOne, Mask,...
LLVM_ABI SDValue getMaskFromElementCount(const SDLoc &DL, EVT VT, ElementCount Len)
Return a vector with the first 'Len' lanes set to true and remaining lanes set to false.
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
iterator_range< allnodes_iterator > allnodes()
LLVM_ABI SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align DstAlign, Align SrcAlign, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
LLVM_ABI OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getTruncStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT SVT, MachineMemOperand *MMO, bool IsCompressing=false)
LLVM_ABI void canonicalizeCommutativeBinop(unsigned Opcode, SDValue &N1, SDValue &N2) const
Swap N1 and N2 if Opcode is a commutative binary opcode and the canonical form expects the opposite o...
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
LLVM_ABI bool isKnownToBeAPowerOfTwoFP(SDValue Val, unsigned Depth=0) const
Test if the given fp value is known to be an integer power-of-2, either positive or negative.
LLVM_ABI OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y, SDNodeFlags Flags)
Try to simplify a floating-point binary operation into 1 of its operands or a constant.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue getDeactivationSymbol(const GlobalValue *GV)
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
LLVM_ABI bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
LLVM_ABI std::pair< EVT, EVT > GetDependentSplitDestVTs(const EVT &VT, const EVT &EnvVT, bool *HiIsEmpty) const
Compute the VTs needed for the low/hi parts of a type, dependent on an enveloping VT that has been sp...
LLVM_ABI SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
LLVM_ABI std::optional< ConstantRange > getValidShiftAmountRange(SDValue V, const APInt &DemandedElts, unsigned Depth) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
LLVM_ABI SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
LLVM_ABI SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
DenormalMode getDenormalMode(EVT VT) const
Return the current function's default denormal handling kind for the given floating point type.
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp, ArrayRef< ISD::NodeType > CandidateBinOps, bool AllowPartials=false)
Match a binop + shuffle pyramid that represents a horizontal reduction over the elements of a vector ...
LLVM_ABI bool isADDLike(SDValue Op, bool NoWrap=false) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
LLVM_ABI SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
LLVM_ABI void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits=0, unsigned SizeInBits=0, bool InvalidateDbg=true)
Transfer debug values from one node to another, while optionally generating fragment expressions for ...
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
ilist< SDNode >::iterator allnodes_iterator
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
int getMaskElt(unsigned Idx) const
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
static LLVM_ABI bool isSplatMask(ArrayRef< int > Mask)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
virtual bool shallExtractConstSplatVectorElementToStore(Type *VectorTy, unsigned ElemSizeInBits, unsigned &Index) const
Return true if the target shall perform extract vector element and store given that the vector is kno...
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
BooleanContent
Enum that describes how the target represents true/false values.
virtual unsigned getMaxGluedStoresPerMemcpy() const
Get maximum # of store operations to be glued together.
std::vector< ArgListEntry > ArgListTy
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
virtual bool isLegalStoreImmediate(int64_t Value) const
Return true if the specified immediate is legal for the value input of a store instruction.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
Primary interface to the complete machine description for the target machine.
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const SelectionDAGTargetInfo * getSelectionDAGInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Definition Triple.h:720
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:288
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:36
LLVM_ABI void set(Value *Val)
Definition Value.h:874
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Value * getOperand(unsigned i) const
Definition User.h:207
This class is used to represent an VP_GATHER node.
This class is used to represent a VP_LOAD node.
This class is used to represent an VP_SCATTER node.
This class is used to represent a VP_STORE node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_LOAD node.
This class is used to represent an EXPERIMENTAL_VP_STRIDED_STORE node.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3232
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3162
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3149
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3139
LLVM_ABI APInt pext(const APInt &Val, const APInt &Mask)
Perform a "compress" operation, also known as pext or bext.
Definition APInt.cpp:3242
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3213
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3154
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
Definition APInt.cpp:3222
LLVM_ABI APInt pdep(const APInt &Val, const APInt &Mask)
Perform an "expand" operation, also known as pdep or bdep.
Definition APInt.cpp:3252
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2299
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3204
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3040
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3237
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2304
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3134
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3144
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:24
LLVM_ABI CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:829
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:513
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:540
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:602
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:524
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:749
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:920
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:530
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:717
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:667
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:883
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:837
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:693
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:802
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:706
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:651
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:616
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:821
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:655
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:909
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:898
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:785
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:502
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:507
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:737
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:683
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:701
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:931
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:955
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:843
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:881
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:885
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isBitwiseLogicOp(unsigned Opcode)
Whether this is bitwise logic opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
LLVM_ABI CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:383
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:578
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
LLVM_ABI ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1570
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
@ Store
The extracted value is stored (ExtractElement only).
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1783
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1552
LLVM_ABI bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition APFloat.h:1695
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1738
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:331
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
LLVM_ABI SDValue peekThroughInsertVectorElt(SDValue V, const APInt &DemandedElts)
Recursively peek through INSERT_VECTOR_ELT nodes, returning the source vector operand of V,...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1769
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
bool includesPoison(UndefPoisonKind Kind)
Returns true if Kind includes the Poison bit.
Definition UndefPoison.h:27
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool includesUndef(UndefPoisonKind Kind)
Returns true if Kind includes the Undef bit.
Definition UndefPoison.h:33
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1719
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
IntPtrTy
Definition InstrProf.h:82
LLVM_ABI bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
constexpr unsigned BitWidth
LLVM_ABI bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:572
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1756
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1796
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:373
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:783
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:543
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:176
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits pdep(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pdep(Val, Mask).
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
static LLVM_ABI KnownBits pext(const KnownBits &Val, const KnownBits &Mask)
Compute known bits for pext(Val, Mask).
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static MemOp Move(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)