LLVM 23.0.0git
SelectionDAG.cpp
Go to the documentation of this file.
1//===- SelectionDAG.cpp - Implement the SelectionDAG data structures ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the SelectionDAG class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "SDNodeDbgValue.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/APSInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseSet.h"
21#include "llvm/ADT/FoldingSet.h"
22#include "llvm/ADT/STLExtras.h"
25#include "llvm/ADT/Twine.h"
51#include "llvm/IR/Constant.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DataLayout.h"
55#include "llvm/IR/DebugLoc.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/GlobalValue.h"
59#include "llvm/IR/Metadata.h"
60#include "llvm/IR/Type.h"
64#include "llvm/Support/Debug.h"
74#include <algorithm>
75#include <cassert>
76#include <cstdint>
77#include <cstdlib>
78#include <limits>
79#include <optional>
80#include <string>
81#include <utility>
82#include <vector>
83
84using namespace llvm;
85using namespace llvm::SDPatternMatch;
86
87/// makeVTList - Return an instance of the SDVTList struct initialized with the
88/// specified members.
89static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
90 SDVTList Res = {VTs, NumVTs};
91 return Res;
92}
93
94// Default null implementations of the callbacks.
98
99void SelectionDAG::DAGNodeDeletedListener::anchor() {}
100void SelectionDAG::DAGNodeInsertedListener::anchor() {}
101
102#define DEBUG_TYPE "selectiondag"
103
104static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
105 cl::Hidden, cl::init(true),
106 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
107
108static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
109 cl::desc("Number limit for gluing ld/st of memcpy."),
110 cl::Hidden, cl::init(0));
111
113 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
114 cl::desc("DAG combiner limit number of steps when searching DAG "
115 "for predecessor nodes"));
116
118 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
119}
120
122
123//===----------------------------------------------------------------------===//
124// ConstantFPSDNode Class
125//===----------------------------------------------------------------------===//
126
127/// isExactlyValue - We don't rely on operator== working on double values, as
128/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
129/// As such, this method can be used to do an exact bit-for-bit comparison of
130/// two floating point values.
132 return getValueAPF().bitwiseIsEqual(V);
133}
134
136 const APFloat& Val) {
137 assert(VT.isFloatingPoint() && "Can only convert between FP types");
138
139 // convert modifies in place, so make a copy.
140 APFloat Val2 = APFloat(Val);
141 bool losesInfo;
143 &losesInfo);
144 return !losesInfo;
145}
146
147//===----------------------------------------------------------------------===//
148// ISD Namespace
149//===----------------------------------------------------------------------===//
150
151bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
152 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
153 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
154 unsigned EltSize =
155 N->getValueType(0).getVectorElementType().getSizeInBits();
156 SplatVal = OptAPInt->trunc(EltSize);
157 return true;
158 }
159 }
160
161 auto *BV = dyn_cast<BuildVectorSDNode>(N);
162 if (!BV)
163 return false;
164
165 APInt SplatUndef;
166 unsigned SplatBitSize;
167 bool HasUndefs;
168 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
169 // Endianness does not matter here. We are checking for a splat given the
170 // element size of the vector, and if we find such a splat for little endian
171 // layout, then that should be valid also for big endian (as the full vector
172 // size is known to be a multiple of the element size).
173 const bool IsBigEndian = false;
174 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
175 EltSize, IsBigEndian) &&
176 EltSize == SplatBitSize;
177}
178
179// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
180// specializations of the more general isConstantSplatVector()?
181
182bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
183 // Look through a bit convert.
184 while (N->getOpcode() == ISD::BITCAST)
185 N = N->getOperand(0).getNode();
186
187 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
188 APInt SplatVal;
189 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
190 }
191
192 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
193
194 unsigned i = 0, e = N->getNumOperands();
195
196 // Skip over all of the undef values.
197 while (i != e && N->getOperand(i).isUndef())
198 ++i;
199
200 // Do not accept an all-undef vector.
201 if (i == e) return false;
202
203 // Do not accept build_vectors that aren't all constants or which have non-~0
204 // elements. We have to be a bit careful here, as the type of the constant
205 // may not be the same as the type of the vector elements due to type
206 // legalization (the elements are promoted to a legal type for the target and
207 // a vector of a type may be legal when the base element type is not).
208 // We only want to check enough bits to cover the vector elements, because
209 // we care if the resultant vector is all ones, not whether the individual
210 // constants are.
211 SDValue NotZero = N->getOperand(i);
212 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
213 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
214 if (OptAPInt->countr_one() < EltSize)
215 return false;
216 } else
217 return false;
218
219 // Okay, we have at least one ~0 value, check to see if the rest match or are
220 // undefs. Even with the above element type twiddling, this should be OK, as
221 // the same type legalization should have applied to all the elements.
222 for (++i; i != e; ++i)
223 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
224 return false;
225 return true;
226}
227
228bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
229 // Look through a bit convert.
230 while (N->getOpcode() == ISD::BITCAST)
231 N = N->getOperand(0).getNode();
232
233 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
234 APInt SplatVal;
235 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
236 }
237
238 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
239
240 bool IsAllUndef = true;
241 for (const SDValue &Op : N->op_values()) {
242 if (Op.isUndef())
243 continue;
244 IsAllUndef = false;
245 // Do not accept build_vectors that aren't all constants or which have non-0
246 // elements. We have to be a bit careful here, as the type of the constant
247 // may not be the same as the type of the vector elements due to type
248 // legalization (the elements are promoted to a legal type for the target
249 // and a vector of a type may be legal when the base element type is not).
250 // We only want to check enough bits to cover the vector elements, because
251 // we care if the resultant vector is all zeros, not whether the individual
252 // constants are.
253 if (auto OptAPInt = Op->bitcastToAPInt()) {
254 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
255 if (OptAPInt->countr_zero() < EltSize)
256 return false;
257 } else
258 return false;
259 }
260
261 // Do not accept an all-undef vector.
262 if (IsAllUndef)
263 return false;
264 return true;
265}
266
268 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
269}
270
272 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
273}
274
276 if (N->getOpcode() != ISD::BUILD_VECTOR)
277 return false;
278
279 for (const SDValue &Op : N->op_values()) {
280 if (Op.isUndef())
281 continue;
283 return false;
284 }
285 return true;
286}
287
289 if (N->getOpcode() != ISD::BUILD_VECTOR)
290 return false;
291
292 for (const SDValue &Op : N->op_values()) {
293 if (Op.isUndef())
294 continue;
296 return false;
297 }
298 return true;
299}
300
301bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
302 bool Signed) {
303 assert(N->getValueType(0).isVector() && "Expected a vector!");
304
305 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
306 if (EltSize <= NewEltSize)
307 return false;
308
309 if (N->getOpcode() == ISD::ZERO_EXTEND) {
310 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
311 NewEltSize) &&
312 !Signed;
313 }
314 if (N->getOpcode() == ISD::SIGN_EXTEND) {
315 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
316 NewEltSize) &&
317 Signed;
318 }
319 if (N->getOpcode() != ISD::BUILD_VECTOR)
320 return false;
321
322 for (const SDValue &Op : N->op_values()) {
323 if (Op.isUndef())
324 continue;
326 return false;
327
328 APInt C = Op->getAsAPIntVal().trunc(EltSize);
329 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
330 return false;
331 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
332 return false;
333 }
334
335 return true;
336}
337
339 // Return false if the node has no operands.
340 // This is "logically inconsistent" with the definition of "all" but
341 // is probably the desired behavior.
342 if (N->getNumOperands() == 0)
343 return false;
344 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
345}
346
348 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
349}
350
351template <typename ConstNodeType>
353 std::function<bool(ConstNodeType *)> Match,
354 bool AllowUndefs, bool AllowTruncation) {
355 // FIXME: Add support for scalar UNDEF cases?
356 if (auto *C = dyn_cast<ConstNodeType>(Op))
357 return Match(C);
358
359 // FIXME: Add support for vector UNDEF cases?
360 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
361 ISD::SPLAT_VECTOR != Op.getOpcode())
362 return false;
363
364 EVT SVT = Op.getValueType().getScalarType();
365 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
366 if (AllowUndefs && Op.getOperand(i).isUndef()) {
367 if (!Match(nullptr))
368 return false;
369 continue;
370 }
371
372 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
373 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
374 !Match(Cst))
375 return false;
376 }
377 return true;
378}
379// Build used template types.
381 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
383 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
384
386 SDValue LHS, SDValue RHS,
387 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
388 bool AllowUndefs, bool AllowTypeMismatch) {
389 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
390 return false;
391
392 // TODO: Add support for scalar UNDEF cases?
393 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
394 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
395 return Match(LHSCst, RHSCst);
396
397 // TODO: Add support for vector UNDEF cases?
398 if (LHS.getOpcode() != RHS.getOpcode() ||
399 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
400 LHS.getOpcode() != ISD::SPLAT_VECTOR))
401 return false;
402
403 EVT SVT = LHS.getValueType().getScalarType();
404 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
405 SDValue LHSOp = LHS.getOperand(i);
406 SDValue RHSOp = RHS.getOperand(i);
407 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
408 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
409 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
410 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
411 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
412 return false;
413 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
414 LHSOp.getValueType() != RHSOp.getValueType()))
415 return false;
416 if (!Match(LHSCst, RHSCst))
417 return false;
418 }
419 return true;
420}
421
423 switch (MinMaxOpc) {
424 default:
425 llvm_unreachable("unrecognized opcode");
426 case ISD::UMIN:
427 return ISD::UMAX;
428 case ISD::UMAX:
429 return ISD::UMIN;
430 case ISD::SMIN:
431 return ISD::SMAX;
432 case ISD::SMAX:
433 return ISD::SMIN;
434 }
435}
436
438 switch (MinMaxOpc) {
439 default:
440 llvm_unreachable("unrecognized min/max opcode");
441 case ISD::SMIN:
442 return ISD::UMIN;
443 case ISD::SMAX:
444 return ISD::UMAX;
445 case ISD::UMIN:
446 return ISD::SMIN;
447 case ISD::UMAX:
448 return ISD::SMAX;
449 }
450}
451
453 switch (VecReduceOpcode) {
454 default:
455 llvm_unreachable("Expected VECREDUCE opcode");
458 case ISD::VP_REDUCE_FADD:
459 case ISD::VP_REDUCE_SEQ_FADD:
460 return ISD::FADD;
463 case ISD::VP_REDUCE_FMUL:
464 case ISD::VP_REDUCE_SEQ_FMUL:
465 return ISD::FMUL;
467 case ISD::VP_REDUCE_ADD:
468 return ISD::ADD;
470 case ISD::VP_REDUCE_MUL:
471 return ISD::MUL;
473 case ISD::VP_REDUCE_AND:
474 return ISD::AND;
476 case ISD::VP_REDUCE_OR:
477 return ISD::OR;
479 case ISD::VP_REDUCE_XOR:
480 return ISD::XOR;
482 case ISD::VP_REDUCE_SMAX:
483 return ISD::SMAX;
485 case ISD::VP_REDUCE_SMIN:
486 return ISD::SMIN;
488 case ISD::VP_REDUCE_UMAX:
489 return ISD::UMAX;
491 case ISD::VP_REDUCE_UMIN:
492 return ISD::UMIN;
494 case ISD::VP_REDUCE_FMAX:
495 return ISD::FMAXNUM;
497 case ISD::VP_REDUCE_FMIN:
498 return ISD::FMINNUM;
500 case ISD::VP_REDUCE_FMAXIMUM:
501 return ISD::FMAXIMUM;
503 case ISD::VP_REDUCE_FMINIMUM:
504 return ISD::FMINIMUM;
505 }
506}
507
509 switch (MaskedOpc) {
510 case ISD::MASKED_UDIV:
511 return ISD::UDIV;
512 case ISD::MASKED_SDIV:
513 return ISD::SDIV;
514 case ISD::MASKED_UREM:
515 return ISD::UREM;
516 case ISD::MASKED_SREM:
517 return ISD::SREM;
518 default:
519 llvm_unreachable("Expected masked binop opcode");
520 }
521}
522
523bool ISD::isVPOpcode(unsigned Opcode) {
524 switch (Opcode) {
525 default:
526 return false;
527#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
528 case ISD::VPSD: \
529 return true;
530#include "llvm/IR/VPIntrinsics.def"
531 }
532}
533
534bool ISD::isVPBinaryOp(unsigned Opcode) {
535 switch (Opcode) {
536 default:
537 break;
538#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
539#define VP_PROPERTY_BINARYOP return true;
540#define END_REGISTER_VP_SDNODE(VPSD) break;
541#include "llvm/IR/VPIntrinsics.def"
542 }
543 return false;
544}
545
546bool ISD::isVPReduction(unsigned Opcode) {
547 switch (Opcode) {
548 default:
549 return false;
550 case ISD::VP_REDUCE_ADD:
551 case ISD::VP_REDUCE_MUL:
552 case ISD::VP_REDUCE_AND:
553 case ISD::VP_REDUCE_OR:
554 case ISD::VP_REDUCE_XOR:
555 case ISD::VP_REDUCE_SMAX:
556 case ISD::VP_REDUCE_SMIN:
557 case ISD::VP_REDUCE_UMAX:
558 case ISD::VP_REDUCE_UMIN:
559 case ISD::VP_REDUCE_FMAX:
560 case ISD::VP_REDUCE_FMIN:
561 case ISD::VP_REDUCE_FMAXIMUM:
562 case ISD::VP_REDUCE_FMINIMUM:
563 case ISD::VP_REDUCE_FADD:
564 case ISD::VP_REDUCE_FMUL:
565 case ISD::VP_REDUCE_SEQ_FADD:
566 case ISD::VP_REDUCE_SEQ_FMUL:
567 return true;
568 }
569}
570
571/// The operand position of the vector mask.
572std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
573 switch (Opcode) {
574 default:
575 return std::nullopt;
576#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
577 case ISD::VPSD: \
578 return MASKPOS;
579#include "llvm/IR/VPIntrinsics.def"
580 }
581}
582
583/// The operand position of the explicit vector length parameter.
584std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
585 switch (Opcode) {
586 default:
587 return std::nullopt;
588#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
589 case ISD::VPSD: \
590 return EVLPOS;
591#include "llvm/IR/VPIntrinsics.def"
592 }
593}
594
595std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
596 bool hasFPExcept) {
597 // FIXME: Return strict opcodes in case of fp exceptions.
598 switch (VPOpcode) {
599 default:
600 return std::nullopt;
601#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
602#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
603#define END_REGISTER_VP_SDNODE(VPOPC) break;
604#include "llvm/IR/VPIntrinsics.def"
605 }
606 return std::nullopt;
607}
608
609std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
610 switch (Opcode) {
611 default:
612 return std::nullopt;
613#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
614#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
615#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
616#include "llvm/IR/VPIntrinsics.def"
617 }
618}
619
621 switch (ExtType) {
622 case ISD::EXTLOAD:
623 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
624 case ISD::SEXTLOAD:
625 return ISD::SIGN_EXTEND;
626 case ISD::ZEXTLOAD:
627 return ISD::ZERO_EXTEND;
628 default:
629 break;
630 }
631
632 llvm_unreachable("Invalid LoadExtType");
633}
634
636 // To perform this operation, we just need to swap the L and G bits of the
637 // operation.
638 unsigned OldL = (Operation >> 2) & 1;
639 unsigned OldG = (Operation >> 1) & 1;
640 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
641 (OldL << 1) | // New G bit
642 (OldG << 2)); // New L bit.
643}
644
646 unsigned Operation = Op;
647 if (isIntegerLike)
648 Operation ^= 7; // Flip L, G, E bits, but not U.
649 else
650 Operation ^= 15; // Flip all of the condition bits.
651
653 Operation &= ~8; // Don't let N and U bits get set.
654
655 return ISD::CondCode(Operation);
656}
657
661
663 bool isIntegerLike) {
664 return getSetCCInverseImpl(Op, isIntegerLike);
665}
666
667/// For an integer comparison, return 1 if the comparison is a signed operation
668/// and 2 if the result is an unsigned comparison. Return zero if the operation
669/// does not depend on the sign of the input (setne and seteq).
670static int isSignedOp(ISD::CondCode Opcode) {
671 switch (Opcode) {
672 default: llvm_unreachable("Illegal integer setcc operation!");
673 case ISD::SETEQ:
674 case ISD::SETNE: return 0;
675 case ISD::SETLT:
676 case ISD::SETLE:
677 case ISD::SETGT:
678 case ISD::SETGE: return 1;
679 case ISD::SETULT:
680 case ISD::SETULE:
681 case ISD::SETUGT:
682 case ISD::SETUGE: return 2;
683 }
684}
685
687 EVT Type) {
688 bool IsInteger = Type.isInteger();
689 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
690 // Cannot fold a signed integer setcc with an unsigned integer setcc.
691 return ISD::SETCC_INVALID;
692
693 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
694
695 // If the N and U bits get set, then the resultant comparison DOES suddenly
696 // care about orderedness, and it is true when ordered.
697 if (Op > ISD::SETTRUE2)
698 Op &= ~16; // Clear the U bit if the N bit is set.
699
700 // Canonicalize illegal integer setcc's.
701 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
702 Op = ISD::SETNE;
703
704 return ISD::CondCode(Op);
705}
706
708 EVT Type) {
709 bool IsInteger = Type.isInteger();
710 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
711 // Cannot fold a signed setcc with an unsigned setcc.
712 return ISD::SETCC_INVALID;
713
714 // Combine all of the condition bits.
715 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
716
717 // Canonicalize illegal integer setcc's.
718 if (IsInteger) {
719 switch (Result) {
720 default: break;
721 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
722 case ISD::SETOEQ: // SETEQ & SETU[LG]E
723 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
724 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
725 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
726 }
727 }
728
729 return Result;
730}
731
732//===----------------------------------------------------------------------===//
733// SDNode Profile Support
734//===----------------------------------------------------------------------===//
735
736/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
737static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
738 ID.AddInteger(OpC);
739}
740
741/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
742/// solely with their pointer.
744 ID.AddPointer(VTList.VTs);
745}
746
747/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
750 for (const auto &Op : Ops) {
751 ID.AddPointer(Op.getNode());
752 ID.AddInteger(Op.getResNo());
753 }
754}
755
756/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
759 for (const auto &Op : Ops) {
760 ID.AddPointer(Op.getNode());
761 ID.AddInteger(Op.getResNo());
762 }
763}
764
765static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
766 SDVTList VTList, ArrayRef<SDValue> OpList) {
767 AddNodeIDOpcode(ID, OpC);
768 AddNodeIDValueTypes(ID, VTList);
769 AddNodeIDOperands(ID, OpList);
770}
771
772/// If this is an SDNode with special info, add this info to the NodeID data.
774 switch (N->getOpcode()) {
777 case ISD::MCSymbol:
778 llvm_unreachable("Should only be used on nodes with operands");
779 default: break; // Normal nodes don't need extra info.
781 case ISD::Constant: {
783 ID.AddPointer(C->getConstantIntValue());
784 ID.AddBoolean(C->isOpaque());
785 break;
786 }
788 case ISD::ConstantFP:
789 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
790 break;
796 ID.AddPointer(GA->getGlobal());
797 ID.AddInteger(GA->getOffset());
798 ID.AddInteger(GA->getTargetFlags());
799 break;
800 }
801 case ISD::BasicBlock:
803 break;
804 case ISD::Register:
805 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
806 break;
808 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
809 break;
810 case ISD::SRCVALUE:
811 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
812 break;
813 case ISD::FrameIndex:
815 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
816 break;
818 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
819 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
820 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
821 break;
822 case ISD::JumpTable:
824 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
825 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
826 break;
830 ID.AddInteger(CP->getAlign().value());
831 ID.AddInteger(CP->getOffset());
834 else
835 ID.AddPointer(CP->getConstVal());
836 ID.AddInteger(CP->getTargetFlags());
837 break;
838 }
839 case ISD::TargetIndex: {
841 ID.AddInteger(TI->getIndex());
842 ID.AddInteger(TI->getOffset());
843 ID.AddInteger(TI->getTargetFlags());
844 break;
845 }
846 case ISD::LOAD: {
847 const LoadSDNode *LD = cast<LoadSDNode>(N);
848 ID.AddInteger(LD->getMemoryVT().getRawBits());
849 ID.AddInteger(LD->getRawSubclassData());
850 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(LD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::STORE: {
855 const StoreSDNode *ST = cast<StoreSDNode>(N);
856 ID.AddInteger(ST->getMemoryVT().getRawBits());
857 ID.AddInteger(ST->getRawSubclassData());
858 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
859 ID.AddInteger(ST->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_LOAD: {
863 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
864 ID.AddInteger(ELD->getMemoryVT().getRawBits());
865 ID.AddInteger(ELD->getRawSubclassData());
866 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
867 ID.AddInteger(ELD->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::VP_LOAD_FF: {
871 const auto *LD = cast<VPLoadFFSDNode>(N);
872 ID.AddInteger(LD->getMemoryVT().getRawBits());
873 ID.AddInteger(LD->getRawSubclassData());
874 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
875 ID.AddInteger(LD->getMemOperand()->getFlags());
876 break;
877 }
878 case ISD::VP_STORE: {
879 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
880 ID.AddInteger(EST->getMemoryVT().getRawBits());
881 ID.AddInteger(EST->getRawSubclassData());
882 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
883 ID.AddInteger(EST->getMemOperand()->getFlags());
884 break;
885 }
886 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
888 ID.AddInteger(SLD->getMemoryVT().getRawBits());
889 ID.AddInteger(SLD->getRawSubclassData());
890 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
891 break;
892 }
893 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
895 ID.AddInteger(SST->getMemoryVT().getRawBits());
896 ID.AddInteger(SST->getRawSubclassData());
897 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
898 break;
899 }
900 case ISD::VP_GATHER: {
902 ID.AddInteger(EG->getMemoryVT().getRawBits());
903 ID.AddInteger(EG->getRawSubclassData());
904 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
905 ID.AddInteger(EG->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::VP_SCATTER: {
910 ID.AddInteger(ES->getMemoryVT().getRawBits());
911 ID.AddInteger(ES->getRawSubclassData());
912 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
913 ID.AddInteger(ES->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MLOAD: {
918 ID.AddInteger(MLD->getMemoryVT().getRawBits());
919 ID.AddInteger(MLD->getRawSubclassData());
920 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MLD->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSTORE: {
926 ID.AddInteger(MST->getMemoryVT().getRawBits());
927 ID.AddInteger(MST->getRawSubclassData());
928 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MST->getMemOperand()->getFlags());
930 break;
931 }
932 case ISD::MGATHER: {
934 ID.AddInteger(MG->getMemoryVT().getRawBits());
935 ID.AddInteger(MG->getRawSubclassData());
936 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
937 ID.AddInteger(MG->getMemOperand()->getFlags());
938 break;
939 }
940 case ISD::MSCATTER: {
942 ID.AddInteger(MS->getMemoryVT().getRawBits());
943 ID.AddInteger(MS->getRawSubclassData());
944 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
945 ID.AddInteger(MS->getMemOperand()->getFlags());
946 break;
947 }
950 case ISD::ATOMIC_SWAP:
962 case ISD::ATOMIC_LOAD:
963 case ISD::ATOMIC_STORE: {
964 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
965 ID.AddInteger(AT->getMemoryVT().getRawBits());
966 ID.AddInteger(AT->getRawSubclassData());
967 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
968 ID.AddInteger(AT->getMemOperand()->getFlags());
969 break;
970 }
971 case ISD::VECTOR_SHUFFLE: {
972 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
973 for (int M : Mask)
974 ID.AddInteger(M);
975 break;
976 }
977 case ISD::ADDRSPACECAST: {
979 ID.AddInteger(ASC->getSrcAddressSpace());
980 ID.AddInteger(ASC->getDestAddressSpace());
981 break;
982 }
984 case ISD::BlockAddress: {
986 ID.AddPointer(BA->getBlockAddress());
987 ID.AddInteger(BA->getOffset());
988 ID.AddInteger(BA->getTargetFlags());
989 break;
990 }
991 case ISD::AssertAlign:
992 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
993 break;
994 case ISD::PREFETCH:
997 // Handled by MemIntrinsicSDNode check after the switch.
998 break;
1000 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
1001 break;
1002 } // end switch (N->getOpcode())
1003
1004 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
1005 // to check.
1006 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
1007 ID.AddInteger(MN->getRawSubclassData());
1008 ID.AddInteger(MN->getMemoryVT().getRawBits());
1009 for (const MachineMemOperand *MMO : MN->memoperands()) {
1010 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
1011 ID.AddInteger(MMO->getFlags());
1012 }
1013 }
1014}
1015
1016/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1017/// data.
1019 AddNodeIDOpcode(ID, N->getOpcode());
1020 // Add the return value info.
1021 AddNodeIDValueTypes(ID, N->getVTList());
1022 // Add the operand info.
1023 AddNodeIDOperands(ID, N->ops());
1024
1025 // Handle SDNode leafs with special info.
1027}
1028
1029//===----------------------------------------------------------------------===//
1030// SelectionDAG Class
1031//===----------------------------------------------------------------------===//
1032
1033/// doNotCSE - Return true if CSE should not be performed for this node.
1034static bool doNotCSE(SDNode *N) {
1035 if (N->getValueType(0) == MVT::Glue)
1036 return true; // Never CSE anything that produces a glue result.
1037
1038 switch (N->getOpcode()) {
1039 default: break;
1040 case ISD::HANDLENODE:
1041 case ISD::EH_LABEL:
1042 return true; // Never CSE these nodes.
1043 }
1044
1045 // Check that remaining values produced are not flags.
1046 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1047 if (N->getValueType(i) == MVT::Glue)
1048 return true; // Never CSE anything that produces a glue result.
1049
1050 return false;
1051}
1052
1053/// Construct a DemandedElts mask which demands all elements of \p V.
1054/// If \p V is not a fixed-length vector, then this will return a single bit.
1056 EVT VT = V.getValueType();
1057 // Since the number of lanes in a scalable vector is unknown at compile time,
1058 // we track one bit which is implicitly broadcast to all lanes. This means
1059 // that all lanes in a scalable vector are considered demanded.
1061 : APInt(1, 1);
1062}
1063
1064/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1065/// SelectionDAG.
1067 // Create a dummy node (which is not added to allnodes), that adds a reference
1068 // to the root node, preventing it from being deleted.
1069 HandleSDNode Dummy(getRoot());
1070
1071 SmallVector<SDNode*, 128> DeadNodes;
1072
1073 // Add all obviously-dead nodes to the DeadNodes worklist.
1074 for (SDNode &Node : allnodes())
1075 if (Node.use_empty())
1076 DeadNodes.push_back(&Node);
1077
1078 RemoveDeadNodes(DeadNodes);
1079
1080 // If the root changed (e.g. it was a dead load, update the root).
1081 setRoot(Dummy.getValue());
1082}
1083
1084/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1085/// given list, and any nodes that become unreachable as a result.
1087
1088 // Process the worklist, deleting the nodes and adding their uses to the
1089 // worklist.
1090 while (!DeadNodes.empty()) {
1091 SDNode *N = DeadNodes.pop_back_val();
1092 // Skip to next node if we've already managed to delete the node. This could
1093 // happen if replacing a node causes a node previously added to the node to
1094 // be deleted.
1095 if (N->getOpcode() == ISD::DELETED_NODE)
1096 continue;
1097
1098 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1099 DUL->NodeDeleted(N, nullptr);
1100
1101 // Take the node out of the appropriate CSE map.
1102 RemoveNodeFromCSEMaps(N);
1103
1104 // Next, brutally remove the operand list. This is safe to do, as there are
1105 // no cycles in the graph.
1106 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1107 SDUse &Use = *I++;
1108 SDNode *Operand = Use.getNode();
1109 Use.set(SDValue());
1110
1111 // Now that we removed this operand, see if there are no uses of it left.
1112 if (Operand->use_empty())
1113 DeadNodes.push_back(Operand);
1114 }
1115
1116 DeallocateNode(N);
1117 }
1118}
1119
1121 SmallVector<SDNode*, 16> DeadNodes(1, N);
1122
1123 // Create a dummy node that adds a reference to the root node, preventing
1124 // it from being deleted. (This matters if the root is an operand of the
1125 // dead node.)
1126 HandleSDNode Dummy(getRoot());
1127
1128 RemoveDeadNodes(DeadNodes);
1129}
1130
1132 // First take this out of the appropriate CSE map.
1133 RemoveNodeFromCSEMaps(N);
1134
1135 // Finally, remove uses due to operands of this node, remove from the
1136 // AllNodes list, and delete the node.
1137 DeleteNodeNotInCSEMaps(N);
1138}
1139
1140void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1141 assert(N->getIterator() != AllNodes.begin() &&
1142 "Cannot delete the entry node!");
1143 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1144
1145 // Drop all of the operands and decrement used node's use counts.
1146 N->DropOperands();
1147
1148 DeallocateNode(N);
1149}
1150
1151void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1152 assert(!(V->isVariadic() && isParameter));
1153 if (isParameter)
1154 ByvalParmDbgValues.push_back(V);
1155 else
1156 DbgValues.push_back(V);
1157 for (const SDNode *Node : V->getSDNodes())
1158 if (Node)
1159 DbgValMap[Node].push_back(V);
1160}
1161
1163 DbgValMapType::iterator I = DbgValMap.find(Node);
1164 if (I == DbgValMap.end())
1165 return;
1166 for (auto &Val: I->second)
1167 Val->setIsInvalidated();
1168 DbgValMap.erase(I);
1169}
1170
1171void SelectionDAG::DeallocateNode(SDNode *N) {
1172 // If we have operands, deallocate them.
1174
1175 NodeAllocator.Deallocate(AllNodes.remove(N));
1176
1177 // Set the opcode to DELETED_NODE to help catch bugs when node
1178 // memory is reallocated.
1179 // FIXME: There are places in SDag that have grown a dependency on the opcode
1180 // value in the released node.
1181 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1182 N->NodeType = ISD::DELETED_NODE;
1183
1184 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1185 // them and forget about that node.
1186 DbgInfo->erase(N);
1187
1188 // Invalidate extra info.
1189 SDEI.erase(N);
1190}
1191
1192#ifndef NDEBUG
1193/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1194void SelectionDAG::verifyNode(SDNode *N) const {
1195 switch (N->getOpcode()) {
1196 default:
1197 if (N->isTargetOpcode())
1199 break;
1200 case ISD::BUILD_PAIR: {
1201 EVT VT = N->getValueType(0);
1202 assert(N->getNumValues() == 1 && "Too many results!");
1203 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1204 "Wrong return type!");
1205 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1206 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1207 "Mismatched operand types!");
1208 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1209 "Wrong operand type!");
1210 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1211 "Wrong return type size");
1212 break;
1213 }
1214 case ISD::BUILD_VECTOR: {
1215 assert(N->getNumValues() == 1 && "Too many results!");
1216 assert(N->getValueType(0).isVector() && "Wrong return type!");
1217 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1218 "Wrong number of operands!");
1219 EVT EltVT = N->getValueType(0).getVectorElementType();
1220 for (const SDUse &Op : N->ops()) {
1221 assert((Op.getValueType() == EltVT ||
1222 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1223 EltVT.bitsLE(Op.getValueType()))) &&
1224 "Wrong operand type!");
1225 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1226 "Operands must all have the same type");
1227 }
1228 break;
1229 }
1230 case ISD::SADDO:
1231 case ISD::UADDO:
1232 case ISD::SSUBO:
1233 case ISD::USUBO:
1234 assert(N->getNumValues() == 2 && "Wrong number of results!");
1235 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1236 "Invalid add/sub overflow op!");
1237 assert(N->getVTList().VTs[0].isInteger() &&
1238 N->getVTList().VTs[1].isInteger() &&
1239 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1240 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1241 "Binary operator types must match!");
1242 break;
1243 }
1244}
1245#endif // NDEBUG
1246
1247/// Insert a newly allocated node into the DAG.
1248///
1249/// Handles insertion into the all nodes list and CSE map, as well as
1250/// verification and other common operations when a new node is allocated.
1251void SelectionDAG::InsertNode(SDNode *N) {
1252 AllNodes.push_back(N);
1253#ifndef NDEBUG
1254 N->PersistentId = NextPersistentId++;
1255 verifyNode(N);
1256#endif
1257 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1258 DUL->NodeInserted(N);
1259}
1260
1261/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1262/// correspond to it. This is useful when we're about to delete or repurpose
1263/// the node. We don't want future request for structurally identical nodes
1264/// to return N anymore.
1265bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1266 bool Erased = false;
1267 switch (N->getOpcode()) {
1268 case ISD::HANDLENODE: return false; // noop.
1269 case ISD::CONDCODE:
1270 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1271 "Cond code doesn't exist!");
1272 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1273 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1274 break;
1276 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1277 break;
1279 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1280 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1281 ESN->getSymbol(), ESN->getTargetFlags()));
1282 break;
1283 }
1284 case ISD::MCSymbol: {
1285 auto *MCSN = cast<MCSymbolSDNode>(N);
1286 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1287 break;
1288 }
1289 case ISD::VALUETYPE: {
1290 EVT VT = cast<VTSDNode>(N)->getVT();
1291 if (VT.isExtended()) {
1292 Erased = ExtendedValueTypeNodes.erase(VT);
1293 } else {
1294 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1295 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1296 }
1297 break;
1298 }
1299 default:
1300 // Remove it from the CSE Map.
1301 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1302 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1303 Erased = CSEMap.RemoveNode(N);
1304 break;
1305 }
1306#ifndef NDEBUG
1307 // Verify that the node was actually in one of the CSE maps, unless it has a
1308 // glue result (which cannot be CSE'd) or is one of the special cases that are
1309 // not subject to CSE.
1310 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1311 !N->isMachineOpcode() && !doNotCSE(N)) {
1312 N->dump(this);
1313 dbgs() << "\n";
1314 llvm_unreachable("Node is not in map!");
1315 }
1316#endif
1317 return Erased;
1318}
1319
1320/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1321/// maps and modified in place. Add it back to the CSE maps, unless an identical
1322/// node already exists, in which case transfer all its users to the existing
1323/// node. This transfer can potentially trigger recursive merging.
1324void
1325SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1326 // For node types that aren't CSE'd, just act as if no identical node
1327 // already exists.
1328 if (!doNotCSE(N)) {
1329 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1330 if (Existing != N) {
1331 // If there was already an existing matching node, use ReplaceAllUsesWith
1332 // to replace the dead one with the existing one. This can cause
1333 // recursive merging of other unrelated nodes down the line.
1334 Existing->intersectFlagsWith(N->getFlags());
1335 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1336 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1337 ReplaceAllUsesWith(N, Existing);
1338
1339 // N is now dead. Inform the listeners and delete it.
1340 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1341 DUL->NodeDeleted(N, Existing);
1342 DeleteNodeNotInCSEMaps(N);
1343 return;
1344 }
1345 }
1346
1347 // If the node doesn't already exist, we updated it. Inform listeners.
1348 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1349 DUL->NodeUpdated(N);
1350}
1351
1352/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1353/// were replaced with those specified. If this node is never memoized,
1354/// return null, otherwise return a pointer to the slot it would take. If a
1355/// node already exists with these operands, the slot will be non-null.
1356SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1357 void *&InsertPos) {
1358 if (doNotCSE(N))
1359 return nullptr;
1360
1361 SDValue Ops[] = { Op };
1362 FoldingSetNodeID ID;
1363 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1365 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1366 if (Node)
1367 Node->intersectFlagsWith(N->getFlags());
1368 return Node;
1369}
1370
1371/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1372/// were replaced with those specified. If this node is never memoized,
1373/// return null, otherwise return a pointer to the slot it would take. If a
1374/// node already exists with these operands, the slot will be non-null.
1375SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1376 SDValue Op1, SDValue Op2,
1377 void *&InsertPos) {
1378 if (doNotCSE(N))
1379 return nullptr;
1380
1381 SDValue Ops[] = { Op1, Op2 };
1382 FoldingSetNodeID ID;
1383 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1385 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1386 if (Node)
1387 Node->intersectFlagsWith(N->getFlags());
1388 return Node;
1389}
1390
1391/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1392/// were replaced with those specified. If this node is never memoized,
1393/// return null, otherwise return a pointer to the slot it would take. If a
1394/// node already exists with these operands, the slot will be non-null.
1395SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1396 void *&InsertPos) {
1397 if (doNotCSE(N))
1398 return nullptr;
1399
1400 FoldingSetNodeID ID;
1401 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1403 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1404 if (Node)
1405 Node->intersectFlagsWith(N->getFlags());
1406 return Node;
1407}
1408
1410 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1411 : VT.getTypeForEVT(*getContext());
1412
1413 return getDataLayout().getABITypeAlign(Ty);
1414}
1415
1416// EntryNode could meaningfully have debug info if we can find it...
1418 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1419 getVTList(MVT::Other, MVT::Glue)),
1420 Root(getEntryNode()) {
1421 InsertNode(&EntryNode);
1422 DbgInfo = new SDDbgInfo();
1423}
1424
1426 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1427 const TargetLibraryInfo *LibraryInfo,
1428 const LibcallLoweringInfo *LibcallsInfo,
1429 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1431 FunctionVarLocs const *VarLocs) {
1432 MF = &NewMF;
1433 SDAGISelPass = PassPtr;
1434 ORE = &NewORE;
1437 LibInfo = LibraryInfo;
1438 Libcalls = LibcallsInfo;
1439 Context = &MF->getFunction().getContext();
1440 UA = NewUA;
1441 PSI = PSIin;
1442 BFI = BFIin;
1443 MMI = &MMIin;
1444 FnVarLocs = VarLocs;
1445}
1446
1448 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1449 allnodes_clear();
1450 OperandRecycler.clear(OperandAllocator);
1451 delete DbgInfo;
1452}
1453
1455 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1456}
1457
1458void SelectionDAG::allnodes_clear() {
1459 assert(&*AllNodes.begin() == &EntryNode);
1460 AllNodes.remove(AllNodes.begin());
1461 while (!AllNodes.empty())
1462 DeallocateNode(&AllNodes.front());
1463#ifndef NDEBUG
1464 NextPersistentId = 0;
1465#endif
1466}
1467
1468SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1469 void *&InsertPos) {
1470 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1471 if (N) {
1472 switch (N->getOpcode()) {
1473 default: break;
1474 case ISD::Constant:
1475 case ISD::ConstantFP:
1476 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1477 "debug location. Use another overload.");
1478 }
1479 }
1480 return N;
1481}
1482
1483SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1484 const SDLoc &DL, void *&InsertPos) {
1485 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1486 if (N) {
1487 switch (N->getOpcode()) {
1488 case ISD::Constant:
1489 case ISD::ConstantFP:
1490 // Erase debug location from the node if the node is used at several
1491 // different places. Do not propagate one location to all uses as it
1492 // will cause a worse single stepping debugging experience.
1493 if (N->getDebugLoc() != DL.getDebugLoc())
1494 N->setDebugLoc(DebugLoc());
1495 break;
1496 default:
1497 // When the node's point of use is located earlier in the instruction
1498 // sequence than its prior point of use, update its debug info to the
1499 // earlier location.
1500 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1501 N->setDebugLoc(DL.getDebugLoc());
1502 break;
1503 }
1504 }
1505 return N;
1506}
1507
1509 allnodes_clear();
1510 OperandRecycler.clear(OperandAllocator);
1511 OperandAllocator.Reset();
1512 CSEMap.clear();
1513
1514 ExtendedValueTypeNodes.clear();
1515 ExternalSymbols.clear();
1516 TargetExternalSymbols.clear();
1517 MCSymbols.clear();
1518 SDEI.clear();
1519 llvm::fill(CondCodeNodes, nullptr);
1520 llvm::fill(ValueTypeNodes, nullptr);
1521
1522 EntryNode.UseList = nullptr;
1523 InsertNode(&EntryNode);
1524 Root = getEntryNode();
1525 DbgInfo->clear();
1526}
1527
1529 return VT.bitsGT(Op.getValueType())
1530 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1531 : getNode(ISD::FP_ROUND, DL, VT, Op,
1532 getIntPtrConstant(0, DL, /*isTarget=*/true));
1533}
1534
1535std::pair<SDValue, SDValue>
1537 const SDLoc &DL, EVT VT) {
1538 assert(!VT.bitsEq(Op.getValueType()) &&
1539 "Strict no-op FP extend/round not allowed.");
1540 SDValue Res =
1541 VT.bitsGT(Op.getValueType())
1542 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1543 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1544 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1545
1546 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1547}
1548
1550 return VT.bitsGT(Op.getValueType()) ?
1551 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1552 getNode(ISD::TRUNCATE, DL, VT, Op);
1553}
1554
1556 return VT.bitsGT(Op.getValueType()) ?
1557 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1558 getNode(ISD::TRUNCATE, DL, VT, Op);
1559}
1560
1562 return VT.bitsGT(Op.getValueType()) ?
1563 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1564 getNode(ISD::TRUNCATE, DL, VT, Op);
1565}
1566
1568 EVT VT) {
1569 assert(!VT.isVector());
1570 auto Type = Op.getValueType();
1571 SDValue DestOp;
1572 if (Type == VT)
1573 return Op;
1574 auto Size = Op.getValueSizeInBits();
1575 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1576 if (DestOp.getValueType() == VT)
1577 return DestOp;
1578
1579 return getAnyExtOrTrunc(DestOp, DL, VT);
1580}
1581
1583 EVT VT) {
1584 assert(!VT.isVector());
1585 auto Type = Op.getValueType();
1586 SDValue DestOp;
1587 if (Type == VT)
1588 return Op;
1589 auto Size = Op.getValueSizeInBits();
1590 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1591 if (DestOp.getValueType() == VT)
1592 return DestOp;
1593
1594 return getSExtOrTrunc(DestOp, DL, VT);
1595}
1596
1598 EVT VT) {
1599 assert(!VT.isVector());
1600 auto Type = Op.getValueType();
1601 SDValue DestOp;
1602 if (Type == VT)
1603 return Op;
1604 auto Size = Op.getValueSizeInBits();
1605 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1606 if (DestOp.getValueType() == VT)
1607 return DestOp;
1608
1609 return getZExtOrTrunc(DestOp, DL, VT);
1610}
1611
1613 EVT OpVT) {
1614 if (VT.bitsLE(Op.getValueType()))
1615 return getNode(ISD::TRUNCATE, SL, VT, Op);
1616
1617 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1618 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1619}
1620
1622 EVT OpVT = Op.getValueType();
1623 assert(VT.isInteger() && OpVT.isInteger() &&
1624 "Cannot getZeroExtendInReg FP types");
1625 assert(VT.isVector() == OpVT.isVector() &&
1626 "getZeroExtendInReg type should be vector iff the operand "
1627 "type is vector!");
1628 assert((!VT.isVector() ||
1630 "Vector element counts must match in getZeroExtendInReg");
1631 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1632 if (OpVT == VT)
1633 return Op;
1634 // TODO: Use computeKnownBits instead of AssertZext.
1635 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1636 ->getVT()
1637 .getScalarType()
1638 .bitsLE(VT.getScalarType()))
1639 return Op;
1641 VT.getScalarSizeInBits());
1642 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1643}
1644
1646 SDValue EVL, const SDLoc &DL,
1647 EVT VT) {
1648 EVT OpVT = Op.getValueType();
1649 assert(VT.isInteger() && OpVT.isInteger() &&
1650 "Cannot getVPZeroExtendInReg FP types");
1651 assert(VT.isVector() && OpVT.isVector() &&
1652 "getVPZeroExtendInReg type and operand type should be vector!");
1654 "Vector element counts must match in getZeroExtendInReg");
1655 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1656 if (OpVT == VT)
1657 return Op;
1659 VT.getScalarSizeInBits());
1660 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1661 EVL);
1662}
1663
1665 // Only unsigned pointer semantics are supported right now. In the future this
1666 // might delegate to TLI to check pointer signedness.
1667 return getZExtOrTrunc(Op, DL, VT);
1668}
1669
1671 // Only unsigned pointer semantics are supported right now. In the future this
1672 // might delegate to TLI to check pointer signedness.
1673 return getZeroExtendInReg(Op, DL, VT);
1674}
1675
1677 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1678}
1679
1680/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1682 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1683}
1684
1686 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1687 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1688}
1689
1691 SDValue Mask, SDValue EVL, EVT VT) {
1692 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1693 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1694}
1695
1697 SDValue Mask, SDValue EVL) {
1698 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1699}
1700
1702 SDValue Mask, SDValue EVL) {
1703 if (VT.bitsGT(Op.getValueType()))
1704 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1705 if (VT.bitsLT(Op.getValueType()))
1706 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1707 return Op;
1708}
1709
1711 EVT OpVT) {
1712 if (!V)
1713 return getConstant(0, DL, VT);
1714
1715 switch (TLI->getBooleanContents(OpVT)) {
1718 return getConstant(1, DL, VT);
1720 return getAllOnesConstant(DL, VT);
1721 }
1722 llvm_unreachable("Unexpected boolean content enum!");
1723}
1724
1726 bool isT, bool isO) {
1727 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1728 DL, VT, isT, isO);
1729}
1730
1732 bool isT, bool isO) {
1733 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1734}
1735
1737 EVT VT, bool isT, bool isO) {
1738 assert(VT.isInteger() && "Cannot create FP integer constant!");
1739
1740 EVT EltVT = VT.getScalarType();
1741 const ConstantInt *Elt = &Val;
1742
1743 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1744 // to-be-splatted scalar ConstantInt.
1745 if (isa<VectorType>(Elt->getType()))
1746 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1747
1748 // In some cases the vector type is legal but the element type is illegal and
1749 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1750 // inserted value (the type does not need to match the vector element type).
1751 // Any extra bits introduced will be truncated away.
1752 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1754 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1755 APInt NewVal;
1756 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1757 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1758 else
1759 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1760 Elt = ConstantInt::get(*getContext(), NewVal);
1761 }
1762 // In other cases the element type is illegal and needs to be expanded, for
1763 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1764 // the value into n parts and use a vector type with n-times the elements.
1765 // Then bitcast to the type requested.
1766 // Legalizing constants too early makes the DAGCombiner's job harder so we
1767 // only legalize if the DAG tells us we must produce legal types.
1768 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1769 TLI->getTypeAction(*getContext(), EltVT) ==
1771 const APInt &NewVal = Elt->getValue();
1772 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1773 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1774
1775 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1776 if (VT.isScalableVector() ||
1777 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1778 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1779 "Can only handle an even split!");
1780 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1781
1782 SmallVector<SDValue, 2> ScalarParts;
1783 for (unsigned i = 0; i != Parts; ++i)
1784 ScalarParts.push_back(getConstant(
1785 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1786 ViaEltVT, isT, isO));
1787
1788 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1789 }
1790
1791 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1792 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1793
1794 // Check the temporary vector is the correct size. If this fails then
1795 // getTypeToTransformTo() probably returned a type whose size (in bits)
1796 // isn't a power-of-2 factor of the requested type size.
1797 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1798
1799 SmallVector<SDValue, 2> EltParts;
1800 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1801 EltParts.push_back(getConstant(
1802 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1803 ViaEltVT, isT, isO));
1804
1805 // EltParts is currently in little endian order. If we actually want
1806 // big-endian order then reverse it now.
1807 if (getDataLayout().isBigEndian())
1808 std::reverse(EltParts.begin(), EltParts.end());
1809
1810 // The elements must be reversed when the element order is different
1811 // to the endianness of the elements (because the BITCAST is itself a
1812 // vector shuffle in this situation). However, we do not need any code to
1813 // perform this reversal because getConstant() is producing a vector
1814 // splat.
1815 // This situation occurs in MIPS MSA.
1816
1818 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1819 llvm::append_range(Ops, EltParts);
1820
1821 SDValue V =
1822 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1823 return V;
1824 }
1825
1826 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1827 "APInt size does not match type size!");
1828 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1829 SDVTList VTs = getVTList(EltVT);
1831 AddNodeIDNode(ID, Opc, VTs, {});
1832 ID.AddPointer(Elt);
1833 ID.AddBoolean(isO);
1834 void *IP = nullptr;
1835 SDNode *N = nullptr;
1836 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1837 if (!VT.isVector())
1838 return SDValue(N, 0);
1839
1840 if (!N) {
1841 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1842 if (!isT)
1843 N->setDebugLoc(DL.getDebugLoc());
1844 CSEMap.InsertNode(N, IP);
1845 InsertNode(N);
1846 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1847 }
1848
1849 SDValue Result(N, 0);
1850 if (VT.isVector())
1851 Result = getSplat(VT, DL, Result);
1852 return Result;
1853}
1854
1856 bool isT, bool isO) {
1857 unsigned Size = VT.getScalarSizeInBits();
1858 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1859}
1860
1862 bool IsOpaque) {
1864 IsTarget, IsOpaque);
1865}
1866
1868 bool isTarget) {
1869 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1870}
1871
1873 const SDLoc &DL) {
1874 assert(VT.isInteger() && "Shift amount is not an integer type!");
1875 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1876 return getConstant(Val, DL, ShiftVT);
1877}
1878
1880 const SDLoc &DL) {
1881 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1882 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1883}
1884
1886 bool isTarget) {
1887 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1888}
1889
1891 bool isTarget) {
1892 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1893}
1894
1896 EVT VT, bool isTarget) {
1897 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1898
1899 EVT EltVT = VT.getScalarType();
1900 const ConstantFP *Elt = &V;
1901
1902 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1903 // the to-be-splatted scalar ConstantFP.
1904 if (isa<VectorType>(Elt->getType()))
1905 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1906
1907 // Do the map lookup using the actual bit pattern for the floating point
1908 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1909 // we don't have issues with SNANs.
1910 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1911 SDVTList VTs = getVTList(EltVT);
1913 AddNodeIDNode(ID, Opc, VTs, {});
1914 ID.AddPointer(Elt);
1915 void *IP = nullptr;
1916 SDNode *N = nullptr;
1917 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1918 if (!VT.isVector())
1919 return SDValue(N, 0);
1920
1921 if (!N) {
1922 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1923 CSEMap.InsertNode(N, IP);
1924 InsertNode(N);
1925 }
1926
1927 SDValue Result(N, 0);
1928 if (VT.isVector())
1929 Result = getSplat(VT, DL, Result);
1930 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1931 return Result;
1932}
1933
1935 bool isTarget) {
1936 EVT EltVT = VT.getScalarType();
1937 if (EltVT == MVT::f32)
1938 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1939 if (EltVT == MVT::f64)
1940 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1941 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1942 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1943 bool Ignored;
1944 APFloat APF = APFloat(Val);
1946 &Ignored);
1947 return getConstantFP(APF, DL, VT, isTarget);
1948 }
1949 llvm_unreachable("Unsupported type in getConstantFP");
1950}
1951
1953 EVT VT, int64_t Offset, bool isTargetGA,
1954 unsigned TargetFlags) {
1955 assert((TargetFlags == 0 || isTargetGA) &&
1956 "Cannot set target flags on target-independent globals");
1957
1958 // Truncate (with sign-extension) the offset value to the pointer size.
1960 if (BitWidth < 64)
1962
1963 unsigned Opc;
1964 if (GV->isThreadLocal())
1966 else
1968
1969 SDVTList VTs = getVTList(VT);
1971 AddNodeIDNode(ID, Opc, VTs, {});
1972 ID.AddPointer(GV);
1973 ID.AddInteger(Offset);
1974 ID.AddInteger(TargetFlags);
1975 void *IP = nullptr;
1976 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1977 return SDValue(E, 0);
1978
1979 auto *N = newSDNode<GlobalAddressSDNode>(
1980 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1981 CSEMap.InsertNode(N, IP);
1982 InsertNode(N);
1983 return SDValue(N, 0);
1984}
1985
1987 SDVTList VTs = getVTList(MVT::Untyped);
1990 ID.AddPointer(GV);
1991 void *IP = nullptr;
1992 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1993 return SDValue(E, 0);
1994
1995 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1996 CSEMap.InsertNode(N, IP);
1997 InsertNode(N);
1998 return SDValue(N, 0);
1999}
2000
2001SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
2002 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
2003 SDVTList VTs = getVTList(VT);
2005 AddNodeIDNode(ID, Opc, VTs, {});
2006 ID.AddInteger(FI);
2007 void *IP = nullptr;
2008 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2009 return SDValue(E, 0);
2010
2011 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
2012 CSEMap.InsertNode(N, IP);
2013 InsertNode(N);
2014 return SDValue(N, 0);
2015}
2016
2017SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
2018 unsigned TargetFlags) {
2019 assert((TargetFlags == 0 || isTarget) &&
2020 "Cannot set target flags on target-independent jump tables");
2021 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
2022 SDVTList VTs = getVTList(VT);
2024 AddNodeIDNode(ID, Opc, VTs, {});
2025 ID.AddInteger(JTI);
2026 ID.AddInteger(TargetFlags);
2027 void *IP = nullptr;
2028 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2029 return SDValue(E, 0);
2030
2031 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2032 CSEMap.InsertNode(N, IP);
2033 InsertNode(N);
2034 return SDValue(N, 0);
2035}
2036
2038 const SDLoc &DL) {
2040 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2041 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2042}
2043
2045 MaybeAlign Alignment, int Offset,
2046 bool isTarget, unsigned TargetFlags) {
2047 assert((TargetFlags == 0 || isTarget) &&
2048 "Cannot set target flags on target-independent globals");
2049 if (!Alignment)
2050 Alignment = shouldOptForSize()
2051 ? getDataLayout().getABITypeAlign(C->getType())
2052 : getDataLayout().getPrefTypeAlign(C->getType());
2053 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2054 SDVTList VTs = getVTList(VT);
2056 AddNodeIDNode(ID, Opc, VTs, {});
2057 ID.AddInteger(Alignment->value());
2058 ID.AddInteger(Offset);
2059 ID.AddPointer(C);
2060 ID.AddInteger(TargetFlags);
2061 void *IP = nullptr;
2062 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2063 return SDValue(E, 0);
2064
2065 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2066 TargetFlags);
2067 CSEMap.InsertNode(N, IP);
2068 InsertNode(N);
2069 SDValue V = SDValue(N, 0);
2070 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2071 return V;
2072}
2073
2075 MaybeAlign Alignment, int Offset,
2076 bool isTarget, unsigned TargetFlags) {
2077 assert((TargetFlags == 0 || isTarget) &&
2078 "Cannot set target flags on target-independent globals");
2079 if (!Alignment)
2080 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2081 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2082 SDVTList VTs = getVTList(VT);
2084 AddNodeIDNode(ID, Opc, VTs, {});
2085 ID.AddInteger(Alignment->value());
2086 ID.AddInteger(Offset);
2087 C->addSelectionDAGCSEId(ID);
2088 ID.AddInteger(TargetFlags);
2089 void *IP = nullptr;
2090 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2091 return SDValue(E, 0);
2092
2093 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2094 TargetFlags);
2095 CSEMap.InsertNode(N, IP);
2096 InsertNode(N);
2097 return SDValue(N, 0);
2098}
2099
2102 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2103 ID.AddPointer(MBB);
2104 void *IP = nullptr;
2105 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2106 return SDValue(E, 0);
2107
2108 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2109 CSEMap.InsertNode(N, IP);
2110 InsertNode(N);
2111 return SDValue(N, 0);
2112}
2113
2115 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2116 ValueTypeNodes.size())
2117 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2118
2119 SDNode *&N = VT.isExtended() ?
2120 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2121
2122 if (N) return SDValue(N, 0);
2123 N = newSDNode<VTSDNode>(VT);
2124 InsertNode(N);
2125 return SDValue(N, 0);
2126}
2127
2129 SDNode *&N = ExternalSymbols[Sym];
2130 if (N) return SDValue(N, 0);
2131 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2132 InsertNode(N);
2133 return SDValue(N, 0);
2134}
2135
2136SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2138 return getExternalSymbol(SymName.data(), VT);
2139}
2140
2142 SDNode *&N = MCSymbols[Sym];
2143 if (N)
2144 return SDValue(N, 0);
2145 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2146 InsertNode(N);
2147 return SDValue(N, 0);
2148}
2149
2151 unsigned TargetFlags) {
2152 SDNode *&N =
2153 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2154 if (N) return SDValue(N, 0);
2155 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2156 InsertNode(N);
2157 return SDValue(N, 0);
2158}
2159
2161 EVT VT, unsigned TargetFlags) {
2163 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2164}
2165
2167 if ((unsigned)Cond >= CondCodeNodes.size())
2168 CondCodeNodes.resize(Cond+1);
2169
2170 if (!CondCodeNodes[Cond]) {
2171 auto *N = newSDNode<CondCodeSDNode>(Cond);
2172 CondCodeNodes[Cond] = N;
2173 InsertNode(N);
2174 }
2175
2176 return SDValue(CondCodeNodes[Cond], 0);
2177}
2178
2180 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2181 "APInt size does not match type size!");
2182
2183 if (MulImm == 0)
2184 return getConstant(0, DL, VT);
2185
2186 const MachineFunction &MF = getMachineFunction();
2187 const Function &F = MF.getFunction();
2188 ConstantRange CR = getVScaleRange(&F, 64);
2189 if (const APInt *C = CR.getSingleElement())
2190 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2191
2192 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2193}
2194
2195/// \returns a value of type \p VT that represents the runtime value of \p
2196/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2197/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2198/// or TypeSize.
2199template <typename Ty>
2201 EVT VT, Ty Quantity) {
2202 if (Quantity.isScalable())
2203 return DAG.getVScale(
2204 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2205
2206 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2207}
2208
2210 ElementCount EC) {
2211 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2212}
2213
2215 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2216}
2217
2219 ElementCount EC) {
2220 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2221 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2222 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2223 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2224}
2225
2227 APInt One(ResVT.getScalarSizeInBits(), 1);
2228 return getStepVector(DL, ResVT, One);
2229}
2230
2232 const APInt &StepVal) {
2233 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2234 if (ResVT.isScalableVector())
2235 return getNode(
2236 ISD::STEP_VECTOR, DL, ResVT,
2237 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2238
2239 SmallVector<SDValue, 16> OpsStepConstants;
2240 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2241 OpsStepConstants.push_back(
2242 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2243 return getBuildVector(ResVT, DL, OpsStepConstants);
2244}
2245
2246/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2247/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2252
2254 SDValue N2, ArrayRef<int> Mask) {
2255 assert(VT.getVectorNumElements() == Mask.size() &&
2256 "Must have the same number of vector elements as mask elements!");
2257 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2258 "Invalid VECTOR_SHUFFLE");
2259
2260 // Canonicalize shuffle undef, undef -> undef
2261 if (N1.isUndef() && N2.isUndef())
2262 return getUNDEF(VT);
2263
2264 // Validate that all indices in Mask are within the range of the elements
2265 // input to the shuffle.
2266 int NElts = Mask.size();
2267 assert(llvm::all_of(Mask,
2268 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2269 "Index out of range");
2270
2271 // Copy the mask so we can do any needed cleanup.
2272 SmallVector<int, 8> MaskVec(Mask);
2273
2274 // Canonicalize shuffle v, v -> v, undef
2275 if (N1 == N2) {
2276 N2 = getUNDEF(VT);
2277 for (int i = 0; i != NElts; ++i)
2278 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2279 }
2280
2281 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2282 if (N1.isUndef())
2283 commuteShuffle(N1, N2, MaskVec);
2284
2285 if (TLI->hasVectorBlend()) {
2286 // If shuffling a splat, try to blend the splat instead. We do this here so
2287 // that even when this arises during lowering we don't have to re-handle it.
2288 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2289 BitVector UndefElements;
2290 SDValue Splat = BV->getSplatValue(&UndefElements);
2291 if (!Splat)
2292 return;
2293
2294 for (int i = 0; i < NElts; ++i) {
2295 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2296 continue;
2297
2298 // If this input comes from undef, mark it as such.
2299 if (UndefElements[MaskVec[i] - Offset]) {
2300 MaskVec[i] = -1;
2301 continue;
2302 }
2303
2304 // If we can blend a non-undef lane, use that instead.
2305 if (!UndefElements[i])
2306 MaskVec[i] = i + Offset;
2307 }
2308 };
2309 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2310 BlendSplat(N1BV, 0);
2311 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2312 BlendSplat(N2BV, NElts);
2313 }
2314
2315 // Canonicalize all index into lhs, -> shuffle lhs, undef
2316 // Canonicalize all index into rhs, -> shuffle rhs, undef
2317 bool AllLHS = true, AllRHS = true;
2318 bool N2Undef = N2.isUndef();
2319 for (int i = 0; i != NElts; ++i) {
2320 if (MaskVec[i] >= NElts) {
2321 if (N2Undef)
2322 MaskVec[i] = -1;
2323 else
2324 AllLHS = false;
2325 } else if (MaskVec[i] >= 0) {
2326 AllRHS = false;
2327 }
2328 }
2329 if (AllLHS && AllRHS)
2330 return getUNDEF(VT);
2331 if (AllLHS && !N2Undef)
2332 N2 = getUNDEF(VT);
2333 if (AllRHS) {
2334 N1 = getUNDEF(VT);
2335 commuteShuffle(N1, N2, MaskVec);
2336 }
2337 // Reset our undef status after accounting for the mask.
2338 N2Undef = N2.isUndef();
2339 // Re-check whether both sides ended up undef.
2340 if (N1.isUndef() && N2Undef)
2341 return getUNDEF(VT);
2342
2343 // If Identity shuffle return that node.
2344 bool Identity = true, AllSame = true;
2345 for (int i = 0; i != NElts; ++i) {
2346 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2347 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2348 }
2349 if (Identity && NElts)
2350 return N1;
2351
2352 // Shuffling a constant splat doesn't change the result.
2353 if (N2Undef) {
2354 SDValue V = N1;
2355
2356 // Look through any bitcasts. We check that these don't change the number
2357 // (and size) of elements and just changes their types.
2358 while (V.getOpcode() == ISD::BITCAST)
2359 V = V->getOperand(0);
2360
2361 // A splat should always show up as a build vector node.
2362 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2363 BitVector UndefElements;
2364 SDValue Splat = BV->getSplatValue(&UndefElements);
2365 // If this is a splat of an undef, shuffling it is also undef.
2366 if (Splat && Splat.isUndef())
2367 return getUNDEF(VT);
2368
2369 bool SameNumElts =
2370 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2371
2372 // We only have a splat which can skip shuffles if there is a splatted
2373 // value and no undef lanes rearranged by the shuffle.
2374 if (Splat && UndefElements.none()) {
2375 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2376 // number of elements match or the value splatted is a zero constant.
2377 if (SameNumElts || isNullConstant(Splat))
2378 return N1;
2379 }
2380
2381 // If the shuffle itself creates a splat, build the vector directly.
2382 if (AllSame && SameNumElts) {
2383 EVT BuildVT = BV->getValueType(0);
2384 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2385 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2386
2387 // We may have jumped through bitcasts, so the type of the
2388 // BUILD_VECTOR may not match the type of the shuffle.
2389 if (BuildVT != VT)
2390 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2391 return NewBV;
2392 }
2393 }
2394 }
2395
2396 SDVTList VTs = getVTList(VT);
2398 SDValue Ops[2] = { N1, N2 };
2400 for (int i = 0; i != NElts; ++i)
2401 ID.AddInteger(MaskVec[i]);
2402
2403 void* IP = nullptr;
2404 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2405 return SDValue(E, 0);
2406
2407 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2408 // SDNode doesn't have access to it. This memory will be "leaked" when
2409 // the node is deallocated, but recovered when the NodeAllocator is released.
2410 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2411 llvm::copy(MaskVec, MaskAlloc);
2412
2413 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2414 dl.getDebugLoc(), MaskAlloc);
2415 createOperands(N, Ops);
2416
2417 CSEMap.InsertNode(N, IP);
2418 InsertNode(N);
2419 SDValue V = SDValue(N, 0);
2420 NewSDValueDbgMsg(V, "Creating new node: ", this);
2421 return V;
2422}
2423
2425 EVT VT = SV.getValueType(0);
2426 SmallVector<int, 8> MaskVec(SV.getMask());
2428
2429 SDValue Op0 = SV.getOperand(0);
2430 SDValue Op1 = SV.getOperand(1);
2431 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2432}
2433
2435 SDVTList VTs = getVTList(VT);
2437 AddNodeIDNode(ID, ISD::Register, VTs, {});
2438 ID.AddInteger(Reg.id());
2439 void *IP = nullptr;
2440 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2441 return SDValue(E, 0);
2442
2443 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2444 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2445 CSEMap.InsertNode(N, IP);
2446 InsertNode(N);
2447 return SDValue(N, 0);
2448}
2449
2452 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2453 ID.AddPointer(RegMask);
2454 void *IP = nullptr;
2455 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2456 return SDValue(E, 0);
2457
2458 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2459 CSEMap.InsertNode(N, IP);
2460 InsertNode(N);
2461 return SDValue(N, 0);
2462}
2463
2465 MCSymbol *Label) {
2466 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2467}
2468
2469SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2470 SDValue Root, MCSymbol *Label) {
2472 SDValue Ops[] = { Root };
2473 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2474 ID.AddPointer(Label);
2475 void *IP = nullptr;
2476 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2477 return SDValue(E, 0);
2478
2479 auto *N =
2480 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2481 createOperands(N, Ops);
2482
2483 CSEMap.InsertNode(N, IP);
2484 InsertNode(N);
2485 return SDValue(N, 0);
2486}
2487
2489 int64_t Offset, bool isTarget,
2490 unsigned TargetFlags) {
2491 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2492 SDVTList VTs = getVTList(VT);
2493
2495 AddNodeIDNode(ID, Opc, VTs, {});
2496 ID.AddPointer(BA);
2497 ID.AddInteger(Offset);
2498 ID.AddInteger(TargetFlags);
2499 void *IP = nullptr;
2500 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2501 return SDValue(E, 0);
2502
2503 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2504 CSEMap.InsertNode(N, IP);
2505 InsertNode(N);
2506 return SDValue(N, 0);
2507}
2508
2511 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2512 ID.AddPointer(V);
2513
2514 void *IP = nullptr;
2515 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2516 return SDValue(E, 0);
2517
2518 auto *N = newSDNode<SrcValueSDNode>(V);
2519 CSEMap.InsertNode(N, IP);
2520 InsertNode(N);
2521 return SDValue(N, 0);
2522}
2523
2526 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2527 ID.AddPointer(MD);
2528
2529 void *IP = nullptr;
2530 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2531 return SDValue(E, 0);
2532
2533 auto *N = newSDNode<MDNodeSDNode>(MD);
2534 CSEMap.InsertNode(N, IP);
2535 InsertNode(N);
2536 return SDValue(N, 0);
2537}
2538
2540 if (VT == V.getValueType())
2541 return V;
2542
2543 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2544}
2545
2547 unsigned SrcAS, unsigned DestAS) {
2548 SDVTList VTs = getVTList(VT);
2549 SDValue Ops[] = {Ptr};
2552 ID.AddInteger(SrcAS);
2553 ID.AddInteger(DestAS);
2554
2555 void *IP = nullptr;
2556 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2557 return SDValue(E, 0);
2558
2559 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2560 VTs, SrcAS, DestAS);
2561 createOperands(N, Ops);
2562
2563 CSEMap.InsertNode(N, IP);
2564 InsertNode(N);
2565 return SDValue(N, 0);
2566}
2567
2569 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2570}
2571
2573 UndefPoisonKind Kind) {
2574 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind))
2575 return V;
2576 return getFreeze(V);
2577}
2578
2579/// getShiftAmountOperand - Return the specified value casted to
2580/// the target's desired shift amount type.
2582 EVT OpTy = Op.getValueType();
2583 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2584 if (OpTy == ShTy || OpTy.isVector()) return Op;
2585
2586 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2587}
2588
2590 SDLoc dl(Node);
2592 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2593 EVT VT = Node->getValueType(0);
2594 SDValue Tmp1 = Node->getOperand(0);
2595 SDValue Tmp2 = Node->getOperand(1);
2596 const MaybeAlign MA(Node->getConstantOperandVal(3));
2597
2598 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2599 Tmp2, MachinePointerInfo(V));
2600 SDValue VAList = VAListLoad;
2601
2602 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2603 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2604 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2605
2606 VAList = getNode(
2607 ISD::AND, dl, VAList.getValueType(), VAList,
2608 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2609 }
2610
2611 // Increment the pointer, VAList, to the next vaarg
2612 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2613 getConstant(getDataLayout().getTypeAllocSize(
2614 VT.getTypeForEVT(*getContext())),
2615 dl, VAList.getValueType()));
2616 // Store the incremented VAList to the legalized pointer
2617 Tmp1 =
2618 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2619 // Load the actual argument out of the pointer VAList
2620 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2621}
2622
2624 SDLoc dl(Node);
2626 // This defaults to loading a pointer from the input and storing it to the
2627 // output, returning the chain.
2628 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2629 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2630 SDValue Tmp1 =
2631 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2632 Node->getOperand(2), MachinePointerInfo(VS));
2633 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2634 MachinePointerInfo(VD));
2635}
2636
2638 const DataLayout &DL = getDataLayout();
2639 Type *Ty = VT.getTypeForEVT(*getContext());
2640 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2641
2642 if (TLI->isTypeLegal(VT) || !VT.isVector())
2643 return RedAlign;
2644
2645 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2646 const Align StackAlign = TFI->getStackAlign();
2647
2648 // See if we can choose a smaller ABI alignment in cases where it's an
2649 // illegal vector type that will get broken down.
2650 if (RedAlign > StackAlign) {
2651 EVT IntermediateVT;
2652 MVT RegisterVT;
2653 unsigned NumIntermediates;
2654 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2655 NumIntermediates, RegisterVT);
2656 Ty = IntermediateVT.getTypeForEVT(*getContext());
2657 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2658 if (RedAlign2 < RedAlign)
2659 RedAlign = RedAlign2;
2660
2661 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2662 // If the stack is not realignable, the alignment should be limited to the
2663 // StackAlignment
2664 RedAlign = std::min(RedAlign, StackAlign);
2665 }
2666
2667 return RedAlign;
2668}
2669
2671 MachineFrameInfo &MFI = MF->getFrameInfo();
2672 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2673 int StackID = 0;
2674 if (Bytes.isScalable())
2675 StackID = TFI->getStackIDForScalableVectors();
2676 // The stack id gives an indication of whether the object is scalable or
2677 // not, so it's safe to pass in the minimum size here.
2678 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2679 false, nullptr, StackID);
2680 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2681}
2682
2684 Type *Ty = VT.getTypeForEVT(*getContext());
2685 Align StackAlign =
2686 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2687 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2688}
2689
2691 TypeSize VT1Size = VT1.getStoreSize();
2692 TypeSize VT2Size = VT2.getStoreSize();
2693 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2694 "Don't know how to choose the maximum size when creating a stack "
2695 "temporary");
2696 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2697 ? VT1Size
2698 : VT2Size;
2699
2700 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2701 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2702 const DataLayout &DL = getDataLayout();
2703 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2704 return CreateStackTemporary(Bytes, Align);
2705}
2706
2708 ISD::CondCode Cond, const SDLoc &dl,
2709 SDNodeFlags Flags) {
2710 EVT OpVT = N1.getValueType();
2711
2712 auto GetUndefBooleanConstant = [&]() {
2713 if (VT.getScalarType() == MVT::i1 ||
2714 TLI->getBooleanContents(OpVT) ==
2716 return getUNDEF(VT);
2717 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2718 // so we cannot use getUNDEF(). Return zero instead.
2719 return getConstant(0, dl, VT);
2720 };
2721
2722 // These setcc operations always fold.
2723 switch (Cond) {
2724 default: break;
2725 case ISD::SETFALSE:
2726 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2727 case ISD::SETTRUE:
2728 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2729
2730 case ISD::SETOEQ:
2731 case ISD::SETOGT:
2732 case ISD::SETOGE:
2733 case ISD::SETOLT:
2734 case ISD::SETOLE:
2735 case ISD::SETONE:
2736 case ISD::SETO:
2737 case ISD::SETUO:
2738 case ISD::SETUEQ:
2739 case ISD::SETUNE:
2740 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2741 break;
2742 }
2743
2744 if (OpVT.isInteger()) {
2745 // For EQ and NE, we can always pick a value for the undef to make the
2746 // predicate pass or fail, so we can return undef.
2747 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2748 // icmp eq/ne X, undef -> undef.
2749 if ((N1.isUndef() || N2.isUndef()) &&
2750 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2751 return GetUndefBooleanConstant();
2752
2753 // If both operands are undef, we can return undef for int comparison.
2754 // icmp undef, undef -> undef.
2755 if (N1.isUndef() && N2.isUndef())
2756 return GetUndefBooleanConstant();
2757
2758 // icmp X, X -> true/false
2759 // icmp X, undef -> true/false because undef could be X.
2760 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2761 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2762 }
2763
2765 const APInt &C2 = N2C->getAPIntValue();
2767 const APInt &C1 = N1C->getAPIntValue();
2768
2770 dl, VT, OpVT);
2771 }
2772 }
2773
2774 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2775 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2776
2777 if (N1CFP && N2CFP) {
2778 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2779 switch (Cond) {
2780 default: break;
2781 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2782 return GetUndefBooleanConstant();
2783 [[fallthrough]];
2784 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2785 OpVT);
2786 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2787 return GetUndefBooleanConstant();
2788 [[fallthrough]];
2790 R==APFloat::cmpLessThan, dl, VT,
2791 OpVT);
2792 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2793 return GetUndefBooleanConstant();
2794 [[fallthrough]];
2795 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2796 OpVT);
2797 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2798 return GetUndefBooleanConstant();
2799 [[fallthrough]];
2801 VT, OpVT);
2802 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2803 return GetUndefBooleanConstant();
2804 [[fallthrough]];
2806 R==APFloat::cmpEqual, dl, VT,
2807 OpVT);
2808 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2809 return GetUndefBooleanConstant();
2810 [[fallthrough]];
2812 R==APFloat::cmpEqual, dl, VT, OpVT);
2813 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2814 OpVT);
2815 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2816 OpVT);
2818 R==APFloat::cmpEqual, dl, VT,
2819 OpVT);
2820 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2821 OpVT);
2823 R==APFloat::cmpLessThan, dl, VT,
2824 OpVT);
2826 R==APFloat::cmpUnordered, dl, VT,
2827 OpVT);
2829 VT, OpVT);
2830 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2831 OpVT);
2832 }
2833 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2834 // Ensure that the constant occurs on the RHS.
2836 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2837 return SDValue();
2838 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chain=*/{},
2839 /*IsSignaling=*/false, Flags);
2840 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2841 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2842 // If an operand is known to be a nan (or undef that could be a nan), we can
2843 // fold it.
2844 // Choosing NaN for the undef will always make unordered comparison succeed
2845 // and ordered comparison fails.
2846 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2847 switch (ISD::getUnorderedFlavor(Cond)) {
2848 default:
2849 llvm_unreachable("Unknown flavor!");
2850 case 0: // Known false.
2851 return getBoolConstant(false, dl, VT, OpVT);
2852 case 1: // Known true.
2853 return getBoolConstant(true, dl, VT, OpVT);
2854 case 2: // Undefined.
2855 return GetUndefBooleanConstant();
2856 }
2857 }
2858
2859 // Could not fold it.
2860 return SDValue();
2861}
2862
2863/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2864/// use this predicate to simplify operations downstream.
2866 unsigned BitWidth = Op.getScalarValueSizeInBits();
2868}
2869
2870// TODO: Should have argument to specify if sign bit of nan is ignorable.
2872 if (Depth >= MaxRecursionDepth)
2873 return false; // Limit search depth.
2874
2875 unsigned Opc = Op.getOpcode();
2876 switch (Opc) {
2877 case ISD::FABS:
2878 return true;
2879 case ISD::AssertNoFPClass: {
2880 FPClassTest NoFPClass =
2881 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2882
2883 const FPClassTest TestMask = fcNan | fcNegative;
2884 return (NoFPClass & TestMask) == TestMask;
2885 }
2886 case ISD::ARITH_FENCE:
2887 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2888 case ISD::FEXP:
2889 case ISD::FEXP2:
2890 case ISD::FEXP10:
2891 return Op->getFlags().hasNoNaNs();
2892 case ISD::FMINNUM:
2893 case ISD::FMINNUM_IEEE:
2894 case ISD::FMINIMUM:
2895 case ISD::FMINIMUMNUM:
2896 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2897 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2898 case ISD::FMAXNUM:
2899 case ISD::FMAXNUM_IEEE:
2900 case ISD::FMAXIMUM:
2901 case ISD::FMAXIMUMNUM:
2902 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2903 // is sufficient.
2904 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2905 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2906 default:
2907 return false;
2908 }
2909
2910 llvm_unreachable("covered opcode switch");
2911}
2912
2913/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2914/// this predicate to simplify operations downstream. Mask is known to be zero
2915/// for bits that V cannot have.
2917 unsigned Depth) const {
2918 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2919}
2920
2921/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2922/// DemandedElts. We use this predicate to simplify operations downstream.
2923/// Mask is known to be zero for bits that V cannot have.
2925 const APInt &DemandedElts,
2926 unsigned Depth) const {
2927 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2928}
2929
2930/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2931/// DemandedElts. We use this predicate to simplify operations downstream.
2933 unsigned Depth /* = 0 */) const {
2934 return computeKnownBits(V, DemandedElts, Depth).isZero();
2935}
2936
2937/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2939 unsigned Depth) const {
2940 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2941}
2942
2944 const APInt &DemandedElts,
2945 unsigned Depth) const {
2946 EVT VT = Op.getValueType();
2947 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2948
2949 unsigned NumElts = VT.getVectorNumElements();
2950 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2951
2952 APInt KnownZeroElements = APInt::getZero(NumElts);
2953 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2954 if (!DemandedElts[EltIdx])
2955 continue; // Don't query elements that are not demanded.
2956 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2957 if (MaskedVectorIsZero(Op, Mask, Depth))
2958 KnownZeroElements.setBit(EltIdx);
2959 }
2960 return KnownZeroElements;
2961}
2962
2963/// isSplatValue - Return true if the vector V has the same value
2964/// across all DemandedElts. For scalable vectors, we don't know the
2965/// number of lanes at compile time. Instead, we use a 1 bit APInt
2966/// to represent a conservative value for all lanes; that is, that
2967/// one bit value is implicitly splatted across all lanes.
2968bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2969 APInt &UndefElts, unsigned Depth) const {
2970 unsigned Opcode = V.getOpcode();
2971 EVT VT = V.getValueType();
2972 assert(VT.isVector() && "Vector type expected");
2973 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2974 "scalable demanded bits are ignored");
2975
2976 if (!DemandedElts)
2977 return false; // No demanded elts, better to assume we don't know anything.
2978
2979 if (Depth >= MaxRecursionDepth)
2980 return false; // Limit search depth.
2981
2982 // Deal with some common cases here that work for both fixed and scalable
2983 // vector types.
2984 switch (Opcode) {
2985 case ISD::SPLAT_VECTOR:
2986 UndefElts = V.getOperand(0).isUndef()
2987 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2988 : APInt(DemandedElts.getBitWidth(), 0);
2989 return true;
2990 case ISD::ADD:
2991 case ISD::SUB:
2992 case ISD::AND:
2993 case ISD::XOR:
2994 case ISD::OR: {
2995 APInt UndefLHS, UndefRHS;
2996 SDValue LHS = V.getOperand(0);
2997 SDValue RHS = V.getOperand(1);
2998 // Only recognize splats with the same demanded undef elements for both
2999 // operands, otherwise we might fail to handle binop-specific undef
3000 // handling.
3001 // e.g. (and undef, 0) -> 0 etc.
3002 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
3003 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
3004 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
3005 UndefElts = UndefLHS | UndefRHS;
3006 return true;
3007 }
3008 return false;
3009 }
3010 case ISD::ABS:
3012 case ISD::TRUNCATE:
3013 case ISD::SIGN_EXTEND:
3014 case ISD::ZERO_EXTEND:
3015 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
3016 default:
3017 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
3018 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
3019 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
3020 Depth);
3021 break;
3022 }
3023
3024 // We don't support other cases than those above for scalable vectors at
3025 // the moment.
3026 if (VT.isScalableVector())
3027 return false;
3028
3029 unsigned NumElts = VT.getVectorNumElements();
3030 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3031 UndefElts = APInt::getZero(NumElts);
3032
3033 switch (Opcode) {
3034 case ISD::BUILD_VECTOR: {
3035 SDValue Scl;
3036 for (unsigned i = 0; i != NumElts; ++i) {
3037 SDValue Op = V.getOperand(i);
3038 if (Op.isUndef()) {
3039 UndefElts.setBit(i);
3040 continue;
3041 }
3042 if (!DemandedElts[i])
3043 continue;
3044 if (Scl && Scl != Op)
3045 return false;
3046 Scl = Op;
3047 }
3048 return true;
3049 }
3050 case ISD::VECTOR_SHUFFLE: {
3051 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3052 APInt DemandedLHS = APInt::getZero(NumElts);
3053 APInt DemandedRHS = APInt::getZero(NumElts);
3054 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3055 for (int i = 0; i != (int)NumElts; ++i) {
3056 int M = Mask[i];
3057 if (M < 0) {
3058 UndefElts.setBit(i);
3059 continue;
3060 }
3061 if (!DemandedElts[i])
3062 continue;
3063 if (M < (int)NumElts)
3064 DemandedLHS.setBit(M);
3065 else
3066 DemandedRHS.setBit(M - NumElts);
3067 }
3068
3069 // If we aren't demanding either op, assume there's no splat.
3070 // If we are demanding both ops, assume there's no splat.
3071 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3072 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3073 return false;
3074
3075 // See if the demanded elts of the source op is a splat or we only demand
3076 // one element, which should always be a splat.
3077 // TODO: Handle source ops splats with undefs.
3078 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3079 APInt SrcUndefs;
3080 return (SrcElts.popcount() == 1) ||
3081 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3082 (SrcElts & SrcUndefs).isZero());
3083 };
3084 if (!DemandedLHS.isZero())
3085 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3086 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3087 }
3089 // Offset the demanded elts by the subvector index.
3090 SDValue Src = V.getOperand(0);
3091 // We don't support scalable vectors at the moment.
3092 if (Src.getValueType().isScalableVector())
3093 return false;
3094 uint64_t Idx = V.getConstantOperandVal(1);
3095 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3096 APInt UndefSrcElts;
3097 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3098 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3099 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3100 return true;
3101 }
3102 break;
3103 }
3107 // Widen the demanded elts by the src element count.
3108 SDValue Src = V.getOperand(0);
3109 // We don't support scalable vectors at the moment.
3110 if (Src.getValueType().isScalableVector())
3111 return false;
3112 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3113 APInt UndefSrcElts;
3114 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3115 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3116 UndefElts = UndefSrcElts.trunc(NumElts);
3117 return true;
3118 }
3119 break;
3120 }
3121 case ISD::BITCAST: {
3122 SDValue Src = V.getOperand(0);
3123 EVT SrcVT = Src.getValueType();
3124 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3125 unsigned BitWidth = VT.getScalarSizeInBits();
3126
3127 // Ignore bitcasts from unsupported types.
3128 // TODO: Add fp support?
3129 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3130 break;
3131
3132 // Bitcast 'small element' vector to 'large element' vector.
3133 if ((BitWidth % SrcBitWidth) == 0) {
3134 // See if each sub element is a splat.
3135 unsigned Scale = BitWidth / SrcBitWidth;
3136 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3137 APInt ScaledDemandedElts =
3138 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3139 for (unsigned I = 0; I != Scale; ++I) {
3140 APInt SubUndefElts;
3141 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3142 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3143 SubDemandedElts &= ScaledDemandedElts;
3144 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3145 return false;
3146 // TODO: Add support for merging sub undef elements.
3147 if (!SubUndefElts.isZero())
3148 return false;
3149 }
3150 return true;
3151 }
3152 break;
3153 }
3154 }
3155
3156 return false;
3157}
3158
3159/// Helper wrapper to main isSplatValue function.
3160bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3161 EVT VT = V.getValueType();
3162 assert(VT.isVector() && "Vector type expected");
3163
3164 APInt UndefElts;
3165 // Since the number of lanes in a scalable vector is unknown at compile time,
3166 // we track one bit which is implicitly broadcast to all lanes. This means
3167 // that all lanes in a scalable vector are considered demanded.
3168 APInt DemandedElts
3170 return isSplatValue(V, DemandedElts, UndefElts) &&
3171 (AllowUndefs || !UndefElts);
3172}
3173
3176
3177 EVT VT = V.getValueType();
3178 unsigned Opcode = V.getOpcode();
3179 switch (Opcode) {
3180 default: {
3181 APInt UndefElts;
3182 // Since the number of lanes in a scalable vector is unknown at compile time,
3183 // we track one bit which is implicitly broadcast to all lanes. This means
3184 // that all lanes in a scalable vector are considered demanded.
3185 APInt DemandedElts
3187
3188 if (isSplatValue(V, DemandedElts, UndefElts)) {
3189 if (VT.isScalableVector()) {
3190 // DemandedElts and UndefElts are ignored for scalable vectors, since
3191 // the only supported cases are SPLAT_VECTOR nodes.
3192 SplatIdx = 0;
3193 } else {
3194 // Handle case where all demanded elements are UNDEF.
3195 if (DemandedElts.isSubsetOf(UndefElts)) {
3196 SplatIdx = 0;
3197 return getUNDEF(VT);
3198 }
3199 SplatIdx = (UndefElts & DemandedElts).countr_one();
3200 }
3201 return V;
3202 }
3203 break;
3204 }
3205 case ISD::SPLAT_VECTOR:
3206 SplatIdx = 0;
3207 return V;
3208 case ISD::VECTOR_SHUFFLE: {
3209 assert(!VT.isScalableVector());
3210 // Check if this is a shuffle node doing a splat.
3211 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3212 // getTargetVShiftNode currently struggles without the splat source.
3213 auto *SVN = cast<ShuffleVectorSDNode>(V);
3214 if (!SVN->isSplat())
3215 break;
3216 int Idx = SVN->getSplatIndex();
3217 int NumElts = V.getValueType().getVectorNumElements();
3218 SplatIdx = Idx % NumElts;
3219 return V.getOperand(Idx / NumElts);
3220 }
3221 }
3222
3223 return SDValue();
3224}
3225
3227 int SplatIdx;
3228 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3229 EVT SVT = SrcVector.getValueType().getScalarType();
3230 EVT LegalSVT = SVT;
3231 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3232 if (!SVT.isInteger())
3233 return SDValue();
3234 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3235 if (LegalSVT.bitsLT(SVT))
3236 return SDValue();
3237 }
3238 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3239 }
3240 return SDValue();
3241}
3242
3243std::optional<ConstantRange>
3245 unsigned Depth) const {
3246 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3247 V.getOpcode() == ISD::SRA) &&
3248 "Unknown shift node");
3249 // Shifting more than the bitwidth is not valid.
3250 unsigned BitWidth = V.getScalarValueSizeInBits();
3251
3252 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3253 const APInt &ShAmt = Cst->getAPIntValue();
3254 if (ShAmt.uge(BitWidth))
3255 return std::nullopt;
3256 return ConstantRange(ShAmt);
3257 }
3258
3259 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3260 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3261 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3262 if (!DemandedElts[i])
3263 continue;
3264 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3265 if (!SA) {
3266 MinAmt = MaxAmt = nullptr;
3267 break;
3268 }
3269 const APInt &ShAmt = SA->getAPIntValue();
3270 if (ShAmt.uge(BitWidth))
3271 return std::nullopt;
3272 if (!MinAmt || MinAmt->ugt(ShAmt))
3273 MinAmt = &ShAmt;
3274 if (!MaxAmt || MaxAmt->ult(ShAmt))
3275 MaxAmt = &ShAmt;
3276 }
3277 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3278 "Failed to find matching min/max shift amounts");
3279 if (MinAmt && MaxAmt)
3280 return ConstantRange(*MinAmt, *MaxAmt + 1);
3281 }
3282
3283 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3284 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3285 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3286 if (KnownAmt.getMaxValue().ult(BitWidth))
3287 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3288
3289 return std::nullopt;
3290}
3291
3292std::optional<unsigned>
3294 unsigned Depth) const {
3295 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3296 V.getOpcode() == ISD::SRA) &&
3297 "Unknown shift node");
3298 if (std::optional<ConstantRange> AmtRange =
3299 getValidShiftAmountRange(V, DemandedElts, Depth))
3300 if (const APInt *ShAmt = AmtRange->getSingleElement())
3301 return ShAmt->getZExtValue();
3302 return std::nullopt;
3303}
3304
3305std::optional<unsigned>
3307 APInt DemandedElts = getDemandAllEltsMask(V);
3308 return getValidShiftAmount(V, DemandedElts, Depth);
3309}
3310
3311std::optional<unsigned>
3313 unsigned Depth) const {
3314 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3315 V.getOpcode() == ISD::SRA) &&
3316 "Unknown shift node");
3317 if (std::optional<ConstantRange> AmtRange =
3318 getValidShiftAmountRange(V, DemandedElts, Depth))
3319 return AmtRange->getUnsignedMin().getZExtValue();
3320 return std::nullopt;
3321}
3322
3323std::optional<unsigned>
3325 APInt DemandedElts = getDemandAllEltsMask(V);
3326 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3327}
3328
3329std::optional<unsigned>
3331 unsigned Depth) const {
3332 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3333 V.getOpcode() == ISD::SRA) &&
3334 "Unknown shift node");
3335 if (std::optional<ConstantRange> AmtRange =
3336 getValidShiftAmountRange(V, DemandedElts, Depth))
3337 return AmtRange->getUnsignedMax().getZExtValue();
3338 return std::nullopt;
3339}
3340
3341std::optional<unsigned>
3343 APInt DemandedElts = getDemandAllEltsMask(V);
3344 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3345}
3346
3347/// Determine which bits of Op are known to be either zero or one and return
3348/// them in Known. For vectors, the known bits are those that are shared by
3349/// every vector element.
3351 APInt DemandedElts = getDemandAllEltsMask(Op);
3352 return computeKnownBits(Op, DemandedElts, Depth);
3353}
3354
3355/// Determine which bits of Op are known to be either zero or one and return
3356/// them in Known. The DemandedElts argument allows us to only collect the known
3357/// bits that are shared by the requested vector elements.
3359 unsigned Depth) const {
3360 unsigned BitWidth = Op.getScalarValueSizeInBits();
3361
3362 KnownBits Known(BitWidth); // Don't know anything.
3363
3364 if (auto OptAPInt = Op->bitcastToAPInt()) {
3365 // We know all of the bits for a constant!
3366 return KnownBits::makeConstant(*std::move(OptAPInt));
3367 }
3368
3369 if (Depth >= MaxRecursionDepth)
3370 return Known; // Limit search depth.
3371
3372 KnownBits Known2;
3373 unsigned NumElts = DemandedElts.getBitWidth();
3374 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3375 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3376 assert((!Op.getValueType().isFixedLengthVector() ||
3377 NumElts == Op.getValueType().getVectorNumElements()) &&
3378 "Unexpected vector size");
3379
3380 if (!DemandedElts)
3381 return Known; // No demanded elts, better to assume we don't know anything.
3382
3383 unsigned Opcode = Op.getOpcode();
3384 switch (Opcode) {
3385 case ISD::MERGE_VALUES:
3386 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3387 Depth + 1);
3388 case ISD::SPLAT_VECTOR: {
3389 SDValue SrcOp = Op.getOperand(0);
3390 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3391 "Expected SPLAT_VECTOR implicit truncation");
3392 // Implicitly truncate the bits to match the official semantics of
3393 // SPLAT_VECTOR.
3394 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
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);
3501 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
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::CLMUL: {
3956 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3957 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3958 Known = KnownBits::clmul(Known, Known2);
3959 break;
3960 }
3961 case ISD::MGATHER:
3962 case ISD::MLOAD: {
3963 ISD::LoadExtType ETy =
3964 (Opcode == ISD::MGATHER)
3965 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3966 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3967 if (ETy == ISD::ZEXTLOAD) {
3968 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3969 KnownBits Known0(MemVT.getScalarSizeInBits());
3970 return Known0.zext(BitWidth);
3971 }
3972 break;
3973 }
3974 case ISD::LOAD: {
3976 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3977 if (ISD::isNON_EXTLoad(LD) && Cst) {
3978 // Determine any common known bits from the loaded constant pool value.
3979 Type *CstTy = Cst->getType();
3980 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3981 !Op.getValueType().isScalableVector()) {
3982 // If its a vector splat, then we can (quickly) reuse the scalar path.
3983 // NOTE: We assume all elements match and none are UNDEF.
3984 if (CstTy->isVectorTy()) {
3985 if (const Constant *Splat = Cst->getSplatValue()) {
3986 Cst = Splat;
3987 CstTy = Cst->getType();
3988 }
3989 }
3990 // TODO - do we need to handle different bitwidths?
3991 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3992 // Iterate across all vector elements finding common known bits.
3993 Known.setAllConflict();
3994 for (unsigned i = 0; i != NumElts; ++i) {
3995 if (!DemandedElts[i])
3996 continue;
3997 if (Constant *Elt = Cst->getAggregateElement(i)) {
3998 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
3999 const APInt &Value = CInt->getValue();
4000 Known.One &= Value;
4001 Known.Zero &= ~Value;
4002 continue;
4003 }
4004 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
4005 APInt Value = CFP->getValueAPF().bitcastToAPInt();
4006 Known.One &= Value;
4007 Known.Zero &= ~Value;
4008 continue;
4009 }
4010 }
4011 Known.One.clearAllBits();
4012 Known.Zero.clearAllBits();
4013 break;
4014 }
4015 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4016 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4017 Known = KnownBits::makeConstant(CInt->getValue());
4018 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4019 Known =
4020 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4021 }
4022 }
4023 }
4024 } else if (Op.getResNo() == 0) {
4025 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4026 KnownBits KnownScalarMemory(ScalarMemorySize);
4027 if (const MDNode *MD = LD->getRanges())
4028 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4029
4030 // Extend the Known bits from memory to the size of the scalar result.
4031 if (ISD::isZEXTLoad(Op.getNode()))
4032 Known = KnownScalarMemory.zext(BitWidth);
4033 else if (ISD::isSEXTLoad(Op.getNode()))
4034 Known = KnownScalarMemory.sext(BitWidth);
4035 else if (ISD::isEXTLoad(Op.getNode()))
4036 Known = KnownScalarMemory.anyext(BitWidth);
4037 else
4038 Known = KnownScalarMemory;
4039 assert(Known.getBitWidth() == BitWidth);
4040 return Known;
4041 }
4042 break;
4043 }
4045 if (Op.getValueType().isScalableVector())
4046 break;
4047 EVT InVT = Op.getOperand(0).getValueType();
4048 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4049 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4050 Known = Known.zext(BitWidth);
4051 break;
4052 }
4053 case ISD::ZERO_EXTEND: {
4054 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4055 Known = Known.zext(BitWidth);
4056 break;
4057 }
4059 if (Op.getValueType().isScalableVector())
4060 break;
4061 EVT InVT = Op.getOperand(0).getValueType();
4062 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4063 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4064 // If the sign bit is known to be zero or one, then sext will extend
4065 // it to the top bits, else it will just zext.
4066 Known = Known.sext(BitWidth);
4067 break;
4068 }
4069 case ISD::SIGN_EXTEND: {
4070 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4071 // If the sign bit is known to be zero or one, then sext will extend
4072 // it to the top bits, else it will just zext.
4073 Known = Known.sext(BitWidth);
4074 break;
4075 }
4077 if (Op.getValueType().isScalableVector())
4078 break;
4079 EVT InVT = Op.getOperand(0).getValueType();
4080 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4081 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4082 Known = Known.anyext(BitWidth);
4083 break;
4084 }
4085 case ISD::ANY_EXTEND: {
4086 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4087 Known = Known.anyext(BitWidth);
4088 break;
4089 }
4090 case ISD::TRUNCATE: {
4091 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4092 Known = Known.trunc(BitWidth);
4093 break;
4094 }
4095 case ISD::TRUNCATE_SSAT_S: {
4096 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4097 Known = Known.truncSSat(BitWidth);
4098 break;
4099 }
4100 case ISD::TRUNCATE_SSAT_U: {
4101 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4102 Known = Known.truncSSatU(BitWidth);
4103 break;
4104 }
4105 case ISD::TRUNCATE_USAT_U: {
4106 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4107 Known = Known.truncUSat(BitWidth);
4108 break;
4109 }
4110 case ISD::AssertZext: {
4111 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4113 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4114 Known.Zero |= (~InMask);
4115 Known.One &= (~Known.Zero);
4116 break;
4117 }
4118 case ISD::AssertAlign: {
4119 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4120 assert(LogOfAlign != 0);
4121
4122 // TODO: Should use maximum with source
4123 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4124 // well as clearing one bits.
4125 Known.Zero.setLowBits(LogOfAlign);
4126 Known.One.clearLowBits(LogOfAlign);
4127 break;
4128 }
4129 case ISD::AssertNoFPClass: {
4130 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4131
4132 FPClassTest NoFPClass =
4133 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4134 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4135 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4136 // Cannot be negative.
4137 Known.makeNonNegative();
4138 }
4139
4140 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4141 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4142 // Cannot be positive.
4143 Known.makeNegative();
4144 }
4145
4146 break;
4147 }
4148 case ISD::FABS:
4149 // fabs clears the sign bit
4150 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4151 Known.makeNonNegative();
4152 break;
4153 case ISD::FGETSIGN:
4154 // All bits are zero except the low bit.
4155 Known.Zero.setBitsFrom(1);
4156 break;
4157 case ISD::ADD: {
4158 SDNodeFlags Flags = Op.getNode()->getFlags();
4159 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4160 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4161 bool SelfAdd = Op.getOperand(0) == Op.getOperand(1) &&
4163 Op.getOperand(0), DemandedElts,
4165 Known = KnownBits::add(Known, Known2, Flags.hasNoSignedWrap(),
4166 Flags.hasNoUnsignedWrap(), SelfAdd);
4167 break;
4168 }
4169 case ISD::SUB: {
4170 SDNodeFlags Flags = Op.getNode()->getFlags();
4171 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4172 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4173 Known = KnownBits::sub(Known, Known2, Flags.hasNoSignedWrap(),
4174 Flags.hasNoUnsignedWrap());
4175 break;
4176 }
4177 case ISD::USUBO:
4178 case ISD::SSUBO:
4179 case ISD::USUBO_CARRY:
4180 case ISD::SSUBO_CARRY:
4181 if (Op.getResNo() == 1) {
4182 // If we know the result of a setcc has the top bits zero, use this info.
4183 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4185 BitWidth > 1)
4186 Known.Zero.setBitsFrom(1);
4187 break;
4188 }
4189 [[fallthrough]];
4190 case ISD::SUBC: {
4191 assert(Op.getResNo() == 0 &&
4192 "We only compute knownbits for the difference here.");
4193
4194 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4195 KnownBits Borrow(1);
4196 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4197 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4198 // Borrow has bit width 1
4199 Borrow = Borrow.trunc(1);
4200 } else {
4201 Borrow.setAllZero();
4202 }
4203
4204 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4205 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4206 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4207 break;
4208 }
4209 case ISD::UADDO:
4210 case ISD::SADDO:
4211 case ISD::UADDO_CARRY:
4212 case ISD::SADDO_CARRY:
4213 if (Op.getResNo() == 1) {
4214 // If we know the result of a setcc has the top bits zero, use this info.
4215 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4217 BitWidth > 1)
4218 Known.Zero.setBitsFrom(1);
4219 break;
4220 }
4221 [[fallthrough]];
4222 case ISD::ADDC:
4223 case ISD::ADDE: {
4224 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4225
4226 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4227 KnownBits Carry(1);
4228 if (Opcode == ISD::ADDE)
4229 // Can't track carry from glue, set carry to unknown.
4230 Carry.resetAll();
4231 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4232 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4233 // Carry has bit width 1
4234 Carry = Carry.trunc(1);
4235 } else {
4236 Carry.setAllZero();
4237 }
4238
4239 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4240 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4241 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4242 break;
4243 }
4244 case ISD::UDIV: {
4245 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4246 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4247 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4248 break;
4249 }
4250 case ISD::SDIV: {
4251 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4252 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4253 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4254 break;
4255 }
4256 case ISD::SREM: {
4257 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4258 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4259 Known = KnownBits::srem(Known, Known2);
4260 break;
4261 }
4262 case ISD::UREM: {
4263 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4264 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4265 Known = KnownBits::urem(Known, Known2);
4266 break;
4267 }
4268 case ISD::EXTRACT_ELEMENT: {
4269 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4270 const unsigned Index = Op.getConstantOperandVal(1);
4271 const unsigned EltBitWidth = Op.getValueSizeInBits();
4272
4273 // Remove low part of known bits mask
4274 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4275 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4276
4277 // Remove high part of known bit mask
4278 Known = Known.trunc(EltBitWidth);
4279 break;
4280 }
4282 SDValue InVec = Op.getOperand(0);
4283 SDValue EltNo = Op.getOperand(1);
4284 EVT VecVT = InVec.getValueType();
4285 // computeKnownBits not yet implemented for scalable vectors.
4286 if (VecVT.isScalableVector())
4287 break;
4288 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4289 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4290
4291 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4292 // anything about the extended bits.
4293 if (BitWidth > EltBitWidth)
4294 Known = Known.trunc(EltBitWidth);
4295
4296 // If we know the element index, just demand that vector element, else for
4297 // an unknown element index, ignore DemandedElts and demand them all.
4298 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4299 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4300 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4301 DemandedSrcElts =
4302 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4303
4304 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4305 if (BitWidth > EltBitWidth)
4306 Known = Known.anyext(BitWidth);
4307 break;
4308 }
4310 if (Op.getValueType().isScalableVector())
4311 break;
4312
4313 // If we know the element index, split the demand between the
4314 // source vector and the inserted element, otherwise assume we need
4315 // the original demanded vector elements and the value.
4316 SDValue InVec = Op.getOperand(0);
4317 SDValue InVal = Op.getOperand(1);
4318 SDValue EltNo = Op.getOperand(2);
4319 bool DemandedVal = true;
4320 APInt DemandedVecElts = DemandedElts;
4321 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4322 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4323 unsigned EltIdx = CEltNo->getZExtValue();
4324 DemandedVal = !!DemandedElts[EltIdx];
4325 DemandedVecElts.clearBit(EltIdx);
4326 }
4327 Known.setAllConflict();
4328 if (DemandedVal) {
4329 Known2 = computeKnownBits(InVal, Depth + 1);
4330 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4331 }
4332 if (!!DemandedVecElts) {
4333 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4334 Known = Known.intersectWith(Known2);
4335 }
4336 break;
4337 }
4338 case ISD::BITREVERSE: {
4339 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4340 Known = Known2.reverseBits();
4341 break;
4342 }
4343 case ISD::BSWAP: {
4344 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4345 Known = Known2.byteSwap();
4346 break;
4347 }
4348 case ISD::ABS:
4349 case ISD::ABS_MIN_POISON: {
4350 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4351 Known = Known2.abs();
4352 Known.Zero.setHighBits(
4353 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4354 break;
4355 }
4356 case ISD::USUBSAT: {
4357 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4358 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4359 Known = KnownBits::usub_sat(Known, Known2);
4360 break;
4361 }
4362 case ISD::UMIN: {
4363 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4364 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4365 Known = KnownBits::umin(Known, Known2);
4366 break;
4367 }
4368 case ISD::UMAX: {
4369 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4370 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4371 Known = KnownBits::umax(Known, Known2);
4372 break;
4373 }
4374 case ISD::SMIN:
4375 case ISD::SMAX: {
4376 // If we have a clamp pattern, we know that the number of sign bits will be
4377 // the minimum of the clamp min/max range.
4378 bool IsMax = (Opcode == ISD::SMAX);
4379 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4380 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4381 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4382 CstHigh =
4383 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4384 if (CstLow && CstHigh) {
4385 if (!IsMax)
4386 std::swap(CstLow, CstHigh);
4387
4388 const APInt &ValueLow = CstLow->getAPIntValue();
4389 const APInt &ValueHigh = CstHigh->getAPIntValue();
4390 if (ValueLow.sle(ValueHigh)) {
4391 unsigned LowSignBits = ValueLow.getNumSignBits();
4392 unsigned HighSignBits = ValueHigh.getNumSignBits();
4393 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4394 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4395 Known.One.setHighBits(MinSignBits);
4396 break;
4397 }
4398 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4399 Known.Zero.setHighBits(MinSignBits);
4400 break;
4401 }
4402 }
4403 }
4404
4405 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4406 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4407 if (IsMax)
4408 Known = KnownBits::smax(Known, Known2);
4409 else
4410 Known = KnownBits::smin(Known, Known2);
4411
4412 // For SMAX, if CstLow is non-negative we know the result will be
4413 // non-negative and thus all sign bits are 0.
4414 // TODO: There's an equivalent of this for smin with negative constant for
4415 // known ones.
4416 if (IsMax && CstLow) {
4417 const APInt &ValueLow = CstLow->getAPIntValue();
4418 if (ValueLow.isNonNegative()) {
4419 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4420 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4421 }
4422 }
4423
4424 break;
4425 }
4426 case ISD::UINT_TO_FP: {
4427 Known.makeNonNegative();
4428 break;
4429 }
4430 case ISD::SINT_TO_FP: {
4431 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4432 if (Known2.isNonNegative())
4433 Known.makeNonNegative();
4434 else if (Known2.isNegative())
4435 Known.makeNegative();
4436 break;
4437 }
4438 case ISD::FP_TO_UINT_SAT: {
4439 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4440 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4442 break;
4443 }
4444 case ISD::ATOMIC_LOAD: {
4445 // If we are looking at the loaded value.
4446 if (Op.getResNo() == 0) {
4447 auto *AT = cast<AtomicSDNode>(Op);
4448 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4449 KnownBits KnownScalarMemory(ScalarMemorySize);
4450 if (const MDNode *MD = AT->getRanges())
4451 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4452
4453 switch (AT->getExtensionType()) {
4454 case ISD::ZEXTLOAD:
4455 Known = KnownScalarMemory.zext(BitWidth);
4456 break;
4457 case ISD::SEXTLOAD:
4458 Known = KnownScalarMemory.sext(BitWidth);
4459 break;
4460 case ISD::EXTLOAD:
4461 switch (TLI->getExtendForAtomicOps()) {
4462 case ISD::ZERO_EXTEND:
4463 Known = KnownScalarMemory.zext(BitWidth);
4464 break;
4465 case ISD::SIGN_EXTEND:
4466 Known = KnownScalarMemory.sext(BitWidth);
4467 break;
4468 default:
4469 Known = KnownScalarMemory.anyext(BitWidth);
4470 break;
4471 }
4472 break;
4473 case ISD::NON_EXTLOAD:
4474 Known = KnownScalarMemory;
4475 break;
4476 }
4477 assert(Known.getBitWidth() == BitWidth);
4478 }
4479 break;
4480 }
4482 if (Op.getResNo() == 1) {
4483 // The boolean result conforms to getBooleanContents.
4484 // If we know the result of a setcc has the top bits zero, use this info.
4485 // We know that we have an integer-based boolean since these operations
4486 // are only available for integer.
4487 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4489 BitWidth > 1)
4490 Known.Zero.setBitsFrom(1);
4491 break;
4492 }
4493 [[fallthrough]];
4495 case ISD::ATOMIC_SWAP:
4506 case ISD::ATOMIC_LOAD_UMAX: {
4507 // If we are looking at the loaded value.
4508 if (Op.getResNo() == 0) {
4509 auto *AT = cast<AtomicSDNode>(Op);
4510 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4511
4512 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4513 Known.Zero.setBitsFrom(MemBits);
4514 }
4515 break;
4516 }
4517 case ISD::FrameIndex:
4519 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4520 Known, getMachineFunction());
4521 break;
4522
4523 default:
4524 if (Opcode < ISD::BUILTIN_OP_END)
4525 break;
4526 [[fallthrough]];
4530 // TODO: Probably okay to remove after audit; here to reduce change size
4531 // in initial enablement patch for scalable vectors
4532 if (Op.getValueType().isScalableVector())
4533 break;
4534
4535 // Allow the target to implement this method for its nodes.
4536 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4537 break;
4538 }
4539
4540 return Known;
4541}
4542
4543/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4556
4559 // X + 0 never overflow
4560 if (isNullConstant(N1))
4561 return OFK_Never;
4562
4563 // If both operands each have at least two sign bits, the addition
4564 // cannot overflow.
4565 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4566 return OFK_Never;
4567
4568 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4569 return OFK_Sometime;
4570}
4571
4574 // X + 0 never overflow
4575 if (isNullConstant(N1))
4576 return OFK_Never;
4577
4578 // mulhi + 1 never overflow
4579 KnownBits N1Known = computeKnownBits(N1);
4580 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4581 N1Known.getMaxValue().ult(2))
4582 return OFK_Never;
4583
4584 KnownBits N0Known = computeKnownBits(N0);
4585 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4586 N0Known.getMaxValue().ult(2))
4587 return OFK_Never;
4588
4589 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4590 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4591 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4592 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4593}
4594
4597 // X - 0 never overflow
4598 if (isNullConstant(N1))
4599 return OFK_Never;
4600
4601 // If both operands each have at least two sign bits, the subtraction
4602 // cannot overflow.
4603 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4604 return OFK_Never;
4605
4606 KnownBits N0Known = computeKnownBits(N0);
4607 KnownBits N1Known = computeKnownBits(N1);
4608 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4609 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4610 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4611}
4612
4615 // X - 0 never overflow
4616 if (isNullConstant(N1))
4617 return OFK_Never;
4618
4619 ConstantRange N0Range =
4620 computeConstantRangeIncludingKnownBits(N0, /*ForSigned=*/false);
4621 ConstantRange N1Range =
4622 computeConstantRangeIncludingKnownBits(N1, /*ForSigned=*/false);
4623 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4624}
4625
4628 // X * 0 and X * 1 never overflow.
4629 if (isNullConstant(N1) || isOneConstant(N1))
4630 return OFK_Never;
4631
4634 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4635}
4636
4639 // X * 0 and X * 1 never overflow.
4640 if (isNullConstant(N1) || isOneConstant(N1))
4641 return OFK_Never;
4642
4643 // Get the size of the result.
4644 unsigned BitWidth = N0.getScalarValueSizeInBits();
4645
4646 // Sum of the sign bits.
4647 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4648
4649 // If we have enough sign bits, then there's no overflow.
4650 if (SignBits > BitWidth + 1)
4651 return OFK_Never;
4652
4653 if (SignBits == BitWidth + 1) {
4654 // The overflow occurs when the true multiplication of the
4655 // the operands is the minimum negative number.
4656 KnownBits N0Known = computeKnownBits(N0);
4657 KnownBits N1Known = computeKnownBits(N1);
4658 // If one of the operands is non-negative, then there's no
4659 // overflow.
4660 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4661 return OFK_Never;
4662 }
4663
4664 return OFK_Sometime;
4665}
4666
4668 unsigned Depth) const {
4669 APInt DemandedElts = getDemandAllEltsMask(Op);
4670 return computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4671}
4672
4674 const APInt &DemandedElts,
4675 bool ForSigned,
4676 unsigned Depth) const {
4677 EVT VT = Op.getValueType();
4678 unsigned BitWidth = VT.getScalarSizeInBits();
4679
4680 if (Depth >= MaxRecursionDepth)
4681 return ConstantRange::getFull(BitWidth);
4682
4683 if (ConstantSDNode *C = isConstOrConstSplat(Op, DemandedElts))
4684 return ConstantRange(C->getAPIntValue());
4685
4686 unsigned Opcode = Op.getOpcode();
4687 switch (Opcode) {
4688 case ISD::VSCALE: {
4690 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
4691 return getVScaleRange(&F, BitWidth).multiply(Multiplier);
4692 }
4693 default:
4694 break;
4695 }
4696
4697 return ConstantRange::getFull(BitWidth);
4698}
4699
4702 unsigned Depth) const {
4703 APInt DemandedElts = getDemandAllEltsMask(Op);
4704 return computeConstantRangeIncludingKnownBits(Op, DemandedElts, ForSigned,
4705 Depth);
4706}
4707
4709 SDValue Op, const APInt &DemandedElts, bool ForSigned,
4710 unsigned Depth) const {
4711 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
4712 ConstantRange CR1 = ConstantRange::fromKnownBits(Known, ForSigned);
4713 ConstantRange CR2 = computeConstantRange(Op, DemandedElts, ForSigned, Depth);
4716 return CR1.intersectWith(CR2, RangeType);
4717}
4718
4720 unsigned Depth) const {
4721 APInt DemandedElts = getDemandAllEltsMask(Val);
4722 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4723}
4724
4726 const APInt &DemandedElts,
4727 bool OrZero, unsigned Depth) const {
4728 if (Depth >= MaxRecursionDepth)
4729 return false; // Limit search depth.
4730
4731 EVT OpVT = Val.getValueType();
4732 unsigned BitWidth = OpVT.getScalarSizeInBits();
4733 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4734 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4735 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4736 assert(
4737 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4738 "Unexpected vector size");
4739
4740 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4741 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4742 return (OrZero && V.isZero()) || V.isPowerOf2();
4743 };
4744
4745 // Is the constant a known power of 2 or zero?
4746 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4747 return true;
4748
4749 switch (Val.getOpcode()) {
4750 case ISD::BUILD_VECTOR:
4751 // Are all operands of a build vector constant powers of two or zero?
4752 if (all_of(enumerate(Val->ops()), [&](auto P) {
4753 auto *C = dyn_cast<ConstantSDNode>(P.value());
4754 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4755 }))
4756 return true;
4757 break;
4758
4759 case ISD::SPLAT_VECTOR:
4760 // Is the operand of a splat vector a constant power of two?
4761 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4762 if (IsPowerOfTwoOrZero(C))
4763 return true;
4764 break;
4765
4767 SDValue InVec = Val.getOperand(0);
4768 SDValue EltNo = Val.getOperand(1);
4769 EVT VecVT = InVec.getValueType();
4770
4771 // Skip scalable vectors or implicit extensions.
4772 if (VecVT.isScalableVector() ||
4773 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4774 break;
4775
4776 // If we know the element index, just demand that vector element, else for
4777 // an unknown element index, ignore DemandedElts and demand them all.
4778 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4779 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4780 APInt DemandedSrcElts =
4781 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4782 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4783 : APInt::getAllOnes(NumSrcElts);
4784 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4785 }
4786
4787 case ISD::AND: {
4788 // Looking for `x & -x` pattern:
4789 // If x == 0:
4790 // x & -x -> 0
4791 // If x != 0:
4792 // x & -x -> non-zero pow2
4793 // so if we find the pattern return whether we know `x` is non-zero.
4794 SDValue X, Z;
4795 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))) ||
4796 (sd_match(Val, m_And(m_Value(X), m_Sub(m_Value(Z), m_Deferred(X)))) &&
4797 MaskedVectorIsZero(Z, DemandedElts, Depth + 1)))
4798 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4799 break;
4800 }
4801
4802 case ISD::SHL: {
4803 // A left-shift of a constant one will have exactly one bit set because
4804 // shifting the bit off the end is undefined.
4805 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4806 if (C && C->getAPIntValue() == 1)
4807 return true;
4808 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4809 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4810 Depth + 1);
4811 }
4812
4813 case ISD::SRL: {
4814 // A logical right-shift of a constant sign-bit will have exactly
4815 // one bit set.
4816 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4817 if (C && C->getAPIntValue().isSignMask())
4818 return true;
4819 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4820 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4821 Depth + 1);
4822 }
4823
4824 case ISD::TRUNCATE:
4825 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4826 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4827 Depth + 1);
4828
4829 case ISD::ROTL:
4830 case ISD::ROTR:
4831 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4832 Depth + 1);
4833 case ISD::BSWAP:
4834 case ISD::BITREVERSE:
4835 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4836 Depth + 1);
4837
4838 case ISD::SMIN:
4839 case ISD::SMAX:
4840 case ISD::UMIN:
4841 case ISD::UMAX:
4842 return isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4843 Depth + 1) &&
4844 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4845 Depth + 1);
4846
4847 case ISD::SELECT:
4848 case ISD::VSELECT:
4849 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4850 Depth + 1) &&
4851 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4852 Depth + 1);
4853
4854 case ISD::ZERO_EXTEND:
4855 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4856 Depth + 1);
4857
4858 case ISD::VSCALE:
4859 // vscale(power-of-two) is a power-of-two
4860 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4861 Depth + 1);
4862
4863 case ISD::VECTOR_SHUFFLE: {
4865 // Demanded elements with undef shuffle mask elements are unknown
4866 // - we cannot guarantee they are a power of two, so return false.
4867 APInt DemandedLHS, DemandedRHS;
4869 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4870 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4871 DemandedLHS, DemandedRHS))
4872 return false;
4873
4874 // All demanded elements from LHS must be known power of two.
4875 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4876 OrZero, Depth + 1))
4877 return false;
4878
4879 // All demanded elements from RHS must be known power of two.
4880 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4881 OrZero, Depth + 1))
4882 return false;
4883
4884 return true;
4885 }
4886 }
4887
4888 // More could be done here, though the above checks are enough
4889 // to handle some common cases.
4890 return false;
4891}
4892
4894 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4895 return C1->getValueAPF().getExactLog2Abs() >= 0;
4896
4897 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4898 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4899
4900 return false;
4901}
4902
4904 APInt DemandedElts = getDemandAllEltsMask(Op);
4905 return ComputeNumSignBits(Op, DemandedElts, Depth);
4906}
4907
4908unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4909 unsigned Depth) const {
4910 EVT VT = Op.getValueType();
4911 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4912 unsigned VTBits = VT.getScalarSizeInBits();
4913 unsigned NumElts = DemandedElts.getBitWidth();
4914 unsigned Tmp, Tmp2;
4915 unsigned FirstAnswer = 1;
4916
4917 assert((!VT.isScalableVector() || NumElts == 1) &&
4918 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4919
4920 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4921 const APInt &Val = C->getAPIntValue();
4922 return Val.getNumSignBits();
4923 }
4924
4925 if (Depth >= MaxRecursionDepth)
4926 return 1; // Limit search depth.
4927
4928 if (!DemandedElts)
4929 return 1; // No demanded elts, better to assume we don't know anything.
4930
4931 unsigned Opcode = Op.getOpcode();
4932 switch (Opcode) {
4933 default: break;
4934 case ISD::AssertSext:
4935 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4936 return VTBits-Tmp+1;
4937 case ISD::AssertZext:
4938 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4939 return VTBits-Tmp;
4940 case ISD::FREEZE:
4941 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4943 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4944 break;
4945 case ISD::MERGE_VALUES:
4946 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4947 Depth + 1);
4948 case ISD::SPLAT_VECTOR: {
4949 // Check if the sign bits of source go down as far as the truncated value.
4950 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4951 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4952 if (NumSrcSignBits > (NumSrcBits - VTBits))
4953 return NumSrcSignBits - (NumSrcBits - VTBits);
4954 break;
4955 }
4956 case ISD::BUILD_VECTOR:
4957 assert(!VT.isScalableVector());
4958 Tmp = VTBits;
4959 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4960 if (!DemandedElts[i])
4961 continue;
4962
4963 SDValue SrcOp = Op.getOperand(i);
4964 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4965 // for constant nodes to ensure we only look at the sign bits.
4967 APInt T = C->getAPIntValue().trunc(VTBits);
4968 Tmp2 = T.getNumSignBits();
4969 } else {
4970 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4971
4972 if (SrcOp.getValueSizeInBits() != VTBits) {
4973 assert(SrcOp.getValueSizeInBits() > VTBits &&
4974 "Expected BUILD_VECTOR implicit truncation");
4975 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4976 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4977 }
4978 }
4979 Tmp = std::min(Tmp, Tmp2);
4980 }
4981 return Tmp;
4982
4983 case ISD::VECTOR_COMPRESS: {
4984 SDValue Vec = Op.getOperand(0);
4985 SDValue PassThru = Op.getOperand(2);
4986 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4987 if (Tmp == 1)
4988 return 1;
4989 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
4990 Tmp = std::min(Tmp, Tmp2);
4991 return Tmp;
4992 }
4993
4994 case ISD::VECTOR_SHUFFLE: {
4995 // Collect the minimum number of sign bits that are shared by every vector
4996 // element referenced by the shuffle.
4997 APInt DemandedLHS, DemandedRHS;
4999 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
5000 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
5001 DemandedLHS, DemandedRHS))
5002 return 1;
5003
5004 Tmp = std::numeric_limits<unsigned>::max();
5005 if (!!DemandedLHS)
5006 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
5007 if (!!DemandedRHS) {
5008 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
5009 Tmp = std::min(Tmp, Tmp2);
5010 }
5011 // If we don't know anything, early out and try computeKnownBits fall-back.
5012 if (Tmp == 1)
5013 break;
5014 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5015 return Tmp;
5016 }
5017
5018 case ISD::BITCAST: {
5019 if (VT.isScalableVector())
5020 break;
5021 SDValue N0 = Op.getOperand(0);
5022 EVT SrcVT = N0.getValueType();
5023 unsigned SrcBits = SrcVT.getScalarSizeInBits();
5024
5025 // Ignore bitcasts from unsupported types..
5026 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
5027 break;
5028
5029 // Fast handling of 'identity' bitcasts.
5030 if (VTBits == SrcBits)
5031 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
5032
5033 bool IsLE = getDataLayout().isLittleEndian();
5034
5035 // Bitcast 'large element' scalar/vector to 'small element' vector.
5036 if ((SrcBits % VTBits) == 0) {
5037 assert(VT.isVector() && "Expected bitcast to vector");
5038
5039 unsigned Scale = SrcBits / VTBits;
5040 APInt SrcDemandedElts =
5041 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
5042
5043 // Fast case - sign splat can be simply split across the small elements.
5044 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
5045 if (Tmp == SrcBits)
5046 return VTBits;
5047
5048 // Slow case - determine how far the sign extends into each sub-element.
5049 Tmp2 = VTBits;
5050 for (unsigned i = 0; i != NumElts; ++i)
5051 if (DemandedElts[i]) {
5052 unsigned SubOffset = i % Scale;
5053 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
5054 SubOffset = SubOffset * VTBits;
5055 if (Tmp <= SubOffset)
5056 return 1;
5057 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
5058 }
5059 return Tmp2;
5060 }
5061 break;
5062 }
5063
5065 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
5066 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5067 return VTBits - Tmp + 1;
5068 case ISD::SIGN_EXTEND:
5069 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5070 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5072 // Max of the input and what this extends.
5073 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5074 Tmp = VTBits-Tmp+1;
5075 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5076 return std::max(Tmp, Tmp2);
5078 if (VT.isScalableVector())
5079 break;
5080 SDValue Src = Op.getOperand(0);
5081 EVT SrcVT = Src.getValueType();
5082 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5083 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5084 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5085 }
5086 case ISD::SRA:
5087 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5088 // SRA X, C -> adds C sign bits.
5089 if (std::optional<unsigned> ShAmt =
5090 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5091 Tmp = std::min(Tmp + *ShAmt, VTBits);
5092 return Tmp;
5093 case ISD::SHL:
5094 if (std::optional<ConstantRange> ShAmtRange =
5095 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5096 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5097 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5098 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5099 // shifted out, then we can compute the number of sign bits for the
5100 // operand being extended. A future improvement could be to pass along the
5101 // "shifted left by" information in the recursive calls to
5102 // ComputeKnownSignBits. Allowing us to handle this more generically.
5103 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5104 SDValue Ext = Op.getOperand(0);
5105 EVT ExtVT = Ext.getValueType();
5106 SDValue Extendee = Ext.getOperand(0);
5107 EVT ExtendeeVT = Extendee.getValueType();
5108 unsigned SizeDifference =
5109 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5110 if (SizeDifference <= MinShAmt) {
5111 Tmp = SizeDifference +
5112 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5113 if (MaxShAmt < Tmp)
5114 return Tmp - MaxShAmt;
5115 }
5116 }
5117 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5118 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5119 if (MaxShAmt < Tmp)
5120 return Tmp - MaxShAmt;
5121 }
5122 break;
5123 case ISD::AND:
5124 case ISD::OR:
5125 case ISD::XOR: // NOT is handled here.
5126 // Logical binary ops preserve the number of sign bits at the worst.
5127 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5128 if (Tmp != 1) {
5129 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5130 FirstAnswer = std::min(Tmp, Tmp2);
5131 // We computed what we know about the sign bits as our first
5132 // answer. Now proceed to the generic code that uses
5133 // computeKnownBits, and pick whichever answer is better.
5134 }
5135 break;
5136
5137 case ISD::SELECT:
5138 case ISD::VSELECT:
5139 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5140 if (Tmp == 1) return 1; // Early out.
5141 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5142 return std::min(Tmp, Tmp2);
5143 case ISD::SELECT_CC:
5144 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5145 if (Tmp == 1) return 1; // Early out.
5146 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5147 return std::min(Tmp, Tmp2);
5148
5149 case ISD::SMIN:
5150 case ISD::SMAX: {
5151 // If we have a clamp pattern, we know that the number of sign bits will be
5152 // the minimum of the clamp min/max range.
5153 bool IsMax = (Opcode == ISD::SMAX);
5154 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5155 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5156 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5157 CstHigh =
5158 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5159 if (CstLow && CstHigh) {
5160 if (!IsMax)
5161 std::swap(CstLow, CstHigh);
5162 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5163 Tmp = CstLow->getAPIntValue().getNumSignBits();
5164 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5165 return std::min(Tmp, Tmp2);
5166 }
5167 }
5168
5169 // Fallback - just get the minimum number of sign bits of the operands.
5170 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5171 if (Tmp == 1)
5172 return 1; // Early out.
5173 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5174 return std::min(Tmp, Tmp2);
5175 }
5176 case ISD::UMIN:
5177 case ISD::UMAX:
5178 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5179 if (Tmp == 1)
5180 return 1; // Early out.
5181 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5182 return std::min(Tmp, Tmp2);
5183 case ISD::SSUBO_CARRY:
5184 case ISD::USUBO_CARRY:
5185 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5186 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5187 return VTBits;
5188 [[fallthrough]];
5189 case ISD::SADDO:
5190 case ISD::UADDO:
5191 case ISD::SADDO_CARRY:
5192 case ISD::UADDO_CARRY:
5193 case ISD::SSUBO:
5194 case ISD::USUBO:
5195 case ISD::SMULO:
5196 case ISD::UMULO:
5197 if (Op.getResNo() != 1)
5198 break;
5199 // The boolean result conforms to getBooleanContents. Fall through.
5200 // If setcc returns 0/-1, all bits are sign bits.
5201 // We know that we have an integer-based boolean since these operations
5202 // are only available for integer.
5203 if (TLI->getBooleanContents(VT.isVector(), false) ==
5205 return VTBits;
5206 break;
5207 case ISD::SETCC:
5208 case ISD::SETCCCARRY:
5209 case ISD::STRICT_FSETCC:
5210 case ISD::STRICT_FSETCCS: {
5211 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5212 // If setcc returns 0/-1, all bits are sign bits.
5213 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5215 return VTBits;
5216 break;
5217 }
5218 case ISD::ROTL:
5219 case ISD::ROTR:
5220 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5221
5222 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5223 if (Tmp == VTBits)
5224 return VTBits;
5225
5226 if (ConstantSDNode *C =
5227 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5228 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5229
5230 // Handle rotate right by N like a rotate left by 32-N.
5231 if (Opcode == ISD::ROTR)
5232 RotAmt = (VTBits - RotAmt) % VTBits;
5233
5234 // If we aren't rotating out all of the known-in sign bits, return the
5235 // number that are left. This handles rotl(sext(x), 1) for example.
5236 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5237 }
5238 break;
5239 case ISD::ADD:
5240 case ISD::ADDC:
5241 // TODO: Move Operand 1 check before Operand 0 check
5242 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5243 if (Tmp == 1) return 1; // Early out.
5244
5245 // Special case decrementing a value (ADD X, -1):
5246 if (ConstantSDNode *CRHS =
5247 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5248 if (CRHS->isAllOnes()) {
5249 KnownBits Known =
5250 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5251
5252 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5253 // sign bits set.
5254 if ((Known.Zero | 1).isAllOnes())
5255 return VTBits;
5256
5257 // If we are subtracting one from a positive number, there is no carry
5258 // out of the result.
5259 if (Known.isNonNegative())
5260 return Tmp;
5261 }
5262
5263 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5264 if (Tmp2 == 1) return 1; // Early out.
5265
5266 // Add can have at most one carry bit. Thus we know that the output
5267 // is, at worst, one more bit than the inputs.
5268 return std::min(Tmp, Tmp2) - 1;
5269 case ISD::SUB:
5270 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5271 if (Tmp2 == 1) return 1; // Early out.
5272
5273 // Handle NEG.
5274 if (ConstantSDNode *CLHS =
5275 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5276 if (CLHS->isZero()) {
5277 KnownBits Known =
5278 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5279 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5280 // sign bits set.
5281 if ((Known.Zero | 1).isAllOnes())
5282 return VTBits;
5283
5284 // If the input is known to be positive (the sign bit is known clear),
5285 // the output of the NEG has the same number of sign bits as the input.
5286 if (Known.isNonNegative())
5287 return Tmp2;
5288
5289 // Otherwise, we treat this like a SUB.
5290 }
5291
5292 // Sub can have at most one carry bit. Thus we know that the output
5293 // is, at worst, one more bit than the inputs.
5294 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5295 if (Tmp == 1) return 1; // Early out.
5296 return std::min(Tmp, Tmp2) - 1;
5297 case ISD::MUL: {
5298 // The output of the Mul can be at most twice the valid bits in the inputs.
5299 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5300 if (SignBitsOp0 == 1)
5301 break;
5302 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5303 if (SignBitsOp1 == 1)
5304 break;
5305 unsigned OutValidBits =
5306 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5307 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5308 }
5309 case ISD::AVGCEILS:
5310 case ISD::AVGFLOORS:
5311 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5312 if (Tmp == 1)
5313 return 1; // Early out.
5314 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5315 return std::min(Tmp, Tmp2);
5316 case ISD::SREM:
5317 // The sign bit is the LHS's sign bit, except when the result of the
5318 // remainder is zero. The magnitude of the result should be less than or
5319 // equal to the magnitude of the LHS. Therefore, the result should have
5320 // at least as many sign bits as the left hand side.
5321 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5322 case ISD::TRUNCATE: {
5323 // Check if the sign bits of source go down as far as the truncated value.
5324 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5325 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5326 if (NumSrcSignBits > (NumSrcBits - VTBits))
5327 return NumSrcSignBits - (NumSrcBits - VTBits);
5328 break;
5329 }
5330 case ISD::EXTRACT_ELEMENT: {
5331 if (VT.isScalableVector())
5332 break;
5333 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5334 const int BitWidth = Op.getValueSizeInBits();
5335 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5336
5337 // Get reverse index (starting from 1), Op1 value indexes elements from
5338 // little end. Sign starts at big end.
5339 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5340
5341 // If the sign portion ends in our element the subtraction gives correct
5342 // result. Otherwise it gives either negative or > bitwidth result
5343 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5344 }
5346 if (VT.isScalableVector())
5347 break;
5348 // If we know the element index, split the demand between the
5349 // source vector and the inserted element, otherwise assume we need
5350 // the original demanded vector elements and the value.
5351 SDValue InVec = Op.getOperand(0);
5352 SDValue InVal = Op.getOperand(1);
5353 SDValue EltNo = Op.getOperand(2);
5354 bool DemandedVal = true;
5355 APInt DemandedVecElts = DemandedElts;
5356 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5357 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5358 unsigned EltIdx = CEltNo->getZExtValue();
5359 DemandedVal = !!DemandedElts[EltIdx];
5360 DemandedVecElts.clearBit(EltIdx);
5361 }
5362 Tmp = std::numeric_limits<unsigned>::max();
5363 if (DemandedVal) {
5364 // TODO - handle implicit truncation of inserted elements.
5365 if (InVal.getScalarValueSizeInBits() != VTBits)
5366 break;
5367 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5368 Tmp = std::min(Tmp, Tmp2);
5369 }
5370 if (!!DemandedVecElts) {
5371 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5372 Tmp = std::min(Tmp, Tmp2);
5373 }
5374 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5375 return Tmp;
5376 }
5378 SDValue InVec = Op.getOperand(0);
5379 SDValue EltNo = Op.getOperand(1);
5380 EVT VecVT = InVec.getValueType();
5381 // ComputeNumSignBits not yet implemented for scalable vectors.
5382 if (VecVT.isScalableVector())
5383 break;
5384 const unsigned BitWidth = Op.getValueSizeInBits();
5385 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5386 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5387
5388 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5389 // anything about sign bits. But if the sizes match we can derive knowledge
5390 // about sign bits from the vector operand.
5391 if (BitWidth != EltBitWidth)
5392 break;
5393
5394 // If we know the element index, just demand that vector element, else for
5395 // an unknown element index, ignore DemandedElts and demand them all.
5396 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5397 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5398 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5399 DemandedSrcElts =
5400 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5401
5402 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5403 }
5405 // Offset the demanded elts by the subvector index.
5406 SDValue Src = Op.getOperand(0);
5407
5408 APInt DemandedSrcElts;
5409 if (Src.getValueType().isScalableVector())
5410 DemandedSrcElts = APInt(1, 1);
5411 else {
5412 uint64_t Idx = Op.getConstantOperandVal(1);
5413 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5414 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5415 }
5416 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5417 }
5418 case ISD::CONCAT_VECTORS: {
5419 if (VT.isScalableVector())
5420 break;
5421 // Determine the minimum number of sign bits across all demanded
5422 // elts of the input vectors. Early out if the result is already 1.
5423 Tmp = std::numeric_limits<unsigned>::max();
5424 EVT SubVectorVT = Op.getOperand(0).getValueType();
5425 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5426 unsigned NumSubVectors = Op.getNumOperands();
5427 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5428 APInt DemandedSub =
5429 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5430 if (!DemandedSub)
5431 continue;
5432 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5433 Tmp = std::min(Tmp, Tmp2);
5434 }
5435 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5436 return Tmp;
5437 }
5438 case ISD::INSERT_SUBVECTOR: {
5439 if (VT.isScalableVector())
5440 break;
5441 // Demand any elements from the subvector and the remainder from the src its
5442 // inserted into.
5443 SDValue Src = Op.getOperand(0);
5444 SDValue Sub = Op.getOperand(1);
5445 uint64_t Idx = Op.getConstantOperandVal(2);
5446 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5447 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5448 APInt DemandedSrcElts = DemandedElts;
5449 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5450
5451 Tmp = std::numeric_limits<unsigned>::max();
5452 if (!!DemandedSubElts) {
5453 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5454 if (Tmp == 1)
5455 return 1; // early-out
5456 }
5457 if (!!DemandedSrcElts) {
5458 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5459 Tmp = std::min(Tmp, Tmp2);
5460 }
5461 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5462 return Tmp;
5463 }
5464 case ISD::LOAD: {
5465 // If we are looking at the loaded value of the SDNode.
5466 if (Op.getResNo() != 0)
5467 break;
5468
5470 if (const MDNode *Ranges = LD->getRanges()) {
5471 if (DemandedElts != 1)
5472 break;
5473
5475 if (VTBits > CR.getBitWidth()) {
5476 switch (LD->getExtensionType()) {
5477 case ISD::SEXTLOAD:
5478 CR = CR.signExtend(VTBits);
5479 break;
5480 case ISD::ZEXTLOAD:
5481 CR = CR.zeroExtend(VTBits);
5482 break;
5483 default:
5484 break;
5485 }
5486 }
5487
5488 if (VTBits != CR.getBitWidth())
5489 break;
5490 return std::min(CR.getSignedMin().getNumSignBits(),
5492 }
5493
5494 unsigned ExtType = LD->getExtensionType();
5495 switch (ExtType) {
5496 default:
5497 break;
5498 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5499 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5500 return VTBits - Tmp + 1;
5501 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5502 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5503 return VTBits - Tmp;
5504 case ISD::NON_EXTLOAD:
5505 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5506 // We only need to handle vectors - computeKnownBits should handle
5507 // scalar cases.
5508 Type *CstTy = Cst->getType();
5509 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5510 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5511 VTBits == CstTy->getScalarSizeInBits()) {
5512 Tmp = VTBits;
5513 for (unsigned i = 0; i != NumElts; ++i) {
5514 if (!DemandedElts[i])
5515 continue;
5516 if (Constant *Elt = Cst->getAggregateElement(i)) {
5517 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5518 const APInt &Value = CInt->getValue();
5519 Tmp = std::min(Tmp, Value.getNumSignBits());
5520 continue;
5521 }
5522 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5523 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5524 Tmp = std::min(Tmp, Value.getNumSignBits());
5525 continue;
5526 }
5527 }
5528 // Unknown type. Conservatively assume no bits match sign bit.
5529 return 1;
5530 }
5531 return Tmp;
5532 }
5533 }
5534 break;
5535 }
5536
5537 break;
5538 }
5541 case ISD::ATOMIC_SWAP:
5553 case ISD::ATOMIC_LOAD: {
5554 auto *AT = cast<AtomicSDNode>(Op);
5555 // If we are looking at the loaded value.
5556 if (Op.getResNo() == 0) {
5557 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5558 if (Tmp == VTBits)
5559 return 1; // early-out
5560
5561 // For atomic_load, prefer to use the extension type.
5562 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5563 switch (AT->getExtensionType()) {
5564 default:
5565 break;
5566 case ISD::SEXTLOAD:
5567 return VTBits - Tmp + 1;
5568 case ISD::ZEXTLOAD:
5569 return VTBits - Tmp;
5570 }
5571 }
5572
5573 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5574 return VTBits - Tmp + 1;
5575 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5576 return VTBits - Tmp;
5577 }
5578 break;
5579 }
5580 }
5581
5582 // Allow the target to implement this method for its nodes.
5583 if (Opcode >= ISD::BUILTIN_OP_END ||
5584 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5585 Opcode == ISD::INTRINSIC_W_CHAIN ||
5586 Opcode == ISD::INTRINSIC_VOID) {
5587 // TODO: This can probably be removed once target code is audited. This
5588 // is here purely to reduce patch size and review complexity.
5589 if (!VT.isScalableVector()) {
5590 unsigned NumBits =
5591 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5592 if (NumBits > 1)
5593 FirstAnswer = std::max(FirstAnswer, NumBits);
5594 }
5595 }
5596
5597 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5598 // use this information.
5599 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5600 return std::max(FirstAnswer, Known.countMinSignBits());
5601}
5602
5604 unsigned Depth) const {
5605 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5606 return Op.getScalarValueSizeInBits() - SignBits + 1;
5607}
5608
5610 const APInt &DemandedElts,
5611 unsigned Depth) const {
5612 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5613 return Op.getScalarValueSizeInBits() - SignBits + 1;
5614}
5615
5617 UndefPoisonKind Kind,
5618 unsigned Depth) const {
5619 // Early out for FREEZE.
5620 if (Op.getOpcode() == ISD::FREEZE)
5621 return true;
5622
5623 APInt DemandedElts = getDemandAllEltsMask(Op);
5624 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, Kind, Depth);
5625}
5626
5628 const APInt &DemandedElts,
5629 UndefPoisonKind Kind,
5630 unsigned Depth) const {
5631 unsigned Opcode = Op.getOpcode();
5632
5633 // Early out for FREEZE.
5634 if (Opcode == ISD::FREEZE)
5635 return true;
5636
5637 if (Depth >= MaxRecursionDepth)
5638 return false; // Limit search depth.
5639
5640 if (isIntOrFPConstant(Op))
5641 return true;
5642
5643 switch (Opcode) {
5644 case ISD::CONDCODE:
5645 case ISD::VALUETYPE:
5646 case ISD::FrameIndex:
5648 case ISD::CopyFromReg:
5649 return true;
5650
5651 case ISD::POISON:
5652 return !includesPoison(Kind);
5653
5654 case ISD::UNDEF:
5655 return !includesUndef(Kind);
5656
5657 case ISD::BITCAST: {
5658 SDValue Src = Op.getOperand(0);
5659 EVT SrcVT = Src.getValueType();
5660 EVT DstVT = Op.getValueType();
5661
5662 if (!SrcVT.isVector() || !DstVT.isVector())
5663 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5664
5665 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
5666 unsigned DstEltBits = DstVT.getScalarSizeInBits();
5667 ElementCount NumSrcElts = SrcVT.getVectorElementCount();
5668 [[maybe_unused]] ElementCount NumDstElts = DstVT.getVectorElementCount();
5669
5670 if (SrcEltBits == DstEltBits)
5671 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedElts, Kind,
5672 Depth + 1);
5673
5674 if (SrcEltBits < DstEltBits) {
5675 if (DstEltBits % SrcEltBits != 0)
5676 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5677
5678 assert(NumSrcElts == NumDstElts * (DstEltBits / SrcEltBits) &&
5679 "Unexpected vector bitcast");
5680 APInt DemandedSrcElts =
5681 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5682 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5683 Depth + 1);
5684 }
5685
5686 if (SrcEltBits % DstEltBits != 0)
5687 return isGuaranteedNotToBeUndefOrPoison(Src, Kind, Depth + 1);
5688
5689 assert(NumDstElts == NumSrcElts * (SrcEltBits / DstEltBits) &&
5690 "Unexpected vector bitcast");
5691 APInt DemandedSrcElts =
5692 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts.getKnownMinValue());
5693 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5694 Depth + 1);
5695 }
5696
5697 case ISD::BUILD_VECTOR:
5698 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5699 // this shouldn't affect the result.
5700 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5701 if (!DemandedElts[i])
5702 continue;
5703 if (!isGuaranteedNotToBeUndefOrPoison(Op.getOperand(i), Kind, Depth + 1))
5704 return false;
5705 }
5706 return true;
5707
5708 case ISD::CONCAT_VECTORS: {
5709 EVT VT = Op.getValueType();
5710 if (!VT.isFixedLengthVector())
5711 break;
5712
5713 EVT SubVT = Op.getOperand(0).getValueType();
5714 unsigned NumSubElts = SubVT.getVectorNumElements();
5715 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
5716 APInt DemandedSubElts =
5717 DemandedElts.extractBits(NumSubElts, I * NumSubElts);
5718 if (!!DemandedSubElts &&
5719 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(I), DemandedSubElts,
5720 Kind, Depth + 1))
5721 return false;
5722 }
5723 return true;
5724 }
5725
5727 SDValue Src = Op.getOperand(0);
5728 if (Src.getValueType().isScalableVector())
5729 break;
5730 uint64_t Idx = Op.getConstantOperandVal(1);
5731 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5732 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5733 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5734 Depth + 1);
5735 }
5736
5737 case ISD::INSERT_SUBVECTOR: {
5738 if (Op.getValueType().isScalableVector())
5739 break;
5740 SDValue Src = Op.getOperand(0);
5741 SDValue Sub = Op.getOperand(1);
5742 uint64_t Idx = Op.getConstantOperandVal(2);
5743 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5744 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5745 APInt DemandedSrcElts = DemandedElts;
5746 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5747
5748 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5749 Sub, DemandedSubElts, Kind, Depth + 1))
5750 return false;
5751 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5752 Src, DemandedSrcElts, Kind, Depth + 1))
5753 return false;
5754 return true;
5755 }
5756
5758 SDValue Src = Op.getOperand(0);
5759 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5760 EVT SrcVT = Src.getValueType();
5761 if (SrcVT.isFixedLengthVector() && IndexC &&
5762 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5763 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5764 IndexC->getZExtValue());
5765 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, Kind,
5766 Depth + 1);
5767 }
5768 break;
5769 }
5770
5772 SDValue InVec = Op.getOperand(0);
5773 SDValue InVal = Op.getOperand(1);
5774 SDValue EltNo = Op.getOperand(2);
5775 EVT VT = InVec.getValueType();
5776 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5777 if (IndexC && VT.isFixedLengthVector() &&
5778 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5779 if (DemandedElts[IndexC->getZExtValue()] &&
5780 !isGuaranteedNotToBeUndefOrPoison(InVal, Kind, Depth + 1))
5781 return false;
5782 APInt InVecDemandedElts = DemandedElts;
5783 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5784 if (!!InVecDemandedElts &&
5786 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5787 InVecDemandedElts, Kind, Depth + 1))
5788 return false;
5789 return true;
5790 }
5791 break;
5792 }
5793
5795 // Check upper (known undef) elements.
5796 if (DemandedElts.ugt(1) && includesUndef(Kind))
5797 return false;
5798 // Check element zero.
5799 if (DemandedElts[0] &&
5800 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1))
5801 return false;
5802 return true;
5803
5804 case ISD::SPLAT_VECTOR:
5805 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind, Depth + 1);
5806
5807 case ISD::SELECT: {
5808 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5809 /*ConsiderFlags*/ true, Depth) &&
5810 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), Kind,
5811 Depth + 1) &&
5812 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedElts,
5813 Kind, Depth + 1) &&
5814 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(2), DemandedElts,
5815 Kind, Depth + 1);
5816 }
5817
5818 case ISD::VECTOR_SHUFFLE: {
5819 APInt DemandedLHS, DemandedRHS;
5820 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5821 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5822 DemandedElts, DemandedLHS, DemandedRHS,
5823 /*AllowUndefElts=*/false))
5824 return false;
5825 if (!DemandedLHS.isZero() &&
5826 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS, Kind,
5827 Depth + 1))
5828 return false;
5829 if (!DemandedRHS.isZero() &&
5830 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS, Kind,
5831 Depth + 1))
5832 return false;
5833 return true;
5834 }
5835
5836 case ISD::SHL:
5837 case ISD::SRL:
5838 case ISD::SRA:
5839 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5840 // enough to check operand 0 if Op can't create undef/poison.
5841 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5842 /*ConsiderFlags*/ true, Depth) &&
5843 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5844 Kind, Depth + 1);
5845
5846 case ISD::BSWAP:
5847 case ISD::CTPOP:
5848 case ISD::BITREVERSE:
5849 case ISD::AND:
5850 case ISD::OR:
5851 case ISD::XOR:
5852 case ISD::ADD:
5853 case ISD::SUB:
5854 case ISD::MUL:
5855 case ISD::SADDSAT:
5856 case ISD::UADDSAT:
5857 case ISD::SSUBSAT:
5858 case ISD::USUBSAT:
5859 case ISD::SSHLSAT:
5860 case ISD::USHLSAT:
5861 case ISD::SMIN:
5862 case ISD::SMAX:
5863 case ISD::UMIN:
5864 case ISD::UMAX:
5865 case ISD::ZERO_EXTEND:
5866 case ISD::SIGN_EXTEND:
5867 case ISD::ANY_EXTEND:
5868 case ISD::TRUNCATE:
5869 case ISD::VSELECT: {
5870 // If Op can't create undef/poison and none of its operands are undef/poison
5871 // then Op is never undef/poison. A difference from the more common check
5872 // below, outside the switch, is that we handle elementwise operations for
5873 // which the DemandedElts mask is valid for all operands here.
5874 return !canCreateUndefOrPoison(Op, DemandedElts, Kind,
5875 /*ConsiderFlags*/ true, Depth) &&
5876 all_of(Op->ops(), [&](SDValue V) {
5877 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, Kind,
5878 Depth + 1);
5879 });
5880 }
5881
5882 // TODO: Search for noundef attributes from library functions.
5883
5884 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5885
5886 default:
5887 // Allow the target to implement this method for its nodes.
5888 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5889 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5890 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5891 Op, DemandedElts, *this, Kind, Depth);
5892 break;
5893 }
5894
5895 // If Op can't create undef/poison and none of its operands are undef/poison
5896 // then Op is never undef/poison.
5897 // NOTE: TargetNodes can handle this in themselves in
5898 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5899 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5900 return !canCreateUndefOrPoison(Op, Kind, /*ConsiderFlags*/ true, Depth) &&
5901 all_of(Op->ops(), [&](SDValue V) {
5902 return isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
5903 });
5904}
5905
5907 bool ConsiderFlags,
5908 unsigned Depth) const {
5909 APInt DemandedElts = getDemandAllEltsMask(Op);
5910 return canCreateUndefOrPoison(Op, DemandedElts, Kind, ConsiderFlags, Depth);
5911}
5912
5914 UndefPoisonKind Kind,
5915 bool ConsiderFlags,
5916 unsigned Depth) const {
5917 if (ConsiderFlags && includesPoison(Kind) && Op->hasPoisonGeneratingFlags())
5918 return true;
5919
5920 unsigned Opcode = Op.getOpcode();
5921 switch (Opcode) {
5922 case ISD::AssertSext:
5923 case ISD::AssertZext:
5924 case ISD::AssertAlign:
5926 // Assertion nodes can create poison if the assertion fails.
5927 return includesPoison(Kind);
5928
5929 case ISD::FREEZE:
5933 case ISD::SADDSAT:
5934 case ISD::UADDSAT:
5935 case ISD::SSUBSAT:
5936 case ISD::USUBSAT:
5937 case ISD::MULHU:
5938 case ISD::MULHS:
5939 case ISD::AVGFLOORS:
5940 case ISD::AVGFLOORU:
5941 case ISD::AVGCEILS:
5942 case ISD::AVGCEILU:
5943 case ISD::ABDU:
5944 case ISD::ABDS:
5945 case ISD::SMIN:
5946 case ISD::SMAX:
5947 case ISD::SCMP:
5948 case ISD::UMIN:
5949 case ISD::UMAX:
5950 case ISD::UCMP:
5951 case ISD::AND:
5952 case ISD::XOR:
5953 case ISD::ROTL:
5954 case ISD::ROTR:
5955 case ISD::FSHL:
5956 case ISD::FSHR:
5957 case ISD::BSWAP:
5958 case ISD::CTTZ:
5959 case ISD::CTLZ:
5960 case ISD::CTLS:
5961 case ISD::CTPOP:
5962 case ISD::BITREVERSE:
5963 case ISD::PARITY:
5964 case ISD::SIGN_EXTEND:
5965 case ISD::TRUNCATE:
5969 case ISD::BITCAST:
5970 case ISD::BUILD_VECTOR:
5971 case ISD::BUILD_PAIR:
5972 case ISD::SPLAT_VECTOR:
5973 case ISD::FABS:
5974 case ISD::FCEIL:
5975 case ISD::FFLOOR:
5976 case ISD::FTRUNC:
5977 case ISD::FRINT:
5978 case ISD::FNEARBYINT:
5979 case ISD::FROUND:
5980 case ISD::FROUNDEVEN:
5981 return false;
5982
5983 case ISD::ABS:
5984 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5985 // Different to Intrinsic::abs.
5986 return false;
5988 // ABS_MIN_POISON may produce poison if the input is INT_MIN.
5989 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) <= 1;
5990
5991 case ISD::ADDC:
5992 case ISD::SUBC:
5993 case ISD::ADDE:
5994 case ISD::SUBE:
5995 case ISD::SADDO:
5996 case ISD::SSUBO:
5997 case ISD::SMULO:
5998 case ISD::SADDO_CARRY:
5999 case ISD::SSUBO_CARRY:
6000 case ISD::UADDO:
6001 case ISD::USUBO:
6002 case ISD::UMULO:
6003 case ISD::UADDO_CARRY:
6004 case ISD::USUBO_CARRY:
6005 // No poison on result or overflow flags.
6006 return false;
6007
6008 case ISD::SELECT_CC:
6009 case ISD::SETCC: {
6010 // Integer setcc cannot create undef or poison.
6011 if (Op.getOperand(0).getValueType().isInteger())
6012 return false;
6013
6014 // FP compares are more complicated. They can create poison for nan/infinity
6015 // based on options and flags. The options and flags also cause special
6016 // nonan condition codes to be used. Those condition codes may be preserved
6017 // even if the nonan flag is dropped somewhere.
6018 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
6019 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
6020 return (unsigned)CCCode & 0x10U;
6021 }
6022
6023 case ISD::OR:
6024 case ISD::ZERO_EXTEND:
6025 case ISD::SELECT:
6026 case ISD::VSELECT:
6027 case ISD::ADD:
6028 case ISD::SUB:
6029 case ISD::MUL:
6030 case ISD::FNEG:
6031 case ISD::FADD:
6032 case ISD::FSUB:
6033 case ISD::FMUL:
6034 case ISD::FDIV:
6035 case ISD::FREM:
6036 case ISD::FCOPYSIGN:
6037 case ISD::FMA:
6038 case ISD::FMAD:
6039 case ISD::FMULADD:
6040 case ISD::FP_EXTEND:
6041 case ISD::FMINNUM:
6042 case ISD::FMAXNUM:
6043 case ISD::FMINNUM_IEEE:
6044 case ISD::FMAXNUM_IEEE:
6045 case ISD::FMINIMUM:
6046 case ISD::FMAXIMUM:
6047 case ISD::FMINIMUMNUM:
6048 case ISD::FMAXIMUMNUM:
6054 // No poison except from flags (which is handled above)
6055 return false;
6056
6057 case ISD::SHL:
6058 case ISD::SRL:
6059 case ISD::SRA:
6060 // If the max shift amount isn't in range, then the shift can
6061 // create poison.
6062 return includesPoison(Kind) &&
6063 !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
6064
6067 // If the amount is zero then the result will be poison.
6068 // TODO: Add isKnownNeverZero DemandedElts handling.
6069 return includesPoison(Kind) &&
6070 !isKnownNeverZero(Op.getOperand(0), Depth + 1);
6071
6073 // Check if we demand any upper (undef) elements.
6074 return includesUndef(Kind) && DemandedElts.ugt(1);
6075
6078 // Ensure that the element index is in bounds.
6079 if (includesPoison(Kind)) {
6080 EVT VecVT = Op.getOperand(0).getValueType();
6081 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
6082 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
6083 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
6084 }
6085 return false;
6086 }
6087
6088 case ISD::VECTOR_SHUFFLE: {
6089 // Check for any demanded shuffle element that is undef.
6090 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6091 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
6092 if (Elt < 0 && DemandedElts[Idx])
6093 return true;
6094 return false;
6095 }
6096
6098 return false;
6099
6100 default:
6101 // Allow the target to implement this method for its nodes.
6102 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6103 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
6104 return TLI->canCreateUndefOrPoisonForTargetNode(
6105 Op, DemandedElts, *this, Kind, ConsiderFlags, Depth);
6106 break;
6107 }
6108
6109 // Be conservative and return true.
6110 return true;
6111}
6112
6113bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
6114 unsigned Opcode = Op.getOpcode();
6115 if (Opcode == ISD::OR)
6116 return Op->getFlags().hasDisjoint() ||
6117 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
6118 if (Opcode == ISD::XOR)
6119 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
6120 return false;
6121}
6122
6124 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
6125 (Op.isAnyAdd() || isADDLike(Op));
6126}
6127
6129 FPClassTest InterestedClasses,
6130 unsigned Depth) const {
6131 APInt DemandedElts = getDemandAllEltsMask(Op);
6132 return computeKnownFPClass(Op, DemandedElts, InterestedClasses, Depth);
6133}
6134
6136 const APInt &DemandedElts,
6137 FPClassTest InterestedClasses,
6138 unsigned Depth) const {
6139 KnownFPClass Known;
6140
6141 if (const auto *CFP = dyn_cast<ConstantFPSDNode>(Op))
6142 return KnownFPClass(CFP->getValueAPF());
6143
6144 if (Depth >= MaxRecursionDepth)
6145 return Known;
6146
6147 if (Op.getOpcode() == ISD::UNDEF)
6148 return Known;
6149
6150 EVT VT = Op.getValueType();
6151 assert(VT.isFloatingPoint() && "Computing KnownFPClass on non-FP op!");
6152 assert((!VT.isFixedLengthVector() ||
6153 DemandedElts.getBitWidth() == VT.getVectorNumElements()) &&
6154 "Unexpected vector size");
6155
6156 if (!DemandedElts)
6157 return Known;
6158
6159 unsigned Opcode = Op.getOpcode();
6160 switch (Opcode) {
6161 case ISD::POISON: {
6162 Known.KnownFPClasses = fcNone;
6163 Known.SignBit = false;
6164 break;
6165 }
6166 case ISD::FNEG: {
6167 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6168 InterestedClasses, Depth + 1);
6169 Known.fneg();
6170 break;
6171 }
6172 case ISD::BUILD_VECTOR: {
6173 assert(!VT.isScalableVector());
6174 bool First = true;
6175 for (unsigned I = 0, E = Op.getNumOperands(); I != E; ++I) {
6176 if (!DemandedElts[I])
6177 continue;
6178
6179 if (First) {
6180 Known =
6181 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6182 First = false;
6183 } else {
6184 Known |=
6185 computeKnownFPClass(Op.getOperand(I), InterestedClasses, Depth + 1);
6186 }
6187
6188 if (Known.isUnknown())
6189 break;
6190 }
6191 break;
6192 }
6194 SDValue Src = Op.getOperand(0);
6195 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6196 EVT SrcVT = Src.getValueType();
6197 if (SrcVT.isFixedLengthVector() && CIdx) {
6198 if (CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6199 APInt DemandedSrcElts = APInt::getOneBitSet(
6200 SrcVT.getVectorNumElements(), CIdx->getZExtValue());
6201 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6202 Depth + 1);
6203 } else {
6204 // Out of bounds index is poison.
6205 Known.KnownFPClasses = fcNone;
6206 }
6207 } else {
6208 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6209 }
6210 break;
6211 }
6212 case ISD::SPLAT_VECTOR: {
6213 Known = computeKnownFPClass(Op.getOperand(0), InterestedClasses, Depth + 1);
6214 break;
6215 }
6216 case ISD::BITCAST: {
6217 // FIXME: It should not be necessary to check for an elementwise bitcast.
6218 // If a bitcast is not elementwise between vector / scalar types,
6219 // computeKnownBits already splices the known bits of the source elements
6220 // appropriately so as to line up with the bits of the result's demanded
6221 // elements.
6222 EVT SrcVT = Op.getOperand(0).getValueType();
6223 if (VT.isScalableVector() || SrcVT.isScalableVector())
6224 break;
6225 unsigned VTNumElts = VT.isVector() ? VT.getVectorNumElements() : 1;
6226 unsigned SrcVTNumElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
6227 if (VTNumElts != SrcVTNumElts)
6228 break;
6229
6230 KnownBits Bits = computeKnownBits(Op, DemandedElts, Depth + 1);
6231 Known = KnownFPClass::bitcast(VT.getFltSemantics(), Bits);
6232 break;
6233 }
6234 case ISD::FABS: {
6235 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6236 InterestedClasses, Depth + 1);
6237 Known.fabs();
6238 break;
6239 }
6240 case ISD::FCOPYSIGN: {
6241 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6242 InterestedClasses, Depth + 1);
6243 KnownFPClass KnownSign = computeKnownFPClass(Op.getOperand(1), DemandedElts,
6244 InterestedClasses, Depth + 1);
6245 Known.copysign(KnownSign);
6246 break;
6247 }
6248 case ISD::AssertNoFPClass: {
6249 Known = computeKnownFPClass(Op.getOperand(0), DemandedElts,
6250 InterestedClasses, Depth + 1);
6251 FPClassTest AssertedClasses =
6252 static_cast<FPClassTest>(Op->getConstantOperandVal(1));
6253 Known.KnownFPClasses &= ~AssertedClasses;
6254 break;
6255 }
6257 SDValue Src = Op.getOperand(0);
6258 EVT SrcVT = Src.getValueType();
6259 if (SrcVT.isFixedLengthVector()) {
6260 unsigned Idx = Op.getConstantOperandVal(1);
6261 unsigned NumSrcElts = SrcVT.getVectorNumElements();
6262
6263 APInt DemandedSrcElts = DemandedElts.zextOrTrunc(NumSrcElts).shl(Idx);
6264 Known = computeKnownFPClass(Src, DemandedSrcElts, InterestedClasses,
6265 Depth + 1);
6266 } else {
6267 Known = computeKnownFPClass(Src, InterestedClasses, Depth + 1);
6268 }
6269 break;
6270 }
6271 case ISD::INSERT_SUBVECTOR: {
6272 SDValue BaseVector = Op.getOperand(0);
6273 SDValue SubVector = Op.getOperand(1);
6274 EVT BaseVT = BaseVector.getValueType();
6275 if (BaseVT.isFixedLengthVector()) {
6276 unsigned Idx = Op.getConstantOperandVal(2);
6277 unsigned NumBaseElts = BaseVT.getVectorNumElements();
6278 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6279
6280 APInt DemandedMask =
6281 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6282 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6283 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6284
6285 if (!DemandedSrcElts.isZero())
6286 Known = computeKnownFPClass(BaseVector, DemandedSrcElts,
6287 InterestedClasses, Depth + 1);
6288 if (!DemandedSubElts.isZero()) {
6290 SubVector, DemandedSubElts, InterestedClasses, Depth + 1);
6291 Known = DemandedSrcElts.isZero() ? SubKnown : (Known | SubKnown);
6292 }
6293 } else {
6294 Known = computeKnownFPClass(SubVector, InterestedClasses, Depth + 1);
6295 if (!Known.isUnknown())
6296 Known |= computeKnownFPClass(BaseVector, InterestedClasses, Depth + 1);
6297 }
6298 break;
6299 }
6300 case ISD::SELECT:
6301 case ISD::VSELECT: {
6302 // TODO: Add adjustKnownFPClassForSelectArm clamp recognition as in
6303 // IR-level ValueTracking.
6304 KnownFPClass KnownFalseClass = computeKnownFPClass(
6305 Op.getOperand(2), DemandedElts, InterestedClasses, Depth + 1);
6306 if (KnownFalseClass.isUnknown())
6307 break;
6308 KnownFPClass KnownTrueClass = computeKnownFPClass(
6309 Op.getOperand(1), DemandedElts, InterestedClasses, Depth + 1);
6310 Known = KnownTrueClass.intersectWith(KnownFalseClass);
6311 break;
6312 }
6313 default:
6314 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6315 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6316 TLI->computeKnownFPClassForTargetNode(Op, Known, DemandedElts, *this,
6317 Depth);
6318 }
6319 break;
6320 }
6321
6322 return Known;
6323}
6324
6326 unsigned Depth) const {
6327 APInt DemandedElts = getDemandAllEltsMask(Op);
6328 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
6329}
6330
6332 bool SNaN, unsigned Depth) const {
6333 assert(!DemandedElts.isZero() && "No demanded elements");
6334
6335 // If we're told that NaNs won't happen, assume they won't.
6336 if (Op->getFlags().hasNoNaNs())
6337 return true;
6338
6339 if (Depth >= MaxRecursionDepth)
6340 return false; // Limit search depth.
6341
6342 unsigned Opcode = Op.getOpcode();
6343 switch (Opcode) {
6344 case ISD::FADD:
6345 case ISD::FSUB:
6346 case ISD::FMUL:
6347 case ISD::FDIV:
6348 case ISD::FREM:
6349 case ISD::FSIN:
6350 case ISD::FCOS:
6351 case ISD::FTAN:
6352 case ISD::FASIN:
6353 case ISD::FACOS:
6354 case ISD::FATAN:
6355 case ISD::FATAN2:
6356 case ISD::FSINH:
6357 case ISD::FCOSH:
6358 case ISD::FTANH:
6359 case ISD::FMA:
6360 case ISD::FMULADD:
6361 case ISD::FMAD: {
6362 if (SNaN)
6363 return true;
6364 // TODO: Need isKnownNeverInfinity
6365 return false;
6366 }
6367 case ISD::FCANONICALIZE:
6368 case ISD::FEXP:
6369 case ISD::FEXP2:
6370 case ISD::FEXP10:
6371 case ISD::FTRUNC:
6372 case ISD::FFLOOR:
6373 case ISD::FCEIL:
6374 case ISD::FROUND:
6375 case ISD::FROUNDEVEN:
6376 case ISD::LROUND:
6377 case ISD::LLROUND:
6378 case ISD::FRINT:
6379 case ISD::LRINT:
6380 case ISD::LLRINT:
6381 case ISD::FNEARBYINT:
6382 case ISD::FLDEXP: {
6383 if (SNaN)
6384 return true;
6385 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6386 }
6387 case ISD::FABS:
6388 case ISD::FNEG:
6389 case ISD::FCOPYSIGN: {
6390 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6391 }
6392 case ISD::SELECT:
6393 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6394 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6395 case ISD::FP_EXTEND:
6396 case ISD::FP_ROUND: {
6397 if (SNaN)
6398 return true;
6399 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6400 }
6401 case ISD::SINT_TO_FP:
6402 case ISD::UINT_TO_FP:
6403 return true;
6404 case ISD::FSQRT: // Need is known positive
6405 case ISD::FLOG:
6406 case ISD::FLOG2:
6407 case ISD::FLOG10:
6408 case ISD::FPOWI:
6409 case ISD::FPOW: {
6410 if (SNaN)
6411 return true;
6412 // TODO: Refine on operand
6413 return false;
6414 }
6415 case ISD::FMINNUM:
6416 case ISD::FMAXNUM:
6417 case ISD::FMINIMUMNUM:
6418 case ISD::FMAXIMUMNUM: {
6419 // Only one needs to be known not-nan, since it will be returned if the
6420 // other ends up being one.
6421 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6422 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6423 }
6424 case ISD::FMINNUM_IEEE:
6425 case ISD::FMAXNUM_IEEE: {
6426 if (SNaN)
6427 return true;
6428 // This can return a NaN if either operand is an sNaN, or if both operands
6429 // are NaN.
6430 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6431 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6432 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6433 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6434 }
6435 case ISD::FMINIMUM:
6436 case ISD::FMAXIMUM: {
6437 // TODO: Does this quiet or return the origina NaN as-is?
6438 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6439 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6440 }
6442 SDValue Src = Op.getOperand(0);
6443 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6444 EVT SrcVT = Src.getValueType();
6445 if (SrcVT.isFixedLengthVector() && Idx &&
6446 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6447 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6448 Idx->getZExtValue());
6449 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6450 }
6451 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6452 }
6454 SDValue Src = Op.getOperand(0);
6455 if (Src.getValueType().isFixedLengthVector()) {
6456 unsigned Idx = Op.getConstantOperandVal(1);
6457 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6458 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6459 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6460 }
6461 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6462 }
6463 case ISD::INSERT_SUBVECTOR: {
6464 SDValue BaseVector = Op.getOperand(0);
6465 SDValue SubVector = Op.getOperand(1);
6466 EVT BaseVectorVT = BaseVector.getValueType();
6467 if (BaseVectorVT.isFixedLengthVector()) {
6468 unsigned Idx = Op.getConstantOperandVal(2);
6469 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6470 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6471
6472 // Clear/Extract the bits at the position where the subvector will be
6473 // inserted.
6474 APInt DemandedMask =
6475 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6476 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6477 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6478
6479 bool NeverNaN = true;
6480 if (!DemandedSrcElts.isZero())
6481 NeverNaN &=
6482 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6483 if (NeverNaN && !DemandedSubElts.isZero())
6484 NeverNaN &=
6485 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6486 return NeverNaN;
6487 }
6488 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6489 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6490 }
6491 case ISD::BUILD_VECTOR: {
6492 unsigned NumElts = Op.getNumOperands();
6493 for (unsigned I = 0; I != NumElts; ++I)
6494 if (DemandedElts[I] &&
6495 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6496 return false;
6497 return true;
6498 }
6499 case ISD::SPLAT_VECTOR:
6500 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6501 case ISD::AssertNoFPClass: {
6502 FPClassTest NoFPClass =
6503 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6504 if ((NoFPClass & fcNan) == fcNan)
6505 return true;
6506 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6507 return true;
6508 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6509 }
6510 default:
6511 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6512 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6513 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6514 Depth);
6515 }
6516 break;
6517 }
6518
6519 FPClassTest NanMask = SNaN ? fcSNan : fcNan;
6520 KnownFPClass Known = computeKnownFPClass(Op, DemandedElts, NanMask, Depth);
6521 return Known.isKnownNever(NanMask);
6522}
6523
6525 APInt DemandedElts = getDemandAllEltsMask(Op);
6526 return isKnownNeverLogicalZero(Op, DemandedElts, Depth);
6527}
6528
6530 const APInt &DemandedElts,
6531 unsigned Depth) const {
6532 assert(!DemandedElts.isZero() && "No demanded elements");
6533 EVT VT = Op.getValueType();
6534 KnownFPClass Known =
6535 computeKnownFPClass(Op, DemandedElts, fcZero | fcSubnormal, Depth);
6536 return Known.isKnownNeverLogicalZero(getDenormalMode(VT));
6537}
6538
6540 APInt DemandedElts = getDemandAllEltsMask(Op);
6541 return isKnownNeverZero(Op, DemandedElts, Depth);
6542}
6543
6545 unsigned Depth) const {
6546 if (Depth >= MaxRecursionDepth)
6547 return false; // Limit search depth.
6548
6549 EVT OpVT = Op.getValueType();
6550 unsigned BitWidth = OpVT.getScalarSizeInBits();
6551
6552 assert(!Op.getValueType().isFloatingPoint() &&
6553 "Floating point types unsupported - use isKnownNeverLogicalZero");
6554
6555 // If the value is a constant, we can obviously see if it is a zero or not.
6556 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6557 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6558 return !V.isZero();
6559 };
6560
6561 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6562 return true;
6563
6564 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6565 // some degree.
6566 switch (Op.getOpcode()) {
6567 default:
6568 break;
6569
6570 case ISD::BUILD_VECTOR:
6571 // Are all operands of a build vector constant non-zero?
6572 if (all_of(enumerate(Op->ops()), [&](auto P) {
6573 auto *C = dyn_cast<ConstantSDNode>(P.value());
6574 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6575 }))
6576 return true;
6577 break;
6578
6579 case ISD::SPLAT_VECTOR:
6580 // Is the operand of a splat vector a constant non-zero?
6581 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6582 if (IsNeverZero(C))
6583 return true;
6584 break;
6585
6587 SDValue InVec = Op.getOperand(0);
6588 SDValue EltNo = Op.getOperand(1);
6589 EVT VecVT = InVec.getValueType();
6590
6591 // Skip scalable vectors or implicit extensions.
6592 if (VecVT.isScalableVector() ||
6593 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6594 break;
6595
6596 // If we know the element index, just demand that vector element, else for
6597 // an unknown element index, ignore DemandedElts and demand them all.
6598 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6599 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6600 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6601 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6602 DemandedSrcElts =
6603 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6604
6605 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6606 }
6607
6608 case ISD::OR:
6609 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6610 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6611
6612 case ISD::VSELECT:
6613 case ISD::SELECT:
6614 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6615 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6616
6617 case ISD::SHL: {
6618 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6619 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6620 KnownBits ValKnown =
6621 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6622 // 1 << X is never zero.
6623 if (ValKnown.One[0])
6624 return true;
6625 // If max shift cnt of known ones is non-zero, result is non-zero.
6626 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6627 .getMaxValue();
6628 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6629 !ValKnown.One.shl(MaxCnt).isZero())
6630 return true;
6631 break;
6632 }
6633
6634 case ISD::VECTOR_SHUFFLE: {
6635 if (Op.getValueType().isScalableVector())
6636 return false;
6637
6638 unsigned NumElts = DemandedElts.getBitWidth();
6639
6640 // All demanded elements from LHS and RHS must be known non-zero.
6641 // Demanded elements with undef shuffle mask elements are unknown.
6642
6643 APInt DemandedLHS, DemandedRHS;
6644 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6645 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6646 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6647 DemandedLHS, DemandedRHS))
6648 return false;
6649
6650 return (!DemandedLHS ||
6651 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6652 (!DemandedRHS ||
6653 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6654 }
6655
6656 case ISD::UADDSAT:
6657 case ISD::UMAX:
6658 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6659 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6660
6661 case ISD::UMIN:
6662 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6663 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6664
6665 // For smin/smax: If either operand is known negative/positive
6666 // respectively we don't need the other to be known at all.
6667 case ISD::SMAX: {
6668 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6669 if (Op1.isStrictlyPositive())
6670 return true;
6671
6672 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6673 if (Op0.isStrictlyPositive())
6674 return true;
6675
6676 if (Op1.isNonZero() && Op0.isNonZero())
6677 return true;
6678
6679 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6680 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6681 }
6682 case ISD::SMIN: {
6683 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6684 if (Op1.isNegative())
6685 return true;
6686
6687 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6688 if (Op0.isNegative())
6689 return true;
6690
6691 if (Op1.isNonZero() && Op0.isNonZero())
6692 return true;
6693
6694 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6695 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6696 }
6697
6698 case ISD::ROTL:
6699 case ISD::ROTR:
6700 case ISD::BITREVERSE:
6701 case ISD::BSWAP:
6702 case ISD::CTPOP:
6703 case ISD::ABS:
6705 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6706
6707 case ISD::SRA:
6708 case ISD::SRL: {
6709 if (Op->getFlags().hasExact())
6710 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6711 KnownBits ValKnown =
6712 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6713 if (ValKnown.isNegative())
6714 return true;
6715 // If max shift cnt of known ones is non-zero, result is non-zero.
6716 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6717 .getMaxValue();
6718 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6719 !ValKnown.One.lshr(MaxCnt).isZero())
6720 return true;
6721 break;
6722 }
6723 case ISD::UDIV:
6724 case ISD::SDIV:
6725 // div exact can only produce a zero if the dividend is zero.
6726 // TODO: For udiv this is also true if Op1 u<= Op0
6727 if (Op->getFlags().hasExact())
6728 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6729 break;
6730
6731 case ISD::ADD:
6732 if (Op->getFlags().hasNoUnsignedWrap())
6733 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6734 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6735 return true;
6736 // TODO: There are a lot more cases we can prove for add.
6737 break;
6738
6739 case ISD::SUB: {
6740 if (isNullConstant(Op.getOperand(0)))
6741 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6742
6743 std::optional<bool> ne = KnownBits::ne(
6744 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6745 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6746 return ne && *ne;
6747 }
6748
6749 case ISD::MUL:
6750 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6751 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6752 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6753 return true;
6754 break;
6755
6756 case ISD::ZERO_EXTEND:
6757 case ISD::SIGN_EXTEND:
6758 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6759 case ISD::VSCALE: {
6761 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6762 ConstantRange CR =
6763 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6764 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6765 return true;
6766 break;
6767 }
6768 }
6769
6770 return computeKnownBits(Op, DemandedElts, Depth).isNonZero();
6771}
6772
6774 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6775 return !C1->isNegative();
6776
6777 switch (Op.getOpcode()) {
6778 case ISD::FABS:
6779 case ISD::FEXP:
6780 case ISD::FEXP2:
6781 case ISD::FEXP10:
6782 return true;
6783 default:
6784 return false;
6785 }
6786
6787 llvm_unreachable("covered opcode switch");
6788}
6789
6791 assert(Use.getValueType().isFloatingPoint());
6792 const SDNode *User = Use.getUser();
6793 if (User->getFlags().hasNoSignedZeros())
6794 return true;
6795
6796 unsigned OperandNo = Use.getOperandNo();
6797 // Check if this use is insensitive to the sign of zero
6798 switch (User->getOpcode()) {
6799 case ISD::SETCC:
6800 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6801 case ISD::FABS:
6802 // fabs always produces +0.0.
6803 return true;
6804 case ISD::FCOPYSIGN:
6805 // copysign overwrites the sign bit of the first operand.
6806 return OperandNo == 0;
6807 case ISD::FADD:
6808 case ISD::FSUB: {
6809 // Arithmetic with non-zero constants fixes the uncertainty around the
6810 // sign bit.
6811 SDValue Other = User->getOperand(1 - OperandNo);
6813 }
6814 case ISD::FP_TO_SINT:
6815 case ISD::FP_TO_UINT:
6816 // fp-to-int conversions normalize signed zeros.
6817 return true;
6818 default:
6819 return false;
6820 }
6821}
6822
6824 if (Op->getFlags().hasNoSignedZeros())
6825 return true;
6826 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6827 // regression. Ideally, this should be implemented as a demanded-bits
6828 // optimization that stems from the users.
6829 if (Op->use_size() > 2)
6830 return false;
6831 return all_of(Op->uses(),
6832 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6833}
6834
6836 // Check the obvious case.
6837 if (A == B) return true;
6838
6839 // For negative and positive zero.
6842 if (CA->isZero() && CB->isZero()) return true;
6843
6844 // Otherwise they may not be equal.
6845 return false;
6846}
6847
6848// Only bits set in Mask must be negated, other bits may be arbitrary.
6850 if (isBitwiseNot(V, AllowUndefs))
6851 return V.getOperand(0);
6852
6853 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6854 // bits in the non-extended part.
6855 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6856 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6857 return SDValue();
6858 SDValue ExtArg = V.getOperand(0);
6859 if (ExtArg.getScalarValueSizeInBits() >=
6860 MaskC->getAPIntValue().getActiveBits() &&
6861 isBitwiseNot(ExtArg, AllowUndefs) &&
6862 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6863 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6864 return ExtArg.getOperand(0).getOperand(0);
6865 return SDValue();
6866}
6867
6869 // Match masked merge pattern (X & ~M) op (Y & M)
6870 // Including degenerate case (X & ~M) op M
6871 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6872 SDValue Other) {
6873 if (SDValue NotOperand =
6874 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6875 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6876 NotOperand->getOpcode() == ISD::TRUNCATE)
6877 NotOperand = NotOperand->getOperand(0);
6878
6879 if (Other == NotOperand)
6880 return true;
6881 if (Other->getOpcode() == ISD::AND)
6882 return NotOperand == Other->getOperand(0) ||
6883 NotOperand == Other->getOperand(1);
6884 }
6885 return false;
6886 };
6887
6888 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6889 A = A->getOperand(0);
6890
6891 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6892 B = B->getOperand(0);
6893
6894 if (A->getOpcode() == ISD::AND)
6895 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6896 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6897 return false;
6898}
6899
6900// FIXME: unify with llvm::haveNoCommonBitsSet.
6902 assert(A.getValueType() == B.getValueType() &&
6903 "Values must have the same type");
6906 return true;
6909}
6910
6911static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6912 SelectionDAG &DAG) {
6913 if (cast<ConstantSDNode>(Step)->isZero())
6914 return DAG.getConstant(0, DL, VT);
6915
6916 return SDValue();
6917}
6918
6921 SelectionDAG &DAG) {
6922 int NumOps = Ops.size();
6923 assert(NumOps != 0 && "Can't build an empty vector!");
6924 assert(!VT.isScalableVector() &&
6925 "BUILD_VECTOR cannot be used with scalable types");
6926 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6927 "Incorrect element count in BUILD_VECTOR!");
6928
6929 // BUILD_VECTOR of UNDEFs is UNDEF.
6930 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6931 return DAG.getUNDEF(VT);
6932
6933 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6934 SDValue IdentitySrc;
6935 bool IsIdentity = true;
6936 for (int i = 0; i != NumOps; ++i) {
6938 Ops[i].getOperand(0).getValueType() != VT ||
6939 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6940 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6941 Ops[i].getConstantOperandAPInt(1) != i) {
6942 IsIdentity = false;
6943 break;
6944 }
6945 IdentitySrc = Ops[i].getOperand(0);
6946 }
6947 if (IsIdentity)
6948 return IdentitySrc;
6949
6950 return SDValue();
6951}
6952
6953/// Try to simplify vector concatenation to an input value, undef, or build
6954/// vector.
6957 SelectionDAG &DAG) {
6958 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6960 [Ops](SDValue Op) {
6961 return Ops[0].getValueType() == Op.getValueType();
6962 }) &&
6963 "Concatenation of vectors with inconsistent value types!");
6964 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6965 VT.getVectorElementCount() &&
6966 "Incorrect element count in vector concatenation!");
6967
6968 if (Ops.size() == 1)
6969 return Ops[0];
6970
6971 // Concat of UNDEFs is UNDEF.
6972 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6973 return DAG.getUNDEF(VT);
6974
6975 // Scan the operands and look for extract operations from a single source
6976 // that correspond to insertion at the same location via this concatenation:
6977 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6978 SDValue IdentitySrc;
6979 bool IsIdentity = true;
6980 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6981 SDValue Op = Ops[i];
6982 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
6983 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
6984 Op.getOperand(0).getValueType() != VT ||
6985 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
6986 Op.getConstantOperandVal(1) != IdentityIndex) {
6987 IsIdentity = false;
6988 break;
6989 }
6990 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
6991 "Unexpected identity source vector for concat of extracts");
6992 IdentitySrc = Op.getOperand(0);
6993 }
6994 if (IsIdentity) {
6995 assert(IdentitySrc && "Failed to set source vector of extracts");
6996 return IdentitySrc;
6997 }
6998
6999 // The code below this point is only designed to work for fixed width
7000 // vectors, so we bail out for now.
7001 if (VT.isScalableVector())
7002 return SDValue();
7003
7004 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
7005 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
7006 // BUILD_VECTOR.
7007 // FIXME: Add support for SCALAR_TO_VECTOR as well.
7008 EVT SVT = VT.getScalarType();
7010 for (SDValue Op : Ops) {
7011 EVT OpVT = Op.getValueType();
7012 if (Op.isUndef())
7013 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
7014 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
7015 Elts.append(Op->op_begin(), Op->op_end());
7016 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
7017 OpVT.getVectorNumElements() == 1 &&
7018 isNullConstant(Op.getOperand(2)))
7019 Elts.push_back(Op.getOperand(1));
7020 else
7021 return SDValue();
7022 }
7023
7024 // BUILD_VECTOR requires all inputs to be of the same type, find the
7025 // maximum type and extend them all.
7026 for (SDValue Op : Elts)
7027 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
7028
7029 if (SVT.bitsGT(VT.getScalarType())) {
7030 for (SDValue &Op : Elts) {
7031 if (Op.isUndef())
7032 Op = DAG.getUNDEF(SVT);
7033 else
7034 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
7035 ? DAG.getZExtOrTrunc(Op, DL, SVT)
7036 : DAG.getSExtOrTrunc(Op, DL, SVT);
7037 }
7038 }
7039
7040 SDValue V = DAG.getBuildVector(VT, DL, Elts);
7041 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
7042 return V;
7043}
7044
7045/// Gets or creates the specified node.
7046SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
7047 SDVTList VTs = getVTList(VT);
7049 AddNodeIDNode(ID, Opcode, VTs, {});
7050 void *IP = nullptr;
7051 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
7052 return SDValue(E, 0);
7053
7054 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7055 CSEMap.InsertNode(N, IP);
7056
7057 InsertNode(N);
7058 SDValue V = SDValue(N, 0);
7059 NewSDValueDbgMsg(V, "Creating new node: ", this);
7060 return V;
7061}
7062
7063SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7064 SDValue N1) {
7065 SDNodeFlags Flags;
7066 if (Inserter)
7067 Flags = Inserter->getFlags();
7068 return getNode(Opcode, DL, VT, N1, Flags);
7069}
7070
7071SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7072 SDValue N1, const SDNodeFlags Flags) {
7073 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
7074
7075 // Constant fold unary operations with a vector integer or float operand.
7076 switch (Opcode) {
7077 default:
7078 // FIXME: Entirely reasonable to perform folding of other unary
7079 // operations here as the need arises.
7080 break;
7081 case ISD::FNEG:
7082 case ISD::FABS:
7083 case ISD::FCEIL:
7084 case ISD::FTRUNC:
7085 case ISD::FFLOOR:
7086 case ISD::FP_EXTEND:
7087 case ISD::FP_TO_SINT:
7088 case ISD::FP_TO_UINT:
7089 case ISD::FP_TO_FP16:
7090 case ISD::FP_TO_BF16:
7091 case ISD::TRUNCATE:
7092 case ISD::ANY_EXTEND:
7093 case ISD::ZERO_EXTEND:
7094 case ISD::SIGN_EXTEND:
7095 case ISD::UINT_TO_FP:
7096 case ISD::SINT_TO_FP:
7097 case ISD::FP16_TO_FP:
7098 case ISD::BF16_TO_FP:
7099 case ISD::BITCAST:
7100 case ISD::ABS:
7102 case ISD::BITREVERSE:
7103 case ISD::BSWAP:
7104 case ISD::CTLZ:
7106 case ISD::CTTZ:
7108 case ISD::CTPOP:
7109 case ISD::CTLS:
7110 case ISD::STEP_VECTOR: {
7111 SDValue Ops = {N1};
7112 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
7113 return Fold;
7114 }
7115 }
7116
7117 unsigned OpOpcode = N1.getNode()->getOpcode();
7118 switch (Opcode) {
7119 case ISD::STEP_VECTOR:
7120 assert(VT.isScalableVector() &&
7121 "STEP_VECTOR can only be used with scalable types");
7122 assert(OpOpcode == ISD::TargetConstant &&
7123 VT.getVectorElementType() == N1.getValueType() &&
7124 "Unexpected step operand");
7125 break;
7126 case ISD::FREEZE:
7127 assert(VT == N1.getValueType() && "Unexpected VT!");
7129 return N1;
7130 break;
7131 case ISD::TokenFactor:
7132 case ISD::MERGE_VALUES:
7134 return N1; // Factor, merge or concat of one node? No need.
7135 case ISD::BUILD_VECTOR: {
7136 // Attempt to simplify BUILD_VECTOR.
7137 SDValue Ops[] = {N1};
7138 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7139 return V;
7140 break;
7141 }
7142 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
7143 case ISD::FP_EXTEND:
7145 "Invalid FP cast!");
7146 if (N1.getValueType() == VT) return N1; // noop conversion.
7147 assert((!VT.isVector() || VT.getVectorElementCount() ==
7149 "Vector element count mismatch!");
7150 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
7151 if (N1.isUndef())
7152 return getUNDEF(VT);
7153 break;
7154 case ISD::FP_TO_SINT:
7155 case ISD::FP_TO_UINT:
7156 if (N1.isUndef())
7157 return getUNDEF(VT);
7158 break;
7159 case ISD::SINT_TO_FP:
7160 case ISD::UINT_TO_FP:
7161 // [us]itofp(undef) = 0, because the result value is bounded.
7162 if (N1.isUndef())
7163 return getConstantFP(0.0, DL, VT);
7164 break;
7165 case ISD::SIGN_EXTEND:
7166 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7167 "Invalid SIGN_EXTEND!");
7168 assert(VT.isVector() == N1.getValueType().isVector() &&
7169 "SIGN_EXTEND result type type should be vector iff the operand "
7170 "type is vector!");
7171 if (N1.getValueType() == VT) return N1; // noop extension
7172 assert((!VT.isVector() || VT.getVectorElementCount() ==
7174 "Vector element count mismatch!");
7175 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
7176 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
7177 SDNodeFlags Flags;
7178 if (OpOpcode == ISD::ZERO_EXTEND)
7179 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7180 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7181 transferDbgValues(N1, NewVal);
7182 return NewVal;
7183 }
7184
7185 if (OpOpcode == ISD::POISON)
7186 return getPOISON(VT);
7187
7188 if (N1.isUndef())
7189 // sext(undef) = 0, because the top bits will all be the same.
7190 return getConstant(0, DL, VT);
7191
7192 // Skip unnecessary sext_inreg pattern:
7193 // (sext (trunc x)) -> x iff the upper bits are all signbits.
7194 if (OpOpcode == ISD::TRUNCATE) {
7195 SDValue OpOp = N1.getOperand(0);
7196 if (OpOp.getValueType() == VT) {
7197 unsigned NumSignExtBits =
7199 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
7200 transferDbgValues(N1, OpOp);
7201 return OpOp;
7202 }
7203 }
7204 }
7205 break;
7206 case ISD::ZERO_EXTEND:
7207 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7208 "Invalid ZERO_EXTEND!");
7209 assert(VT.isVector() == N1.getValueType().isVector() &&
7210 "ZERO_EXTEND result type type should be vector iff the operand "
7211 "type is vector!");
7212 if (N1.getValueType() == VT) return N1; // noop extension
7213 assert((!VT.isVector() || VT.getVectorElementCount() ==
7215 "Vector element count mismatch!");
7216 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
7217 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
7218 SDNodeFlags Flags;
7219 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7220 SDValue NewVal =
7221 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
7222 transferDbgValues(N1, NewVal);
7223 return NewVal;
7224 }
7225
7226 if (OpOpcode == ISD::POISON)
7227 return getPOISON(VT);
7228
7229 if (N1.isUndef())
7230 // zext(undef) = 0, because the top bits will be zero.
7231 return getConstant(0, DL, VT);
7232
7233 // Skip unnecessary zext_inreg pattern:
7234 // (zext (trunc x)) -> x iff the upper bits are known zero.
7235 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
7236 // use to recognise zext_inreg patterns.
7237 if (OpOpcode == ISD::TRUNCATE) {
7238 SDValue OpOp = N1.getOperand(0);
7239 if (OpOp.getValueType() == VT) {
7240 if (OpOp.getOpcode() != ISD::AND) {
7243 if (MaskedValueIsZero(OpOp, HiBits)) {
7244 transferDbgValues(N1, OpOp);
7245 return OpOp;
7246 }
7247 }
7248 }
7249 }
7250 break;
7251 case ISD::ANY_EXTEND:
7252 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7253 "Invalid ANY_EXTEND!");
7254 assert(VT.isVector() == N1.getValueType().isVector() &&
7255 "ANY_EXTEND result type type should be vector iff the operand "
7256 "type is vector!");
7257 if (N1.getValueType() == VT) return N1; // noop extension
7258 assert((!VT.isVector() || VT.getVectorElementCount() ==
7260 "Vector element count mismatch!");
7261 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
7262
7263 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7264 OpOpcode == ISD::ANY_EXTEND) {
7265 SDNodeFlags Flags;
7266 if (OpOpcode == ISD::ZERO_EXTEND)
7267 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7268 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
7269 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7270 }
7271 if (N1.isUndef())
7272 return getUNDEF(VT);
7273
7274 // (ext (trunc x)) -> x
7275 if (OpOpcode == ISD::TRUNCATE) {
7276 SDValue OpOp = N1.getOperand(0);
7277 if (OpOp.getValueType() == VT) {
7278 transferDbgValues(N1, OpOp);
7279 return OpOp;
7280 }
7281 }
7282 break;
7283 case ISD::TRUNCATE:
7284 assert(VT.isInteger() && N1.getValueType().isInteger() &&
7285 "Invalid TRUNCATE!");
7286 assert(VT.isVector() == N1.getValueType().isVector() &&
7287 "TRUNCATE result type type should be vector iff the operand "
7288 "type is vector!");
7289 if (N1.getValueType() == VT) return N1; // noop truncate
7290 assert((!VT.isVector() || VT.getVectorElementCount() ==
7292 "Vector element count mismatch!");
7293 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
7294 if (OpOpcode == ISD::TRUNCATE)
7295 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7296 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
7297 OpOpcode == ISD::ANY_EXTEND) {
7298 // If the source is smaller than the dest, we still need an extend.
7300 VT.getScalarType())) {
7301 SDNodeFlags Flags;
7302 if (OpOpcode == ISD::ZERO_EXTEND)
7303 Flags.setNonNeg(N1->getFlags().hasNonNeg());
7304 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
7305 }
7306 if (N1.getOperand(0).getValueType().bitsGT(VT))
7307 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
7308 return N1.getOperand(0);
7309 }
7310 if (N1.isUndef())
7311 return getUNDEF(VT);
7312 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
7313 return getVScale(DL, VT,
7315 break;
7319 assert(VT.isVector() && "This DAG node is restricted to vector types.");
7320 assert(N1.getValueType().bitsLE(VT) &&
7321 "The input must be the same size or smaller than the result.");
7324 "The destination vector type must have fewer lanes than the input.");
7325 break;
7326 case ISD::ABS:
7327 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
7328 if (N1.isUndef())
7329 return getConstant(0, DL, VT);
7330 break;
7332 assert(VT.isInteger() && VT == N1.getValueType() &&
7333 "Invalid ABS_MIN_POISON!");
7334 if (N1.isUndef())
7335 return getConstant(0, DL, VT);
7336 break;
7337 case ISD::BSWAP:
7338 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
7339 assert((VT.getScalarSizeInBits() % 16 == 0) &&
7340 "BSWAP types must be a multiple of 16 bits!");
7341 if (N1.isUndef())
7342 return getUNDEF(VT);
7343 // bswap(bswap(X)) -> X.
7344 if (OpOpcode == ISD::BSWAP)
7345 return N1.getOperand(0);
7346 break;
7347 case ISD::BITREVERSE:
7348 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7349 if (N1.isUndef())
7350 return getUNDEF(VT);
7351 break;
7352 case ISD::BITCAST:
7354 "Cannot BITCAST between types of different sizes!");
7355 if (VT == N1.getValueType()) return N1; // noop conversion.
7356 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7357 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7358 if (N1.isUndef())
7359 return getUNDEF(VT);
7360 break;
7362 assert(VT.isVector() && !N1.getValueType().isVector() &&
7363 (VT.getVectorElementType() == N1.getValueType() ||
7365 N1.getValueType().isInteger() &&
7367 "Illegal SCALAR_TO_VECTOR node!");
7368 if (N1.isUndef())
7369 return getUNDEF(VT);
7370 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7371 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7373 N1.getConstantOperandVal(1) == 0 &&
7374 N1.getOperand(0).getValueType() == VT)
7375 return N1.getOperand(0);
7376 break;
7377 case ISD::FNEG:
7378 // Negation of an unknown bag of bits is still completely undefined.
7379 if (N1.isUndef())
7380 return getUNDEF(VT);
7381
7382 if (OpOpcode == ISD::FNEG) // --X -> X
7383 return N1.getOperand(0);
7384 break;
7385 case ISD::FABS:
7386 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7387 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7388 break;
7389 case ISD::VSCALE:
7390 assert(VT == N1.getValueType() && "Unexpected VT!");
7391 break;
7392 case ISD::CTPOP:
7393 if (N1.getValueType().getScalarType() == MVT::i1)
7394 return N1;
7395 break;
7396 case ISD::CTLZ:
7397 case ISD::CTTZ:
7398 if (N1.getValueType().getScalarType() == MVT::i1)
7399 return getNOT(DL, N1, N1.getValueType());
7400 break;
7401 case ISD::CTLS:
7402 if (N1.getValueType().getScalarType() == MVT::i1)
7403 return getConstant(0, DL, VT);
7404 break;
7405 case ISD::VECREDUCE_ADD:
7406 if (N1.getValueType().getScalarType() == MVT::i1)
7407 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7408 break;
7411 if (N1.getValueType().getScalarType() == MVT::i1)
7412 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7413 break;
7416 if (N1.getValueType().getScalarType() == MVT::i1)
7417 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7418 break;
7419 case ISD::SPLAT_VECTOR:
7420 assert(VT.isVector() && "Wrong return type!");
7421 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7422 // that for now.
7424 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7426 N1.getValueType().isInteger() &&
7428 "Wrong operand type!");
7429 break;
7430 }
7431
7432 SDNode *N;
7433 SDVTList VTs = getVTList(VT);
7434 SDValue Ops[] = {N1};
7435 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7437 AddNodeIDNode(ID, Opcode, VTs, Ops);
7438 void *IP = nullptr;
7439 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7440 E->intersectFlagsWith(Flags);
7441 return SDValue(E, 0);
7442 }
7443
7444 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7445 N->setFlags(Flags);
7446 createOperands(N, Ops);
7447 CSEMap.InsertNode(N, IP);
7448 } else {
7449 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7450 createOperands(N, Ops);
7451 }
7452
7453 InsertNode(N);
7454 SDValue V = SDValue(N, 0);
7455 NewSDValueDbgMsg(V, "Creating new node: ", this);
7456 return V;
7457}
7458
7459static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7460 const APInt &C2) {
7461 switch (Opcode) {
7462 case ISD::ADD: return C1 + C2;
7463 case ISD::SUB: return C1 - C2;
7464 case ISD::MUL: return C1 * C2;
7465 case ISD::AND: return C1 & C2;
7466 case ISD::OR: return C1 | C2;
7467 case ISD::XOR: return C1 ^ C2;
7468 case ISD::SHL: return C1 << C2;
7469 case ISD::SRL: return C1.lshr(C2);
7470 case ISD::SRA: return C1.ashr(C2);
7471 case ISD::ROTL: return C1.rotl(C2);
7472 case ISD::ROTR: return C1.rotr(C2);
7473 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7474 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7475 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7476 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7477 case ISD::SADDSAT: return C1.sadd_sat(C2);
7478 case ISD::UADDSAT: return C1.uadd_sat(C2);
7479 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7480 case ISD::USUBSAT: return C1.usub_sat(C2);
7481 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7482 case ISD::USHLSAT: return C1.ushl_sat(C2);
7483 case ISD::UDIV:
7484 if (!C2.getBoolValue())
7485 break;
7486 return C1.udiv(C2);
7487 case ISD::UREM:
7488 if (!C2.getBoolValue())
7489 break;
7490 return C1.urem(C2);
7491 case ISD::SDIV:
7492 if (!C2.getBoolValue())
7493 break;
7494 return C1.sdiv(C2);
7495 case ISD::SREM:
7496 if (!C2.getBoolValue())
7497 break;
7498 return C1.srem(C2);
7499 case ISD::AVGFLOORS:
7500 return APIntOps::avgFloorS(C1, C2);
7501 case ISD::AVGFLOORU:
7502 return APIntOps::avgFloorU(C1, C2);
7503 case ISD::AVGCEILS:
7504 return APIntOps::avgCeilS(C1, C2);
7505 case ISD::AVGCEILU:
7506 return APIntOps::avgCeilU(C1, C2);
7507 case ISD::ABDS:
7508 return APIntOps::abds(C1, C2);
7509 case ISD::ABDU:
7510 return APIntOps::abdu(C1, C2);
7511 case ISD::MULHS:
7512 return APIntOps::mulhs(C1, C2);
7513 case ISD::MULHU:
7514 return APIntOps::mulhu(C1, C2);
7515 case ISD::CLMUL:
7516 return APIntOps::clmul(C1, C2);
7517 case ISD::CLMULR:
7518 return APIntOps::clmulr(C1, C2);
7519 case ISD::CLMULH:
7520 return APIntOps::clmulh(C1, C2);
7521 }
7522 return std::nullopt;
7523}
7524// Handle constant folding with UNDEF.
7525// TODO: Handle more cases.
7526static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7527 bool IsUndef1, const APInt &C2,
7528 bool IsUndef2) {
7529 if (!(IsUndef1 || IsUndef2))
7530 return FoldValue(Opcode, C1, C2);
7531
7532 // Fold and(x, undef) -> 0
7533 // Fold mul(x, undef) -> 0
7534 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7535 return APInt::getZero(C1.getBitWidth());
7536
7537 return std::nullopt;
7538}
7539
7541 const GlobalAddressSDNode *GA,
7542 const SDNode *N2) {
7543 if (GA->getOpcode() != ISD::GlobalAddress)
7544 return SDValue();
7545 if (!TLI->isOffsetFoldingLegal(GA))
7546 return SDValue();
7547 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7548 if (!C2)
7549 return SDValue();
7550 int64_t Offset = C2->getSExtValue();
7551 switch (Opcode) {
7552 case ISD::ADD:
7553 case ISD::PTRADD:
7554 break;
7555 case ISD::SUB: Offset = -uint64_t(Offset); break;
7556 default: return SDValue();
7557 }
7558 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7559 GA->getOffset() + uint64_t(Offset));
7560}
7561
7563 switch (Opcode) {
7564 case ISD::SDIV:
7565 case ISD::UDIV:
7566 case ISD::SREM:
7567 case ISD::UREM: {
7568 // If a divisor is zero/undef or any element of a divisor vector is
7569 // zero/undef, the whole op is undef.
7570 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7571 SDValue Divisor = Ops[1];
7572 if (Divisor.isUndef() || isNullConstant(Divisor))
7573 return true;
7574
7575 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7576 llvm::any_of(Divisor->op_values(),
7577 [](SDValue V) { return V.isUndef() ||
7578 isNullConstant(V); });
7579 // TODO: Handle signed overflow.
7580 }
7581 // TODO: Handle oversized shifts.
7582 default:
7583 return false;
7584 }
7585}
7586
7589 SDNodeFlags Flags) {
7590 // If the opcode is a target-specific ISD node, there's nothing we can
7591 // do here and the operand rules may not line up with the below, so
7592 // bail early.
7593 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7594 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7595 // foldCONCAT_VECTORS in getNode before this is called.
7596 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7597 return SDValue();
7598
7599 unsigned NumOps = Ops.size();
7600 if (NumOps == 0)
7601 return SDValue();
7602
7603 if (isUndef(Opcode, Ops))
7604 return getUNDEF(VT);
7605
7606 // Handle unary special cases.
7607 if (NumOps == 1) {
7608 SDValue N1 = Ops[0];
7609
7610 // Constant fold unary operations with an integer constant operand. Even
7611 // opaque constant will be folded, because the folding of unary operations
7612 // doesn't create new constants with different values. Nevertheless, the
7613 // opaque flag is preserved during folding to prevent future folding with
7614 // other constants.
7615 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7616 const APInt &Val = C->getAPIntValue();
7617 switch (Opcode) {
7618 case ISD::SIGN_EXTEND:
7619 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7620 C->isTargetOpcode(), C->isOpaque());
7621 case ISD::TRUNCATE:
7622 if (C->isOpaque())
7623 break;
7624 [[fallthrough]];
7625 case ISD::ZERO_EXTEND:
7626 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7627 C->isTargetOpcode(), C->isOpaque());
7628 case ISD::ANY_EXTEND:
7629 // Some targets like RISCV prefer to sign extend some types.
7630 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7631 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7632 C->isTargetOpcode(), C->isOpaque());
7633 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7634 C->isTargetOpcode(), C->isOpaque());
7635 case ISD::ABS:
7636 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7637 C->isOpaque());
7639 if (Val.isMinSignedValue())
7640 return getPOISON(VT);
7641 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7642 C->isOpaque());
7643 case ISD::BITREVERSE:
7644 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7645 C->isOpaque());
7646 case ISD::BSWAP:
7647 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7648 C->isOpaque());
7649 case ISD::CTPOP:
7650 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7651 C->isOpaque());
7652 case ISD::CTLZ:
7654 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7655 C->isOpaque());
7656 case ISD::CTTZ:
7658 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7659 C->isOpaque());
7660 case ISD::CTLS:
7661 // CTLS returns the number of extra sign bits so subtract one.
7662 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7663 C->isTargetOpcode(), C->isOpaque());
7664 case ISD::UINT_TO_FP:
7665 case ISD::SINT_TO_FP: {
7667 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7669 return getConstantFP(FPV, DL, VT);
7670 }
7671 case ISD::FP16_TO_FP:
7672 case ISD::BF16_TO_FP: {
7673 bool Ignored;
7674 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7675 : APFloat::BFloat(),
7676 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7677
7678 // This can return overflow, underflow, or inexact; we don't care.
7679 // FIXME need to be more flexible about rounding mode.
7681 &Ignored);
7682 return getConstantFP(FPV, DL, VT);
7683 }
7684 case ISD::STEP_VECTOR:
7685 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7686 return V;
7687 break;
7688 case ISD::BITCAST:
7689 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7690 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7691 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7692 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7693 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7694 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7695 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7696 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7697 break;
7698 }
7699 }
7700
7701 // Constant fold unary operations with a floating point constant operand.
7702 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7703 APFloat V = C->getValueAPF(); // make copy
7704 switch (Opcode) {
7705 case ISD::FNEG:
7706 V.changeSign();
7707 return getConstantFP(V, DL, VT);
7708 case ISD::FABS:
7709 V.clearSign();
7710 return getConstantFP(V, DL, VT);
7711 case ISD::FCEIL: {
7712 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7714 return getConstantFP(V, DL, VT);
7715 return SDValue();
7716 }
7717 case ISD::FTRUNC: {
7718 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7720 return getConstantFP(V, DL, VT);
7721 return SDValue();
7722 }
7723 case ISD::FFLOOR: {
7724 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7726 return getConstantFP(V, DL, VT);
7727 return SDValue();
7728 }
7729 case ISD::FP_EXTEND: {
7730 bool ignored;
7731 // This can return overflow, underflow, or inexact; we don't care.
7732 // FIXME need to be more flexible about rounding mode.
7733 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7734 &ignored);
7735 return getConstantFP(V, DL, VT);
7736 }
7737 case ISD::FP_TO_SINT:
7738 case ISD::FP_TO_UINT: {
7739 bool ignored;
7740 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7741 // FIXME need to be more flexible about rounding mode.
7743 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7744 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7745 break;
7746 return getConstant(IntVal, DL, VT);
7747 }
7748 case ISD::FP_TO_FP16:
7749 case ISD::FP_TO_BF16: {
7750 bool Ignored;
7751 // This can return overflow, underflow, or inexact; we don't care.
7752 // FIXME need to be more flexible about rounding mode.
7753 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7754 : APFloat::BFloat(),
7756 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7757 }
7758 case ISD::BITCAST:
7759 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7760 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7761 VT);
7762 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7763 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7764 VT);
7765 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7766 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7767 VT);
7768 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7769 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7770 break;
7771 }
7772 }
7773
7774 // Early-out if we failed to constant fold a bitcast.
7775 if (Opcode == ISD::BITCAST)
7776 return SDValue();
7777 }
7778
7779 // Handle binops special cases.
7780 if (NumOps == 2) {
7781 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7782 return CFP;
7783
7784 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7785 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7786 if (C1->isOpaque() || C2->isOpaque())
7787 return SDValue();
7788
7789 std::optional<APInt> FoldAttempt =
7790 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7791 if (!FoldAttempt)
7792 return SDValue();
7793
7794 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7795 assert((!Folded || !VT.isVector()) &&
7796 "Can't fold vectors ops with scalar operands");
7797 return Folded;
7798 }
7799 }
7800
7801 // fold (add Sym, c) -> Sym+c
7803 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7804 if (TLI->isCommutativeBinOp(Opcode))
7806 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7807
7808 // fold (sext_in_reg c1) -> c2
7809 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7810 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7811
7812 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7813 unsigned FromBits = EVT.getScalarSizeInBits();
7814 Val <<= Val.getBitWidth() - FromBits;
7815 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7816 return getConstant(Val, DL, ConstantVT);
7817 };
7818
7819 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7820 const APInt &Val = C1->getAPIntValue();
7821 return SignExtendInReg(Val, VT);
7822 }
7823
7825 SmallVector<SDValue, 8> ScalarOps;
7826 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7827 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7828 SDValue Op = Ops[0].getOperand(I);
7829 if (Op.isUndef()) {
7830 ScalarOps.push_back(getUNDEF(OpVT));
7831 continue;
7832 }
7833 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7834 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7835 }
7836 return getBuildVector(VT, DL, ScalarOps);
7837 }
7838
7839 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7840 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7841 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7842 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7843 Ops[0].getOperand(0).getValueType()));
7844 }
7845 }
7846
7847 // Handle fshl/fshr special cases.
7848 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7849 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7850 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7851 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7852
7853 if (C1 && C2 && C3) {
7854 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7855 return SDValue();
7856 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7857 &V3 = C3->getAPIntValue();
7858
7859 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7860 : APIntOps::fshr(V1, V2, V3);
7861 return getConstant(FoldedVal, DL, VT);
7862 }
7863 }
7864
7865 // Handle fma/fmad special cases.
7866 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7867 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7868 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7869 Ops[2].getValueType() == VT && "FMA types must match!");
7873 if (C1 && C2 && C3) {
7874 APFloat V1 = C1->getValueAPF();
7875 const APFloat &V2 = C2->getValueAPF();
7876 const APFloat &V3 = C3->getValueAPF();
7877 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7878 V1.multiply(V2, APFloat::rmNearestTiesToEven);
7880 } else
7881 V1.fusedMultiplyAdd(V2, V3, APFloat::rmNearestTiesToEven);
7882 return getConstantFP(V1, DL, VT);
7883 }
7884 }
7885
7886 // This is for vector folding only from here on.
7887 if (!VT.isVector())
7888 return SDValue();
7889
7890 ElementCount NumElts = VT.getVectorElementCount();
7891
7892 // See if we can fold through any bitcasted integer ops.
7893 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7894 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7895 (Ops[0].getOpcode() == ISD::BITCAST ||
7896 Ops[1].getOpcode() == ISD::BITCAST)) {
7899 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7900 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7901 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7902 N2.getValueType().isInteger()) {
7903 bool IsLE = getDataLayout().isLittleEndian();
7904 unsigned EltBits = VT.getScalarSizeInBits();
7905 SmallVector<APInt> RawBits1, RawBits2;
7906 BitVector UndefElts1, UndefElts2;
7907 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7908 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7909 SmallVector<APInt> RawBits;
7910 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7911 std::optional<APInt> Fold = FoldValueWithUndef(
7912 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7913 if (!Fold)
7914 break;
7915 RawBits.push_back(*Fold);
7916 }
7917 if (RawBits.size() == NumElts.getFixedValue()) {
7918 // We have constant folded, but we might need to cast this again back
7919 // to the original (possibly legalized) type.
7920 EVT BVVT, BVEltVT;
7921 if (N1.getValueType() == VT) {
7922 BVVT = N1.getValueType();
7923 BVEltVT = BV1->getOperand(0).getValueType();
7924 } else {
7925 BVVT = N2.getValueType();
7926 BVEltVT = BV2->getOperand(0).getValueType();
7927 }
7928 unsigned BVEltBits = BVEltVT.getSizeInBits();
7929 SmallVector<APInt> DstBits;
7930 BitVector DstUndefs;
7932 DstBits, RawBits, DstUndefs,
7933 BitVector(RawBits.size(), false));
7934 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
7935 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
7936 if (DstUndefs[I])
7937 continue;
7938 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
7939 }
7940 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
7941 }
7942 }
7943 }
7944 // Logic ops can be folded from raw integer bits - mainly for AVX512 masks.
7945 if (ISD::isBitwiseLogicOp(Opcode) && isa<ConstantSDNode>(N1) &&
7946 isa<ConstantSDNode>(N2)) {
7947 if (SDValue Res = FoldConstantArithmetic(Opcode, DL, N1.getValueType(),
7948 {N1, N2}, Flags))
7949 return getBitcast(VT, Res);
7950 }
7951 }
7952
7953 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
7954 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
7955 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
7956 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
7957 APInt RHSVal;
7958 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
7959 APInt NewStep = Opcode == ISD::MUL
7960 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
7961 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
7962 return getStepVector(DL, VT, NewStep);
7963 }
7964 }
7965
7966 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
7967 return !Op.getValueType().isVector() ||
7968 Op.getValueType().getVectorElementCount() == NumElts;
7969 };
7970
7971 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
7972 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
7973 Op.getOpcode() == ISD::BUILD_VECTOR ||
7974 Op.getOpcode() == ISD::SPLAT_VECTOR;
7975 };
7976
7977 // All operands must be vector types with the same number of elements as
7978 // the result type and must be either UNDEF or a build/splat vector
7979 // or UNDEF scalars.
7980 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
7981 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
7982 return SDValue();
7983
7984 // If we are comparing vectors, then the result needs to be a i1 boolean that
7985 // is then extended back to the legal result type depending on how booleans
7986 // are represented.
7987 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
7988 ISD::NodeType ExtendCode =
7989 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
7990 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
7992
7993 // Find legal integer scalar type for constant promotion and
7994 // ensure that its scalar size is at least as large as source.
7995 EVT LegalSVT = VT.getScalarType();
7996 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
7997 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
7998 if (LegalSVT.bitsLT(VT.getScalarType()))
7999 return SDValue();
8000 }
8001
8002 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
8003 // only have one operand to check. For fixed-length vector types we may have
8004 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
8005 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
8006
8007 // Constant fold each scalar lane separately.
8008 SmallVector<SDValue, 4> ScalarResults;
8009 for (unsigned I = 0; I != NumVectorElts; I++) {
8010 SmallVector<SDValue, 4> ScalarOps;
8011 for (SDValue Op : Ops) {
8012 EVT InSVT = Op.getValueType().getScalarType();
8013 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
8014 Op.getOpcode() != ISD::SPLAT_VECTOR) {
8015 if (Op.isUndef())
8016 ScalarOps.push_back(getUNDEF(InSVT));
8017 else
8018 ScalarOps.push_back(Op);
8019 continue;
8020 }
8021
8022 SDValue ScalarOp =
8023 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
8024 EVT ScalarVT = ScalarOp.getValueType();
8025
8026 // Build vector (integer) scalar operands may need implicit
8027 // truncation - do this before constant folding.
8028 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
8029 // Don't create illegally-typed nodes unless they're constants or undef
8030 // - if we fail to constant fold we can't guarantee the (dead) nodes
8031 // we're creating will be cleaned up before being visited for
8032 // legalization.
8033 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
8034 !isa<ConstantSDNode>(ScalarOp) &&
8035 TLI->getTypeAction(*getContext(), InSVT) !=
8037 return SDValue();
8038 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
8039 }
8040
8041 ScalarOps.push_back(ScalarOp);
8042 }
8043
8044 // Constant fold the scalar operands.
8045 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
8046
8047 // Scalar folding only succeeded if the result is a constant or UNDEF.
8048 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
8049 ScalarResult.getOpcode() != ISD::ConstantFP)
8050 return SDValue();
8051
8052 // Legalize the (integer) scalar constant if necessary. We only do
8053 // this once we know the folding succeeded, since otherwise we would
8054 // get a node with illegal type which has a user.
8055 if (LegalSVT != SVT)
8056 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
8057
8058 ScalarResults.push_back(ScalarResult);
8059 }
8060
8061 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
8062 : getBuildVector(VT, DL, ScalarResults);
8063 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
8064 return V;
8065}
8066
8069 // TODO: Add support for unary/ternary fp opcodes.
8070 if (Ops.size() != 2)
8071 return SDValue();
8072
8073 // TODO: We don't do any constant folding for strict FP opcodes here, but we
8074 // should. That will require dealing with a potentially non-default
8075 // rounding mode, checking the "opStatus" return value from the APFloat
8076 // math calculations, and possibly other variations.
8077 SDValue N1 = Ops[0];
8078 SDValue N2 = Ops[1];
8079 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
8080 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
8081 if (N1CFP && N2CFP) {
8082 APFloat C1 = N1CFP->getValueAPF(); // make copy
8083 const APFloat &C2 = N2CFP->getValueAPF();
8084 switch (Opcode) {
8085 case ISD::FADD:
8087 return getConstantFP(C1, DL, VT);
8088 case ISD::FSUB:
8090 return getConstantFP(C1, DL, VT);
8091 case ISD::FMUL:
8093 return getConstantFP(C1, DL, VT);
8094 case ISD::FDIV:
8096 return getConstantFP(C1, DL, VT);
8097 case ISD::FREM:
8098 C1.mod(C2);
8099 return getConstantFP(C1, DL, VT);
8100 case ISD::FCOPYSIGN:
8101 C1.copySign(C2);
8102 return getConstantFP(C1, DL, VT);
8103 case ISD::FMINNUM:
8104 return getConstantFP(minnum(C1, C2), DL, VT);
8105 case ISD::FMAXNUM:
8106 return getConstantFP(maxnum(C1, C2), DL, VT);
8107 case ISD::FMINIMUM:
8108 return getConstantFP(minimum(C1, C2), DL, VT);
8109 case ISD::FMAXIMUM:
8110 return getConstantFP(maximum(C1, C2), DL, VT);
8111 case ISD::FMINIMUMNUM:
8112 return getConstantFP(minimumnum(C1, C2), DL, VT);
8113 case ISD::FMAXIMUMNUM:
8114 return getConstantFP(maximumnum(C1, C2), DL, VT);
8115 default: break;
8116 }
8117 }
8118 if (N1CFP && Opcode == ISD::FP_ROUND) {
8119 APFloat C1 = N1CFP->getValueAPF(); // make copy
8120 bool Unused;
8121 // This can return overflow, underflow, or inexact; we don't care.
8122 // FIXME need to be more flexible about rounding mode.
8124 &Unused);
8125 return getConstantFP(C1, DL, VT);
8126 }
8127
8128 switch (Opcode) {
8129 case ISD::FSUB:
8130 // -0.0 - undef --> undef (consistent with "fneg undef")
8131 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
8132 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
8133 return getUNDEF(VT);
8134 [[fallthrough]];
8135
8136 case ISD::FADD:
8137 case ISD::FMUL:
8138 case ISD::FDIV:
8139 case ISD::FREM:
8140 // If both operands are undef, the result is undef. If 1 operand is undef,
8141 // the result is NaN. This should match the behavior of the IR optimizer.
8142 if (N1.isUndef() && N2.isUndef())
8143 return getUNDEF(VT);
8144 if (N1.isUndef() || N2.isUndef())
8146 }
8147 return SDValue();
8148}
8149
8151 const SDLoc &DL, EVT DstEltVT) {
8152 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
8153
8154 // If this is already the right type, we're done.
8155 if (SrcEltVT == DstEltVT)
8156 return SDValue(BV, 0);
8157
8158 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
8159 unsigned DstBitSize = DstEltVT.getSizeInBits();
8160
8161 // If this is a conversion of N elements of one type to N elements of another
8162 // type, convert each element. This handles FP<->INT cases.
8163 if (SrcBitSize == DstBitSize) {
8165 for (SDValue Op : BV->op_values()) {
8166 // If the vector element type is not legal, the BUILD_VECTOR operands
8167 // are promoted and implicitly truncated. Make that explicit here.
8168 if (Op.getValueType() != SrcEltVT)
8169 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
8170 Ops.push_back(getBitcast(DstEltVT, Op));
8171 }
8172 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
8174 return getBuildVector(VT, DL, Ops);
8175 }
8176
8177 // Otherwise, we're growing or shrinking the elements. To avoid having to
8178 // handle annoying details of growing/shrinking FP values, we convert them to
8179 // int first.
8180 if (SrcEltVT.isFloatingPoint()) {
8181 // Convert the input float vector to a int vector where the elements are the
8182 // same sizes.
8183 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
8184 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8186 DstEltVT);
8187 return SDValue();
8188 }
8189
8190 // Now we know the input is an integer vector. If the output is a FP type,
8191 // convert to integer first, then to FP of the right size.
8192 if (DstEltVT.isFloatingPoint()) {
8193 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
8194 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
8196 DstEltVT);
8197 return SDValue();
8198 }
8199
8200 // Okay, we know the src/dst types are both integers of differing types.
8201 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
8202
8203 // Extract the constant raw bit data.
8204 BitVector UndefElements;
8205 SmallVector<APInt> RawBits;
8206 bool IsLE = getDataLayout().isLittleEndian();
8207 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
8208 return SDValue();
8209
8211 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
8212 if (UndefElements[I])
8213 Ops.push_back(getUNDEF(DstEltVT));
8214 else
8215 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
8216 }
8217
8218 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
8219 return getBuildVector(VT, DL, Ops);
8220}
8221
8223 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
8224
8225 // There's no need to assert on a byte-aligned pointer. All pointers are at
8226 // least byte aligned.
8227 if (A == Align(1))
8228 return Val;
8229
8230 SDVTList VTs = getVTList(Val.getValueType());
8232 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
8233 ID.AddInteger(A.value());
8234
8235 void *IP = nullptr;
8236 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
8237 return SDValue(E, 0);
8238
8239 auto *N =
8240 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
8241 createOperands(N, {Val});
8242
8243 CSEMap.InsertNode(N, IP);
8244 InsertNode(N);
8245
8246 SDValue V(N, 0);
8247 NewSDValueDbgMsg(V, "Creating new node: ", this);
8248 return V;
8249}
8250
8251SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8252 SDValue N1, SDValue N2) {
8253 SDNodeFlags Flags;
8254 if (Inserter)
8255 Flags = Inserter->getFlags();
8256 return getNode(Opcode, DL, VT, N1, N2, Flags);
8257}
8258
8260 SDValue &N2) const {
8261 if (!TLI->isCommutativeBinOp(Opcode))
8262 return;
8263
8264 // Canonicalize:
8265 // binop(const, nonconst) -> binop(nonconst, const)
8268 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
8269 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
8270 if ((N1C && !N2C) || (N1CFP && !N2CFP))
8271 std::swap(N1, N2);
8272
8273 // Canonicalize:
8274 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
8275 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
8277 std::swap(N1, N2);
8278}
8279
8280SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8281 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
8283 N2.getOpcode() != ISD::DELETED_NODE &&
8284 "Operand is DELETED_NODE!");
8285
8286 canonicalizeCommutativeBinop(Opcode, N1, N2);
8287
8288 auto *N1C = dyn_cast<ConstantSDNode>(N1);
8289 auto *N2C = dyn_cast<ConstantSDNode>(N2);
8290
8291 // Don't allow undefs in vector splats - we might be returning N2 when folding
8292 // to zero etc.
8293 ConstantSDNode *N2CV =
8294 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
8295
8296 switch (Opcode) {
8297 default: break;
8298 case ISD::TokenFactor:
8299 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
8300 N2.getValueType() == MVT::Other && "Invalid token factor!");
8301 // Fold trivial token factors.
8302 if (N1.getOpcode() == ISD::EntryToken) return N2;
8303 if (N2.getOpcode() == ISD::EntryToken) return N1;
8304 if (N1 == N2) return N1;
8305 break;
8306 case ISD::BUILD_VECTOR: {
8307 // Attempt to simplify BUILD_VECTOR.
8308 SDValue Ops[] = {N1, N2};
8309 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8310 return V;
8311 break;
8312 }
8313 case ISD::CONCAT_VECTORS: {
8314 SDValue Ops[] = {N1, N2};
8315 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8316 return V;
8317 break;
8318 }
8319 case ISD::AND:
8320 assert(VT.isInteger() && "This operator does not apply to FP types!");
8321 assert(N1.getValueType() == N2.getValueType() &&
8322 N1.getValueType() == VT && "Binary operator types must match!");
8323 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
8324 // worth handling here.
8325 if (N2CV && N2CV->isZero())
8326 return N2;
8327 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
8328 return N1;
8329 break;
8330 case ISD::OR:
8331 case ISD::XOR:
8332 case ISD::ADD:
8333 case ISD::PTRADD:
8334 case ISD::SUB:
8335 assert(VT.isInteger() && "This operator does not apply to FP types!");
8336 assert(N1.getValueType() == N2.getValueType() &&
8337 N1.getValueType() == VT && "Binary operator types must match!");
8338 // The equal operand types requirement is unnecessarily strong for PTRADD.
8339 // However, the SelectionDAGBuilder does not generate PTRADDs with different
8340 // operand types, and we'd need to re-implement GEP's non-standard wrapping
8341 // logic everywhere where PTRADDs may be folded or combined to properly
8342 // support them. If/when we introduce pointer types to the SDAG, we will
8343 // need to relax this constraint.
8344
8345 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
8346 // it's worth handling here.
8347 if (N2CV && N2CV->isZero())
8348 return N1;
8349 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
8350 VT.getScalarType() == MVT::i1)
8351 return getNode(ISD::XOR, DL, VT, N1, N2);
8352 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
8353 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
8354 N2.getOpcode() == ISD::VSCALE) {
8355 const APInt &C1 = N1->getConstantOperandAPInt(0);
8356 const APInt &C2 = N2->getConstantOperandAPInt(0);
8357 return getVScale(DL, VT, C1 + C2);
8358 }
8359 break;
8360 case ISD::MUL:
8361 assert(VT.isInteger() && "This operator does not apply to FP types!");
8362 assert(N1.getValueType() == N2.getValueType() &&
8363 N1.getValueType() == VT && "Binary operator types must match!");
8364 if (VT.getScalarType() == MVT::i1)
8365 return getNode(ISD::AND, DL, VT, N1, N2);
8366 if (N2CV && N2CV->isZero())
8367 return N2;
8368 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8369 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8370 const APInt &N2CImm = N2C->getAPIntValue();
8371 return getVScale(DL, VT, MulImm * N2CImm);
8372 }
8373 break;
8374 case ISD::UDIV:
8375 case ISD::UREM:
8376 case ISD::MULHU:
8377 case ISD::MULHS:
8378 case ISD::SDIV:
8379 case ISD::SREM:
8380 case ISD::SADDSAT:
8381 case ISD::SSUBSAT:
8382 case ISD::UADDSAT:
8383 case ISD::USUBSAT:
8384 assert(VT.isInteger() && "This operator does not apply to FP types!");
8385 assert(N1.getValueType() == N2.getValueType() &&
8386 N1.getValueType() == VT && "Binary operator types must match!");
8387 if (VT.getScalarType() == MVT::i1) {
8388 // fold (add_sat x, y) -> (or x, y) for bool types.
8389 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8390 return getNode(ISD::OR, DL, VT, N1, N2);
8391 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8392 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8393 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8394 }
8395 break;
8396 case ISD::SCMP:
8397 case ISD::UCMP:
8398 assert(N1.getValueType() == N2.getValueType() &&
8399 "Types of operands of UCMP/SCMP must match");
8400 assert(N1.getValueType().isVector() == VT.isVector() &&
8401 "Operands and return type of must both be scalars or vectors");
8402 if (VT.isVector())
8405 "Result and operands must have the same number of elements");
8406 break;
8407 case ISD::AVGFLOORS:
8408 case ISD::AVGFLOORU:
8409 case ISD::AVGCEILS:
8410 case ISD::AVGCEILU:
8411 assert(VT.isInteger() && "This operator does not apply to FP types!");
8412 assert(N1.getValueType() == N2.getValueType() &&
8413 N1.getValueType() == VT && "Binary operator types must match!");
8414 break;
8415 case ISD::ABDS:
8416 case ISD::ABDU:
8417 assert(VT.isInteger() && "This operator does not apply to FP types!");
8418 assert(N1.getValueType() == N2.getValueType() &&
8419 N1.getValueType() == VT && "Binary operator types must match!");
8420 if (VT.getScalarType() == MVT::i1)
8421 return getNode(ISD::XOR, DL, VT, N1, N2);
8422 break;
8423 case ISD::SMIN:
8424 case ISD::UMAX:
8425 assert(VT.isInteger() && "This operator does not apply to FP types!");
8426 assert(N1.getValueType() == N2.getValueType() &&
8427 N1.getValueType() == VT && "Binary operator types must match!");
8428 if (VT.getScalarType() == MVT::i1)
8429 return getNode(ISD::OR, DL, VT, N1, N2);
8430 break;
8431 case ISD::SMAX:
8432 case ISD::UMIN:
8433 assert(VT.isInteger() && "This operator does not apply to FP types!");
8434 assert(N1.getValueType() == N2.getValueType() &&
8435 N1.getValueType() == VT && "Binary operator types must match!");
8436 if (VT.getScalarType() == MVT::i1)
8437 return getNode(ISD::AND, DL, VT, N1, N2);
8438 break;
8439 case ISD::FADD:
8440 case ISD::FSUB:
8441 case ISD::FMUL:
8442 case ISD::FDIV:
8443 case ISD::FREM:
8444 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8445 assert(N1.getValueType() == N2.getValueType() &&
8446 N1.getValueType() == VT && "Binary operator types must match!");
8447 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8448 return V;
8449 break;
8450 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8451 assert(N1.getValueType() == VT &&
8454 "Invalid FCOPYSIGN!");
8455 break;
8456 case ISD::SHL:
8457 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8458 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8459 const APInt &ShiftImm = N2C->getAPIntValue();
8460 return getVScale(DL, VT, MulImm << ShiftImm);
8461 }
8462 [[fallthrough]];
8463 case ISD::SRA:
8464 case ISD::SRL:
8465 if (SDValue V = simplifyShift(N1, N2))
8466 return V;
8467 [[fallthrough]];
8468 case ISD::ROTL:
8469 case ISD::ROTR:
8470 case ISD::SSHLSAT:
8471 case ISD::USHLSAT:
8472 assert(VT == N1.getValueType() &&
8473 "Shift operators return type must be the same as their first arg");
8474 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8475 "Shifts only work on integers");
8476 assert((!VT.isVector() || VT == N2.getValueType()) &&
8477 "Vector shift amounts must be in the same as their first arg");
8478 // Verify that the shift amount VT is big enough to hold valid shift
8479 // amounts. This catches things like trying to shift an i1024 value by an
8480 // i8, which is easy to fall into in generic code that uses
8481 // TLI.getShiftAmount().
8484 "Invalid use of small shift amount with oversized value!");
8485
8486 // Always fold shifts of i1 values so the code generator doesn't need to
8487 // handle them. Since we know the size of the shift has to be less than the
8488 // size of the value, the shift/rotate count is guaranteed to be zero.
8489 if (VT == MVT::i1)
8490 return N1;
8491 if (N2CV && N2CV->isZero())
8492 return N1;
8493 break;
8494 case ISD::FP_ROUND:
8496 VT.bitsLE(N1.getValueType()) && N2C &&
8497 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8498 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8499 if (N1.getValueType() == VT) return N1; // noop conversion.
8500 break;
8501 case ISD::IS_FPCLASS: {
8503 "IS_FPCLASS is used for a non-floating type");
8504 assert(isa<ConstantSDNode>(N2) && "FPClassTest is not Constant");
8505 // is.fpclass(poison, mask) -> poison
8506 if (N1.getOpcode() == ISD::POISON)
8507 return getPOISON(VT);
8508 FPClassTest Mask = static_cast<FPClassTest>(N2->getAsZExtVal());
8509 // If all tests are made, it doesn't matter what the value is.
8510 if ((Mask & fcAllFlags) == fcAllFlags)
8511 return getBoolConstant(true, DL, VT, N1.getValueType());
8512 if ((Mask & fcAllFlags) == 0)
8513 return getBoolConstant(false, DL, VT, N1.getValueType());
8514 break;
8515 }
8516 case ISD::AssertNoFPClass: {
8518 "AssertNoFPClass is used for a non-floating type");
8519 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8520 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8521 assert(llvm::to_underlying(NoFPClass) <=
8523 "FPClassTest value too large");
8524 (void)NoFPClass;
8525 break;
8526 }
8527 case ISD::AssertSext:
8528 case ISD::AssertZext: {
8529 EVT EVT = cast<VTSDNode>(N2)->getVT();
8530 assert(VT == N1.getValueType() && "Not an inreg extend!");
8531 assert(VT.isInteger() && EVT.isInteger() &&
8532 "Cannot *_EXTEND_INREG FP types");
8533 assert(!EVT.isVector() &&
8534 "AssertSExt/AssertZExt type should be the vector element type "
8535 "rather than the vector type!");
8536 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8537 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8538 break;
8539 }
8541 EVT EVT = cast<VTSDNode>(N2)->getVT();
8542 assert(VT == N1.getValueType() && "Not an inreg extend!");
8543 assert(VT.isInteger() && EVT.isInteger() &&
8544 "Cannot *_EXTEND_INREG FP types");
8545 assert(EVT.isVector() == VT.isVector() &&
8546 "SIGN_EXTEND_INREG type should be vector iff the operand "
8547 "type is vector!");
8548 assert((!EVT.isVector() ||
8550 "Vector element counts must match in SIGN_EXTEND_INREG");
8551 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8552 if (EVT == VT) return N1; // Not actually extending
8553 break;
8554 }
8556 case ISD::FP_TO_UINT_SAT: {
8557 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8558 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8559 assert(N1.getValueType().isVector() == VT.isVector() &&
8560 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8561 "vector!");
8562 assert((!VT.isVector() || VT.getVectorElementCount() ==
8564 "Vector element counts must match in FP_TO_*INT_SAT");
8565 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8566 "Type to saturate to must be a scalar.");
8567 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8568 "Not extending!");
8569 break;
8570 }
8573 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8574 element type of the vector.");
8575
8576 // Extract from an undefined value or using an undefined index is undefined.
8577 if (N1.isUndef() || N2.isUndef())
8578 return getUNDEF(VT);
8579
8580 // EXTRACT_VECTOR_ELT of out-of-bounds element is POISON for fixed length
8581 // vectors. For scalable vectors we will provide appropriate support for
8582 // dealing with arbitrary indices.
8583 if (N2C && N1.getValueType().isFixedLengthVector() &&
8584 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8585 return getPOISON(VT);
8586
8587 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8588 // expanding copies of large vectors from registers. This only works for
8589 // fixed length vectors, since we need to know the exact number of
8590 // elements.
8591 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8593 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8594 return getExtractVectorElt(DL, VT,
8595 N1.getOperand(N2C->getZExtValue() / Factor),
8596 N2C->getZExtValue() % Factor);
8597 }
8598
8599 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8600 // lowering is expanding large vector constants.
8601 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8602 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8605 "BUILD_VECTOR used for scalable vectors");
8606 unsigned Index =
8607 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8608 SDValue Elt = N1.getOperand(Index);
8609
8610 if (VT != Elt.getValueType())
8611 // If the vector element type is not legal, the BUILD_VECTOR operands
8612 // are promoted and implicitly truncated, and the result implicitly
8613 // extended. Make that explicit here.
8614 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8615
8616 return Elt;
8617 }
8618
8619 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8620 // operations are lowered to scalars.
8621 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8622 // If the indices are the same, return the inserted element else
8623 // if the indices are known different, extract the element from
8624 // the original vector.
8625 SDValue N1Op2 = N1.getOperand(2);
8627
8628 if (N1Op2C && N2C) {
8629 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8630 if (VT == N1.getOperand(1).getValueType())
8631 return N1.getOperand(1);
8632 if (VT.isFloatingPoint()) {
8634 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8635 }
8636 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8637 }
8638 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8639 }
8640 }
8641
8642 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8643 // when vector types are scalarized and v1iX is legal.
8644 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8645 // Here we are completely ignoring the extract element index (N2),
8646 // which is fine for fixed width vectors, since any index other than 0
8647 // is undefined anyway. However, this cannot be ignored for scalable
8648 // vectors - in theory we could support this, but we don't want to do this
8649 // without a profitability check.
8650 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8652 N1.getValueType().getVectorNumElements() == 1) {
8653 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8654 N1.getOperand(1));
8655 }
8656 break;
8658 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8659 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8660 (N1.getValueType().isInteger() == VT.isInteger()) &&
8661 N1.getValueType() != VT &&
8662 "Wrong types for EXTRACT_ELEMENT!");
8663
8664 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8665 // 64-bit integers into 32-bit parts. Instead of building the extract of
8666 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8667 if (N1.getOpcode() == ISD::BUILD_PAIR)
8668 return N1.getOperand(N2C->getZExtValue());
8669
8670 // EXTRACT_ELEMENT of a constant int is also very common.
8671 if (N1C) {
8672 unsigned ElementSize = VT.getSizeInBits();
8673 unsigned Shift = ElementSize * N2C->getZExtValue();
8674 const APInt &Val = N1C->getAPIntValue();
8675 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8676 }
8677 break;
8679 EVT N1VT = N1.getValueType();
8680 assert(VT.isVector() && N1VT.isVector() &&
8681 "Extract subvector VTs must be vectors!");
8683 "Extract subvector VTs must have the same element type!");
8684 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8685 "Cannot extract a scalable vector from a fixed length vector!");
8686 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8688 "Extract subvector must be from larger vector to smaller vector!");
8689 assert(N2C && "Extract subvector index must be a constant");
8690 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8691 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8692 N1VT.getVectorMinNumElements()) &&
8693 "Extract subvector overflow!");
8694 assert(N2C->getAPIntValue().getBitWidth() ==
8695 TLI->getVectorIdxWidth(getDataLayout()) &&
8696 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8697 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8698 "Extract index is not a multiple of the output vector length");
8699
8700 // Trivial extraction.
8701 if (VT == N1VT)
8702 return N1;
8703
8704 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8705 if (N1.isUndef())
8706 return getUNDEF(VT);
8707
8708 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8709 // the concat have the same type as the extract.
8710 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8711 VT == N1.getOperand(0).getValueType()) {
8712 unsigned Factor = VT.getVectorMinNumElements();
8713 return N1.getOperand(N2C->getZExtValue() / Factor);
8714 }
8715
8716 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8717 // during shuffle legalization.
8718 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8719 VT == N1.getOperand(1).getValueType())
8720 return N1.getOperand(1);
8721 break;
8722 }
8723 }
8724
8725 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8726 switch (Opcode) {
8727 case ISD::XOR:
8728 case ISD::ADD:
8729 case ISD::PTRADD:
8730 case ISD::SUB:
8732 case ISD::UDIV:
8733 case ISD::SDIV:
8734 case ISD::UREM:
8735 case ISD::SREM:
8736 case ISD::MUL:
8737 case ISD::AND:
8738 case ISD::SSUBSAT:
8739 case ISD::USUBSAT:
8740 case ISD::UMIN:
8741 case ISD::OR:
8742 case ISD::SADDSAT:
8743 case ISD::UADDSAT:
8744 case ISD::UMAX:
8745 case ISD::SMAX:
8746 case ISD::SMIN:
8747 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8748 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8749 }
8750 }
8751
8752 // Canonicalize an UNDEF to the RHS, even over a constant.
8753 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8754 if (TLI->isCommutativeBinOp(Opcode)) {
8755 std::swap(N1, N2);
8756 } else {
8757 switch (Opcode) {
8758 case ISD::PTRADD:
8759 case ISD::SUB:
8760 // fold op(undef, non_undef_arg2) -> undef.
8761 return N1;
8763 case ISD::UDIV:
8764 case ISD::SDIV:
8765 case ISD::UREM:
8766 case ISD::SREM:
8767 case ISD::SSUBSAT:
8768 case ISD::USUBSAT:
8769 // fold op(undef, non_undef_arg2) -> 0.
8770 return getConstant(0, DL, VT);
8771 }
8772 }
8773 }
8774
8775 // Fold a bunch of operators when the RHS is undef.
8776 if (N2.getOpcode() == ISD::UNDEF) {
8777 switch (Opcode) {
8778 case ISD::XOR:
8779 if (N1.getOpcode() == ISD::UNDEF)
8780 // Handle undef ^ undef -> 0 special case. This is a common
8781 // idiom (misuse).
8782 return getConstant(0, DL, VT);
8783 [[fallthrough]];
8784 case ISD::ADD:
8785 case ISD::PTRADD:
8786 case ISD::SUB:
8787 // fold op(arg1, undef) -> undef.
8788 return N2;
8789 case ISD::UDIV:
8790 case ISD::SDIV:
8791 case ISD::UREM:
8792 case ISD::SREM:
8793 // fold op(arg1, undef) -> poison.
8794 return getPOISON(VT);
8795 case ISD::MUL:
8796 case ISD::AND:
8797 case ISD::SSUBSAT:
8798 case ISD::USUBSAT:
8799 case ISD::UMIN:
8800 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8801 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8802 case ISD::OR:
8803 case ISD::SADDSAT:
8804 case ISD::UADDSAT:
8805 case ISD::UMAX:
8806 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8807 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8808 case ISD::SMAX:
8809 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8810 return N1.getOpcode() == ISD::UNDEF
8811 ? N2
8812 : getConstant(
8814 VT);
8815 case ISD::SMIN:
8816 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8817 return N1.getOpcode() == ISD::UNDEF
8818 ? N2
8819 : getConstant(
8821 VT);
8822 }
8823 }
8824
8825 // Perform trivial constant folding.
8826 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8827 return SV;
8828
8829 // Memoize this node if possible.
8830 SDNode *N;
8831 SDVTList VTs = getVTList(VT);
8832 SDValue Ops[] = {N1, N2};
8833 if (VT != MVT::Glue) {
8835 AddNodeIDNode(ID, Opcode, VTs, Ops);
8836 void *IP = nullptr;
8837 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8838 E->intersectFlagsWith(Flags);
8839 return SDValue(E, 0);
8840 }
8841
8842 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8843 N->setFlags(Flags);
8844 createOperands(N, Ops);
8845 CSEMap.InsertNode(N, IP);
8846 } else {
8847 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8848 createOperands(N, Ops);
8849 }
8850
8851 InsertNode(N);
8852 SDValue V = SDValue(N, 0);
8853 NewSDValueDbgMsg(V, "Creating new node: ", this);
8854 return V;
8855}
8856
8857SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8858 SDValue N1, SDValue N2, SDValue N3) {
8859 SDNodeFlags Flags;
8860 if (Inserter)
8861 Flags = Inserter->getFlags();
8862 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8863}
8864
8865SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8866 SDValue N1, SDValue N2, SDValue N3,
8867 const SDNodeFlags Flags) {
8869 N2.getOpcode() != ISD::DELETED_NODE &&
8870 N3.getOpcode() != ISD::DELETED_NODE &&
8871 "Operand is DELETED_NODE!");
8872 // Perform various simplifications.
8873 switch (Opcode) {
8874 case ISD::BUILD_VECTOR: {
8875 // Attempt to simplify BUILD_VECTOR.
8876 SDValue Ops[] = {N1, N2, N3};
8877 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8878 return V;
8879 break;
8880 }
8881 case ISD::CONCAT_VECTORS: {
8882 SDValue Ops[] = {N1, N2, N3};
8883 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8884 return V;
8885 break;
8886 }
8887 case ISD::SETCC: {
8888 assert(VT.isInteger() && "SETCC result type must be an integer!");
8889 assert(N1.getValueType() == N2.getValueType() &&
8890 "SETCC operands must have the same type!");
8891 assert(VT.isVector() == N1.getValueType().isVector() &&
8892 "SETCC type should be vector iff the operand type is vector!");
8893 assert((!VT.isVector() || VT.getVectorElementCount() ==
8895 "SETCC vector element counts must match!");
8896 // Use FoldSetCC to simplify SETCC's.
8897 if (SDValue V =
8898 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8899 return V;
8900 break;
8901 }
8902 case ISD::SELECT:
8903 case ISD::VSELECT:
8904 if (SDValue V = simplifySelect(N1, N2, N3))
8905 return V;
8906 break;
8908 llvm_unreachable("should use getVectorShuffle constructor!");
8910 if (isNullConstant(N3))
8911 return N1;
8912 break;
8914 if (isNullConstant(N3))
8915 return N2;
8916 break;
8918 assert(VT.isVector() && VT == N1.getValueType() &&
8919 "INSERT_VECTOR_ELT vector type mismatch");
8921 "INSERT_VECTOR_ELT scalar fp/int mismatch");
8922 assert((!VT.isFloatingPoint() ||
8923 VT.getVectorElementType() == N2.getValueType()) &&
8924 "INSERT_VECTOR_ELT fp scalar type mismatch");
8925 assert((!VT.isInteger() ||
8927 "INSERT_VECTOR_ELT int scalar size mismatch");
8928
8929 auto *N3C = dyn_cast<ConstantSDNode>(N3);
8930 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
8931 // for scalable vectors where we will generate appropriate code to
8932 // deal with out-of-bounds cases correctly.
8933 if (N3C && VT.isFixedLengthVector() &&
8934 N3C->getZExtValue() >= VT.getVectorNumElements())
8935 return getUNDEF(VT);
8936
8937 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
8938 if (N3.isUndef())
8939 return getUNDEF(VT);
8940
8941 // If inserting poison, just use the input vector.
8942 if (N2.getOpcode() == ISD::POISON)
8943 return N1;
8944
8945 // Inserting undef into undef/poison is still undef.
8946 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8947 return getUNDEF(VT);
8948
8949 // If the inserted element is an UNDEF, just use the input vector.
8950 // But not if skipping the insert could make the result more poisonous.
8951 if (N2.isUndef()) {
8952 if (N3C && VT.isFixedLengthVector()) {
8953 APInt EltMask =
8954 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
8955 if (isGuaranteedNotToBePoison(N1, EltMask))
8956 return N1;
8957 } else if (isGuaranteedNotToBePoison(N1))
8958 return N1;
8959 }
8960 break;
8961 }
8962 case ISD::INSERT_SUBVECTOR: {
8963 // If inserting poison, just use the input vector,
8964 if (N2.getOpcode() == ISD::POISON)
8965 return N1;
8966
8967 // Inserting undef into undef/poison is still undef.
8968 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8969 return getUNDEF(VT);
8970
8971 EVT N2VT = N2.getValueType();
8972 assert(VT == N1.getValueType() &&
8973 "Dest and insert subvector source types must match!");
8974 assert(VT.isVector() && N2VT.isVector() &&
8975 "Insert subvector VTs must be vectors!");
8977 "Insert subvector VTs must have the same element type!");
8978 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
8979 "Cannot insert a scalable vector into a fixed length vector!");
8980 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8982 "Insert subvector must be from smaller vector to larger vector!");
8984 "Insert subvector index must be constant");
8985 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8986 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
8988 "Insert subvector overflow!");
8990 TLI->getVectorIdxWidth(getDataLayout()) &&
8991 "Constant index for INSERT_SUBVECTOR has an invalid size");
8992
8993 // Trivial insertion.
8994 if (VT == N2VT)
8995 return N2;
8996
8997 // If this is an insert of an extracted vector into an undef/poison vector,
8998 // we can just use the input to the extract. But not if skipping the
8999 // extract+insert could make the result more poisonous.
9000 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
9001 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
9002 if (N1.getOpcode() == ISD::POISON)
9003 return N2.getOperand(0);
9004 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
9005 unsigned LoBit = N3->getAsZExtVal();
9006 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9007 APInt EltMask =
9008 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9009 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
9010 return N2.getOperand(0);
9011 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
9012 return N2.getOperand(0);
9013 }
9014
9015 // If the inserted subvector is UNDEF, just use the input vector.
9016 // But not if skipping the insert could make the result more poisonous.
9017 if (N2.isUndef()) {
9018 if (VT.isFixedLengthVector()) {
9019 unsigned LoBit = N3->getAsZExtVal();
9020 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
9021 APInt EltMask =
9022 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
9023 if (isGuaranteedNotToBePoison(N1, EltMask))
9024 return N1;
9025 } else if (isGuaranteedNotToBePoison(N1))
9026 return N1;
9027 }
9028 break;
9029 }
9030 case ISD::BITCAST:
9031 // Fold bit_convert nodes from a type to themselves.
9032 if (N1.getValueType() == VT)
9033 return N1;
9034 break;
9035 case ISD::VP_TRUNCATE:
9036 case ISD::VP_SIGN_EXTEND:
9037 case ISD::VP_ZERO_EXTEND:
9038 // Don't create noop casts.
9039 if (N1.getValueType() == VT)
9040 return N1;
9041 break;
9042 case ISD::VECTOR_COMPRESS: {
9043 [[maybe_unused]] EVT VecVT = N1.getValueType();
9044 [[maybe_unused]] EVT MaskVT = N2.getValueType();
9045 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
9046 assert(VT == VecVT && "Vector and result type don't match.");
9047 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
9048 "All inputs must be vectors.");
9049 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
9051 "Vector and mask must have same number of elements.");
9052
9053 if (N1.isUndef() || N2.isUndef())
9054 return N3;
9055
9056 break;
9057 }
9062 [[maybe_unused]] EVT AccVT = N1.getValueType();
9063 [[maybe_unused]] EVT Input1VT = N2.getValueType();
9064 [[maybe_unused]] EVT Input2VT = N3.getValueType();
9065 assert(Input1VT.isVector() && Input1VT == Input2VT &&
9066 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9067 "node to have the same type!");
9068 assert(VT.isVector() && VT == AccVT &&
9069 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
9070 "the same type as its result!");
9072 AccVT.getVectorElementCount()) &&
9073 "Expected the element count of the second and third operands of the "
9074 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
9075 "element count of the first operand and the result!");
9077 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
9078 "node to have an element type which is the same as or smaller than "
9079 "the element type of the first operand and result!");
9080 break;
9081 }
9082 }
9083
9084 // Perform trivial constant folding for arithmetic operators.
9085 switch (Opcode) {
9086 case ISD::FMA:
9087 case ISD::FMAD:
9088 case ISD::SETCC:
9089 case ISD::FSHL:
9090 case ISD::FSHR:
9091 if (SDValue SV =
9092 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
9093 return SV;
9094 break;
9095 }
9096
9097 // Memoize node if it doesn't produce a glue result.
9098 SDNode *N;
9099 SDVTList VTs = getVTList(VT);
9100 SDValue Ops[] = {N1, N2, N3};
9101 if (VT != MVT::Glue) {
9103 AddNodeIDNode(ID, Opcode, VTs, Ops);
9104 void *IP = nullptr;
9105 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
9106 E->intersectFlagsWith(Flags);
9107 return SDValue(E, 0);
9108 }
9109
9110 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9111 N->setFlags(Flags);
9112 createOperands(N, Ops);
9113 CSEMap.InsertNode(N, IP);
9114 } else {
9115 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
9116 createOperands(N, Ops);
9117 }
9118
9119 InsertNode(N);
9120 SDValue V = SDValue(N, 0);
9121 NewSDValueDbgMsg(V, "Creating new node: ", this);
9122 return V;
9123}
9124
9125SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9126 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9127 const SDNodeFlags Flags) {
9128 SDValue Ops[] = { N1, N2, N3, N4 };
9129 return getNode(Opcode, DL, VT, Ops, Flags);
9130}
9131
9132SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9133 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
9134 SDNodeFlags Flags;
9135 if (Inserter)
9136 Flags = Inserter->getFlags();
9137 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
9138}
9139
9140SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9141 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9142 SDValue N5, const SDNodeFlags Flags) {
9143 SDValue Ops[] = { N1, N2, N3, N4, N5 };
9144 return getNode(Opcode, DL, VT, Ops, Flags);
9145}
9146
9147SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
9148 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
9149 SDValue N5) {
9150 SDNodeFlags Flags;
9151 if (Inserter)
9152 Flags = Inserter->getFlags();
9153 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
9154}
9155
9156/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
9157/// the incoming stack arguments to be loaded from the stack.
9159 SmallVector<SDValue, 8> ArgChains;
9160
9161 // Include the original chain at the beginning of the list. When this is
9162 // used by target LowerCall hooks, this helps legalize find the
9163 // CALLSEQ_BEGIN node.
9164 ArgChains.push_back(Chain);
9165
9166 // Add a chain value for each stack argument.
9167 for (SDNode *U : getEntryNode().getNode()->users())
9168 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
9169 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
9170 if (FI->getIndex() < 0)
9171 ArgChains.push_back(SDValue(L, 1));
9172
9173 // Build a tokenfactor for all the chains.
9174 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
9175}
9176
9177/// getMemsetValue - Vectorized representation of the memset value
9178/// operand.
9180 const SDLoc &dl) {
9181 assert(!Value.isUndef());
9182
9183 unsigned NumBits = VT.getScalarSizeInBits();
9185 assert(C->getAPIntValue().getBitWidth() == 8);
9186 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
9187 if (VT.isInteger()) {
9188 bool IsOpaque = VT.getSizeInBits() > 64 ||
9189 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
9190 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
9191 }
9192 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
9193 }
9194
9195 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
9196 EVT IntVT = VT.getScalarType();
9197 if (!IntVT.isInteger())
9198 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
9199
9200 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
9201 if (NumBits > 8) {
9202 // Use a multiplication with 0x010101... to extend the input to the
9203 // required length.
9204 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
9205 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
9206 DAG.getConstant(Magic, dl, IntVT));
9207 }
9208
9209 if (VT != Value.getValueType() && !VT.isInteger())
9210 Value = DAG.getBitcast(VT.getScalarType(), Value);
9211 if (VT != Value.getValueType())
9212 Value = DAG.getSplatBuildVector(VT, dl, Value);
9213
9214 return Value;
9215}
9216
9217/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
9218/// used when a memcpy is turned into a memset when the source is a constant
9219/// string ptr.
9221 const TargetLowering &TLI,
9222 const ConstantDataArraySlice &Slice) {
9223 // Handle vector with all elements zero.
9224 if (Slice.Array == nullptr) {
9225 if (VT.isInteger())
9226 return DAG.getConstant(0, dl, VT);
9227 return DAG.getNode(ISD::BITCAST, dl, VT,
9228 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
9229 }
9230
9231 assert(!VT.isVector() && "Can't handle vector type here!");
9232 unsigned NumVTBits = VT.getSizeInBits();
9233 unsigned NumVTBytes = NumVTBits / 8;
9234 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
9235
9236 APInt Val(NumVTBits, 0);
9237 if (DAG.getDataLayout().isLittleEndian()) {
9238 for (unsigned i = 0; i != NumBytes; ++i)
9239 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
9240 } else {
9241 for (unsigned i = 0; i != NumBytes; ++i)
9242 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
9243 }
9244
9245 // If the "cost" of materializing the integer immediate is less than the cost
9246 // of a load, then it is cost effective to turn the load into the immediate.
9247 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
9248 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
9249 return DAG.getConstant(Val, dl, VT);
9250 return SDValue();
9251}
9252
9254 const SDLoc &DL,
9255 const SDNodeFlags Flags) {
9256 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
9257 return getMemBasePlusOffset(Base, Index, DL, Flags);
9258}
9259
9261 const SDLoc &DL,
9262 const SDNodeFlags Flags) {
9263 assert(Offset.getValueType().isInteger());
9264 EVT BasePtrVT = Ptr.getValueType();
9265 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
9266 BasePtrVT))
9267 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
9268 // InBounds only applies to PTRADD, don't set it if we generate ADD.
9269 SDNodeFlags AddFlags = Flags;
9270 AddFlags.setInBounds(false);
9271 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
9272}
9273
9274/// Returns true if memcpy source is constant data.
9276 uint64_t SrcDelta = 0;
9277 GlobalAddressSDNode *G = nullptr;
9278 if (Src.getOpcode() == ISD::GlobalAddress)
9280 else if (Src->isAnyAdd() &&
9281 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
9282 Src.getOperand(1).getOpcode() == ISD::Constant) {
9283 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
9284 SrcDelta = Src.getConstantOperandVal(1);
9285 }
9286 if (!G)
9287 return false;
9288
9289 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
9290 SrcDelta + G->getOffset());
9291}
9292
9294 SelectionDAG &DAG) {
9295 // On Darwin, -Os means optimize for size without hurting performance, so
9296 // only really optimize for size when -Oz (MinSize) is used.
9298 return MF.getFunction().hasMinSize();
9299 return DAG.shouldOptForSize();
9300}
9301
9303 SmallVector<SDValue, 32> &OutChains, unsigned From,
9304 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
9305 SmallVector<SDValue, 16> &OutStoreChains) {
9306 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
9307 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
9308 SmallVector<SDValue, 16> GluedLoadChains;
9309 for (unsigned i = From; i < To; ++i) {
9310 OutChains.push_back(OutLoadChains[i]);
9311 GluedLoadChains.push_back(OutLoadChains[i]);
9312 }
9313
9314 // Chain for all loads.
9315 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
9316 GluedLoadChains);
9317
9318 for (unsigned i = From; i < To; ++i) {
9319 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
9320 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
9321 ST->getBasePtr(), ST->getMemoryVT(),
9322 ST->getMemOperand());
9323 OutChains.push_back(NewStore);
9324 }
9325}
9326
9327static SDValue
9329 SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign,
9330 Align SrcAlign, bool isVol, bool AlwaysInline,
9331 MachinePointerInfo DstPtrInfo,
9332 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9333 BatchAAResults *BatchAA) {
9334 // Turn a memcpy of undef to nop.
9335 // FIXME: We need to honor volatile even is Src is undef.
9336 if (Src.isUndef())
9337 return Chain;
9338
9339 // Expand memcpy to a series of load and store ops if the size operand falls
9340 // below a certain threshold.
9341 // TODO: In the AlwaysInline case, if the size is big then generate a loop
9342 // rather than maybe a humongous number of loads and stores.
9343 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9344 const DataLayout &DL = DAG.getDataLayout();
9345 LLVMContext &C = *DAG.getContext();
9346 std::vector<EVT> MemOps;
9347 bool DstAlignCanChange = false;
9349 MachineFrameInfo &MFI = MF.getFrameInfo();
9350 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9352 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9353 DstAlignCanChange = true;
9354 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9356 // If marked as volatile, perform a copy even when marked as constant.
9357 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
9358 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
9359 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
9360 const MemOp Op = isZeroConstant
9361 ? MemOp::Set(Size, DstAlignCanChange, DstAlign,
9362 /*IsZeroMemset*/ true, isVol)
9363 : MemOp::Copy(Size, DstAlignCanChange, DstAlign,
9364 SrcAlign, isVol, CopyFromConstant);
9365 if (!TLI.findOptimalMemOpLowering(
9366 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
9367 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
9368 return SDValue();
9369
9370 if (DstAlignCanChange) {
9371 Type *Ty = MemOps[0].getTypeForEVT(C);
9372 Align NewDstAlign = DL.getABITypeAlign(Ty);
9373
9374 // Don't promote to an alignment that would require dynamic stack
9375 // realignment which may conflict with optimizations such as tail call
9376 // optimization.
9378 if (!TRI->hasStackRealignment(MF))
9379 if (MaybeAlign StackAlign = DL.getStackAlignment())
9380 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9381
9382 if (NewDstAlign > DstAlign) {
9383 // Give the stack frame object a larger alignment if needed.
9384 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9385 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9386 DstAlign = NewDstAlign;
9387 }
9388 }
9389
9390 // Prepare AAInfo for loads/stores after lowering this memcpy.
9391 AAMDNodes NewAAInfo = AAInfo;
9392 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9393
9394 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9395 bool isConstant =
9396 BatchAA && SrcVal &&
9397 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9398
9399 MachineMemOperand::Flags MMOFlags =
9401 SmallVector<SDValue, 16> OutLoadChains;
9402 SmallVector<SDValue, 16> OutStoreChains;
9403 SmallVector<SDValue, 32> OutChains;
9404 unsigned NumMemOps = MemOps.size();
9405 uint64_t SrcOff = 0, DstOff = 0;
9406 for (unsigned i = 0; i != NumMemOps; ++i) {
9407 EVT VT = MemOps[i];
9408 unsigned VTSize = VT.getSizeInBits() / 8;
9409 SDValue Value, Store;
9410
9411 if (VTSize > Size) {
9412 // Issuing an unaligned load / store pair that overlaps with the previous
9413 // pair. Adjust the offset accordingly.
9414 assert(i == NumMemOps-1 && i != 0);
9415 SrcOff -= VTSize - Size;
9416 DstOff -= VTSize - Size;
9417 }
9418
9419 if (CopyFromConstant &&
9420 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9421 // It's unlikely a store of a vector immediate can be done in a single
9422 // instruction. It would require a load from a constantpool first.
9423 // We only handle zero vectors here.
9424 // FIXME: Handle other cases where store of vector immediate is done in
9425 // a single instruction.
9426 ConstantDataArraySlice SubSlice;
9427 if (SrcOff < Slice.Length) {
9428 SubSlice = Slice;
9429 SubSlice.move(SrcOff);
9430 } else {
9431 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9432 SubSlice.Array = nullptr;
9433 SubSlice.Offset = 0;
9434 SubSlice.Length = VTSize;
9435 }
9436 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9437 if (Value.getNode()) {
9438 Store = DAG.getStore(
9439 Chain, dl, Value,
9440 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9441 DstPtrInfo.getWithOffset(DstOff), DstAlign, MMOFlags, NewAAInfo);
9442 OutChains.push_back(Store);
9443 }
9444 }
9445
9446 if (!Store.getNode()) {
9447 // The type might not be legal for the target. This should only happen
9448 // if the type is smaller than a legal type, as on PPC, so the right
9449 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9450 // to Load/Store if NVT==VT.
9451 // FIXME does the case above also need this?
9452 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9453 assert(NVT.bitsGE(VT));
9454
9455 bool isDereferenceable =
9456 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9457 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9458 if (isDereferenceable)
9460 if (isConstant)
9461 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9462
9463 Value = DAG.getExtLoad(
9464 ISD::EXTLOAD, dl, NVT, Chain,
9465 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9466 SrcPtrInfo.getWithOffset(SrcOff), VT,
9467 commonAlignment(SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9468 OutLoadChains.push_back(Value.getValue(1));
9469
9470 Store = DAG.getTruncStore(
9471 Chain, dl, Value,
9472 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9473 DstPtrInfo.getWithOffset(DstOff), VT, DstAlign, MMOFlags, NewAAInfo);
9474 OutStoreChains.push_back(Store);
9475 }
9476 SrcOff += VTSize;
9477 DstOff += VTSize;
9478 Size -= VTSize;
9479 }
9480
9481 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9483 unsigned NumLdStInMemcpy = OutStoreChains.size();
9484
9485 if (NumLdStInMemcpy) {
9486 // It may be that memcpy might be converted to memset if it's memcpy
9487 // of constants. In such a case, we won't have loads and stores, but
9488 // just stores. In the absence of loads, there is nothing to gang up.
9489 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9490 // If target does not care, just leave as it.
9491 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9492 OutChains.push_back(OutLoadChains[i]);
9493 OutChains.push_back(OutStoreChains[i]);
9494 }
9495 } else {
9496 // Ld/St less than/equal limit set by target.
9497 if (NumLdStInMemcpy <= GluedLdStLimit) {
9498 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9499 NumLdStInMemcpy, OutLoadChains,
9500 OutStoreChains);
9501 } else {
9502 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9503 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9504 unsigned GlueIter = 0;
9505
9506 // Residual ld/st.
9507 if (RemainingLdStInMemcpy) {
9509 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9510 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9511 }
9512
9513 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9514 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9515 GlueIter - GluedLdStLimit;
9516 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9517 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9518 OutLoadChains, OutStoreChains);
9519 GlueIter += GluedLdStLimit;
9520 }
9521 }
9522 }
9523 }
9524 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9525}
9526
9528 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
9529 uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol,
9530 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9531 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo) {
9532 // Turn a memmove of undef to nop.
9533 // FIXME: We need to honor volatile even is Src is undef.
9534 if (Src.isUndef())
9535 return Chain;
9536
9537 // Expand memmove to a series of load and store ops if the size operand falls
9538 // below a certain threshold.
9539 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9540 const DataLayout &DL = DAG.getDataLayout();
9541 LLVMContext &C = *DAG.getContext();
9542 std::vector<EVT> MemOps;
9543 bool DstAlignCanChange = false;
9545 MachineFrameInfo &MFI = MF.getFrameInfo();
9546 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9548 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9549 DstAlignCanChange = true;
9550 SrcAlign = std::max(SrcAlign, DAG.InferPtrAlign(Src).valueOrOne());
9551 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9552 if (!TLI.findOptimalMemOpLowering(
9553 C, MemOps, Limit,
9554 MemOp::Copy(Size, DstAlignCanChange, DstAlign, SrcAlign, isVol),
9555 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9556 MF.getFunction().getAttributes(), nullptr))
9557 return SDValue();
9558
9559 if (DstAlignCanChange) {
9560 Type *Ty = MemOps[0].getTypeForEVT(C);
9561 Align NewDstAlign = DL.getABITypeAlign(Ty);
9562
9563 // Don't promote to an alignment that would require dynamic stack
9564 // realignment which may conflict with optimizations such as tail call
9565 // optimization.
9567 if (!TRI->hasStackRealignment(MF))
9568 if (MaybeAlign StackAlign = DL.getStackAlignment())
9569 NewDstAlign = std::min(NewDstAlign, *StackAlign);
9570
9571 if (NewDstAlign > DstAlign) {
9572 // Give the stack frame object a larger alignment if needed.
9573 if (MFI.getObjectAlign(FI->getIndex()) < NewDstAlign)
9574 MFI.setObjectAlignment(FI->getIndex(), NewDstAlign);
9575 DstAlign = NewDstAlign;
9576 }
9577 }
9578
9579 // Prepare AAInfo for loads/stores after lowering this memmove.
9580 AAMDNodes NewAAInfo = AAInfo;
9581 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9582
9583 MachineMemOperand::Flags MMOFlags =
9585 uint64_t SrcOff = 0;
9586 SmallVector<SDValue, 8> LoadValues;
9587 SmallVector<SDValue, 8> LoadChains;
9588 SmallVector<SDValue, 8> OutChains;
9589 unsigned NumMemOps = MemOps.size();
9590 for (unsigned i = 0; i < NumMemOps; i++) {
9591 EVT VT = MemOps[i];
9592 unsigned VTSize = VT.getSizeInBits() / 8;
9593 SDValue Value;
9594 bool IsOverlapping = false;
9595
9596 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - SrcOff) {
9597 // Issuing an unaligned load / store pair that overlaps with the previous
9598 // pair. Adjust the offset accordingly.
9599 SrcOff = Size - VTSize;
9600 IsOverlapping = true;
9601 }
9602
9603 // Calculate the actual alignment at the current offset. The alignment at
9604 // SrcOff may be lower than the base alignment, especially when using
9605 // overlapping loads.
9606 Align SrcAlignAtOffset = commonAlignment(SrcAlign, SrcOff);
9607 if (IsOverlapping) {
9608 // Verify that the target allows misaligned memory accesses at the
9609 // adjusted offset when using overlapping loads.
9610 unsigned Fast;
9611 if (!TLI.allowsMisalignedMemoryAccesses(VT, SrcPtrInfo.getAddrSpace(),
9612 SrcAlignAtOffset, MMOFlags,
9613 &Fast) ||
9614 !Fast) {
9615 // This should have been caught by findOptimalMemOpLowering, but verify
9616 // here for safety.
9617 return SDValue();
9618 }
9619 }
9620
9621 bool isDereferenceable =
9622 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9623 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9624 if (isDereferenceable)
9626 Value =
9627 DAG.getLoad(VT, dl, Chain,
9628 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9629 SrcPtrInfo.getWithOffset(SrcOff), SrcAlignAtOffset,
9630 SrcMMOFlags, NewAAInfo);
9631 LoadValues.push_back(Value);
9632 LoadChains.push_back(Value.getValue(1));
9633 SrcOff += VTSize;
9634 }
9635 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9636 OutChains.clear();
9637 uint64_t DstOff = 0;
9638 for (unsigned i = 0; i < NumMemOps; i++) {
9639 EVT VT = MemOps[i];
9640 unsigned VTSize = VT.getSizeInBits() / 8;
9641 SDValue Store;
9642 bool IsOverlapping = false;
9643
9644 if (i == NumMemOps - 1 && i != 0 && VTSize > Size - DstOff) {
9645 // Issuing an unaligned load / store pair that overlaps with the previous
9646 // pair. Adjust the offset accordingly.
9647 DstOff = Size - VTSize;
9648 IsOverlapping = true;
9649 }
9650
9651 // Calculate the actual alignment at the current offset. The alignment at
9652 // DstOff may be lower than the base alignment, especially when using
9653 // overlapping stores.
9654 Align DstAlignAtOffset = commonAlignment(DstAlign, DstOff);
9655 if (IsOverlapping) {
9656 // Verify that the target allows misaligned memory accesses at the
9657 // adjusted offset when using overlapping stores.
9658 unsigned Fast;
9659 if (!TLI.allowsMisalignedMemoryAccesses(VT, DstPtrInfo.getAddrSpace(),
9660 DstAlignAtOffset, MMOFlags,
9661 &Fast) ||
9662 !Fast) {
9663 // This should have been caught by findOptimalMemOpLowering, but verify
9664 // here for safety.
9665 return SDValue();
9666 }
9667 }
9668 Store = DAG.getStore(
9669 Chain, dl, LoadValues[i],
9670 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9671 DstPtrInfo.getWithOffset(DstOff), DstAlignAtOffset, MMOFlags,
9672 NewAAInfo);
9673 OutChains.push_back(Store);
9674 DstOff += VTSize;
9675 }
9676
9677 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9678}
9679
9680/// Lower the call to 'memset' intrinsic function into a series of store
9681/// operations.
9682///
9683/// \param DAG Selection DAG where lowered code is placed.
9684/// \param dl Link to corresponding IR location.
9685/// \param Chain Control flow dependency.
9686/// \param Dst Pointer to destination memory location.
9687/// \param Src Value of byte to write into the memory.
9688/// \param Size Number of bytes to write.
9689/// \param Alignment Alignment of the destination in bytes.
9690/// \param isVol True if destination is volatile.
9691/// \param AlwaysInline Makes sure no function call is generated.
9692/// \param DstPtrInfo IR information on the memory pointer.
9693/// \returns New head in the control flow, if lowering was successful, empty
9694/// SDValue otherwise.
9695///
9696/// The function tries to replace 'llvm.memset' intrinsic with several store
9697/// operations and value calculation code. This is usually profitable for small
9698/// memory size or when the semantic requires inlining.
9700 SDValue Chain, SDValue Dst, SDValue Src,
9701 uint64_t Size, Align Alignment, bool isVol,
9702 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9703 const AAMDNodes &AAInfo) {
9704 // Turn a memset of undef to nop.
9705 // FIXME: We need to honor volatile even is Src is undef.
9706 if (Src.isUndef())
9707 return Chain;
9708
9709 // Expand memset to a series of load/store ops if the size operand
9710 // falls below a certain threshold.
9711 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9712 std::vector<EVT> MemOps;
9713 bool DstAlignCanChange = false;
9714 LLVMContext &C = *DAG.getContext();
9716 MachineFrameInfo &MFI = MF.getFrameInfo();
9717 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9719 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9720 DstAlignCanChange = true;
9721 bool IsZeroVal = isNullConstant(Src);
9722 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9723
9724 EVT LargestVT;
9725 if (!TLI.findOptimalMemOpLowering(
9726 C, MemOps, Limit,
9727 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9728 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9729 &LargestVT))
9730 return SDValue();
9731
9732 if (DstAlignCanChange) {
9733 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9734 const DataLayout &DL = DAG.getDataLayout();
9735 Align NewAlign = DL.getABITypeAlign(Ty);
9736
9737 // Don't promote to an alignment that would require dynamic stack
9738 // realignment which may conflict with optimizations such as tail call
9739 // optimization.
9741 if (!TRI->hasStackRealignment(MF))
9742 if (MaybeAlign StackAlign = DL.getStackAlignment())
9743 NewAlign = std::min(NewAlign, *StackAlign);
9744
9745 if (NewAlign > Alignment) {
9746 // Give the stack frame object a larger alignment if needed.
9747 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9748 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9749 Alignment = NewAlign;
9750 }
9751 }
9752
9753 SmallVector<SDValue, 8> OutChains;
9754 uint64_t DstOff = 0;
9755 unsigned NumMemOps = MemOps.size();
9756
9757 // Find the largest store and generate the bit pattern for it.
9758 // If target didn't set LargestVT, compute it from MemOps.
9759 if (!LargestVT.isSimple()) {
9760 LargestVT = MemOps[0];
9761 for (unsigned i = 1; i < NumMemOps; i++)
9762 if (MemOps[i].bitsGT(LargestVT))
9763 LargestVT = MemOps[i];
9764 }
9765 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9766
9767 // Prepare AAInfo for loads/stores after lowering this memset.
9768 AAMDNodes NewAAInfo = AAInfo;
9769 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9770
9771 for (unsigned i = 0; i < NumMemOps; i++) {
9772 EVT VT = MemOps[i];
9773 unsigned VTSize = VT.getSizeInBits() / 8;
9774 // The target should specify store types that exactly cover the memset size
9775 // (with the last store potentially being oversized for overlapping stores).
9776 assert(Size > 0 && "Target specified more stores than needed in "
9777 "findOptimalMemOpLowering");
9778 if (VTSize > Size) {
9779 // Issuing an unaligned load / store pair that overlaps with the previous
9780 // pair. Adjust the offset accordingly.
9781 assert(i == NumMemOps-1 && i != 0);
9782 DstOff -= VTSize - Size;
9783 }
9784
9785 // If this store is smaller than the largest store see whether we can get
9786 // the smaller value for free with a truncate or extract vector element and
9787 // then store.
9788 SDValue Value = MemSetValue;
9789 if (VT.bitsLT(LargestVT)) {
9790 unsigned Index;
9791 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9792 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9793 if (!LargestVT.isVector() && !VT.isVector() &&
9794 TLI.isTruncateFree(LargestVT, VT))
9795 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9796 else if (LargestVT.isVector() && !VT.isVector() &&
9798 LargestVT.getTypeForEVT(*DAG.getContext()),
9799 VT.getSizeInBits(), Index) &&
9800 TLI.isTypeLegal(SVT) &&
9801 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9802 // Target which can combine store(extractelement VectorTy, Idx) can get
9803 // the smaller value for free.
9804 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9805 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9806 } else
9807 Value = getMemsetValue(Src, VT, DAG, dl);
9808 }
9809 assert(Value.getValueType() == VT && "Value with wrong type.");
9810 SDValue Store = DAG.getStore(
9811 Chain, dl, Value,
9812 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9813 DstPtrInfo.getWithOffset(DstOff), Alignment,
9815 NewAAInfo);
9816 OutChains.push_back(Store);
9817 DstOff += VT.getSizeInBits() / 8;
9818 // For oversized overlapping stores, only subtract the remaining bytes.
9819 // For normal stores, subtract the full store size.
9820 if (VTSize > Size) {
9821 Size = 0;
9822 } else {
9823 Size -= VTSize;
9824 }
9825 }
9826
9827 // After processing all stores, Size should be exactly 0. Any remaining bytes
9828 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9829 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9830 "stores that exactly cover the memset size");
9831
9832 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9833}
9834
9836 unsigned AS) {
9837 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9838 // pointer operands can be losslessly bitcasted to pointers of address space 0
9839 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9840 report_fatal_error("cannot lower memory intrinsic in address space " +
9841 Twine(AS));
9842 }
9843}
9844
9846 const SelectionDAG *SelDAG,
9847 bool AllowReturnsFirstArg) {
9848 if (!CI || !CI->isTailCall())
9849 return false;
9850 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9851 // helper symbol we lower to.
9852 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9853 AllowReturnsFirstArg &&
9855}
9856
9857static std::pair<SDValue, SDValue>
9860 const CallInst *CI, RTLIB::Libcall Call,
9861 SelectionDAG *DAG, const TargetLowering *TLI) {
9862 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9863
9864 if (LCImpl == RTLIB::Unsupported)
9865 return {};
9866
9868 bool IsTailCall =
9869 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9870 SDValue Callee =
9871 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9872
9873 CLI.setDebugLoc(dl)
9874 .setChain(Chain)
9876 CI->getType(), Callee, std::move(Args))
9877 .setTailCall(IsTailCall);
9878
9879 return TLI->LowerCallTo(CLI);
9880}
9881
9882std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9883 const SDLoc &dl, SDValue S1,
9884 SDValue S2,
9885 const CallInst *CI) {
9887 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9888 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9889 RTLIB::STRCMP, this, TLI);
9890}
9891
9892std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9893 const SDLoc &dl, SDValue S1,
9894 SDValue S2,
9895 const CallInst *CI) {
9897 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9898 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9899 RTLIB::STRSTR, this, TLI);
9900}
9901
9902std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9903 const SDLoc &dl,
9904 SDValue Dst, SDValue Src,
9906 const CallInst *CI) {
9908
9910 {Dst, PT},
9911 {Src, PT},
9914 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9915 RTLIB::MEMCCPY, this, TLI);
9916}
9917
9918std::pair<SDValue, SDValue>
9920 SDValue Mem1, SDValue Size, const CallInst *CI) {
9923 {Mem0, PT},
9924 {Mem1, PT},
9926 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9927 RTLIB::MEMCMP, this, TLI);
9928}
9929
9930std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
9931 const SDLoc &dl,
9932 SDValue Dst, SDValue Src,
9933 const CallInst *CI) {
9935 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
9936 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9937 RTLIB::STRCPY, this, TLI);
9938}
9939
9940std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
9941 const SDLoc &dl,
9942 SDValue Src,
9943 const CallInst *CI) {
9944 // Emit a library call.
9947 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9948 RTLIB::STRLEN, this, TLI);
9949}
9950
9952 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
9953 Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline,
9954 const CallInst *CI, std::optional<bool> OverrideTailCall,
9955 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
9956 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
9957 // Check to see if we should lower the memcpy to loads and stores first.
9958 // For cases within the target-specified limits, this is the best choice.
9960 if (ConstantSize) {
9961 // Memcpy with size zero? Just return the original chain.
9962 if (ConstantSize->isZero())
9963 return Chain;
9964
9966 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
9967 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9968 if (Result.getNode())
9969 return Result;
9970 }
9971
9972 // Then check to see if we should lower the memcpy with target-specific
9973 // code. If the target chooses to do this, this is the next best.
9974 if (TSI) {
9975 SDValue Result = TSI->EmitTargetCodeForMemcpy(
9976 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol,
9977 AlwaysInline, DstPtrInfo, SrcPtrInfo);
9978 if (Result.getNode())
9979 return Result;
9980 }
9981
9982 // If we really need inline code and the target declined to provide it,
9983 // use a (potentially long) sequence of loads and stores.
9984 if (AlwaysInline) {
9985 assert(ConstantSize && "AlwaysInline requires a constant size!");
9987 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
9988 SrcAlign, isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9989 }
9990
9993
9994 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
9995 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
9996 // respect volatile, so they may do things like read or write memory
9997 // beyond the given memory regions. But fixing this isn't easy, and most
9998 // people don't care.
9999
10000 // Emit a library call.
10003 Args.emplace_back(Dst, PtrTy);
10004 Args.emplace_back(Src, PtrTy);
10005 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10006 // FIXME: pass in SDLoc
10008 bool IsTailCall = false;
10009 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
10010
10011 if (OverrideTailCall.has_value()) {
10012 IsTailCall = *OverrideTailCall;
10013 } else {
10014 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
10015 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
10016 }
10017
10018 CLI.setDebugLoc(dl)
10019 .setChain(Chain)
10020 .setLibCallee(
10021 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
10022 Dst.getValueType().getTypeForEVT(*getContext()),
10023 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
10024 std::move(Args))
10026 .setTailCall(IsTailCall);
10027
10028 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10029 return CallResult.second;
10030}
10031
10033 SDValue Dst, SDValue Src, SDValue Size,
10034 Type *SizeTy, unsigned ElemSz,
10035 bool isTailCall,
10036 MachinePointerInfo DstPtrInfo,
10037 MachinePointerInfo SrcPtrInfo) {
10038 // Emit a library call.
10041 Args.emplace_back(Dst, ArgTy);
10042 Args.emplace_back(Src, ArgTy);
10043 Args.emplace_back(Size, SizeTy);
10044
10045 RTLIB::Libcall LibraryCall =
10047 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10048 if (LibcallImpl == RTLIB::Unsupported)
10049 report_fatal_error("Unsupported element size");
10050
10052 CLI.setDebugLoc(dl)
10053 .setChain(Chain)
10054 .setLibCallee(
10055 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10057 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10058 std::move(Args))
10060 .setTailCall(isTailCall);
10061
10062 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10063 return CallResult.second;
10064}
10065
10067 SDValue Src, SDValue Size, Align DstAlign,
10068 Align SrcAlign, bool isVol, const CallInst *CI,
10069 std::optional<bool> OverrideTailCall,
10070 MachinePointerInfo DstPtrInfo,
10071 MachinePointerInfo SrcPtrInfo,
10072 const AAMDNodes &AAInfo,
10073 BatchAAResults *BatchAA) {
10074 // Check to see if we should lower the memmove to loads and stores first.
10075 // For cases within the target-specified limits, this is the best choice.
10077 if (ConstantSize) {
10078 // Memmove with size zero? Just return the original chain.
10079 if (ConstantSize->isZero())
10080 return Chain;
10081
10083 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), DstAlign,
10084 SrcAlign, isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
10085 if (Result.getNode())
10086 return Result;
10087 }
10088
10089 // Then check to see if we should lower the memmove with target-specific
10090 // code. If the target chooses to do this, this is the next best.
10091 if (TSI) {
10092 SDValue Result = TSI->EmitTargetCodeForMemmove(
10093 *this, dl, Chain, Dst, Src, Size, DstAlign, SrcAlign, isVol, DstPtrInfo,
10094 SrcPtrInfo);
10095 if (Result.getNode())
10096 return Result;
10097 }
10098
10101
10102 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
10103 // not be safe. See memcpy above for more details.
10104
10105 // Emit a library call.
10108 Args.emplace_back(Dst, PtrTy);
10109 Args.emplace_back(Src, PtrTy);
10110 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
10111 // FIXME: pass in SDLoc
10113
10114 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
10115
10116 bool IsTailCall = false;
10117 if (OverrideTailCall.has_value()) {
10118 IsTailCall = *OverrideTailCall;
10119 } else {
10120 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
10121 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
10122 }
10123
10124 CLI.setDebugLoc(dl)
10125 .setChain(Chain)
10126 .setLibCallee(
10127 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
10128 Dst.getValueType().getTypeForEVT(*getContext()),
10129 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
10130 std::move(Args))
10132 .setTailCall(IsTailCall);
10133
10134 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
10135 return CallResult.second;
10136}
10137
10139 SDValue Dst, SDValue Src, SDValue Size,
10140 Type *SizeTy, unsigned ElemSz,
10141 bool isTailCall,
10142 MachinePointerInfo DstPtrInfo,
10143 MachinePointerInfo SrcPtrInfo) {
10144 // Emit a library call.
10146 Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());
10147 Args.emplace_back(Dst, IntPtrTy);
10148 Args.emplace_back(Src, IntPtrTy);
10149 Args.emplace_back(Size, SizeTy);
10150
10151 RTLIB::Libcall LibraryCall =
10153 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10154 if (LibcallImpl == RTLIB::Unsupported)
10155 report_fatal_error("Unsupported element size");
10156
10158 CLI.setDebugLoc(dl)
10159 .setChain(Chain)
10160 .setLibCallee(
10161 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10163 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10164 std::move(Args))
10166 .setTailCall(isTailCall);
10167
10168 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10169 return CallResult.second;
10170}
10171
10173 SDValue Src, SDValue Size, Align Alignment,
10174 bool isVol, bool AlwaysInline,
10175 const CallInst *CI,
10176 MachinePointerInfo DstPtrInfo,
10177 const AAMDNodes &AAInfo) {
10178 // Check to see if we should lower the memset to stores first.
10179 // For cases within the target-specified limits, this is the best choice.
10181 if (ConstantSize) {
10182 // Memset with size zero? Just return the original chain.
10183 if (ConstantSize->isZero())
10184 return Chain;
10185
10186 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10187 ConstantSize->getZExtValue(), Alignment,
10188 isVol, false, DstPtrInfo, AAInfo);
10189
10190 if (Result.getNode())
10191 return Result;
10192 }
10193
10194 // Then check to see if we should lower the memset with target-specific
10195 // code. If the target chooses to do this, this is the next best.
10196 if (TSI) {
10197 SDValue Result = TSI->EmitTargetCodeForMemset(
10198 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
10199 if (Result.getNode())
10200 return Result;
10201 }
10202
10203 // If we really need inline code and the target declined to provide it,
10204 // use a (potentially long) sequence of loads and stores.
10205 if (AlwaysInline) {
10206 assert(ConstantSize && "AlwaysInline requires a constant size!");
10207 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
10208 ConstantSize->getZExtValue(), Alignment,
10209 isVol, true, DstPtrInfo, AAInfo);
10210 assert(Result &&
10211 "getMemsetStores must return a valid sequence when AlwaysInline");
10212 return Result;
10213 }
10214
10216
10217 // Emit a library call.
10218 auto &Ctx = *getContext();
10219 const auto& DL = getDataLayout();
10220
10222 // FIXME: pass in SDLoc
10223 CLI.setDebugLoc(dl).setChain(Chain);
10224
10225 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
10226 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
10227
10228 // If zeroing out and bzero is present, use it.
10229 if (UseBZero) {
10231 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10232 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10233 CLI.setLibCallee(
10234 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
10235 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
10236 } else {
10237 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10238
10240 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
10241 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
10242 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
10243 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
10244 Dst.getValueType().getTypeForEVT(Ctx),
10245 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
10246 std::move(Args));
10247 }
10248
10249 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
10250 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
10251
10252 // If we're going to use bzero, make sure not to tail call unless the
10253 // subsequent return doesn't need a value, as bzero doesn't return the first
10254 // arg unlike memset.
10255 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
10256 bool IsTailCall =
10257 CI && CI->isTailCall() &&
10258 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
10259 CLI.setDiscardResult().setTailCall(IsTailCall);
10260
10261 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10262 return CallResult.second;
10263}
10264
10267 Type *SizeTy, unsigned ElemSz,
10268 bool isTailCall,
10269 MachinePointerInfo DstPtrInfo) {
10270 // Emit a library call.
10272 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
10273 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
10274 Args.emplace_back(Size, SizeTy);
10275
10276 RTLIB::Libcall LibraryCall =
10278 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
10279 if (LibcallImpl == RTLIB::Unsupported)
10280 report_fatal_error("Unsupported element size");
10281
10283 CLI.setDebugLoc(dl)
10284 .setChain(Chain)
10285 .setLibCallee(
10286 Libcalls->getLibcallImplCallingConv(LibcallImpl),
10288 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
10289 std::move(Args))
10291 .setTailCall(isTailCall);
10292
10293 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
10294 return CallResult.second;
10295}
10296
10297SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10299 MachineMemOperand *MMO,
10300 ISD::LoadExtType ExtType) {
10302 AddNodeIDNode(ID, Opcode, VTList, Ops);
10303 ID.AddInteger(MemVT.getRawBits());
10304 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
10305 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
10306 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10307 ID.AddInteger(MMO->getFlags());
10308 void* IP = nullptr;
10309 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10310 E->refineAlignment(MMO);
10311 E->refineRanges(MMO);
10312 return SDValue(E, 0);
10313 }
10314
10315 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
10316 VTList, MemVT, MMO, ExtType);
10317 createOperands(N, Ops);
10318
10319 CSEMap.InsertNode(N, IP);
10320 InsertNode(N);
10321 SDValue V(N, 0);
10322 NewSDValueDbgMsg(V, "Creating new node: ", this);
10323 return V;
10324}
10325
10327 EVT MemVT, SDVTList VTs, SDValue Chain,
10328 SDValue Ptr, SDValue Cmp, SDValue Swp,
10329 MachineMemOperand *MMO) {
10330 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
10332 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
10333
10334 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
10335 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10336}
10337
10338SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
10339 SDValue Chain, SDValue Ptr, SDValue Val,
10340 MachineMemOperand *MMO) {
10341 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
10342 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
10343 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
10344 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
10345 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
10346 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
10347 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
10348 Opcode == ISD::ATOMIC_LOAD_FMIN ||
10349 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
10350 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
10351 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
10352 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
10353 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
10354 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
10355 Opcode == ISD::ATOMIC_STORE) &&
10356 "Invalid Atomic Op");
10357
10358 EVT VT = Val.getValueType();
10359
10360 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
10361 getVTList(VT, MVT::Other);
10362 SDValue Ops[] = {Chain, Ptr, Val};
10363 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
10364}
10365
10367 EVT MemVT, EVT VT, SDValue Chain,
10368 SDValue Ptr, MachineMemOperand *MMO) {
10369 SDVTList VTs = getVTList(VT, MVT::Other);
10370 SDValue Ops[] = {Chain, Ptr};
10371 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
10372}
10373
10374/// getMergeValues - Create a MERGE_VALUES node from the given operands.
10376 if (Ops.size() == 1)
10377 return Ops[0];
10378
10380 VTs.reserve(Ops.size());
10381 for (const SDValue &Op : Ops)
10382 VTs.push_back(Op.getValueType());
10383 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
10384}
10385
10387 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
10388 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
10390 const AAMDNodes &AAInfo) {
10391 if (Size.hasValue() && !Size.getValue())
10393
10395 MachineMemOperand *MMO =
10396 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
10397
10398 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
10399}
10400
10402 SDVTList VTList,
10403 ArrayRef<SDValue> Ops, EVT MemVT,
10404 MachineMemOperand *MMO) {
10405 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
10406}
10407
10409 SDVTList VTList,
10410 ArrayRef<SDValue> Ops, EVT MemVT,
10412 assert(!MMOs.empty() && "Must have at least one MMO");
10413 assert(
10414 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
10415 Opcode == ISD::PREFETCH ||
10416 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10417 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10418 "Opcode is not a memory-accessing opcode!");
10419
10421 if (MMOs.size() == 1) {
10422 MemRefs = MMOs[0];
10423 } else {
10424 // Allocate: [size_t count][MMO*][MMO*]...
10425 size_t AllocSize =
10426 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10427 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10428 size_t *CountPtr = static_cast<size_t *>(Buffer);
10429 *CountPtr = MMOs.size();
10430 MachineMemOperand **Array =
10431 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10432 llvm::copy(MMOs, Array);
10433 MemRefs = Array;
10434 }
10435
10436 // Memoize the node unless it returns a glue result.
10438 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10440 AddNodeIDNode(ID, Opcode, VTList, Ops);
10441 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10442 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10443 ID.AddInteger(MemVT.getRawBits());
10444 for (const MachineMemOperand *MMO : MMOs) {
10445 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10446 ID.AddInteger(MMO->getFlags());
10447 }
10448 void *IP = nullptr;
10449 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10450 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10451 return SDValue(E, 0);
10452 }
10453
10454 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10455 VTList, MemVT, MemRefs);
10456 createOperands(N, Ops);
10457 CSEMap.InsertNode(N, IP);
10458 } else {
10459 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10460 VTList, MemVT, MemRefs);
10461 createOperands(N, Ops);
10462 }
10463 InsertNode(N);
10464 SDValue V(N, 0);
10465 NewSDValueDbgMsg(V, "Creating new node: ", this);
10466 return V;
10467}
10468
10470 SDValue Chain, int FrameIndex) {
10471 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10472 const auto VTs = getVTList(MVT::Other);
10473 SDValue Ops[2] = {
10474 Chain,
10475 getFrameIndex(FrameIndex,
10476 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10477 true)};
10478
10480 AddNodeIDNode(ID, Opcode, VTs, Ops);
10481 ID.AddInteger(FrameIndex);
10482 void *IP = nullptr;
10483 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10484 return SDValue(E, 0);
10485
10486 LifetimeSDNode *N =
10487 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10488 createOperands(N, Ops);
10489 CSEMap.InsertNode(N, IP);
10490 InsertNode(N);
10491 SDValue V(N, 0);
10492 NewSDValueDbgMsg(V, "Creating new node: ", this);
10493 return V;
10494}
10495
10497 uint64_t Guid, uint64_t Index,
10498 uint32_t Attr) {
10499 const unsigned Opcode = ISD::PSEUDO_PROBE;
10500 const auto VTs = getVTList(MVT::Other);
10501 SDValue Ops[] = {Chain};
10503 AddNodeIDNode(ID, Opcode, VTs, Ops);
10504 ID.AddInteger(Guid);
10505 ID.AddInteger(Index);
10506 void *IP = nullptr;
10507 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10508 return SDValue(E, 0);
10509
10510 auto *N = newSDNode<PseudoProbeSDNode>(
10511 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10512 createOperands(N, Ops);
10513 CSEMap.InsertNode(N, IP);
10514 InsertNode(N);
10515 SDValue V(N, 0);
10516 NewSDValueDbgMsg(V, "Creating new node: ", this);
10517 return V;
10518}
10519
10520/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10521/// MachinePointerInfo record from it. This is particularly useful because the
10522/// code generator has many cases where it doesn't bother passing in a
10523/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10525 SelectionDAG &DAG, SDValue Ptr,
10526 int64_t Offset = 0) {
10527 // If this is FI+Offset, we can model it.
10528 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10530 FI->getIndex(), Offset);
10531
10532 // If this is (FI+Offset1)+Offset2, we can model it.
10533 if (Ptr.getOpcode() != ISD::ADD ||
10536 return Info;
10537
10538 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10540 DAG.getMachineFunction(), FI,
10541 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10542}
10543
10544/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10545/// MachinePointerInfo record from it. This is particularly useful because the
10546/// code generator has many cases where it doesn't bother passing in a
10547/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10549 SelectionDAG &DAG, SDValue Ptr,
10550 SDValue OffsetOp) {
10551 // If the 'Offset' value isn't a constant, we can't handle this.
10553 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10554 if (OffsetOp.isUndef())
10555 return InferPointerInfo(Info, DAG, Ptr);
10556 return Info;
10557}
10558
10560 EVT VT, const SDLoc &dl, SDValue Chain,
10561 SDValue Ptr, SDValue Offset,
10562 MachinePointerInfo PtrInfo, EVT MemVT,
10563 Align Alignment,
10564 MachineMemOperand::Flags MMOFlags,
10565 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10566 assert(Chain.getValueType() == MVT::Other &&
10567 "Invalid chain type");
10568
10569 MMOFlags |= MachineMemOperand::MOLoad;
10570 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10571 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10572 // clients.
10573 if (PtrInfo.V.isNull())
10574 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10575
10576 TypeSize Size = MemVT.getStoreSize();
10578 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10579 Alignment, AAInfo, Ranges);
10580 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10581}
10582
10584 EVT VT, const SDLoc &dl, SDValue Chain,
10585 SDValue Ptr, SDValue Offset, EVT MemVT,
10586 MachineMemOperand *MMO) {
10587 if (VT == MemVT) {
10588 ExtType = ISD::NON_EXTLOAD;
10589 } else if (ExtType == ISD::NON_EXTLOAD) {
10590 assert(VT == MemVT && "Non-extending load from different memory type!");
10591 } else {
10592 // Extending load.
10593 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10594 "Should only be an extending load, not truncating!");
10595 assert(VT.isInteger() == MemVT.isInteger() &&
10596 "Cannot convert from FP to Int or Int -> FP!");
10597 assert(VT.isVector() == MemVT.isVector() &&
10598 "Cannot use an ext load to convert to or from a vector!");
10599 assert((!VT.isVector() ||
10601 "Cannot use an ext load to change the number of vector elements!");
10602 }
10603
10604 assert((!MMO->getRanges() ||
10606 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10607 MemVT.isInteger())) &&
10608 "Range metadata and load type must match!");
10609
10610 bool Indexed = AM != ISD::UNINDEXED;
10611 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10612
10613 SDVTList VTs = Indexed ?
10614 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10615 SDValue Ops[] = { Chain, Ptr, Offset };
10617 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10618 ID.AddInteger(MemVT.getRawBits());
10619 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10620 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10621 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10622 ID.AddInteger(MMO->getFlags());
10623 void *IP = nullptr;
10624 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10625 E->refineAlignment(MMO);
10626 E->refineRanges(MMO);
10627 return SDValue(E, 0);
10628 }
10629 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10630 ExtType, MemVT, MMO);
10631 createOperands(N, Ops);
10632
10633 CSEMap.InsertNode(N, IP);
10634 InsertNode(N);
10635 SDValue V(N, 0);
10636 NewSDValueDbgMsg(V, "Creating new node: ", this);
10637 return V;
10638}
10639
10641 SDValue Ptr, MachinePointerInfo PtrInfo,
10642 MaybeAlign Alignment,
10643 MachineMemOperand::Flags MMOFlags,
10644 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10646 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10647 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10648}
10649
10651 SDValue Ptr, MachineMemOperand *MMO) {
10653 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10654 VT, MMO);
10655}
10656
10658 EVT VT, SDValue Chain, SDValue Ptr,
10659 MachinePointerInfo PtrInfo, EVT MemVT,
10660 MaybeAlign Alignment,
10661 MachineMemOperand::Flags MMOFlags,
10662 const AAMDNodes &AAInfo) {
10664 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10665 MemVT, Alignment, MMOFlags, AAInfo);
10666}
10667
10669 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10670 MachineMemOperand *MMO) {
10672 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10673 MemVT, MMO);
10674}
10675
10679 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10680 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10681 // Don't propagate the invariant or dereferenceable flags.
10682 auto MMOFlags =
10683 LD->getMemOperand()->getFlags() &
10685 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10686 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10687 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10688}
10689
10691 SDValue Ptr, MachinePointerInfo PtrInfo,
10692 Align Alignment,
10693 MachineMemOperand::Flags MMOFlags,
10694 const AAMDNodes &AAInfo) {
10695 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10696
10697 MMOFlags |= MachineMemOperand::MOStore;
10698 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10699
10700 if (PtrInfo.V.isNull())
10701 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10702
10705 MachineMemOperand *MMO =
10706 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10707 return getStore(Chain, dl, Val, Ptr, MMO);
10708}
10709
10711 SDValue Ptr, MachineMemOperand *MMO) {
10713 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10715}
10716
10718 SDValue Ptr, SDValue Offset, EVT SVT,
10720 bool IsTruncating) {
10721 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10722 EVT VT = Val.getValueType();
10723 if (VT == SVT) {
10724 IsTruncating = false;
10725 } else if (!IsTruncating) {
10726 assert(VT == SVT && "No-truncating store from different memory type!");
10727 } else {
10729 "Should only be a truncating store, not extending!");
10730 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10731 assert(VT.isVector() == SVT.isVector() &&
10732 "Cannot use trunc store to convert to or from a vector!");
10733 assert((!VT.isVector() ||
10735 "Cannot use trunc store to change the number of vector elements!");
10736 }
10737
10738 bool Indexed = AM != ISD::UNINDEXED;
10739 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10740 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10741 : getVTList(MVT::Other);
10742 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10745 ID.AddInteger(SVT.getRawBits());
10746 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10747 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10748 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10749 ID.AddInteger(MMO->getFlags());
10750 void *IP = nullptr;
10751 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10752 cast<StoreSDNode>(E)->refineAlignment(MMO);
10753 return SDValue(E, 0);
10754 }
10755 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10756 IsTruncating, SVT, MMO);
10757 createOperands(N, Ops);
10758
10759 CSEMap.InsertNode(N, IP);
10760 InsertNode(N);
10761 SDValue V(N, 0);
10762 NewSDValueDbgMsg(V, "Creating new node: ", this);
10763 return V;
10764}
10765
10767 SDValue Ptr, MachinePointerInfo PtrInfo,
10768 EVT SVT, Align Alignment,
10769 MachineMemOperand::Flags MMOFlags,
10770 const AAMDNodes &AAInfo) {
10771 assert(Chain.getValueType() == MVT::Other &&
10772 "Invalid chain type");
10773
10774 MMOFlags |= MachineMemOperand::MOStore;
10775 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10776
10777 if (PtrInfo.V.isNull())
10778 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10779
10781 MachineMemOperand *MMO = MF.getMachineMemOperand(
10782 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10783 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10784}
10785
10787 SDValue Ptr, EVT SVT,
10788 MachineMemOperand *MMO) {
10790 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10791}
10792
10796 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10797 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10798 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10799 ST->getMemoryVT(), ST->getMemOperand(), AM,
10800 ST->isTruncatingStore());
10801}
10802
10804 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10805 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10806 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10807 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10808 const MDNode *Ranges, bool IsExpanding) {
10809 MMOFlags |= MachineMemOperand::MOLoad;
10810 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10811 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10812 // clients.
10813 if (PtrInfo.V.isNull())
10814 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10815
10816 TypeSize Size = MemVT.getStoreSize();
10818 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10819 Alignment, AAInfo, Ranges);
10820 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10821 MMO, IsExpanding);
10822}
10823
10825 ISD::LoadExtType ExtType, EVT VT,
10826 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10827 SDValue Offset, SDValue Mask, SDValue EVL,
10828 EVT MemVT, MachineMemOperand *MMO,
10829 bool IsExpanding) {
10830 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10831 assert(Mask.getValueType().getVectorElementCount() ==
10832 VT.getVectorElementCount() &&
10833 "Vector width mismatch between mask and data");
10834
10835 bool Indexed = AM != ISD::UNINDEXED;
10836 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10837
10838 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10839 : getVTList(VT, MVT::Other);
10840 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10842 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10843 ID.AddInteger(MemVT.getRawBits());
10844 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10845 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10846 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10847 ID.AddInteger(MMO->getFlags());
10848 void *IP = nullptr;
10849 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10850 E->refineAlignment(MMO);
10851 E->refineRanges(MMO);
10852 return SDValue(E, 0);
10853 }
10854 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10855 ExtType, IsExpanding, MemVT, MMO);
10856 createOperands(N, Ops);
10857
10858 CSEMap.InsertNode(N, IP);
10859 InsertNode(N);
10860 SDValue V(N, 0);
10861 NewSDValueDbgMsg(V, "Creating new node: ", this);
10862 return V;
10863}
10864
10866 SDValue Ptr, SDValue Mask, SDValue EVL,
10867 MachinePointerInfo PtrInfo,
10868 MaybeAlign Alignment,
10869 MachineMemOperand::Flags MMOFlags,
10870 const AAMDNodes &AAInfo, const MDNode *Ranges,
10871 bool IsExpanding) {
10873 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10874 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10875 IsExpanding);
10876}
10877
10879 SDValue Ptr, SDValue Mask, SDValue EVL,
10880 MachineMemOperand *MMO, bool IsExpanding) {
10882 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10883 Mask, EVL, VT, MMO, IsExpanding);
10884}
10885
10887 EVT VT, SDValue Chain, SDValue Ptr,
10888 SDValue Mask, SDValue EVL,
10889 MachinePointerInfo PtrInfo, EVT MemVT,
10890 MaybeAlign Alignment,
10891 MachineMemOperand::Flags MMOFlags,
10892 const AAMDNodes &AAInfo, bool IsExpanding) {
10894 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10895 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10896 IsExpanding);
10897}
10898
10900 EVT VT, SDValue Chain, SDValue Ptr,
10901 SDValue Mask, SDValue EVL, EVT MemVT,
10902 MachineMemOperand *MMO, bool IsExpanding) {
10904 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10905 EVL, MemVT, MMO, IsExpanding);
10906}
10907
10911 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10912 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10913 // Don't propagate the invariant or dereferenceable flags.
10914 auto MMOFlags =
10915 LD->getMemOperand()->getFlags() &
10917 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10918 LD->getChain(), Base, Offset, LD->getMask(),
10919 LD->getVectorLength(), LD->getPointerInfo(),
10920 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
10921 nullptr, LD->isExpandingLoad());
10922}
10923
10925 SDValue Ptr, SDValue Offset, SDValue Mask,
10926 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
10927 ISD::MemIndexedMode AM, bool IsTruncating,
10928 bool IsCompressing) {
10929 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10930 assert(Mask.getValueType().getVectorElementCount() ==
10932 "Vector width mismatch between mask and data");
10933
10934 bool Indexed = AM != ISD::UNINDEXED;
10935 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10936 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10937 : getVTList(MVT::Other);
10938 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
10940 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10941 ID.AddInteger(MemVT.getRawBits());
10942 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10943 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10944 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10945 ID.AddInteger(MMO->getFlags());
10946 void *IP = nullptr;
10947 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10948 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10949 return SDValue(E, 0);
10950 }
10951 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10952 IsTruncating, IsCompressing, MemVT, MMO);
10953 createOperands(N, Ops);
10954
10955 CSEMap.InsertNode(N, IP);
10956 InsertNode(N);
10957 SDValue V(N, 0);
10958 NewSDValueDbgMsg(V, "Creating new node: ", this);
10959 return V;
10960}
10961
10963 SDValue Val, SDValue Ptr, SDValue Mask,
10964 SDValue EVL, MachinePointerInfo PtrInfo,
10965 EVT SVT, Align Alignment,
10966 MachineMemOperand::Flags MMOFlags,
10967 const AAMDNodes &AAInfo,
10968 bool IsCompressing) {
10969 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10970
10971 MMOFlags |= MachineMemOperand::MOStore;
10972 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10973
10974 if (PtrInfo.V.isNull())
10975 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10976
10978 MachineMemOperand *MMO = MF.getMachineMemOperand(
10979 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10980 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
10981 IsCompressing);
10982}
10983
10985 SDValue Val, SDValue Ptr, SDValue Mask,
10986 SDValue EVL, EVT SVT,
10987 MachineMemOperand *MMO,
10988 bool IsCompressing) {
10989 EVT VT = Val.getValueType();
10990
10991 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10992 if (VT == SVT)
10993 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
10994 EVL, VT, MMO, ISD::UNINDEXED,
10995 /*IsTruncating*/ false, IsCompressing);
10996
10998 "Should only be a truncating store, not extending!");
10999 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11000 assert(VT.isVector() == SVT.isVector() &&
11001 "Cannot use trunc store to convert to or from a vector!");
11002 assert((!VT.isVector() ||
11004 "Cannot use trunc store to change the number of vector elements!");
11005
11006 SDVTList VTs = getVTList(MVT::Other);
11008 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
11010 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11011 ID.AddInteger(SVT.getRawBits());
11012 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
11013 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11014 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11015 ID.AddInteger(MMO->getFlags());
11016 void *IP = nullptr;
11017 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11018 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
11019 return SDValue(E, 0);
11020 }
11021 auto *N =
11022 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11023 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
11024 createOperands(N, Ops);
11025
11026 CSEMap.InsertNode(N, IP);
11027 InsertNode(N);
11028 SDValue V(N, 0);
11029 NewSDValueDbgMsg(V, "Creating new node: ", this);
11030 return V;
11031}
11032
11036 auto *ST = cast<VPStoreSDNode>(OrigStore);
11037 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
11038 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
11039 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
11040 Offset, ST->getMask(), ST->getVectorLength()};
11042 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
11043 ID.AddInteger(ST->getMemoryVT().getRawBits());
11044 ID.AddInteger(ST->getRawSubclassData());
11045 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
11046 ID.AddInteger(ST->getMemOperand()->getFlags());
11047 void *IP = nullptr;
11048 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11049 return SDValue(E, 0);
11050
11051 auto *N = newSDNode<VPStoreSDNode>(
11052 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
11053 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
11054 createOperands(N, Ops);
11055
11056 CSEMap.InsertNode(N, IP);
11057 InsertNode(N);
11058 SDValue V(N, 0);
11059 NewSDValueDbgMsg(V, "Creating new node: ", this);
11060 return V;
11061}
11062
11064 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
11065 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
11066 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
11067 bool Indexed = AM != ISD::UNINDEXED;
11068 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
11069
11070 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
11071 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
11072 : getVTList(VT, MVT::Other);
11074 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
11075 ID.AddInteger(VT.getRawBits());
11076 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
11077 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
11078 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11079
11080 void *IP = nullptr;
11081 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11082 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
11083 return SDValue(E, 0);
11084 }
11085
11086 auto *N =
11087 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
11088 ExtType, IsExpanding, MemVT, MMO);
11089 createOperands(N, Ops);
11090 CSEMap.InsertNode(N, IP);
11091 InsertNode(N);
11092 SDValue V(N, 0);
11093 NewSDValueDbgMsg(V, "Creating new node: ", this);
11094 return V;
11095}
11096
11098 SDValue Ptr, SDValue Stride,
11099 SDValue Mask, SDValue EVL,
11100 MachineMemOperand *MMO,
11101 bool IsExpanding) {
11103 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
11104 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
11105}
11106
11108 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
11109 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
11110 MachineMemOperand *MMO, bool IsExpanding) {
11112 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
11113 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
11114}
11115
11117 SDValue Val, SDValue Ptr,
11118 SDValue Offset, SDValue Stride,
11119 SDValue Mask, SDValue EVL, EVT MemVT,
11120 MachineMemOperand *MMO,
11122 bool IsTruncating, bool IsCompressing) {
11123 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11124 bool Indexed = AM != ISD::UNINDEXED;
11125 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
11126 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
11127 : getVTList(MVT::Other);
11128 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
11130 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11131 ID.AddInteger(MemVT.getRawBits());
11132 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11133 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11134 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11135 void *IP = nullptr;
11136 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11137 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11138 return SDValue(E, 0);
11139 }
11140 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11141 VTs, AM, IsTruncating,
11142 IsCompressing, MemVT, MMO);
11143 createOperands(N, Ops);
11144
11145 CSEMap.InsertNode(N, IP);
11146 InsertNode(N);
11147 SDValue V(N, 0);
11148 NewSDValueDbgMsg(V, "Creating new node: ", this);
11149 return V;
11150}
11151
11153 SDValue Val, SDValue Ptr,
11154 SDValue Stride, SDValue Mask,
11155 SDValue EVL, EVT SVT,
11156 MachineMemOperand *MMO,
11157 bool IsCompressing) {
11158 EVT VT = Val.getValueType();
11159
11160 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11161 if (VT == SVT)
11162 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
11163 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
11164 /*IsTruncating*/ false, IsCompressing);
11165
11167 "Should only be a truncating store, not extending!");
11168 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
11169 assert(VT.isVector() == SVT.isVector() &&
11170 "Cannot use trunc store to convert to or from a vector!");
11171 assert((!VT.isVector() ||
11173 "Cannot use trunc store to change the number of vector elements!");
11174
11175 SDVTList VTs = getVTList(MVT::Other);
11177 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
11179 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
11180 ID.AddInteger(SVT.getRawBits());
11181 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
11182 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
11183 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11184 void *IP = nullptr;
11185 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11186 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
11187 return SDValue(E, 0);
11188 }
11189 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
11190 VTs, ISD::UNINDEXED, true,
11191 IsCompressing, SVT, MMO);
11192 createOperands(N, Ops);
11193
11194 CSEMap.InsertNode(N, IP);
11195 InsertNode(N);
11196 SDValue V(N, 0);
11197 NewSDValueDbgMsg(V, "Creating new node: ", this);
11198 return V;
11199}
11200
11203 ISD::MemIndexType IndexType) {
11204 assert(Ops.size() == 6 && "Incompatible number of operands");
11205
11207 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
11208 ID.AddInteger(VT.getRawBits());
11209 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
11210 dl.getIROrder(), VTs, VT, MMO, IndexType));
11211 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11212 ID.AddInteger(MMO->getFlags());
11213 void *IP = nullptr;
11214 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11215 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
11216 return SDValue(E, 0);
11217 }
11218
11219 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11220 VT, MMO, IndexType);
11221 createOperands(N, Ops);
11222
11223 assert(N->getMask().getValueType().getVectorElementCount() ==
11224 N->getValueType(0).getVectorElementCount() &&
11225 "Vector width mismatch between mask and data");
11226 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11227 N->getValueType(0).getVectorElementCount().isScalable() &&
11228 "Scalable flags of index and data do not match");
11230 N->getIndex().getValueType().getVectorElementCount(),
11231 N->getValueType(0).getVectorElementCount()) &&
11232 "Vector width mismatch between index and data");
11233 assert(isa<ConstantSDNode>(N->getScale()) &&
11234 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11235 "Scale should be a constant power of 2");
11236
11237 CSEMap.InsertNode(N, IP);
11238 InsertNode(N);
11239 SDValue V(N, 0);
11240 NewSDValueDbgMsg(V, "Creating new node: ", this);
11241 return V;
11242}
11243
11246 MachineMemOperand *MMO,
11247 ISD::MemIndexType IndexType) {
11248 assert(Ops.size() == 7 && "Incompatible number of operands");
11249
11251 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
11252 ID.AddInteger(VT.getRawBits());
11253 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
11254 dl.getIROrder(), VTs, VT, MMO, IndexType));
11255 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11256 ID.AddInteger(MMO->getFlags());
11257 void *IP = nullptr;
11258 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11259 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
11260 return SDValue(E, 0);
11261 }
11262 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11263 VT, MMO, IndexType);
11264 createOperands(N, Ops);
11265
11266 assert(N->getMask().getValueType().getVectorElementCount() ==
11267 N->getValue().getValueType().getVectorElementCount() &&
11268 "Vector width mismatch between mask and data");
11269 assert(
11270 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11271 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11272 "Scalable flags of index and data do not match");
11274 N->getIndex().getValueType().getVectorElementCount(),
11275 N->getValue().getValueType().getVectorElementCount()) &&
11276 "Vector width mismatch between index and data");
11277 assert(isa<ConstantSDNode>(N->getScale()) &&
11278 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11279 "Scale should be a constant power of 2");
11280
11281 CSEMap.InsertNode(N, IP);
11282 InsertNode(N);
11283 SDValue V(N, 0);
11284 NewSDValueDbgMsg(V, "Creating new node: ", this);
11285 return V;
11286}
11287
11290 SDValue PassThru, EVT MemVT,
11291 MachineMemOperand *MMO,
11293 ISD::LoadExtType ExtTy, bool isExpanding) {
11294 bool Indexed = AM != ISD::UNINDEXED;
11295 assert((Indexed || Offset.isUndef()) &&
11296 "Unindexed masked load with an offset!");
11297 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
11298 : getVTList(VT, MVT::Other);
11299 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
11302 ID.AddInteger(MemVT.getRawBits());
11303 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
11304 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
11305 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11306 ID.AddInteger(MMO->getFlags());
11307 void *IP = nullptr;
11308 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11309 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
11310 return SDValue(E, 0);
11311 }
11312 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
11313 AM, ExtTy, isExpanding, MemVT, MMO);
11314 createOperands(N, Ops);
11315
11316 CSEMap.InsertNode(N, IP);
11317 InsertNode(N);
11318 SDValue V(N, 0);
11319 NewSDValueDbgMsg(V, "Creating new node: ", this);
11320 return V;
11321}
11322
11327 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
11328 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
11329 Offset, LD->getMask(), LD->getPassThru(),
11330 LD->getMemoryVT(), LD->getMemOperand(), AM,
11331 LD->getExtensionType(), LD->isExpandingLoad());
11332}
11333
11336 SDValue Mask, EVT MemVT,
11337 MachineMemOperand *MMO,
11338 ISD::MemIndexedMode AM, bool IsTruncating,
11339 bool IsCompressing) {
11340 assert(Chain.getValueType() == MVT::Other &&
11341 "Invalid chain type");
11342 bool Indexed = AM != ISD::UNINDEXED;
11343 assert((Indexed || Offset.isUndef()) &&
11344 "Unindexed masked store with an offset!");
11345 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
11346 : getVTList(MVT::Other);
11347 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
11350 ID.AddInteger(MemVT.getRawBits());
11351 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
11352 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
11353 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11354 ID.AddInteger(MMO->getFlags());
11355 void *IP = nullptr;
11356 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11357 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
11358 return SDValue(E, 0);
11359 }
11360 auto *N =
11361 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
11362 IsTruncating, IsCompressing, MemVT, MMO);
11363 createOperands(N, Ops);
11364
11365 CSEMap.InsertNode(N, IP);
11366 InsertNode(N);
11367 SDValue V(N, 0);
11368 NewSDValueDbgMsg(V, "Creating new node: ", this);
11369 return V;
11370}
11371
11376 assert(ST->getOffset().isUndef() &&
11377 "Masked store is already a indexed store!");
11378 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
11379 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
11380 AM, ST->isTruncatingStore(), ST->isCompressingStore());
11381}
11382
11385 MachineMemOperand *MMO,
11386 ISD::MemIndexType IndexType,
11387 ISD::LoadExtType ExtTy) {
11388 assert(Ops.size() == 6 && "Incompatible number of operands");
11389
11392 ID.AddInteger(MemVT.getRawBits());
11393 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
11394 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
11395 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11396 ID.AddInteger(MMO->getFlags());
11397 void *IP = nullptr;
11398 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11399 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11400 return SDValue(E, 0);
11401 }
11402
11403 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11404 VTs, MemVT, MMO, IndexType, ExtTy);
11405 createOperands(N, Ops);
11406
11407 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
11408 "Incompatible type of the PassThru value in MaskedGatherSDNode");
11409 assert(N->getMask().getValueType().getVectorElementCount() ==
11410 N->getValueType(0).getVectorElementCount() &&
11411 "Vector width mismatch between mask and data");
11412 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11413 N->getValueType(0).getVectorElementCount().isScalable() &&
11414 "Scalable flags of index and data do not match");
11416 N->getIndex().getValueType().getVectorElementCount(),
11417 N->getValueType(0).getVectorElementCount()) &&
11418 "Vector width mismatch between index and data");
11419 assert(isa<ConstantSDNode>(N->getScale()) &&
11420 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11421 "Scale should be a constant power of 2");
11422
11423 CSEMap.InsertNode(N, IP);
11424 InsertNode(N);
11425 SDValue V(N, 0);
11426 NewSDValueDbgMsg(V, "Creating new node: ", this);
11427 return V;
11428}
11429
11432 MachineMemOperand *MMO,
11433 ISD::MemIndexType IndexType,
11434 bool IsTrunc) {
11435 assert(Ops.size() == 6 && "Incompatible number of operands");
11436
11439 ID.AddInteger(MemVT.getRawBits());
11440 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11441 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11442 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11443 ID.AddInteger(MMO->getFlags());
11444 void *IP = nullptr;
11445 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11446 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11447 return SDValue(E, 0);
11448 }
11449
11450 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11451 VTs, MemVT, MMO, IndexType, IsTrunc);
11452 createOperands(N, Ops);
11453
11454 assert(N->getMask().getValueType().getVectorElementCount() ==
11455 N->getValue().getValueType().getVectorElementCount() &&
11456 "Vector width mismatch between mask and data");
11457 assert(
11458 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11459 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11460 "Scalable flags of index and data do not match");
11462 N->getIndex().getValueType().getVectorElementCount(),
11463 N->getValue().getValueType().getVectorElementCount()) &&
11464 "Vector width mismatch between index and data");
11465 assert(isa<ConstantSDNode>(N->getScale()) &&
11466 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11467 "Scale should be a constant power of 2");
11468
11469 CSEMap.InsertNode(N, IP);
11470 InsertNode(N);
11471 SDValue V(N, 0);
11472 NewSDValueDbgMsg(V, "Creating new node: ", this);
11473 return V;
11474}
11475
11477 const SDLoc &dl, ArrayRef<SDValue> Ops,
11478 MachineMemOperand *MMO,
11479 ISD::MemIndexType IndexType) {
11480 assert(Ops.size() == 7 && "Incompatible number of operands");
11481
11484 ID.AddInteger(MemVT.getRawBits());
11485 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11486 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11487 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11488 ID.AddInteger(MMO->getFlags());
11489 void *IP = nullptr;
11490 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11491 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11492 return SDValue(E, 0);
11493 }
11494
11495 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11496 VTs, MemVT, MMO, IndexType);
11497 createOperands(N, Ops);
11498
11499 assert(N->getMask().getValueType().getVectorElementCount() ==
11500 N->getIndex().getValueType().getVectorElementCount() &&
11501 "Vector width mismatch between mask and data");
11502 assert(isa<ConstantSDNode>(N->getScale()) &&
11503 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11504 "Scale should be a constant power of 2");
11505 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11506
11507 CSEMap.InsertNode(N, IP);
11508 InsertNode(N);
11509 SDValue V(N, 0);
11510 NewSDValueDbgMsg(V, "Creating new node: ", this);
11511 return V;
11512}
11513
11515 SDValue Ptr, SDValue Mask, SDValue EVL,
11516 MachineMemOperand *MMO) {
11517 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11518 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11520 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11521 ID.AddInteger(VT.getRawBits());
11522 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11523 VTs, VT, MMO));
11524 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11525 ID.AddInteger(MMO->getFlags());
11526 void *IP = nullptr;
11527 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11528 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11529 return SDValue(E, 0);
11530 }
11531 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11532 VT, MMO);
11533 createOperands(N, Ops);
11534
11535 CSEMap.InsertNode(N, IP);
11536 InsertNode(N);
11537 SDValue V(N, 0);
11538 NewSDValueDbgMsg(V, "Creating new node: ", this);
11539 return V;
11540}
11541
11543 EVT MemVT, MachineMemOperand *MMO) {
11544 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11545 SDVTList VTs = getVTList(MVT::Other);
11546 SDValue Ops[] = {Chain, Ptr};
11549 ID.AddInteger(MemVT.getRawBits());
11550 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11551 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11552 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11553 ID.AddInteger(MMO->getFlags());
11554 void *IP = nullptr;
11555 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11556 return SDValue(E, 0);
11557
11558 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11559 dl.getDebugLoc(), VTs, MemVT, MMO);
11560 createOperands(N, Ops);
11561
11562 CSEMap.InsertNode(N, IP);
11563 InsertNode(N);
11564 SDValue V(N, 0);
11565 NewSDValueDbgMsg(V, "Creating new node: ", this);
11566 return V;
11567}
11568
11570 EVT MemVT, MachineMemOperand *MMO) {
11571 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11572 SDVTList VTs = getVTList(MVT::Other);
11573 SDValue Ops[] = {Chain, Ptr};
11576 ID.AddInteger(MemVT.getRawBits());
11577 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11578 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11579 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11580 ID.AddInteger(MMO->getFlags());
11581 void *IP = nullptr;
11582 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11583 return SDValue(E, 0);
11584
11585 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11586 dl.getDebugLoc(), VTs, MemVT, MMO);
11587 createOperands(N, Ops);
11588
11589 CSEMap.InsertNode(N, IP);
11590 InsertNode(N);
11591 SDValue V(N, 0);
11592 NewSDValueDbgMsg(V, "Creating new node: ", this);
11593 return V;
11594}
11595
11597 // select undef, T, F --> T (if T is a constant), otherwise F
11598 // select, ?, undef, F --> F
11599 // select, ?, T, undef --> T
11600 if (Cond.isUndef())
11601 return isConstantValueOfAnyType(T) ? T : F;
11602 if (T.isUndef())
11604 if (F.isUndef())
11606
11607 // select true, T, F --> T
11608 // select false, T, F --> F
11609 if (auto C = isBoolConstant(Cond))
11610 return *C ? T : F;
11611
11612 // select ?, T, T --> T
11613 if (T == F)
11614 return T;
11615
11616 return SDValue();
11617}
11618
11620 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11621 if (X.isUndef())
11622 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11623 // shift X, undef --> undef (because it may shift by the bitwidth)
11624 if (Y.isUndef())
11625 return getUNDEF(X.getValueType());
11626
11627 // shift 0, Y --> 0
11628 // shift X, 0 --> X
11630 return X;
11631
11632 // shift X, C >= bitwidth(X) --> undef
11633 // All vector elements must be too big (or undef) to avoid partial undefs.
11634 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11635 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11636 };
11637 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11638 return getUNDEF(X.getValueType());
11639
11640 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11641 if (X.getValueType().getScalarType() == MVT::i1)
11642 return X;
11643
11644 return SDValue();
11645}
11646
11648 SDNodeFlags Flags) {
11649 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11650 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11651 // operation is poison. That result can be relaxed to undef.
11652 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11653 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11654 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11655 (YC && YC->getValueAPF().isNaN());
11656 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11657 (YC && YC->getValueAPF().isInfinity());
11658
11659 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11660 return getUNDEF(X.getValueType());
11661
11662 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11663 return getUNDEF(X.getValueType());
11664
11665 if (!YC)
11666 return SDValue();
11667
11668 // X + -0.0 --> X
11669 if (Opcode == ISD::FADD)
11670 if (YC->getValueAPF().isNegZero())
11671 return X;
11672
11673 // X - +0.0 --> X
11674 if (Opcode == ISD::FSUB)
11675 if (YC->getValueAPF().isPosZero())
11676 return X;
11677
11678 // X * 1.0 --> X
11679 // X / 1.0 --> X
11680 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11681 if (YC->getValueAPF().isExactlyValue(1.0))
11682 return X;
11683
11684 // X * 0.0 --> 0.0
11685 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11686 if (YC->getValueAPF().isZero())
11687 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11688
11689 return SDValue();
11690}
11691
11693 SDValue Ptr, SDValue SV, unsigned Align) {
11694 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11695 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11696}
11697
11698SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11700 switch (Ops.size()) {
11701 case 0: return getNode(Opcode, DL, VT);
11702 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11703 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11704 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11705 default: break;
11706 }
11707
11708 // Copy from an SDUse array into an SDValue array for use with
11709 // the regular getNode logic.
11711 return getNode(Opcode, DL, VT, NewOps);
11712}
11713
11714SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11716 SDNodeFlags Flags;
11717 if (Inserter)
11718 Flags = Inserter->getFlags();
11719 return getNode(Opcode, DL, VT, Ops, Flags);
11720}
11721
11722SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11723 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11724 unsigned NumOps = Ops.size();
11725 switch (NumOps) {
11726 case 0: return getNode(Opcode, DL, VT);
11727 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11728 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11729 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11730 default: break;
11731 }
11732
11733#ifndef NDEBUG
11734 for (const auto &Op : Ops)
11735 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11736 "Operand is DELETED_NODE!");
11737#endif
11738
11739 switch (Opcode) {
11740 default: break;
11741 case ISD::BUILD_VECTOR:
11742 // Attempt to simplify BUILD_VECTOR.
11743 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11744 return V;
11745 break;
11747 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11748 return V;
11749 break;
11750 case ISD::SELECT_CC:
11751 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11752 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11753 "LHS and RHS of condition must have same type!");
11754 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11755 "True and False arms of SelectCC must have same type!");
11756 assert(Ops[2].getValueType() == VT &&
11757 "select_cc node must be of same type as true and false value!");
11758 assert((!Ops[0].getValueType().isVector() ||
11759 Ops[0].getValueType().getVectorElementCount() ==
11760 VT.getVectorElementCount()) &&
11761 "Expected select_cc with vector result to have the same sized "
11762 "comparison type!");
11763 break;
11764 case ISD::BR_CC:
11765 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11766 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11767 "LHS/RHS of comparison should match types!");
11768 break;
11769 case ISD::VP_ADD:
11770 case ISD::VP_SUB:
11771 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11772 if (VT.getScalarType() == MVT::i1)
11773 Opcode = ISD::VP_XOR;
11774 break;
11775 case ISD::VP_MUL:
11776 // If it is VP_MUL mask operation then turn it to VP_AND
11777 if (VT.getScalarType() == MVT::i1)
11778 Opcode = ISD::VP_AND;
11779 break;
11780 case ISD::VP_REDUCE_MUL:
11781 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11782 if (VT == MVT::i1)
11783 Opcode = ISD::VP_REDUCE_AND;
11784 break;
11785 case ISD::VP_REDUCE_ADD:
11786 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11787 if (VT == MVT::i1)
11788 Opcode = ISD::VP_REDUCE_XOR;
11789 break;
11790 case ISD::VP_REDUCE_SMAX:
11791 case ISD::VP_REDUCE_UMIN:
11792 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11793 // VP_REDUCE_AND.
11794 if (VT == MVT::i1)
11795 Opcode = ISD::VP_REDUCE_AND;
11796 break;
11797 case ISD::VP_REDUCE_SMIN:
11798 case ISD::VP_REDUCE_UMAX:
11799 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11800 // VP_REDUCE_OR.
11801 if (VT == MVT::i1)
11802 Opcode = ISD::VP_REDUCE_OR;
11803 break;
11804 }
11805
11806 // Memoize nodes.
11807 SDNode *N;
11808 SDVTList VTs = getVTList(VT);
11809
11810 if (VT != MVT::Glue) {
11812 AddNodeIDNode(ID, Opcode, VTs, Ops);
11813 void *IP = nullptr;
11814
11815 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11816 E->intersectFlagsWith(Flags);
11817 return SDValue(E, 0);
11818 }
11819
11820 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11821 createOperands(N, Ops);
11822
11823 CSEMap.InsertNode(N, IP);
11824 } else {
11825 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11826 createOperands(N, Ops);
11827 }
11828
11829 N->setFlags(Flags);
11830 InsertNode(N);
11831 SDValue V(N, 0);
11832 NewSDValueDbgMsg(V, "Creating new node: ", this);
11833 return V;
11834}
11835
11836SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11837 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11838 SDNodeFlags Flags;
11839 if (Inserter)
11840 Flags = Inserter->getFlags();
11841 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11842}
11843
11844SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11846 const SDNodeFlags Flags) {
11847 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11848}
11849
11850SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11852 SDNodeFlags Flags;
11853 if (Inserter)
11854 Flags = Inserter->getFlags();
11855 return getNode(Opcode, DL, VTList, Ops, Flags);
11856}
11857
11858SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11859 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11860 if (VTList.NumVTs == 1)
11861 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11862
11863#ifndef NDEBUG
11864 for (const auto &Op : Ops)
11865 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11866 "Operand is DELETED_NODE!");
11867#endif
11868
11869 switch (Opcode) {
11870 case ISD::SADDO:
11871 case ISD::UADDO:
11872 case ISD::SSUBO:
11873 case ISD::USUBO: {
11874 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11875 "Invalid add/sub overflow op!");
11876 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11877 Ops[0].getValueType() == Ops[1].getValueType() &&
11878 Ops[0].getValueType() == VTList.VTs[0] &&
11879 "Binary operator types must match!");
11880 SDValue N1 = Ops[0], N2 = Ops[1];
11881 canonicalizeCommutativeBinop(Opcode, N1, N2);
11882
11883 // (X +- 0) -> X with zero-overflow.
11884 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11885 /*AllowTruncation*/ true);
11886 if (N2CV && N2CV->isZero()) {
11887 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11888 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11889 }
11890
11891 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11892 VTList.VTs[1].getScalarType() == MVT::i1) {
11893 SDValue F1 = getFreeze(N1);
11894 SDValue F2 = getFreeze(N2);
11895 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11896 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11897 return getNode(ISD::MERGE_VALUES, DL, VTList,
11898 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11899 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11900 Flags);
11901 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11902 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11903 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11904 return getNode(ISD::MERGE_VALUES, DL, VTList,
11905 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11906 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11907 Flags);
11908 }
11909 }
11910 break;
11911 }
11912 case ISD::SADDO_CARRY:
11913 case ISD::UADDO_CARRY:
11914 case ISD::SSUBO_CARRY:
11915 case ISD::USUBO_CARRY:
11916 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11917 "Invalid add/sub overflow op!");
11918 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11919 Ops[0].getValueType() == Ops[1].getValueType() &&
11920 Ops[0].getValueType() == VTList.VTs[0] &&
11921 Ops[2].getValueType() == VTList.VTs[1] &&
11922 "Binary operator types must match!");
11923 break;
11924 case ISD::SMUL_LOHI:
11925 case ISD::UMUL_LOHI: {
11926 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
11927 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
11928 VTList.VTs[0] == Ops[0].getValueType() &&
11929 VTList.VTs[0] == Ops[1].getValueType() &&
11930 "Binary operator types must match!");
11931 // Constant fold.
11934 if (LHS && RHS) {
11935 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
11936 unsigned OutWidth = Width * 2;
11937 APInt Val = LHS->getAPIntValue();
11938 APInt Mul = RHS->getAPIntValue();
11939 if (Opcode == ISD::SMUL_LOHI) {
11940 Val = Val.sext(OutWidth);
11941 Mul = Mul.sext(OutWidth);
11942 } else {
11943 Val = Val.zext(OutWidth);
11944 Mul = Mul.zext(OutWidth);
11945 }
11946 Val *= Mul;
11947
11948 SDValue Hi =
11949 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
11950 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
11951 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
11952 }
11953 break;
11954 }
11955 case ISD::FFREXP: {
11956 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
11957 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
11958 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
11959
11961 int FrexpExp;
11962 APFloat FrexpMant =
11963 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
11964 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
11965 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
11966 DL, VTList.VTs[1]);
11967 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
11968 }
11969
11970 break;
11971 }
11973 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11974 "Invalid STRICT_FP_EXTEND!");
11975 assert(VTList.VTs[0].isFloatingPoint() &&
11976 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
11977 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11978 "STRICT_FP_EXTEND result type should be vector iff the operand "
11979 "type is vector!");
11980 assert((!VTList.VTs[0].isVector() ||
11981 VTList.VTs[0].getVectorElementCount() ==
11982 Ops[1].getValueType().getVectorElementCount()) &&
11983 "Vector element count mismatch!");
11984 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
11985 "Invalid fpext node, dst <= src!");
11986 break;
11988 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
11989 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11990 "STRICT_FP_ROUND result type should be vector iff the operand "
11991 "type is vector!");
11992 assert((!VTList.VTs[0].isVector() ||
11993 VTList.VTs[0].getVectorElementCount() ==
11994 Ops[1].getValueType().getVectorElementCount()) &&
11995 "Vector element count mismatch!");
11996 assert(VTList.VTs[0].isFloatingPoint() &&
11997 Ops[1].getValueType().isFloatingPoint() &&
11998 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
11999 Ops[2].getOpcode() == ISD::TargetConstant &&
12000 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
12001 "Invalid STRICT_FP_ROUND!");
12002 break;
12003 }
12004
12005 // Memoize the node unless it returns a glue result.
12006 SDNode *N;
12007 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
12009 AddNodeIDNode(ID, Opcode, VTList, Ops);
12010 void *IP = nullptr;
12011 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12012 E->intersectFlagsWith(Flags);
12013 return SDValue(E, 0);
12014 }
12015
12016 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12017 createOperands(N, Ops);
12018 CSEMap.InsertNode(N, IP);
12019 } else {
12020 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
12021 createOperands(N, Ops);
12022 }
12023
12024 N->setFlags(Flags);
12025 InsertNode(N);
12026 SDValue V(N, 0);
12027 NewSDValueDbgMsg(V, "Creating new node: ", this);
12028 return V;
12029}
12030
12031SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
12032 SDVTList VTList) {
12033 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
12034}
12035
12036SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12037 SDValue N1) {
12038 SDValue Ops[] = { N1 };
12039 return getNode(Opcode, DL, VTList, Ops);
12040}
12041
12042SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12043 SDValue N1, SDValue N2) {
12044 SDValue Ops[] = { N1, N2 };
12045 return getNode(Opcode, DL, VTList, Ops);
12046}
12047
12048SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12049 SDValue N1, SDValue N2, SDValue N3) {
12050 SDValue Ops[] = { N1, N2, N3 };
12051 return getNode(Opcode, DL, VTList, Ops);
12052}
12053
12054SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12055 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
12056 SDValue Ops[] = { N1, N2, N3, N4 };
12057 return getNode(Opcode, DL, VTList, Ops);
12058}
12059
12060SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
12061 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
12062 SDValue N5) {
12063 SDValue Ops[] = { N1, N2, N3, N4, N5 };
12064 return getNode(Opcode, DL, VTList, Ops);
12065}
12066
12068 if (!VT.isExtended())
12069 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
12070
12071 return makeVTList(&(*EVTs.insert(VT).first), 1);
12072}
12073
12076 ID.AddInteger(2U);
12077 ID.AddInteger(VT1.getRawBits());
12078 ID.AddInteger(VT2.getRawBits());
12079
12080 void *IP = nullptr;
12081 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12082 if (!Result) {
12083 EVT *Array = Allocator.Allocate<EVT>(2);
12084 Array[0] = VT1;
12085 Array[1] = VT2;
12086 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
12087 VTListMap.InsertNode(Result, IP);
12088 }
12089 return Result->getSDVTList();
12090}
12091
12094 ID.AddInteger(3U);
12095 ID.AddInteger(VT1.getRawBits());
12096 ID.AddInteger(VT2.getRawBits());
12097 ID.AddInteger(VT3.getRawBits());
12098
12099 void *IP = nullptr;
12100 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12101 if (!Result) {
12102 EVT *Array = Allocator.Allocate<EVT>(3);
12103 Array[0] = VT1;
12104 Array[1] = VT2;
12105 Array[2] = VT3;
12106 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
12107 VTListMap.InsertNode(Result, IP);
12108 }
12109 return Result->getSDVTList();
12110}
12111
12114 ID.AddInteger(4U);
12115 ID.AddInteger(VT1.getRawBits());
12116 ID.AddInteger(VT2.getRawBits());
12117 ID.AddInteger(VT3.getRawBits());
12118 ID.AddInteger(VT4.getRawBits());
12119
12120 void *IP = nullptr;
12121 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12122 if (!Result) {
12123 EVT *Array = Allocator.Allocate<EVT>(4);
12124 Array[0] = VT1;
12125 Array[1] = VT2;
12126 Array[2] = VT3;
12127 Array[3] = VT4;
12128 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
12129 VTListMap.InsertNode(Result, IP);
12130 }
12131 return Result->getSDVTList();
12132}
12133
12135 unsigned NumVTs = VTs.size();
12137 ID.AddInteger(NumVTs);
12138 for (unsigned index = 0; index < NumVTs; index++) {
12139 ID.AddInteger(VTs[index].getRawBits());
12140 }
12141
12142 void *IP = nullptr;
12143 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
12144 if (!Result) {
12145 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
12146 llvm::copy(VTs, Array);
12147 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
12148 VTListMap.InsertNode(Result, IP);
12149 }
12150 return Result->getSDVTList();
12151}
12152
12153
12154/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
12155/// specified operands. If the resultant node already exists in the DAG,
12156/// this does not modify the specified node, instead it returns the node that
12157/// already exists. If the resultant node does not exist in the DAG, the
12158/// input node is returned. As a degenerate case, if you specify the same
12159/// input operands as the node already has, the input node is returned.
12161 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
12162
12163 // Check to see if there is no change.
12164 if (Op == N->getOperand(0)) return N;
12165
12166 // See if the modified node already exists.
12167 void *InsertPos = nullptr;
12168 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
12169 return Existing;
12170
12171 // Nope it doesn't. Remove the node from its current place in the maps.
12172 if (InsertPos)
12173 if (!RemoveNodeFromCSEMaps(N))
12174 InsertPos = nullptr;
12175
12176 // Now we update the operands.
12177 N->OperandList[0].set(Op);
12178
12180 // If this gets put into a CSE map, add it.
12181 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12182 return N;
12183}
12184
12186 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
12187
12188 // Check to see if there is no change.
12189 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
12190 return N; // No operands changed, just return the input node.
12191
12192 // See if the modified node already exists.
12193 void *InsertPos = nullptr;
12194 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
12195 return Existing;
12196
12197 // Nope it doesn't. Remove the node from its current place in the maps.
12198 if (InsertPos)
12199 if (!RemoveNodeFromCSEMaps(N))
12200 InsertPos = nullptr;
12201
12202 // Now we update the operands.
12203 if (N->OperandList[0] != Op1)
12204 N->OperandList[0].set(Op1);
12205 if (N->OperandList[1] != Op2)
12206 N->OperandList[1].set(Op2);
12207
12209 // If this gets put into a CSE map, add it.
12210 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12211 return N;
12212}
12213
12216 SDValue Ops[] = { Op1, Op2, Op3 };
12217 return UpdateNodeOperands(N, Ops);
12218}
12219
12222 SDValue Op3, SDValue Op4) {
12223 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
12224 return UpdateNodeOperands(N, Ops);
12225}
12226
12229 SDValue Op3, SDValue Op4, SDValue Op5) {
12230 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
12231 return UpdateNodeOperands(N, Ops);
12232}
12233
12236 unsigned NumOps = Ops.size();
12237 assert(N->getNumOperands() == NumOps &&
12238 "Update with wrong number of operands");
12239
12240 // If no operands changed just return the input node.
12241 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
12242 return N;
12243
12244 // See if the modified node already exists.
12245 void *InsertPos = nullptr;
12246 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
12247 return Existing;
12248
12249 // Nope it doesn't. Remove the node from its current place in the maps.
12250 if (InsertPos)
12251 if (!RemoveNodeFromCSEMaps(N))
12252 InsertPos = nullptr;
12253
12254 // Now we update the operands.
12255 for (unsigned i = 0; i != NumOps; ++i)
12256 if (N->OperandList[i] != Ops[i])
12257 N->OperandList[i].set(Ops[i]);
12258
12260 // If this gets put into a CSE map, add it.
12261 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
12262 return N;
12263}
12264
12265/// DropOperands - Release the operands and set this node to have
12266/// zero operands.
12268 // Unlike the code in MorphNodeTo that does this, we don't need to
12269 // watch for dead nodes here.
12270 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
12271 SDUse &Use = *I++;
12272 Use.set(SDValue());
12273 }
12274}
12275
12277 ArrayRef<MachineMemOperand *> NewMemRefs) {
12278 if (NewMemRefs.empty()) {
12279 N->clearMemRefs();
12280 return;
12281 }
12282
12283 // Check if we can avoid allocating by storing a single reference directly.
12284 if (NewMemRefs.size() == 1) {
12285 N->MemRefs = NewMemRefs[0];
12286 N->NumMemRefs = 1;
12287 return;
12288 }
12289
12290 MachineMemOperand **MemRefsBuffer =
12291 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
12292 llvm::copy(NewMemRefs, MemRefsBuffer);
12293 N->MemRefs = MemRefsBuffer;
12294 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
12295}
12296
12297/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
12298/// machine opcode.
12299///
12301 EVT VT) {
12302 SDVTList VTs = getVTList(VT);
12303 return SelectNodeTo(N, MachineOpc, VTs, {});
12304}
12305
12307 EVT VT, SDValue Op1) {
12308 SDVTList VTs = getVTList(VT);
12309 SDValue Ops[] = { Op1 };
12310 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12311}
12312
12314 EVT VT, SDValue Op1,
12315 SDValue Op2) {
12316 SDVTList VTs = getVTList(VT);
12317 SDValue Ops[] = { Op1, Op2 };
12318 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12319}
12320
12322 EVT VT, SDValue Op1,
12323 SDValue Op2, SDValue Op3) {
12324 SDVTList VTs = getVTList(VT);
12325 SDValue Ops[] = { Op1, Op2, Op3 };
12326 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12327}
12328
12331 SDVTList VTs = getVTList(VT);
12332 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12333}
12334
12336 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
12337 SDVTList VTs = getVTList(VT1, VT2);
12338 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12339}
12340
12342 EVT VT1, EVT VT2) {
12343 SDVTList VTs = getVTList(VT1, VT2);
12344 return SelectNodeTo(N, MachineOpc, VTs, {});
12345}
12346
12348 EVT VT1, EVT VT2, EVT VT3,
12350 SDVTList VTs = getVTList(VT1, VT2, VT3);
12351 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12352}
12353
12355 EVT VT1, EVT VT2,
12356 SDValue Op1, SDValue Op2) {
12357 SDVTList VTs = getVTList(VT1, VT2);
12358 SDValue Ops[] = { Op1, Op2 };
12359 return SelectNodeTo(N, MachineOpc, VTs, Ops);
12360}
12361
12364 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
12365 // Reset the NodeID to -1.
12366 New->setNodeId(-1);
12367 if (New != N) {
12368 ReplaceAllUsesWith(N, New);
12370 }
12371 return New;
12372}
12373
12374/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
12375/// the line number information on the merged node since it is not possible to
12376/// preserve the information that operation is associated with multiple lines.
12377/// This will make the debugger working better at -O0, were there is a higher
12378/// probability having other instructions associated with that line.
12379///
12380/// For IROrder, we keep the smaller of the two
12381SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
12382 DebugLoc NLoc = N->getDebugLoc();
12383 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
12384 N->setDebugLoc(DebugLoc());
12385 }
12386 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
12387 N->setIROrder(Order);
12388 return N;
12389}
12390
12391/// MorphNodeTo - This *mutates* the specified node to have the specified
12392/// return type, opcode, and operands.
12393///
12394/// Note that MorphNodeTo returns the resultant node. If there is already a
12395/// node of the specified opcode and operands, it returns that node instead of
12396/// the current one. Note that the SDLoc need not be the same.
12397///
12398/// Using MorphNodeTo is faster than creating a new node and swapping it in
12399/// with ReplaceAllUsesWith both because it often avoids allocating a new
12400/// node, and because it doesn't require CSE recalculation for any of
12401/// the node's users.
12402///
12403/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
12404/// As a consequence it isn't appropriate to use from within the DAG combiner or
12405/// the legalizer which maintain worklists that would need to be updated when
12406/// deleting things.
12409 // If an identical node already exists, use it.
12410 void *IP = nullptr;
12411 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
12413 AddNodeIDNode(ID, Opc, VTs, Ops);
12414 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
12415 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
12416 }
12417
12418 if (!RemoveNodeFromCSEMaps(N))
12419 IP = nullptr;
12420
12421 // Start the morphing.
12422 N->NodeType = Opc;
12423 N->ValueList = VTs.VTs;
12424 N->NumValues = VTs.NumVTs;
12425
12426 // Clear the operands list, updating used nodes to remove this from their
12427 // use list. Keep track of any operands that become dead as a result.
12428 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12429 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12430 SDUse &Use = *I++;
12431 SDNode *Used = Use.getNode();
12432 Use.set(SDValue());
12433 if (Used->use_empty())
12434 DeadNodeSet.insert(Used);
12435 }
12436
12437 // For MachineNode, initialize the memory references information.
12439 MN->clearMemRefs();
12440
12441 // Swap for an appropriately sized array from the recycler.
12442 removeOperands(N);
12443 createOperands(N, Ops);
12444
12445 // Delete any nodes that are still dead after adding the uses for the
12446 // new operands.
12447 if (!DeadNodeSet.empty()) {
12448 SmallVector<SDNode *, 16> DeadNodes;
12449 for (SDNode *N : DeadNodeSet)
12450 if (N->use_empty())
12451 DeadNodes.push_back(N);
12452 RemoveDeadNodes(DeadNodes);
12453 }
12454
12455 if (IP)
12456 CSEMap.InsertNode(N, IP); // Memoize the new node.
12457 return N;
12458}
12459
12461 unsigned OrigOpc = Node->getOpcode();
12462 unsigned NewOpc;
12463 switch (OrigOpc) {
12464 default:
12465 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12466#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12467 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12468#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12469 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12470#include "llvm/IR/ConstrainedOps.def"
12471 }
12472
12473 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12474
12475 // We're taking this node out of the chain, so we need to re-link things.
12476 SDValue InputChain = Node->getOperand(0);
12477 SDValue OutputChain = SDValue(Node, 1);
12478 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12479
12481 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12482 Ops.push_back(Node->getOperand(i));
12483
12484 SDVTList VTs = getVTList(Node->getValueType(0));
12485 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12486
12487 // MorphNodeTo can operate in two ways: if an existing node with the
12488 // specified operands exists, it can just return it. Otherwise, it
12489 // updates the node in place to have the requested operands.
12490 if (Res == Node) {
12491 // If we updated the node in place, reset the node ID. To the isel,
12492 // this should be just like a newly allocated machine node.
12493 Res->setNodeId(-1);
12494 } else {
12497 }
12498
12499 return Res;
12500}
12501
12502/// getMachineNode - These are used for target selectors to create a new node
12503/// with specified return type(s), MachineInstr opcode, and operands.
12504///
12505/// Note that getMachineNode returns the resultant node. If there is already a
12506/// node of the specified opcode and operands, it returns that node instead of
12507/// the current one.
12509 EVT VT) {
12510 SDVTList VTs = getVTList(VT);
12511 return getMachineNode(Opcode, dl, VTs, {});
12512}
12513
12515 EVT VT, SDValue Op1) {
12516 SDVTList VTs = getVTList(VT);
12517 SDValue Ops[] = { Op1 };
12518 return getMachineNode(Opcode, dl, VTs, Ops);
12519}
12520
12522 EVT VT, SDValue Op1, SDValue Op2) {
12523 SDVTList VTs = getVTList(VT);
12524 SDValue Ops[] = { Op1, Op2 };
12525 return getMachineNode(Opcode, dl, VTs, Ops);
12526}
12527
12529 EVT VT, SDValue Op1, SDValue Op2,
12530 SDValue Op3) {
12531 SDVTList VTs = getVTList(VT);
12532 SDValue Ops[] = { Op1, Op2, Op3 };
12533 return getMachineNode(Opcode, dl, VTs, Ops);
12534}
12535
12538 SDVTList VTs = getVTList(VT);
12539 return getMachineNode(Opcode, dl, VTs, Ops);
12540}
12541
12543 EVT VT1, EVT VT2, SDValue Op1,
12544 SDValue Op2) {
12545 SDVTList VTs = getVTList(VT1, VT2);
12546 SDValue Ops[] = { Op1, Op2 };
12547 return getMachineNode(Opcode, dl, VTs, Ops);
12548}
12549
12551 EVT VT1, EVT VT2, SDValue Op1,
12552 SDValue Op2, SDValue Op3) {
12553 SDVTList VTs = getVTList(VT1, VT2);
12554 SDValue Ops[] = { Op1, Op2, Op3 };
12555 return getMachineNode(Opcode, dl, VTs, Ops);
12556}
12557
12559 EVT VT1, EVT VT2,
12561 SDVTList VTs = getVTList(VT1, VT2);
12562 return getMachineNode(Opcode, dl, VTs, Ops);
12563}
12564
12566 EVT VT1, EVT VT2, EVT VT3,
12567 SDValue Op1, SDValue Op2) {
12568 SDVTList VTs = getVTList(VT1, VT2, VT3);
12569 SDValue Ops[] = { Op1, Op2 };
12570 return getMachineNode(Opcode, dl, VTs, Ops);
12571}
12572
12574 EVT VT1, EVT VT2, EVT VT3,
12575 SDValue Op1, SDValue Op2,
12576 SDValue Op3) {
12577 SDVTList VTs = getVTList(VT1, VT2, VT3);
12578 SDValue Ops[] = { Op1, Op2, Op3 };
12579 return getMachineNode(Opcode, dl, VTs, Ops);
12580}
12581
12583 EVT VT1, EVT VT2, EVT VT3,
12585 SDVTList VTs = getVTList(VT1, VT2, VT3);
12586 return getMachineNode(Opcode, dl, VTs, Ops);
12587}
12588
12590 ArrayRef<EVT> ResultTys,
12592 SDVTList VTs = getVTList(ResultTys);
12593 return getMachineNode(Opcode, dl, VTs, Ops);
12594}
12595
12597 SDVTList VTs,
12599 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12601 void *IP = nullptr;
12602
12603 if (DoCSE) {
12605 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12606 IP = nullptr;
12607 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12608 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12609 }
12610 }
12611
12612 // Allocate a new MachineSDNode.
12613 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12614 createOperands(N, Ops);
12615
12616 if (DoCSE)
12617 CSEMap.InsertNode(N, IP);
12618
12619 InsertNode(N);
12620 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12621 return N;
12622}
12623
12624/// getTargetExtractSubreg - A convenience function for creating
12625/// TargetOpcode::EXTRACT_SUBREG nodes.
12627 SDValue Operand) {
12628 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12629 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12630 VT, Operand, SRIdxVal);
12631 return SDValue(Subreg, 0);
12632}
12633
12634/// getTargetInsertSubreg - A convenience function for creating
12635/// TargetOpcode::INSERT_SUBREG nodes.
12637 SDValue Operand, SDValue Subreg) {
12638 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12639 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12640 VT, Operand, Subreg, SRIdxVal);
12641 return SDValue(Result, 0);
12642}
12643
12644/// getNodeIfExists - Get the specified node if it's already available, or
12645/// else return NULL.
12648 bool AllowCommute) {
12649 SDNodeFlags Flags;
12650 if (Inserter)
12651 Flags = Inserter->getFlags();
12652 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12653}
12654
12657 const SDNodeFlags Flags,
12658 bool AllowCommute) {
12659 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12660 return nullptr;
12661
12662 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12664 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12665 void *IP = nullptr;
12666 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12667 E->intersectFlagsWith(Flags);
12668 return E;
12669 }
12670 return nullptr;
12671 };
12672
12673 if (SDNode *Existing = Lookup(Ops))
12674 return Existing;
12675
12676 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12677 return Lookup({Ops[1], Ops[0]});
12678
12679 return nullptr;
12680}
12681
12682/// doesNodeExist - Check if a node exists without modifying its flags.
12683bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12685 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12687 AddNodeIDNode(ID, Opcode, VTList, Ops);
12688 void *IP = nullptr;
12689 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12690 return true;
12691 }
12692 return false;
12693}
12694
12695/// getDbgValue - Creates a SDDbgValue node.
12696///
12697/// SDNode
12699 SDNode *N, unsigned R, bool IsIndirect,
12700 const DebugLoc &DL, unsigned O) {
12701 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12702 "Expected inlined-at fields to agree");
12703 return new (DbgInfo->getAlloc())
12704 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12705 {}, IsIndirect, DL, O,
12706 /*IsVariadic=*/false);
12707}
12708
12709/// Constant
12711 DIExpression *Expr,
12712 const Value *C,
12713 const DebugLoc &DL, unsigned O) {
12714 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12715 "Expected inlined-at fields to agree");
12716 return new (DbgInfo->getAlloc())
12717 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12718 /*IsIndirect=*/false, DL, O,
12719 /*IsVariadic=*/false);
12720}
12721
12722/// FrameIndex
12724 DIExpression *Expr, unsigned FI,
12725 bool IsIndirect,
12726 const DebugLoc &DL,
12727 unsigned O) {
12728 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12729 "Expected inlined-at fields to agree");
12730 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12731}
12732
12733/// FrameIndex with dependencies
12735 DIExpression *Expr, unsigned FI,
12736 ArrayRef<SDNode *> Dependencies,
12737 bool IsIndirect,
12738 const DebugLoc &DL,
12739 unsigned O) {
12740 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12741 "Expected inlined-at fields to agree");
12742 return new (DbgInfo->getAlloc())
12743 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12744 Dependencies, IsIndirect, DL, O,
12745 /*IsVariadic=*/false);
12746}
12747
12748/// VReg
12750 Register VReg, bool IsIndirect,
12751 const DebugLoc &DL, unsigned O) {
12752 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12753 "Expected inlined-at fields to agree");
12754 return new (DbgInfo->getAlloc())
12755 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12756 {}, IsIndirect, DL, O,
12757 /*IsVariadic=*/false);
12758}
12759
12762 ArrayRef<SDNode *> Dependencies,
12763 bool IsIndirect, const DebugLoc &DL,
12764 unsigned O, bool IsVariadic) {
12765 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12766 "Expected inlined-at fields to agree");
12767 return new (DbgInfo->getAlloc())
12768 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12769 DL, O, IsVariadic);
12770}
12771
12773 unsigned OffsetInBits, unsigned SizeInBits,
12774 bool InvalidateDbg) {
12775 SDNode *FromNode = From.getNode();
12776 SDNode *ToNode = To.getNode();
12777 assert(FromNode && ToNode && "Can't modify dbg values");
12778
12779 // PR35338
12780 // TODO: assert(From != To && "Redundant dbg value transfer");
12781 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12782 if (From == To || FromNode == ToNode)
12783 return;
12784
12785 if (!FromNode->getHasDebugValue())
12786 return;
12787
12788 SDDbgOperand FromLocOp =
12789 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12791
12793 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12794 if (Dbg->isInvalidated())
12795 continue;
12796
12797 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12798
12799 // Create a new location ops vector that is equal to the old vector, but
12800 // with each instance of FromLocOp replaced with ToLocOp.
12801 bool Changed = false;
12802 auto NewLocOps = Dbg->copyLocationOps();
12803 std::replace_if(
12804 NewLocOps.begin(), NewLocOps.end(),
12805 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12806 bool Match = Op == FromLocOp;
12807 Changed |= Match;
12808 return Match;
12809 },
12810 ToLocOp);
12811 // Ignore this SDDbgValue if we didn't find a matching location.
12812 if (!Changed)
12813 continue;
12814
12815 DIVariable *Var = Dbg->getVariable();
12816 auto *Expr = Dbg->getExpression();
12817 // If a fragment is requested, update the expression.
12818 if (SizeInBits) {
12819 // When splitting a larger (e.g., sign-extended) value whose
12820 // lower bits are described with an SDDbgValue, do not attempt
12821 // to transfer the SDDbgValue to the upper bits.
12822 if (auto FI = Expr->getFragmentInfo())
12823 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12824 continue;
12825 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12826 SizeInBits);
12827 if (!Fragment)
12828 continue;
12829 Expr = *Fragment;
12830 }
12831
12832 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12833 // Clone the SDDbgValue and move it to To.
12834 SDDbgValue *Clone = getDbgValueList(
12835 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12836 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12837 Dbg->isVariadic());
12838 ClonedDVs.push_back(Clone);
12839
12840 if (InvalidateDbg) {
12841 // Invalidate value and indicate the SDDbgValue should not be emitted.
12842 Dbg->setIsInvalidated();
12843 Dbg->setIsEmitted();
12844 }
12845 }
12846
12847 for (SDDbgValue *Dbg : ClonedDVs) {
12848 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12849 "Transferred DbgValues should depend on the new SDNode");
12850 AddDbgValue(Dbg, false);
12851 }
12852}
12853
12855 if (!N.getHasDebugValue())
12856 return;
12857
12858 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12859 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12860 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12861 return SDDbgOperand::fromNode(Node, ResNo);
12862 };
12863
12865 for (auto *DV : GetDbgValues(&N)) {
12866 if (DV->isInvalidated())
12867 continue;
12868 switch (N.getOpcode()) {
12869 default:
12870 break;
12871 case ISD::ADD: {
12872 SDValue N0 = N.getOperand(0);
12873 SDValue N1 = N.getOperand(1);
12874 if (!isa<ConstantSDNode>(N0)) {
12875 bool RHSConstant = isa<ConstantSDNode>(N1);
12877 if (RHSConstant)
12878 Offset = N.getConstantOperandVal(1);
12879 // We are not allowed to turn indirect debug values variadic, so
12880 // don't salvage those.
12881 if (!RHSConstant && DV->isIndirect())
12882 continue;
12883
12884 // Rewrite an ADD constant node into a DIExpression. Since we are
12885 // performing arithmetic to compute the variable's *value* in the
12886 // DIExpression, we need to mark the expression with a
12887 // DW_OP_stack_value.
12888 auto *DIExpr = DV->getExpression();
12889 auto NewLocOps = DV->copyLocationOps();
12890 bool Changed = false;
12891 size_t OrigLocOpsSize = NewLocOps.size();
12892 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12893 // We're not given a ResNo to compare against because the whole
12894 // node is going away. We know that any ISD::ADD only has one
12895 // result, so we can assume any node match is using the result.
12896 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12897 NewLocOps[i].getSDNode() != &N)
12898 continue;
12899 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12900 if (RHSConstant) {
12903 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12904 } else {
12905 // Convert to a variadic expression (if not already).
12906 // convertToVariadicExpression() returns a const pointer, so we use
12907 // a temporary const variable here.
12908 const auto *TmpDIExpr =
12912 ExprOps.push_back(NewLocOps.size());
12913 ExprOps.push_back(dwarf::DW_OP_plus);
12914 SDDbgOperand RHS =
12916 NewLocOps.push_back(RHS);
12917 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12918 }
12919 Changed = true;
12920 }
12921 (void)Changed;
12922 assert(Changed && "Salvage target doesn't use N");
12923
12924 bool IsVariadic =
12925 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12926
12927 auto AdditionalDependencies = DV->getAdditionalDependencies();
12928 SDDbgValue *Clone = getDbgValueList(
12929 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12930 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12931 ClonedDVs.push_back(Clone);
12932 DV->setIsInvalidated();
12933 DV->setIsEmitted();
12934 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12935 N0.getNode()->dumprFull(this);
12936 dbgs() << " into " << *DIExpr << '\n');
12937 }
12938 break;
12939 }
12940 case ISD::TRUNCATE: {
12941 SDValue N0 = N.getOperand(0);
12942 TypeSize FromSize = N0.getValueSizeInBits();
12943 TypeSize ToSize = N.getValueSizeInBits(0);
12944
12945 DIExpression *DbgExpression = DV->getExpression();
12946 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12947 auto NewLocOps = DV->copyLocationOps();
12948 bool Changed = false;
12949 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12950 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12951 NewLocOps[i].getSDNode() != &N)
12952 continue;
12953
12954 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12955 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
12956 Changed = true;
12957 }
12958 assert(Changed && "Salvage target doesn't use N");
12959 (void)Changed;
12960
12961 SDDbgValue *Clone =
12962 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
12963 DV->getAdditionalDependencies(), DV->isIndirect(),
12964 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
12965
12966 ClonedDVs.push_back(Clone);
12967 DV->setIsInvalidated();
12968 DV->setIsEmitted();
12969 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
12970 dbgs() << " into " << *DbgExpression << '\n');
12971 break;
12972 }
12973 }
12974 }
12975
12976 for (SDDbgValue *Dbg : ClonedDVs) {
12977 assert((!Dbg->getSDNodes().empty() ||
12978 llvm::any_of(Dbg->getLocationOps(),
12979 [&](const SDDbgOperand &Op) {
12980 return Op.getKind() == SDDbgOperand::FRAMEIX;
12981 })) &&
12982 "Salvaged DbgValue should depend on a new SDNode");
12983 AddDbgValue(Dbg, false);
12984 }
12985}
12986
12987/// Creates a SDDbgLabel node.
12989 const DebugLoc &DL, unsigned O) {
12990 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
12991 "Expected inlined-at fields to agree");
12992 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
12993}
12994
12995namespace {
12996
12997/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
12998/// pointed to by a use iterator is deleted, increment the use iterator
12999/// so that it doesn't dangle.
13000///
13001class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
13004
13005 void NodeDeleted(SDNode *N, SDNode *E) override {
13006 // Increment the iterator as needed.
13007 while (UI != UE && N == UI->getUser())
13008 ++UI;
13009 }
13010
13011public:
13012 RAUWUpdateListener(SelectionDAG &d,
13015 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
13016};
13017
13018} // end anonymous namespace
13019
13020/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13021/// This can cause recursive merging of nodes in the DAG.
13022///
13023/// This version assumes From has a single result value.
13024///
13026 SDNode *From = FromN.getNode();
13027 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
13028 "Cannot replace with this method!");
13029 assert(From != To.getNode() && "Cannot replace uses of with self");
13030
13031 // Preserve Debug Values
13032 transferDbgValues(FromN, To);
13033 // Preserve extra info.
13034 copyExtraInfo(From, To.getNode());
13035
13036 // Iterate over all the existing uses of From. New uses will be added
13037 // to the beginning of the use list, which we avoid visiting.
13038 // This specifically avoids visiting uses of From that arise while the
13039 // replacement is happening, because any such uses would be the result
13040 // of CSE: If an existing node looks like From after one of its operands
13041 // is replaced by To, we don't want to replace of all its users with To
13042 // too. See PR3018 for more info.
13043 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13044 RAUWUpdateListener Listener(*this, UI, UE);
13045 while (UI != UE) {
13046 SDNode *User = UI->getUser();
13047
13048 // This node is about to morph, remove its old self from the CSE maps.
13049 RemoveNodeFromCSEMaps(User);
13050
13051 // A user can appear in a use list multiple times, and when this
13052 // happens the uses are usually next to each other in the list.
13053 // To help reduce the number of CSE recomputations, process all
13054 // the uses of this user that we can find this way.
13055 do {
13056 SDUse &Use = *UI;
13057 ++UI;
13058 Use.set(To);
13059 if (To->isDivergent() != From->isDivergent())
13061 } while (UI != UE && UI->getUser() == User);
13062 // Now that we have modified User, add it back to the CSE maps. If it
13063 // already exists there, recursively merge the results together.
13064 AddModifiedNodeToCSEMaps(User);
13065 }
13066
13067 // If we just RAUW'd the root, take note.
13068 if (FromN == getRoot())
13069 setRoot(To);
13070}
13071
13072/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13073/// This can cause recursive merging of nodes in the DAG.
13074///
13075/// This version assumes that for each value of From, there is a
13076/// corresponding value in To in the same position with the same type.
13077///
13079#ifndef NDEBUG
13080 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13081 assert((!From->hasAnyUseOfValue(i) ||
13082 From->getValueType(i) == To->getValueType(i)) &&
13083 "Cannot use this version of ReplaceAllUsesWith!");
13084#endif
13085
13086 // Handle the trivial case.
13087 if (From == To)
13088 return;
13089
13090 // Preserve Debug Info. Only do this if there's a use.
13091 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
13092 if (From->hasAnyUseOfValue(i)) {
13093 assert((i < To->getNumValues()) && "Invalid To location");
13094 transferDbgValues(SDValue(From, i), SDValue(To, i));
13095 }
13096 // Preserve extra info.
13097 copyExtraInfo(From, To);
13098
13099 // Iterate over just the existing users of From. See the comments in
13100 // the ReplaceAllUsesWith above.
13101 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13102 RAUWUpdateListener Listener(*this, UI, UE);
13103 while (UI != UE) {
13104 SDNode *User = UI->getUser();
13105
13106 // This node is about to morph, remove its old self from the CSE maps.
13107 RemoveNodeFromCSEMaps(User);
13108
13109 // A user can appear in a use list multiple times, and when this
13110 // happens the uses are usually next to each other in the list.
13111 // To help reduce the number of CSE recomputations, process all
13112 // the uses of this user that we can find this way.
13113 do {
13114 SDUse &Use = *UI;
13115 ++UI;
13116 Use.setNode(To);
13117 if (To->isDivergent() != From->isDivergent())
13119 } while (UI != UE && UI->getUser() == User);
13120
13121 // Now that we have modified User, add it back to the CSE maps. If it
13122 // already exists there, recursively merge the results together.
13123 AddModifiedNodeToCSEMaps(User);
13124 }
13125
13126 // If we just RAUW'd the root, take note.
13127 if (From == getRoot().getNode())
13128 setRoot(SDValue(To, getRoot().getResNo()));
13129}
13130
13131/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
13132/// This can cause recursive merging of nodes in the DAG.
13133///
13134/// This version can replace From with any result values. To must match the
13135/// number and types of values returned by From.
13137 if (From->getNumValues() == 1) // Handle the simple case efficiently.
13138 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
13139
13140 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
13141 // Preserve Debug Info.
13142 transferDbgValues(SDValue(From, i), To[i]);
13143 // Preserve extra info.
13144 copyExtraInfo(From, To[i].getNode());
13145 }
13146
13147 // Iterate over just the existing users of From. See the comments in
13148 // the ReplaceAllUsesWith above.
13149 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
13150 RAUWUpdateListener Listener(*this, UI, UE);
13151 while (UI != UE) {
13152 SDNode *User = UI->getUser();
13153
13154 // This node is about to morph, remove its old self from the CSE maps.
13155 RemoveNodeFromCSEMaps(User);
13156
13157 // A user can appear in a use list multiple times, and when this happens the
13158 // uses are usually next to each other in the list. To help reduce the
13159 // number of CSE and divergence recomputations, process all the uses of this
13160 // user that we can find this way.
13161 bool To_IsDivergent = false;
13162 do {
13163 SDUse &Use = *UI;
13164 const SDValue &ToOp = To[Use.getResNo()];
13165 ++UI;
13166 Use.set(ToOp);
13167 if (ToOp.getValueType() != MVT::Other)
13168 To_IsDivergent |= ToOp->isDivergent();
13169 } while (UI != UE && UI->getUser() == User);
13170
13171 if (To_IsDivergent != From->isDivergent())
13173
13174 // Now that we have modified User, add it back to the CSE maps. If it
13175 // already exists there, recursively merge the results together.
13176 AddModifiedNodeToCSEMaps(User);
13177 }
13178
13179 // If we just RAUW'd the root, take note.
13180 if (From == getRoot().getNode())
13181 setRoot(SDValue(To[getRoot().getResNo()]));
13182}
13183
13184/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
13185/// uses of other values produced by From.getNode() alone. The Deleted
13186/// vector is handled the same way as for ReplaceAllUsesWith.
13188 // Handle the really simple, really trivial case efficiently.
13189 if (From == To) return;
13190
13191 // Handle the simple, trivial, case efficiently.
13192 if (From.getNode()->getNumValues() == 1) {
13193 ReplaceAllUsesWith(From, To);
13194 return;
13195 }
13196
13197 // Preserve Debug Info.
13198 transferDbgValues(From, To);
13199 copyExtraInfo(From.getNode(), To.getNode());
13200
13201 // Iterate over just the existing users of From. See the comments in
13202 // the ReplaceAllUsesWith above.
13203 SDNode::use_iterator UI = From.getNode()->use_begin(),
13204 UE = From.getNode()->use_end();
13205 RAUWUpdateListener Listener(*this, UI, UE);
13206 while (UI != UE) {
13207 SDNode *User = UI->getUser();
13208 bool UserRemovedFromCSEMaps = false;
13209
13210 // A user can appear in a use list multiple times, and when this
13211 // happens the uses are usually next to each other in the list.
13212 // To help reduce the number of CSE recomputations, process all
13213 // the uses of this user that we can find this way.
13214 do {
13215 SDUse &Use = *UI;
13216
13217 // Skip uses of different values from the same node.
13218 if (Use.getResNo() != From.getResNo()) {
13219 ++UI;
13220 continue;
13221 }
13222
13223 // If this node hasn't been modified yet, it's still in the CSE maps,
13224 // so remove its old self from the CSE maps.
13225 if (!UserRemovedFromCSEMaps) {
13226 RemoveNodeFromCSEMaps(User);
13227 UserRemovedFromCSEMaps = true;
13228 }
13229
13230 ++UI;
13231 Use.set(To);
13232 if (To->isDivergent() != From->isDivergent())
13234 } while (UI != UE && UI->getUser() == User);
13235 // We are iterating over all uses of the From node, so if a use
13236 // doesn't use the specific value, no changes are made.
13237 if (!UserRemovedFromCSEMaps)
13238 continue;
13239
13240 // Now that we have modified User, add it back to the CSE maps. If it
13241 // already exists there, recursively merge the results together.
13242 AddModifiedNodeToCSEMaps(User);
13243 }
13244
13245 // If we just RAUW'd the root, take note.
13246 if (From == getRoot())
13247 setRoot(To);
13248}
13249
13250namespace {
13251
13252/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
13253/// to record information about a use.
13254struct UseMemo {
13255 SDNode *User;
13256 unsigned Index;
13257 SDUse *Use;
13258};
13259
13260/// operator< - Sort Memos by User.
13261bool operator<(const UseMemo &L, const UseMemo &R) {
13262 return (intptr_t)L.User < (intptr_t)R.User;
13263}
13264
13265/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
13266/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
13267/// the node already has been taken care of recursively.
13268class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
13269 SmallVectorImpl<UseMemo> &Uses;
13270
13271 void NodeDeleted(SDNode *N, SDNode *E) override {
13272 for (UseMemo &Memo : Uses)
13273 if (Memo.User == N)
13274 Memo.User = nullptr;
13275 }
13276
13277public:
13278 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
13279 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
13280};
13281
13282} // end anonymous namespace
13283
13284/// Return true if a glue output should propagate divergence information.
13286 switch (Node->getOpcode()) {
13287 case ISD::CopyFromReg:
13288 case ISD::CopyToReg:
13289 return false;
13290 default:
13291 return true;
13292 }
13293
13294 llvm_unreachable("covered opcode switch");
13295}
13296
13298 if (TLI->isSDNodeAlwaysUniform(N)) {
13299 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
13300 "Conflicting divergence information!");
13301 return false;
13302 }
13303 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
13304 return true;
13305 for (const auto &Op : N->ops()) {
13306 EVT VT = Op.getValueType();
13307
13308 // Skip Chain. It does not carry divergence.
13309 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
13310 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
13311 return true;
13312 }
13313 return false;
13314}
13315
13317 SmallVector<SDNode *, 16> Worklist(1, N);
13318 do {
13319 N = Worklist.pop_back_val();
13320 bool IsDivergent = calculateDivergence(N);
13321 if (N->SDNodeBits.IsDivergent != IsDivergent) {
13322 N->SDNodeBits.IsDivergent = IsDivergent;
13323 llvm::append_range(Worklist, N->users());
13324 }
13325 } while (!Worklist.empty());
13326}
13327
13328void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
13330 Order.reserve(AllNodes.size());
13331 for (auto &N : allnodes()) {
13332 unsigned NOps = N.getNumOperands();
13333 Degree[&N] = NOps;
13334 if (0 == NOps)
13335 Order.push_back(&N);
13336 }
13337 for (size_t I = 0; I != Order.size(); ++I) {
13338 SDNode *N = Order[I];
13339 for (auto *U : N->users()) {
13340 unsigned &UnsortedOps = Degree[U];
13341 if (0 == --UnsortedOps)
13342 Order.push_back(U);
13343 }
13344 }
13345}
13346
13347#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
13348void SelectionDAG::VerifyDAGDivergence() {
13349 std::vector<SDNode *> TopoOrder;
13350 CreateTopologicalOrder(TopoOrder);
13351 for (auto *N : TopoOrder) {
13352 assert(calculateDivergence(N) == N->isDivergent() &&
13353 "Divergence bit inconsistency detected");
13354 }
13355}
13356#endif
13357
13358/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
13359/// uses of other values produced by From.getNode() alone. The same value
13360/// may appear in both the From and To list. The Deleted vector is
13361/// handled the same way as for ReplaceAllUsesWith.
13363 const SDValue *To,
13364 unsigned Num){
13365 // Handle the simple, trivial case efficiently.
13366 if (Num == 1)
13367 return ReplaceAllUsesOfValueWith(*From, *To);
13368
13369 transferDbgValues(*From, *To);
13370 copyExtraInfo(From->getNode(), To->getNode());
13371
13372 // Read up all the uses and make records of them. This helps
13373 // processing new uses that are introduced during the
13374 // replacement process.
13376 for (unsigned i = 0; i != Num; ++i) {
13377 unsigned FromResNo = From[i].getResNo();
13378 SDNode *FromNode = From[i].getNode();
13379 for (SDUse &Use : FromNode->uses()) {
13380 if (Use.getResNo() == FromResNo) {
13381 UseMemo Memo = {Use.getUser(), i, &Use};
13382 Uses.push_back(Memo);
13383 }
13384 }
13385 }
13386
13387 // Sort the uses, so that all the uses from a given User are together.
13389 RAUOVWUpdateListener Listener(*this, Uses);
13390
13391 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
13392 UseIndex != UseIndexEnd; ) {
13393 // We know that this user uses some value of From. If it is the right
13394 // value, update it.
13395 SDNode *User = Uses[UseIndex].User;
13396 // If the node has been deleted by recursive CSE updates when updating
13397 // another node, then just skip this entry.
13398 if (User == nullptr) {
13399 ++UseIndex;
13400 continue;
13401 }
13402
13403 // This node is about to morph, remove its old self from the CSE maps.
13404 RemoveNodeFromCSEMaps(User);
13405
13406 // The Uses array is sorted, so all the uses for a given User
13407 // are next to each other in the list.
13408 // To help reduce the number of CSE recomputations, process all
13409 // the uses of this user that we can find this way.
13410 do {
13411 unsigned i = Uses[UseIndex].Index;
13412 SDUse &Use = *Uses[UseIndex].Use;
13413 ++UseIndex;
13414
13415 Use.set(To[i]);
13416 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13417
13418 // Now that we have modified User, add it back to the CSE maps. If it
13419 // already exists there, recursively merge the results together.
13420 AddModifiedNodeToCSEMaps(User);
13421 }
13422}
13423
13424/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13425/// based on their topological order. It returns the maximum id and a vector
13426/// of the SDNodes* in assigned order by reference.
13428 unsigned DAGSize = 0;
13429
13430 // SortedPos tracks the progress of the algorithm. Nodes before it are
13431 // sorted, nodes after it are unsorted. When the algorithm completes
13432 // it is at the end of the list.
13433 allnodes_iterator SortedPos = allnodes_begin();
13434
13435 // Visit all the nodes. Move nodes with no operands to the front of
13436 // the list immediately. Annotate nodes that do have operands with their
13437 // operand count. Before we do this, the Node Id fields of the nodes
13438 // may contain arbitrary values. After, the Node Id fields for nodes
13439 // before SortedPos will contain the topological sort index, and the
13440 // Node Id fields for nodes At SortedPos and after will contain the
13441 // count of outstanding operands.
13443 checkForCycles(&N, this);
13444 unsigned Degree = N.getNumOperands();
13445 if (Degree == 0) {
13446 // A node with no uses, add it to the result array immediately.
13447 N.setNodeId(DAGSize++);
13448 allnodes_iterator Q(&N);
13449 if (Q != SortedPos)
13450 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13451 assert(SortedPos != AllNodes.end() && "Overran node list");
13452 ++SortedPos;
13453 } else {
13454 // Temporarily use the Node Id as scratch space for the degree count.
13455 N.setNodeId(Degree);
13456 }
13457 }
13458
13459 // Visit all the nodes. As we iterate, move nodes into sorted order,
13460 // such that by the time the end is reached all nodes will be sorted.
13461 for (SDNode &Node : allnodes()) {
13462 SDNode *N = &Node;
13463 checkForCycles(N, this);
13464 // N is in sorted position, so all its uses have one less operand
13465 // that needs to be sorted.
13466 for (SDNode *P : N->users()) {
13467 unsigned Degree = P->getNodeId();
13468 assert(Degree != 0 && "Invalid node degree");
13469 --Degree;
13470 if (Degree == 0) {
13471 // All of P's operands are sorted, so P may sorted now.
13472 P->setNodeId(DAGSize++);
13473 if (P->getIterator() != SortedPos)
13474 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13475 assert(SortedPos != AllNodes.end() && "Overran node list");
13476 ++SortedPos;
13477 } else {
13478 // Update P's outstanding operand count.
13479 P->setNodeId(Degree);
13480 }
13481 }
13482 if (Node.getIterator() == SortedPos) {
13483#ifndef NDEBUG
13485 SDNode *S = &*++I;
13486 dbgs() << "Overran sorted position:\n";
13487 S->dumprFull(this); dbgs() << "\n";
13488 dbgs() << "Checking if this is due to cycles\n";
13489 checkForCycles(this, true);
13490#endif
13491 llvm_unreachable(nullptr);
13492 }
13493 }
13494
13495 assert(SortedPos == AllNodes.end() &&
13496 "Topological sort incomplete!");
13497 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13498 "First node in topological sort is not the entry token!");
13499 assert(AllNodes.front().getNodeId() == 0 &&
13500 "First node in topological sort has non-zero id!");
13501 assert(AllNodes.front().getNumOperands() == 0 &&
13502 "First node in topological sort has operands!");
13503 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13504 "Last node in topologic sort has unexpected id!");
13505 assert(AllNodes.back().use_empty() &&
13506 "Last node in topologic sort has users!");
13507 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13508 return DAGSize;
13509}
13510
13512 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13513 SortedNodes.clear();
13514 // Node -> remaining number of outstanding operands.
13515 DenseMap<const SDNode *, unsigned> RemainingOperands;
13516
13517 // Put nodes without any operands into SortedNodes first.
13518 for (const SDNode &N : allnodes()) {
13519 checkForCycles(&N, this);
13520 unsigned NumOperands = N.getNumOperands();
13521 if (NumOperands == 0)
13522 SortedNodes.push_back(&N);
13523 else
13524 // Record their total number of outstanding operands.
13525 RemainingOperands[&N] = NumOperands;
13526 }
13527
13528 // A node is pushed into SortedNodes when all of its operands (predecessors in
13529 // the graph) are also in SortedNodes.
13530 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13531 const SDNode *N = SortedNodes[i];
13532 for (const SDNode *U : N->users()) {
13533 // HandleSDNode is never part of a DAG and therefore has no entry in
13534 // RemainingOperands.
13535 if (U->getOpcode() == ISD::HANDLENODE)
13536 continue;
13537 unsigned &NumRemOperands = RemainingOperands[U];
13538 assert(NumRemOperands && "Invalid number of remaining operands");
13539 --NumRemOperands;
13540 if (!NumRemOperands)
13541 SortedNodes.push_back(U);
13542 }
13543 }
13544
13545 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13546 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13547 "First node in topological sort is not the entry token");
13548 assert(SortedNodes.front()->getNumOperands() == 0 &&
13549 "First node in topological sort has operands");
13550}
13551
13552/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13553/// value is produced by SD.
13554void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13555 for (SDNode *SD : DB->getSDNodes()) {
13556 if (!SD)
13557 continue;
13558 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13559 SD->setHasDebugValue(true);
13560 }
13561 DbgInfo->add(DB, isParameter);
13562}
13563
13564void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13565
13567 SDValue NewMemOpChain) {
13568 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13569 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13570 // The new memory operation must have the same position as the old load in
13571 // terms of memory dependency. Create a TokenFactor for the old load and new
13572 // memory operation and update uses of the old load's output chain to use that
13573 // TokenFactor.
13574 if (OldChain == NewMemOpChain || OldChain.use_empty())
13575 return NewMemOpChain;
13576
13577 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13578 OldChain, NewMemOpChain);
13579 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13580 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13581 return TokenFactor;
13582}
13583
13585 SDValue NewMemOp) {
13586 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13587 SDValue OldChain = SDValue(OldLoad, 1);
13588 SDValue NewMemOpChain = NewMemOp.getValue(1);
13589 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13590}
13591
13593 Function **OutFunction) {
13594 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13595
13596 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13597 auto *Module = MF->getFunction().getParent();
13598 auto *Function = Module->getFunction(Symbol);
13599
13600 if (OutFunction != nullptr)
13601 *OutFunction = Function;
13602
13603 if (Function != nullptr) {
13604 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13605 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13606 }
13607
13608 std::string ErrorStr;
13609 raw_string_ostream ErrorFormatter(ErrorStr);
13610 ErrorFormatter << "Undefined external symbol ";
13611 ErrorFormatter << '"' << Symbol << '"';
13612 report_fatal_error(Twine(ErrorStr));
13613}
13614
13615//===----------------------------------------------------------------------===//
13616// SDNode Class
13617//===----------------------------------------------------------------------===//
13618
13621 return Const != nullptr && Const->isZero();
13622}
13623
13625 return V.isUndef() || isNullConstant(V);
13626}
13627
13630 return Const != nullptr && Const->isZero() && !Const->isNegative();
13631}
13632
13635 return Const != nullptr && Const->isAllOnes();
13636}
13637
13640 return Const != nullptr && Const->isOne();
13641}
13642
13645 return Const != nullptr && Const->isMinSignedValue();
13646}
13647
13649 SDValue V, unsigned OperandNo,
13650 unsigned Depth) const {
13651 APInt DemandedElts = getDemandAllEltsMask(V);
13652 return isIdentityElement(Opcode, Flags, V, DemandedElts, OperandNo, Depth);
13653}
13654
13656 SDValue V, const APInt &DemandedElts,
13657 unsigned OperandNo, unsigned Depth) const {
13658 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13659 // TODO: Target-specific opcodes could be added.
13660 if (V.getValueType().isInteger()) {
13661 KnownBits Known = computeKnownBits(V, DemandedElts, Depth);
13662 if (Known.isConstant()) {
13663 const APInt &Const = Known.getConstant();
13664 switch (Opcode) {
13665 case ISD::ADD:
13666 case ISD::OR:
13667 case ISD::XOR:
13668 case ISD::UMAX:
13669 return Const.isZero();
13670 case ISD::MUL:
13671 return Const.isOne();
13672 case ISD::AND:
13673 case ISD::UMIN:
13674 return Const.isAllOnes();
13675 case ISD::SMAX:
13676 return Const.isMinSignedValue();
13677 case ISD::SMIN:
13678 return Const.isMaxSignedValue();
13679 case ISD::SUB:
13680 case ISD::SHL:
13681 case ISD::SRA:
13682 case ISD::SRL:
13683 return OperandNo == 1 && Const.isZero();
13684 case ISD::UDIV:
13685 case ISD::SDIV:
13686 return OperandNo == 1 && Const.isOne();
13687 }
13688 }
13689 } else if (auto *ConstFP = isConstOrConstSplatFP(V, DemandedElts)) {
13690 switch (Opcode) {
13691 case ISD::FADD:
13692 return ConstFP->isZero() &&
13693 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13694 case ISD::FSUB:
13695 return OperandNo == 1 && ConstFP->isZero() &&
13696 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13697 case ISD::FMUL:
13698 return ConstFP->isExactlyValue(1.0);
13699 case ISD::FDIV:
13700 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
13701 case ISD::FMINNUM:
13702 case ISD::FMAXNUM: {
13703 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13704 EVT VT = V.getValueType();
13705 const fltSemantics &Semantics = VT.getFltSemantics();
13706 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics)
13707 : !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
13708 : APFloat::getLargest(Semantics);
13709 if (Opcode == ISD::FMAXNUM)
13710 NeutralAF.changeSign();
13711
13712 return ConstFP->isExactlyValue(NeutralAF);
13713 }
13714 }
13715 }
13716 return false;
13717}
13718
13720 while (V.getOpcode() == ISD::BITCAST)
13721 V = V.getOperand(0);
13722 return V;
13723}
13724
13726 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13727 V = V.getOperand(0);
13728 return V;
13729}
13730
13732 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13733 V = V.getOperand(0);
13734 return V;
13735}
13736
13738 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13739 SDValue InVec = V.getOperand(0);
13740 SDValue EltNo = V.getOperand(2);
13741 EVT VT = InVec.getValueType();
13742 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13743 if (IndexC && VT.isFixedLengthVector() &&
13744 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13745 !DemandedElts[IndexC->getZExtValue()]) {
13746 V = InVec;
13747 continue;
13748 }
13749 break;
13750 }
13751 return V;
13752}
13753
13755 while (V.getOpcode() == ISD::TRUNCATE)
13756 V = V.getOperand(0);
13757 return V;
13758}
13759
13760bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13761 if (V.getOpcode() != ISD::XOR)
13762 return false;
13763 V = peekThroughBitcasts(V.getOperand(1));
13764 unsigned NumBits = V.getScalarValueSizeInBits();
13765 ConstantSDNode *C =
13766 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13767 return C && (C->getAPIntValue().countr_one() >= NumBits);
13768}
13769
13771 bool AllowTruncation) {
13772 APInt DemandedElts = getDemandAllEltsMask(N);
13773 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13774}
13775
13777 bool AllowUndefs,
13778 bool AllowTruncation) {
13780 return CN;
13781
13782 // SplatVectors can truncate their operands. Ignore that case here unless
13783 // AllowTruncation is set.
13784 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13785 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13786 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13787 EVT CVT = CN->getValueType(0);
13788 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13789 if (AllowTruncation || CVT == VecEltVT)
13790 return CN;
13791 }
13792 }
13793
13795 BitVector UndefElements;
13796 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13797
13798 // BuildVectors can truncate their operands. Ignore that case here unless
13799 // AllowTruncation is set.
13800 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13801 if (CN && (UndefElements.none() || AllowUndefs)) {
13802 EVT CVT = CN->getValueType(0);
13803 EVT NSVT = N.getValueType().getScalarType();
13804 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13805 if (AllowTruncation || (CVT == NSVT))
13806 return CN;
13807 }
13808 }
13809
13810 return nullptr;
13811}
13812
13814 APInt DemandedElts = getDemandAllEltsMask(N);
13815 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13816}
13817
13819 const APInt &DemandedElts,
13820 bool AllowUndefs) {
13822 return CN;
13823
13825 BitVector UndefElements;
13826 ConstantFPSDNode *CN =
13827 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13828 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13829 if (CN && (UndefElements.none() || AllowUndefs))
13830 return CN;
13831 }
13832
13833 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13834 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13835 return CN;
13836
13837 return nullptr;
13838}
13839
13840bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13841 // TODO: may want to use peekThroughBitcast() here.
13842 ConstantSDNode *C =
13843 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13844 return C && C->isZero();
13845}
13846
13847bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13848 ConstantSDNode *C =
13849 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13850 return C && C->isOne();
13851}
13852
13853bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13854 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13855 return C && C->isExactlyValue(1.0);
13856}
13857
13858bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13860 unsigned BitWidth = N.getScalarValueSizeInBits();
13861 ConstantSDNode *C =
13862 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13863 return C && C->getAPIntValue().countTrailingOnes() >= BitWidth;
13864}
13865
13866bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13867 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13868 return C && APInt::isSameValue(C->getAPIntValue(),
13869 APInt(C->getAPIntValue().getBitWidth(), 1));
13870}
13871
13872bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13874 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13875 return C && C->isZero();
13876}
13877
13878bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13879 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13880 return C && C->isZero();
13881}
13882
13886
13888 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13890 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13891 bool IsVolatile = false;
13892 bool IsNonTemporal = false;
13893 bool IsDereferenceable = true;
13894 bool IsInvariant = true;
13895 for (const MachineMemOperand *MMO : memoperands()) {
13896 IsVolatile |= MMO->isVolatile();
13897 IsNonTemporal |= MMO->isNonTemporal();
13898 IsDereferenceable &= MMO->isDereferenceable();
13899 IsInvariant &= MMO->isInvariant();
13900 }
13901 MemSDNodeBits.IsVolatile = IsVolatile;
13902 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13903 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13904 MemSDNodeBits.IsInvariant = IsInvariant;
13905
13906 // For the single-MMO case, we check here that the size of the memory operand
13907 // fits within the size of the MMO. This is because the MMO might indicate
13908 // only a possible address range instead of specifying the affected memory
13909 // addresses precisely.
13912 getMemOperand()->getSize().getValue())) &&
13913 "Size mismatch!");
13914}
13915
13916/// Profile - Gather unique data for the node.
13917///
13919 AddNodeIDNode(ID, this);
13920}
13921
13922namespace {
13923
13924 struct EVTArray {
13925 std::vector<EVT> VTs;
13926
13927 EVTArray() {
13928 VTs.reserve(MVT::VALUETYPE_SIZE);
13929 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13930 VTs.push_back(MVT((MVT::SimpleValueType)i));
13931 }
13932 };
13933
13934} // end anonymous namespace
13935
13936/// getValueTypeList - Return a pointer to the specified value type.
13937///
13938const EVT *SDNode::getValueTypeList(MVT VT) {
13939 static EVTArray SimpleVTArray;
13940
13941 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13942 return &SimpleVTArray.VTs[VT.SimpleTy];
13943}
13944
13945/// hasAnyUseOfValue - Return true if there are any use of the indicated
13946/// value. This method ignores uses of other values defined by this operation.
13947bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13948 assert(Value < getNumValues() && "Bad value!");
13949
13950 for (SDUse &U : uses())
13951 if (U.getResNo() == Value)
13952 return true;
13953
13954 return false;
13955}
13956
13957/// isOnlyUserOf - Return true if this node is the only use of N.
13958bool SDNode::isOnlyUserOf(const SDNode *N) const {
13959 bool Seen = false;
13960 for (const SDNode *User : N->users()) {
13961 if (User == this)
13962 Seen = true;
13963 else
13964 return false;
13965 }
13966
13967 return Seen;
13968}
13969
13970/// Return true if the only users of N are contained in Nodes.
13972 bool Seen = false;
13973 for (const SDNode *User : N->users()) {
13974 if (llvm::is_contained(Nodes, User))
13975 Seen = true;
13976 else
13977 return false;
13978 }
13979
13980 return Seen;
13981}
13982
13983/// Return true if the referenced return value is an operand of N.
13984bool SDValue::isOperandOf(const SDNode *N) const {
13985 return is_contained(N->op_values(), *this);
13986}
13987
13988bool SDNode::isOperandOf(const SDNode *N) const {
13989 return any_of(N->op_values(),
13990 [this](SDValue Op) { return this == Op.getNode(); });
13991}
13992
13993/// reachesChainWithoutSideEffects - Return true if this operand (which must
13994/// be a chain) reaches the specified operand without crossing any
13995/// side-effecting instructions on any chain path. In practice, this looks
13996/// through token factors and non-volatile loads. In order to remain efficient,
13997/// this only looks a couple of nodes in, it does not do an exhaustive search.
13998///
13999/// Note that we only need to examine chains when we're searching for
14000/// side-effects; SelectionDAG requires that all side-effects are represented
14001/// by chains, even if another operand would force a specific ordering. This
14002/// constraint is necessary to allow transformations like splitting loads.
14004 unsigned Depth) const {
14005 if (*this == Dest) return true;
14006
14007 // Don't search too deeply, we just want to be able to see through
14008 // TokenFactor's etc.
14009 if (Depth == 0) return false;
14010
14011 // If this is a token factor, all inputs to the TF happen in parallel.
14012 if (getOpcode() == ISD::TokenFactor) {
14013 // First, try a shallow search.
14014 if (is_contained((*this)->ops(), Dest)) {
14015 // We found the chain we want as an operand of this TokenFactor.
14016 // Essentially, we reach the chain without side-effects if we could
14017 // serialize the TokenFactor into a simple chain of operations with
14018 // Dest as the last operation. This is automatically true if the
14019 // chain has one use: there are no other ordering constraints.
14020 // If the chain has more than one use, we give up: some other
14021 // use of Dest might force a side-effect between Dest and the current
14022 // node.
14023 if (Dest.hasOneUse())
14024 return true;
14025 }
14026 // Next, try a deep search: check whether every operand of the TokenFactor
14027 // reaches Dest.
14028 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
14029 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
14030 });
14031 }
14032
14033 // Loads don't have side effects, look through them.
14034 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
14035 if (Ld->isUnordered())
14036 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
14037 }
14038 return false;
14039}
14040
14041bool SDNode::hasPredecessor(const SDNode *N) const {
14044 Worklist.push_back(this);
14045 return hasPredecessorHelper(N, Visited, Worklist);
14046}
14047
14049 this->Flags &= Flags;
14050}
14051
14052SDValue
14054 ArrayRef<ISD::NodeType> CandidateBinOps,
14055 bool AllowPartials) {
14056 // The pattern must end in an extract from index 0.
14057 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
14058 !isNullConstant(Extract->getOperand(1)))
14059 return SDValue();
14060
14061 // Match against one of the candidate binary ops.
14062 SDValue Op = Extract->getOperand(0);
14063 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
14064 return Op.getOpcode() == unsigned(BinOp);
14065 }))
14066 return SDValue();
14067
14068 // Floating-point reductions may require relaxed constraints on the final step
14069 // of the reduction because they may reorder intermediate operations.
14070 unsigned CandidateBinOp = Op.getOpcode();
14071 if (Op.getValueType().isFloatingPoint()) {
14072 SDNodeFlags Flags = Op->getFlags();
14073 switch (CandidateBinOp) {
14074 case ISD::FADD:
14075 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
14076 return SDValue();
14077 break;
14078 default:
14079 llvm_unreachable("Unhandled FP opcode for binop reduction");
14080 }
14081 }
14082
14083 // Matching failed - attempt to see if we did enough stages that a partial
14084 // reduction from a subvector is possible.
14085 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
14086 if (!AllowPartials || !Op)
14087 return SDValue();
14088 EVT OpVT = Op.getValueType();
14089 EVT OpSVT = OpVT.getScalarType();
14090 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
14091 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
14092 return SDValue();
14093 BinOp = (ISD::NodeType)CandidateBinOp;
14094 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
14095 };
14096
14097 // At each stage, we're looking for something that looks like:
14098 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
14099 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
14100 // i32 undef, i32 undef, i32 undef, i32 undef>
14101 // %a = binop <8 x i32> %op, %s
14102 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
14103 // we expect something like:
14104 // <4,5,6,7,u,u,u,u>
14105 // <2,3,u,u,u,u,u,u>
14106 // <1,u,u,u,u,u,u,u>
14107 // While a partial reduction match would be:
14108 // <2,3,u,u,u,u,u,u>
14109 // <1,u,u,u,u,u,u,u>
14110 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
14111 SDValue PrevOp;
14112 for (unsigned i = 0; i < Stages; ++i) {
14113 unsigned MaskEnd = (1 << i);
14114
14115 if (Op.getOpcode() != CandidateBinOp)
14116 return PartialReduction(PrevOp, MaskEnd);
14117
14118 SDValue Op0 = Op.getOperand(0);
14119 SDValue Op1 = Op.getOperand(1);
14120
14122 if (Shuffle) {
14123 Op = Op1;
14124 } else {
14125 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
14126 Op = Op0;
14127 }
14128
14129 // The first operand of the shuffle should be the same as the other operand
14130 // of the binop.
14131 if (!Shuffle || Shuffle->getOperand(0) != Op)
14132 return PartialReduction(PrevOp, MaskEnd);
14133
14134 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
14135 for (int Index = 0; Index < (int)MaskEnd; ++Index)
14136 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
14137 return PartialReduction(PrevOp, MaskEnd);
14138
14139 PrevOp = Op;
14140 }
14141
14142 // Handle subvector reductions, which tend to appear after the shuffle
14143 // reduction stages.
14144 while (Op.getOpcode() == CandidateBinOp) {
14145 unsigned NumElts = Op.getValueType().getVectorNumElements();
14146 SDValue Op0 = Op.getOperand(0);
14147 SDValue Op1 = Op.getOperand(1);
14148 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
14150 Op0.getOperand(0) != Op1.getOperand(0))
14151 break;
14152 SDValue Src = Op0.getOperand(0);
14153 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
14154 if (NumSrcElts != (2 * NumElts))
14155 break;
14156 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
14157 Op1.getConstantOperandAPInt(1) == NumElts) &&
14158 !(Op1.getConstantOperandAPInt(1) == 0 &&
14159 Op0.getConstantOperandAPInt(1) == NumElts))
14160 break;
14161 Op = Src;
14162 }
14163
14164 BinOp = (ISD::NodeType)CandidateBinOp;
14165 return Op;
14166}
14167
14169 EVT VT = N->getValueType(0);
14170 EVT EltVT = VT.getVectorElementType();
14171 unsigned NE = VT.getVectorNumElements();
14172
14173 SDLoc dl(N);
14174
14175 // If ResNE is 0, fully unroll the vector op.
14176 if (ResNE == 0)
14177 ResNE = NE;
14178 else if (NE > ResNE)
14179 NE = ResNE;
14180
14181 if (N->getNumValues() == 2) {
14182 SmallVector<SDValue, 8> Scalars0, Scalars1;
14183 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14184 EVT VT1 = N->getValueType(1);
14185 EVT EltVT1 = VT1.getVectorElementType();
14186
14187 unsigned i;
14188 for (i = 0; i != NE; ++i) {
14189 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14190 SDValue Operand = N->getOperand(j);
14191 EVT OperandVT = Operand.getValueType();
14192
14193 // A vector operand; extract a single element.
14194 EVT OperandEltVT = OperandVT.getVectorElementType();
14195 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14196 }
14197
14198 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
14199 Scalars0.push_back(EltOp);
14200 Scalars1.push_back(EltOp.getValue(1));
14201 }
14202
14203 for (; i < ResNE; ++i) {
14204 Scalars0.push_back(getUNDEF(EltVT));
14205 Scalars1.push_back(getUNDEF(EltVT1));
14206 }
14207
14208 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14209 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
14210 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
14211 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
14212 return getMergeValues({Vec0, Vec1}, dl);
14213 }
14214
14215 assert(N->getNumValues() == 1 &&
14216 "Can't unroll a vector with multiple results!");
14217
14219 SmallVector<SDValue, 4> Operands(N->getNumOperands());
14220
14221 unsigned i;
14222 for (i= 0; i != NE; ++i) {
14223 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
14224 SDValue Operand = N->getOperand(j);
14225 EVT OperandVT = Operand.getValueType();
14226 if (OperandVT.isVector()) {
14227 // A vector operand; extract a single element.
14228 EVT OperandEltVT = OperandVT.getVectorElementType();
14229 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
14230 } else {
14231 // A scalar operand; just use it as is.
14232 Operands[j] = Operand;
14233 }
14234 }
14235
14236 switch (N->getOpcode()) {
14237 default: {
14238 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
14239 N->getFlags()));
14240 break;
14241 }
14242 case ISD::VSELECT:
14243 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
14244 break;
14245 case ISD::SHL:
14246 case ISD::SRA:
14247 case ISD::SRL:
14248 case ISD::ROTL:
14249 case ISD::ROTR:
14250 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
14251 getShiftAmountOperand(Operands[0].getValueType(),
14252 Operands[1])));
14253 break;
14255 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
14256 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
14257 Operands[0],
14258 getValueType(ExtVT)));
14259 break;
14260 }
14261 case ISD::ADDRSPACECAST: {
14262 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
14263 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
14264 ASC->getSrcAddressSpace(),
14265 ASC->getDestAddressSpace()));
14266 break;
14267 }
14268 }
14269 }
14270
14271 for (; i < ResNE; ++i)
14272 Scalars.push_back(getUNDEF(EltVT));
14273
14274 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
14275 return getBuildVector(VecVT, dl, Scalars);
14276}
14277
14278std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
14279 SDNode *N, unsigned ResNE) {
14280 unsigned Opcode = N->getOpcode();
14281 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
14282 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
14283 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
14284 "Expected an overflow opcode");
14285
14286 EVT ResVT = N->getValueType(0);
14287 EVT OvVT = N->getValueType(1);
14288 EVT ResEltVT = ResVT.getVectorElementType();
14289 EVT OvEltVT = OvVT.getVectorElementType();
14290 SDLoc dl(N);
14291
14292 // If ResNE is 0, fully unroll the vector op.
14293 unsigned NE = ResVT.getVectorNumElements();
14294 if (ResNE == 0)
14295 ResNE = NE;
14296 else if (NE > ResNE)
14297 NE = ResNE;
14298
14299 SmallVector<SDValue, 8> LHSScalars;
14300 SmallVector<SDValue, 8> RHSScalars;
14301 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
14302 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
14303
14304 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
14305 SDVTList VTs = getVTList(ResEltVT, SVT);
14306 SmallVector<SDValue, 8> ResScalars;
14307 SmallVector<SDValue, 8> OvScalars;
14308 for (unsigned i = 0; i < NE; ++i) {
14309 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
14310 SDValue Ov =
14311 getSelect(dl, OvEltVT, Res.getValue(1),
14312 getBoolConstant(true, dl, OvEltVT, ResVT),
14313 getConstant(0, dl, OvEltVT));
14314
14315 ResScalars.push_back(Res);
14316 OvScalars.push_back(Ov);
14317 }
14318
14319 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
14320 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
14321
14322 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
14323 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
14324 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
14325 getBuildVector(NewOvVT, dl, OvScalars));
14326}
14327
14330 unsigned Bytes,
14331 int Dist) const {
14332 if (LD->isVolatile() || Base->isVolatile())
14333 return false;
14334 // TODO: probably too restrictive for atomics, revisit
14335 if (!LD->isSimple())
14336 return false;
14337 if (LD->isIndexed() || Base->isIndexed())
14338 return false;
14339 if (LD->getChain() != Base->getChain())
14340 return false;
14341 EVT VT = LD->getMemoryVT();
14342 if (VT.getSizeInBits() / 8 != Bytes)
14343 return false;
14344
14345 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
14346 auto LocDecomp = BaseIndexOffset::match(LD, *this);
14347
14348 int64_t Offset = 0;
14349 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
14350 return (Dist * (int64_t)Bytes == Offset);
14351 return false;
14352}
14353
14354/// InferPtrAlignment - Infer alignment of a load / store address. Return
14355/// std::nullopt if it cannot be inferred.
14357 // If this is a GlobalAddress + cst, return the alignment.
14358 const GlobalValue *GV = nullptr;
14359 int64_t GVOffset = 0;
14360 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
14361 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
14362 KnownBits Known(PtrWidth);
14364 unsigned AlignBits = Known.countMinTrailingZeros();
14365 if (AlignBits)
14366 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
14367 }
14368
14369 // If this is a direct reference to a stack slot, use information about the
14370 // stack slot's alignment.
14371 int FrameIdx = INT_MIN;
14372 int64_t FrameOffset = 0;
14374 FrameIdx = FI->getIndex();
14375 } else if (isBaseWithConstantOffset(Ptr) &&
14377 // Handle FI+Cst
14378 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
14379 FrameOffset = Ptr.getConstantOperandVal(1);
14380 }
14381
14382 if (FrameIdx != INT_MIN) {
14384 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
14385 }
14386
14387 return std::nullopt;
14388}
14389
14390/// Split the scalar node with EXTRACT_ELEMENT using the provided
14391/// VTs and return the low/high part.
14392std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
14393 const SDLoc &DL,
14394 const EVT &LoVT,
14395 const EVT &HiVT) {
14396 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
14397 "Split node must be a scalar type");
14398 SDValue Lo =
14400 SDValue Hi =
14402 return std::make_pair(Lo, Hi);
14403}
14404
14405/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
14406/// which is split (or expanded) into two not necessarily identical pieces.
14407std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
14408 // Currently all types are split in half.
14409 EVT LoVT, HiVT;
14410 if (!VT.isVector())
14411 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
14412 else
14413 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
14414
14415 return std::make_pair(LoVT, HiVT);
14416}
14417
14418/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
14419/// type, dependent on an enveloping VT that has been split into two identical
14420/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14421std::pair<EVT, EVT>
14423 bool *HiIsEmpty) const {
14424 EVT EltTp = VT.getVectorElementType();
14425 // Examples:
14426 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14427 // custom VL=9 with enveloping VL=8/8 yields 8/1
14428 // custom VL=10 with enveloping VL=8/8 yields 8/2
14429 // etc.
14430 ElementCount VTNumElts = VT.getVectorElementCount();
14431 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14432 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14433 "Mixing fixed width and scalable vectors when enveloping a type");
14434 EVT LoVT, HiVT;
14435 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14436 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14437 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14438 *HiIsEmpty = false;
14439 } else {
14440 // Flag that hi type has zero storage size, but return split envelop type
14441 // (this would be easier if vector types with zero elements were allowed).
14442 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14443 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14444 *HiIsEmpty = true;
14445 }
14446 return std::make_pair(LoVT, HiVT);
14447}
14448
14449/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14450/// low/high part.
14451std::pair<SDValue, SDValue>
14452SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14453 const EVT &HiVT) {
14454 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14455 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14456 "Splitting vector with an invalid mixture of fixed and scalable "
14457 "vector types");
14459 N.getValueType().getVectorMinNumElements() &&
14460 "More vector elements requested than available!");
14461 SDValue Lo, Hi;
14462 Lo = getExtractSubvector(DL, LoVT, N, 0);
14463 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14464 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14465 // IDX with the runtime scaling factor of the result vector type. For
14466 // fixed-width result vectors, that runtime scaling factor is 1.
14468 return std::make_pair(Lo, Hi);
14469}
14470
14471std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14472 const SDLoc &DL) {
14473 // Split the vector length parameter.
14474 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14475 EVT VT = N.getValueType();
14477 "Expecting the mask to be an evenly-sized vector");
14478 SDValue HalfNumElts = getElementCount(
14480 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14481 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14482 return std::make_pair(Lo, Hi);
14483}
14484
14485/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14487 EVT VT = N.getValueType();
14490 return getInsertSubvector(DL, getUNDEF(WideVT), N, 0);
14491}
14492
14495 unsigned Start, unsigned Count,
14496 EVT EltVT) {
14497 EVT VT = Op.getValueType();
14498 if (Count == 0)
14500 if (EltVT == EVT())
14501 EltVT = VT.getVectorElementType();
14502 SDLoc SL(Op);
14503 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14504 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14505 }
14506}
14507
14508// getAddressSpace - Return the address space this GlobalAddress belongs to.
14510 return getGlobal()->getType()->getAddressSpace();
14511}
14512
14515 return Val.MachineCPVal->getType();
14516 return Val.ConstVal->getType();
14517}
14518
14519bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14520 unsigned &SplatBitSize,
14521 bool &HasAnyUndefs,
14522 unsigned MinSplatBits,
14523 bool IsBigEndian) const {
14524 EVT VT = getValueType(0);
14525 assert(VT.isVector() && "Expected a vector type");
14526 unsigned VecWidth = VT.getSizeInBits();
14527 if (MinSplatBits > VecWidth)
14528 return false;
14529
14530 // FIXME: The widths are based on this node's type, but build vectors can
14531 // truncate their operands.
14532 SplatValue = APInt(VecWidth, 0);
14533 SplatUndef = APInt(VecWidth, 0);
14534
14535 // Get the bits. Bits with undefined values (when the corresponding element
14536 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14537 // in SplatValue. If any of the values are not constant, give up and return
14538 // false.
14539 unsigned int NumOps = getNumOperands();
14540 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14541 unsigned EltWidth = VT.getScalarSizeInBits();
14542
14543 for (unsigned j = 0; j < NumOps; ++j) {
14544 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14545 SDValue OpVal = getOperand(i);
14546 unsigned BitPos = j * EltWidth;
14547
14548 if (OpVal.isUndef())
14549 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14550 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14551 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14552 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14553 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14554 else
14555 return false;
14556 }
14557
14558 // The build_vector is all constants or undefs. Find the smallest element
14559 // size that splats the vector.
14560 HasAnyUndefs = (SplatUndef != 0);
14561
14562 // FIXME: This does not work for vectors with elements less than 8 bits.
14563 while (VecWidth > 8) {
14564 // If we can't split in half, stop here.
14565 if (VecWidth & 1)
14566 break;
14567
14568 unsigned HalfSize = VecWidth / 2;
14569 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14570 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14571 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14572 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14573
14574 // If the two halves do not match (ignoring undef bits), stop here.
14575 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14576 MinSplatBits > HalfSize)
14577 break;
14578
14579 SplatValue = HighValue | LowValue;
14580 SplatUndef = HighUndef & LowUndef;
14581
14582 VecWidth = HalfSize;
14583 }
14584
14585 // FIXME: The loop above only tries to split in halves. But if the input
14586 // vector for example is <3 x i16> it wouldn't be able to detect a
14587 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14588 // optimizations. I guess that back in the days when this helper was created
14589 // vectors normally was power-of-2 sized.
14590
14591 SplatBitSize = VecWidth;
14592 return true;
14593}
14594
14596 BitVector *UndefElements) const {
14597 unsigned NumOps = getNumOperands();
14598 if (UndefElements) {
14599 UndefElements->clear();
14600 UndefElements->resize(NumOps);
14601 }
14602 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14603 if (!DemandedElts)
14604 return SDValue();
14605 SDValue Splatted;
14606 for (unsigned i = 0; i != NumOps; ++i) {
14607 if (!DemandedElts[i])
14608 continue;
14609 SDValue Op = getOperand(i);
14610 if (Op.isUndef()) {
14611 if (UndefElements)
14612 (*UndefElements)[i] = true;
14613 } else if (!Splatted) {
14614 Splatted = Op;
14615 } else if (Splatted != Op) {
14616 return SDValue();
14617 }
14618 }
14619
14620 if (!Splatted) {
14621 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14622 assert(getOperand(FirstDemandedIdx).isUndef() &&
14623 "Can only have a splat without a constant for all undefs.");
14624 return getOperand(FirstDemandedIdx);
14625 }
14626
14627 return Splatted;
14628}
14629
14631 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14632 return getSplatValue(DemandedElts, UndefElements);
14633}
14634
14636 SmallVectorImpl<SDValue> &Sequence,
14637 BitVector *UndefElements) const {
14638 unsigned NumOps = getNumOperands();
14639 Sequence.clear();
14640 if (UndefElements) {
14641 UndefElements->clear();
14642 UndefElements->resize(NumOps);
14643 }
14644 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14645 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14646 return false;
14647
14648 // Set the undefs even if we don't find a sequence (like getSplatValue).
14649 if (UndefElements)
14650 for (unsigned I = 0; I != NumOps; ++I)
14651 if (DemandedElts[I] && getOperand(I).isUndef())
14652 (*UndefElements)[I] = true;
14653
14654 // Iteratively widen the sequence length looking for repetitions.
14655 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14656 Sequence.append(SeqLen, SDValue());
14657 for (unsigned I = 0; I != NumOps; ++I) {
14658 if (!DemandedElts[I])
14659 continue;
14660 SDValue &SeqOp = Sequence[I % SeqLen];
14662 if (Op.isUndef()) {
14663 if (!SeqOp)
14664 SeqOp = Op;
14665 continue;
14666 }
14667 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14668 Sequence.clear();
14669 break;
14670 }
14671 SeqOp = Op;
14672 }
14673 if (!Sequence.empty())
14674 return true;
14675 }
14676
14677 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14678 return false;
14679}
14680
14682 BitVector *UndefElements) const {
14683 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14684 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14685}
14686
14689 BitVector *UndefElements) const {
14691 getSplatValue(DemandedElts, UndefElements));
14692}
14693
14696 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14697}
14698
14701 BitVector *UndefElements) const {
14703 getSplatValue(DemandedElts, UndefElements));
14704}
14705
14710
14711int32_t
14713 uint32_t BitWidth) const {
14714 if (ConstantFPSDNode *CN =
14716 bool IsExact;
14717 APSInt IntVal(BitWidth);
14718 const APFloat &APF = CN->getValueAPF();
14719 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14720 APFloat::opOK ||
14721 !IsExact)
14722 return -1;
14723
14724 return IntVal.exactLogBase2();
14725 }
14726 return -1;
14727}
14728
14730 bool IsLittleEndian, unsigned DstEltSizeInBits,
14731 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14732 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14733 if (!isConstant())
14734 return false;
14735
14736 unsigned NumSrcOps = getNumOperands();
14737 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14738 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14739 "Invalid bitcast scale");
14740
14741 // Extract raw src bits.
14742 SmallVector<APInt> SrcBitElements(NumSrcOps,
14743 APInt::getZero(SrcEltSizeInBits));
14744 BitVector SrcUndeElements(NumSrcOps, false);
14745
14746 for (unsigned I = 0; I != NumSrcOps; ++I) {
14748 if (Op.isUndef()) {
14749 SrcUndeElements.set(I);
14750 continue;
14751 }
14752 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14753 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14754 assert((CInt || CFP) && "Unknown constant");
14755 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14756 : CFP->getValueAPF().bitcastToAPInt();
14757 }
14758
14759 // Recast to dst width.
14760 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14761 SrcBitElements, UndefElements, SrcUndeElements);
14762 return true;
14763}
14764
14765void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14766 unsigned DstEltSizeInBits,
14767 SmallVectorImpl<APInt> &DstBitElements,
14768 ArrayRef<APInt> SrcBitElements,
14769 BitVector &DstUndefElements,
14770 const BitVector &SrcUndefElements) {
14771 unsigned NumSrcOps = SrcBitElements.size();
14772 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14773 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14774 "Invalid bitcast scale");
14775 assert(NumSrcOps == SrcUndefElements.size() &&
14776 "Vector size mismatch");
14777
14778 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14779 DstUndefElements.clear();
14780 DstUndefElements.resize(NumDstOps, false);
14781 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14782
14783 // Concatenate src elements constant bits together into dst element.
14784 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14785 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14786 for (unsigned I = 0; I != NumDstOps; ++I) {
14787 DstUndefElements.set(I);
14788 APInt &DstBits = DstBitElements[I];
14789 for (unsigned J = 0; J != Scale; ++J) {
14790 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14791 if (SrcUndefElements[Idx])
14792 continue;
14793 DstUndefElements.reset(I);
14794 const APInt &SrcBits = SrcBitElements[Idx];
14795 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14796 "Illegal constant bitwidths");
14797 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14798 }
14799 }
14800 return;
14801 }
14802
14803 // Split src element constant bits into dst elements.
14804 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14805 for (unsigned I = 0; I != NumSrcOps; ++I) {
14806 if (SrcUndefElements[I]) {
14807 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14808 continue;
14809 }
14810 const APInt &SrcBits = SrcBitElements[I];
14811 for (unsigned J = 0; J != Scale; ++J) {
14812 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14813 APInt &DstBits = DstBitElements[Idx];
14814 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14815 }
14816 }
14817}
14818
14820 for (const SDValue &Op : op_values()) {
14821 unsigned Opc = Op.getOpcode();
14822 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14823 return false;
14824 }
14825 return true;
14826}
14827
14828std::optional<std::pair<APInt, APInt>>
14830 unsigned NumOps = getNumOperands();
14831 if (NumOps < 2)
14832 return std::nullopt;
14833
14834 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14835 APInt Start, Stride;
14836 int FirstIdx = -1, SecondIdx = -1;
14837
14838 // Find the first two non-undef constant elements to determine Start and
14839 // Stride, then verify all remaining elements match the sequence.
14840 for (unsigned I = 0; I < NumOps; ++I) {
14842 if (Op->isUndef())
14843 continue;
14844 if (!isa<ConstantSDNode>(Op))
14845 return std::nullopt;
14846
14847 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14848 if (FirstIdx < 0) {
14849 FirstIdx = I;
14850 Start = Val;
14851 } else if (SecondIdx < 0) {
14852 SecondIdx = I;
14853 // Compute stride using modular arithmetic. Simple division would handle
14854 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14855 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14856 // Note that modular arithmetic is agnostic to signed/unsigned.
14857 unsigned IdxDiff = I - FirstIdx;
14858 APInt ValDiff = Val - Start;
14859
14860 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14861 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14862 if (ValDiff.countr_zero() < CommonPow2Bits)
14863 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14864 IdxDiff >>= CommonPow2Bits;
14865 ValDiff.lshrInPlace(CommonPow2Bits);
14866
14867 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14868 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14869 // one, but we could try all candidates to handle more cases.
14870 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14871 if (Stride.isZero())
14872 return std::nullopt;
14873
14874 // Step 3: Adjust Start based on the first defined element's index.
14875 Start -= Stride * FirstIdx;
14876 } else {
14877 // Verify this element matches the sequence.
14878 if (Val != Start + Stride * I)
14879 return std::nullopt;
14880 }
14881 }
14882
14883 // Need at least two defined elements.
14884 if (SecondIdx < 0)
14885 return std::nullopt;
14886
14887 return std::make_pair(Start, Stride);
14888}
14889
14891 // Find the first non-undef value in the shuffle mask.
14892 unsigned i, e;
14893 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14894 /* search */;
14895
14896 // If all elements are undefined, this shuffle can be considered a splat
14897 // (although it should eventually get simplified away completely).
14898 if (i == e)
14899 return true;
14900
14901 // Make sure all remaining elements are either undef or the same as the first
14902 // non-undef value.
14903 for (int Idx = Mask[i]; i != e; ++i)
14904 if (Mask[i] >= 0 && Mask[i] != Idx)
14905 return false;
14906 return true;
14907}
14908
14909// Returns true if it is a constant integer BuildVector or constant integer,
14910// possibly hidden by a bitcast.
14912 SDValue N, bool AllowOpaques) const {
14914
14915 if (auto *C = dyn_cast<ConstantSDNode>(N))
14916 return AllowOpaques || !C->isOpaque();
14917
14919 return true;
14920
14921 // Treat a GlobalAddress supporting constant offset folding as a
14922 // constant integer.
14923 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14924 if (GA->getOpcode() == ISD::GlobalAddress &&
14925 TLI->isOffsetFoldingLegal(GA))
14926 return true;
14927
14928 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14929 isa<ConstantSDNode>(N.getOperand(0)))
14930 return true;
14931 return false;
14932}
14933
14934// Returns true if it is a constant float BuildVector or constant float.
14937 return true;
14938
14940 return true;
14941
14942 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14943 isa<ConstantFPSDNode>(N.getOperand(0)))
14944 return true;
14945
14946 return false;
14947}
14948
14949std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
14950 ConstantSDNode *Const =
14951 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
14952 if (!Const)
14953 return std::nullopt;
14954
14955 EVT VT = N->getValueType(0);
14956 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
14957 switch (TLI->getBooleanContents(N.getValueType())) {
14959 if (CVal.isOne())
14960 return true;
14961 if (CVal.isZero())
14962 return false;
14963 return std::nullopt;
14965 if (CVal.isAllOnes())
14966 return true;
14967 if (CVal.isZero())
14968 return false;
14969 return std::nullopt;
14971 return CVal[0];
14972 }
14973 llvm_unreachable("Unknown BooleanContent enum");
14974}
14975
14976void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
14977 assert(!Node->OperandList && "Node already has operands");
14979 "too many operands to fit into SDNode");
14980 SDUse *Ops = OperandRecycler.allocate(
14981 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
14982
14983 bool IsDivergent = false;
14984 for (unsigned I = 0; I != Vals.size(); ++I) {
14985 Ops[I].setUser(Node);
14986 Ops[I].setInitial(Vals[I]);
14987 EVT VT = Ops[I].getValueType();
14988
14989 // Skip Chain. It does not carry divergence.
14990 if (VT != MVT::Other &&
14991 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
14992 Ops[I].getNode()->isDivergent()) {
14993 IsDivergent = true;
14994 }
14995 }
14996 Node->NumOperands = Vals.size();
14997 Node->OperandList = Ops;
14998 if (!TLI->isSDNodeAlwaysUniform(Node)) {
14999 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
15000 Node->SDNodeBits.IsDivergent = IsDivergent;
15001 }
15002 checkForCycles(Node);
15003}
15004
15007 size_t Limit = SDNode::getMaxNumOperands();
15008 while (Vals.size() > Limit) {
15009 unsigned SliceIdx = Vals.size() - Limit;
15010 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
15011 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
15012 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
15013 Vals.emplace_back(NewTF);
15014 }
15015 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
15016}
15017
15019 EVT VT, SDNodeFlags Flags) {
15020 switch (Opcode) {
15021 default:
15022 return SDValue();
15023 case ISD::ADD:
15024 case ISD::OR:
15025 case ISD::XOR:
15026 case ISD::UMAX:
15027 return getConstant(0, DL, VT);
15028 case ISD::MUL:
15029 return getConstant(1, DL, VT);
15030 case ISD::AND:
15031 case ISD::UMIN:
15032 return getAllOnesConstant(DL, VT);
15033 case ISD::SMAX:
15035 case ISD::SMIN:
15037 case ISD::FADD:
15038 // If flags allow, prefer positive zero since it's generally cheaper
15039 // to materialize on most targets.
15040 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
15041 case ISD::FMUL:
15042 return getConstantFP(1.0, DL, VT);
15043 case ISD::FMINNUM:
15044 case ISD::FMAXNUM: {
15045 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
15046 const fltSemantics &Semantics = VT.getFltSemantics();
15047 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
15048 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
15049 APFloat::getLargest(Semantics);
15050 if (Opcode == ISD::FMAXNUM)
15051 NeutralAF.changeSign();
15052
15053 return getConstantFP(NeutralAF, DL, VT);
15054 }
15055 case ISD::FMINIMUM:
15056 case ISD::FMAXIMUM: {
15057 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
15058 const fltSemantics &Semantics = VT.getFltSemantics();
15059 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
15060 : APFloat::getLargest(Semantics);
15061 if (Opcode == ISD::FMAXIMUM)
15062 NeutralAF.changeSign();
15063
15064 return getConstantFP(NeutralAF, DL, VT);
15065 }
15066
15067 }
15068}
15069
15071 SDValue Acc, SDValue LHS,
15072 SDValue RHS) {
15073 EVT AccVT = Acc.getValueType();
15074 if (AccVT.isFloatingPoint()) {
15075 assert(Opc == ISD::PARTIAL_REDUCE_FMLA && "Unexpected opcode");
15076 SDValue NegRHS = getNode(ISD::FNEG, DL, RHS.getValueType(), RHS);
15077 return getNode(Opc, DL, AccVT, Acc, LHS, NegRHS);
15078 }
15080 "Unexpected opcode");
15081 SDValue NegAcc = getNegative(Acc, DL, AccVT);
15082 SDValue MLA = getNode(Opc, DL, AccVT, NegAcc, LHS, RHS);
15083 return getNegative(MLA, DL, AccVT);
15084}
15085
15086/// Helper used to make a call to a library function that has one argument of
15087/// pointer type.
15088///
15089/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
15090/// used to get or set floating-point state. They have one argument of pointer
15091/// type, which points to the memory region containing bits of the
15092/// floating-point state. The value returned by such function is ignored in the
15093/// created call.
15094///
15095/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
15096/// \param Ptr Pointer used to save/load state.
15097/// \param InChain Ingoing token chain.
15098/// \returns Outgoing chain token.
15100 SDValue InChain,
15101 const SDLoc &DLoc) {
15102 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
15104 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
15105 RTLIB::LibcallImpl LibcallImpl =
15106 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
15107 if (LibcallImpl == RTLIB::Unsupported)
15108 reportFatalUsageError("emitting call to unsupported libcall");
15109
15110 SDValue Callee =
15111 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
15113 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
15114 Libcalls->getLibcallImplCallingConv(LibcallImpl),
15115 Type::getVoidTy(*getContext()), Callee, std::move(Args));
15116 return TLI->LowerCallTo(CLI).second;
15117}
15118
15120 assert(From && To && "Invalid SDNode; empty source SDValue?");
15121 auto I = SDEI.find(From);
15122 if (I == SDEI.end())
15123 return;
15124
15125 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
15126 // the iterator, hence the need to make a copy to prevent a use-after-free.
15127 NodeExtraInfo NEI = I->second;
15128 if (LLVM_LIKELY(!NEI.PCSections)) {
15129 // No deep copy required for the types of extra info set.
15130 //
15131 // FIXME: Investigate if other types of extra info also need deep copy. This
15132 // depends on the types of nodes they can be attached to: if some extra info
15133 // is only ever attached to nodes where a replacement To node is always the
15134 // node where later use and propagation of the extra info has the intended
15135 // semantics, no deep copy is required.
15136 SDEI[To] = std::move(NEI);
15137 return;
15138 }
15139
15140 const SDNode *EntrySDN = getEntryNode().getNode();
15141
15142 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
15143 // through the replacement of From with To. Otherwise, replacements of a node
15144 // (From) with more complex nodes (To and its operands) may result in lost
15145 // extra info where the root node (To) is insignificant in further propagating
15146 // and using extra info when further lowering to MIR.
15147 //
15148 // In the first step pre-populate the visited set with the nodes reachable
15149 // from the old From node. This avoids copying NodeExtraInfo to parts of the
15150 // DAG that is not new and should be left untouched.
15151 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
15152 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
15153 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
15154 if (MaxDepth == 0) {
15155 // Remember this node in case we need to increase MaxDepth and continue
15156 // populating FromReach from this node.
15157 Leafs.emplace_back(N);
15158 return;
15159 }
15160 if (!FromReach.insert(N).second)
15161 return;
15162 for (const SDValue &Op : N->op_values())
15163 Self(Self, Op.getNode(), MaxDepth - 1);
15164 };
15165
15166 // Copy extra info to To and all its transitive operands (that are new).
15168 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
15169 if (FromReach.contains(N))
15170 return true;
15171 if (!Visited.insert(N).second)
15172 return true;
15173 if (EntrySDN == N)
15174 return false;
15175 for (const SDValue &Op : N->op_values()) {
15176 if (N == To && Op.getNode() == EntrySDN) {
15177 // Special case: New node's operand is the entry node; just need to
15178 // copy extra info to new node.
15179 break;
15180 }
15181 if (!Self(Self, Op.getNode()))
15182 return false;
15183 }
15184 // Copy only if entry node was not reached.
15185 SDEI[N] = std::move(NEI);
15186 return true;
15187 };
15188
15189 // We first try with a lower MaxDepth, assuming that the path to common
15190 // operands between From and To is relatively short. This significantly
15191 // improves performance in the common case. The initial MaxDepth is big
15192 // enough to avoid retry in the common case; the last MaxDepth is large
15193 // enough to avoid having to use the fallback below (and protects from
15194 // potential stack exhaustion from recursion).
15195 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
15196 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
15197 // StartFrom is the previous (or initial) set of leafs reachable at the
15198 // previous maximum depth.
15200 std::swap(StartFrom, Leafs);
15201 for (const SDNode *N : StartFrom)
15202 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
15203 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
15204 return;
15205 // This should happen very rarely (reached the entry node).
15206 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
15207 assert(!Leafs.empty());
15208 }
15209
15210 // This should not happen - but if it did, that means the subgraph reachable
15211 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
15212 // could not visit all reachable common operands. Consequently, we were able
15213 // to reach the entry node.
15214 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
15215 assert(false && "From subgraph too complex - increase max. MaxDepth?");
15216 // Best-effort fallback if assertions disabled.
15217 SDEI[To] = std::move(NEI);
15218}
15219
15220#ifndef NDEBUG
15221static void checkForCyclesHelper(const SDNode *N,
15224 const llvm::SelectionDAG *DAG) {
15225 // If this node has already been checked, don't check it again.
15226 if (Checked.count(N))
15227 return;
15228
15229 // If a node has already been visited on this depth-first walk, reject it as
15230 // a cycle.
15231 if (!Visited.insert(N).second) {
15232 errs() << "Detected cycle in SelectionDAG\n";
15233 dbgs() << "Offending node:\n";
15234 N->dumprFull(DAG); dbgs() << "\n";
15235 abort();
15236 }
15237
15238 for (const SDValue &Op : N->op_values())
15239 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
15240
15241 Checked.insert(N);
15242 Visited.erase(N);
15243}
15244#endif
15245
15247 const llvm::SelectionDAG *DAG,
15248 bool force) {
15249#ifndef NDEBUG
15250 bool check = force;
15251#ifdef EXPENSIVE_CHECKS
15252 check = true;
15253#endif // EXPENSIVE_CHECKS
15254 if (check) {
15255 assert(N && "Checking nonexistent SDNode");
15258 checkForCyclesHelper(N, visited, checked, DAG);
15259 }
15260#endif // !NDEBUG
15261}
15262
15263void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
15264 checkForCycles(DAG->getRoot().getNode(), DAG, force);
15265}
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
constexpr LLT S1
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:853
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition Compiler.h:592
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:335
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
static constexpr Value * getValue(Ty &ValueOrUse)
static Value * getOpcode(Value &V, Type &Ty, InstrumentationConfig &IConf, InstrumentorIRBuilderTy &IIRB)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
static bool isConstantSplatVector(SDValue N, APInt &SplatValue, unsigned MinSizeInBits)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static APInt getDemandAllEltsMask(SDValue V)
Construct a DemandedElts mask which demands all elements of V.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align DstAlign, Align SrcAlign, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:334
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static const fltSemantics & BFloat()
Definition APFloat.h:295
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
static const fltSemantics & IEEEdouble()
Definition APFloat.h:297
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:347
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:346
static const fltSemantics & IEEEhalf()
Definition APFloat.h:294
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1179
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1267
void copySign(const APFloat &RHS)
Definition APFloat.h:1361
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5912
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1249
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition APFloat.h:1521
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1240
bool isFinite() const
Definition APFloat.h:1543
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1406
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1258
bool isZero() const
Definition APFloat.h:1534
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1197
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1391
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1157
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1285
bool isPosZero() const
Definition APFloat.h:1549
bool isNegZero() const
Definition APFloat.h:1550
void changeSign()
Definition APFloat.h:1356
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1168
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:2023
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2107
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1616
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1429
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
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:1563
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1414
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1693
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1408
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition APInt.cpp:640
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1076
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1535
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1353
APInt abs() const
Get the absolute value.
Definition APInt.h:1818
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2078
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1709
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1511
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
Definition APInt.cpp:1687
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1419
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1197
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:790
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
bool sle(const APInt &RHS) const
Signed less or equal comparison.
Definition APInt.h:1173
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1662
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1651
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1621
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:652
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2138
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2152
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1084
static bool isSameValue(const APInt &I1, const APInt &I2, bool SignedCompare=false)
Determine if two APInts have the same value, after zero-extending or sign-extending (if SignedCompare...
Definition APInt.h:555
LLVM_ABI APInt rotl(unsigned rotateAmt) const
Rotate left by rotateAmt.
Definition APInt.cpp:1184
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:398
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1458
unsigned logBase2() const
Definition APInt.h:1784
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2088
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1317
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1788
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1028
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1390
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:768
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1264
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1440
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1411
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:483
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2097
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
This is an SDNode representing atomic operations.
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Reset all bits in the bitvector.
Definition BitVector.h:409
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
bool none() const
Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1082
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:124
Implements a dense probed hash-table based set.
Definition DenseSet.h:289
const char * getSymbol() const
This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:208
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
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:1433
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A discriminated union of two or more pointer types, with the discriminator in the low bits of the poi...
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Analysis providing profile information.
void Deallocate(SubClass *E)
Deallocate - Release storage for the pointed-to object.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Keeps track of dbg_value information through SDISel.
LLVM_ABI void add(SDDbgValue *V, bool isParameter)
LLVM_ABI void erase(const SDNode *Node)
Invalidate all DbgValues attached to the node and remove it from the Node-to-DbgValues map.
Holds the information from a dbg_label node through SDISel.
Holds the information for a single machine location through SDISel; either an SDNode,...
static SDDbgOperand fromNode(SDNode *Node, unsigned ResNo)
static SDDbgOperand fromFrameIdx(unsigned FrameIdx)
static SDDbgOperand fromVReg(Register VReg)
static SDDbgOperand fromConst(const Value *Const)
@ SDNODE
Value is the result of an expression.
Holds the information from a dbg_value node through SDISel.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
const DebugLoc & getDebugLoc() const
unsigned getIROrder() const
This class provides iterator support for SDUse operands that use a specific SDNode.
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
const APInt & getAsAPIntVal() const
Helper method returns the APInt value of a ConstantSDNode.
LLVM_ABI void dumprFull(const SelectionDAG *G=nullptr) const
printrFull to dbgs().
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool isDivergent() const
LLVM_ABI bool isOnlyUserOf(const SDNode *N) const
Return true if this node is the only use of N.
iterator_range< value_op_iterator > op_values() const
unsigned getIROrder() const
Return the node ordering.
static constexpr size_t getMaxNumOperands()
Return the maximum number of operands that a SDNode can hold.
iterator_range< use_iterator > uses()
MemSDNodeBitfields MemSDNodeBits
LLVM_ABI void Profile(FoldingSetNodeID &ID) const
Gather unique data for the node.
bool getHasDebugValue() const
SDNodeFlags getFlags() const
void setNodeId(int Id)
Set unique node id.
LLVM_ABI void intersectFlagsWith(const SDNodeFlags Flags)
Clear any flags in this node that aren't also set in Flags.
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
bool use_empty() const
Return true if there are no uses of this node.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
unsigned getNumOperands() const
Return the number of values used by this operation.
const SDValue & getOperand(unsigned Num) const
static LLVM_ABI bool areOnlyUsersOf(ArrayRef< const SDNode * > Nodes, const SDNode *N)
Return true if all the users of N are contained in Nodes.
use_iterator use_begin() const
Provide iteration support to walk over all uses of an SDNode.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if this node is an operand of N.
const APInt & getConstantOperandAPInt(unsigned Num) const
Helper method returns the APInt of a ConstantSDNode operand.
std::optional< APInt > bitcastToAPInt() const
LLVM_ABI bool hasPredecessor(const SDNode *N) const
Return true if N is a predecessor of this node.
LLVM_ABI bool hasAnyUseOfValue(unsigned Value) const
Return true if there are any use of the indicated value.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
bool isUndef() const
Returns true if the node type is UNDEF or POISON.
op_iterator op_end() const
op_iterator op_begin() const
static use_iterator use_end()
LLVM_ABI void DropOperands()
Release the operands and set this node to have zero operands.
SDNode(unsigned Opc, unsigned Order, DebugLoc dl, SDVTList VTs)
Create an SDNode.
Represents a use of a SDNode.
SDNode * getUser()
This returns the SDNode that contains this Use.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node.
LLVM_ABI bool isOperandOf(const SDNode *N) const
Return true if the referenced return value is an operand of N.
SDValue()=default
LLVM_ABI bool reachesChainWithoutSideEffects(SDValue Dest, unsigned Depth=2) const
Return true if this operand (which must be a chain) reaches the specified operand without crossing an...
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
unsigned getOpcode() const
virtual void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI SDValue getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI SDValue getShiftAmountOperand(EVT LHSTy, SDValue Op)
Return the specified value casted to the target's desired shift amount type.
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI std::pair< SDValue, SDValue > getMemccpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue C, SDValue Size, const CallInst *CI)
Lower a memccpy operation into a target library call and return the resulting chain and call result a...
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
LLVM_ABI SDValue getExtLoadVP(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsExpanding=false)
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI SDValue getSplatSourceVector(SDValue V, int &SplatIndex)
If V is a splatted value, return the source vector and its splat index.
LLVM_ABI SDValue getLabelNode(unsigned Opcode, const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI OverflowKind computeOverflowForUnsignedSub(SDValue N0, SDValue N1) const
Determine if the result of the unsigned sub of 2 nodes can overflow.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
const SDValue & getRoot() const
Return the root tag of the SelectionDAG.
LLVM_ABI std::pair< SDValue, SDValue > getStrlen(SDValue Chain, const SDLoc &dl, SDValue Src, const CallInst *CI)
Lower a strlen operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
LLVM_ABI SDValue getAddrSpaceCast(const SDLoc &dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS)
Return an AddrSpaceCastSDNode.
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI std::optional< bool > isBoolConstant(SDValue N) const
Check if a value \op N is a constant using the target's BooleanContent for its type.
LLVM_ABI SDValue getStackArgumentTokenFactor(SDValue Chain)
Compute a TokenFactor to force all the incoming stack arguments to be loaded from the stack.
const TargetSubtargetInfo & getSubtarget() const
LLVM_ABI ConstantRange computeConstantRange(SDValue Op, bool ForSigned, unsigned Depth=0) const
Determine the possible constant range of an integer or vector of integers.
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, MachineModuleInfo &MMI, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
LLVM_ABI 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:645
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h: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:873
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:212
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:185
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3253
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3183
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3170
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3160
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3234
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3175
LLVM_ABI APInt clmul(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, also known as XOR multiplication, and return low-bits.
Definition APInt.cpp:3243
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2297
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3225
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3061
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3258
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2302
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3155
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3165
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:24
LLVM_ABI CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:823
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:538
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:783
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:522
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:857
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:884
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:914
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:997
@ 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:778
@ 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:792
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:848
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:715
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:665
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:877
@ 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:831
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:691
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:800
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:796
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:704
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:769
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:649
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:854
@ 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:815
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:903
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:892
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:982
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:809
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:930
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:505
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:710
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:681
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:791
@ 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:963
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:925
@ 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:949
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:860
@ 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:837
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:875
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:722
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:879
@ 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:751
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool isExtOpcode(unsigned Opcode)
LLVM_ABI bool isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are 0 o...
LLVM_ABI NodeType getUnmaskedBinOpOpcode(unsigned MaskedOpc)
Given a MaskedOpc of ISD::MASKED_(U|S)(DIV|REM), returns the unmasked ISD::(U|S)(DIV|REM).
LLVM_ABI bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isBitwiseLogicOp(unsigned Opcode)
Whether this is bitwise logic opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
LLVM_ABI CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
initializer< Ty > init(const Ty &Val)
@ DW_OP_LLVM_arg
Only used in LLVM metadata.
Definition Dwarf.h:149
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:558
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:1758
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1738
MaybeAlign getAlign(const CallInst &I, unsigned Index)
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1569
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2553
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:315
bool isIntOrFPConstant(SDValue V)
Return true if V is either a integer or FP constant.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:732
LLVM_ABI bool getConstantDataArrayInfo(const Value *V, ConstantDataArraySlice &Slice, unsigned ElementSize, uint64_t Offset=0)
Returns true if the value V is a pointer into a ConstantDataArray.
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
int bit_width(T Value)
Returns the number of bits needed to represent Value if Value is nonzero.
Definition bit.h:325
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1740
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2207
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1551
LLVM_ABI bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition APFloat.h:1652
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:204
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1745
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1695
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:331
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
LLVM_ABI SDValue peekThroughInsertVectorElt(SDValue V, const APInt &DemandedElts)
Recursively peek through INSERT_VECTOR_ELT nodes, returning the source vector operand of V,...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1635
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1726
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1752
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
bool includesPoison(UndefPoisonKind Kind)
Returns true if Kind includes the Poison bit.
Definition UndefPoison.h:27
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
bool includesUndef(UndefPoisonKind Kind)
Returns true if Kind includes the Undef bit.
Definition UndefPoison.h:33
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1676
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
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:1884
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:1946
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:572
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1713
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1753
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:373
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:862
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:783
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:543
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:315
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
LLVM_ABI KnownBits sextInReg(unsigned SrcBitWidth) const
Return known bits for a in-register sign extension of the value we're tracking.
static LLVM_ABI KnownBits mulhu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from zero-extended multiply-hi.
unsigned countMinSignBits() const
Returns the number of times the sign bit is replicated into the other bits.
Definition KnownBits.h:269
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:78
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:125
static LLVM_ABI KnownBits usub_sat(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from llvm.usub.sat(LHS, RHS)
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
static LLVM_ABI KnownBits ashr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for ashr(LHS, RHS).
static LLVM_ABI KnownBits urem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for urem(LHS, RHS).
bool isUnknown() const
Returns true if we don't know any bits.
Definition KnownBits.h:64
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:288
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
void makeNegative()
Make this value negative.
Definition KnownBits.h:120
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:97
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:553
static LLVM_ABI KnownBits fshl(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshl(LHS, RHS, Amt).
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:84
KnownBits reverseBits() const
Definition KnownBits.h:557
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
KnownBits zext(unsigned BitWidth) const
Return known bits for a zero extension of the value we're tracking.
Definition KnownBits.h:176
bool isConstant() const
Returns true if we know the value of all bits.
Definition KnownBits.h:54
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:72
static KnownBits add(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false, bool SelfAdd=false)
Compute knownbits resulting from addition of LHS and RHS.
Definition KnownBits.h:361
static LLVM_ABI KnownBits lshr(const KnownBits &LHS, const KnownBits &RHS, bool ShAmtNonZero=false, bool Exact=false)
Compute known bits for lshr(LHS, RHS).
bool isNonZero() const
Returns true if this value is known to be non-zero.
Definition KnownBits.h:109
static LLVM_ABI KnownBits abdu(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for abdu(LHS, RHS).
KnownBits extractBits(unsigned NumBits, unsigned BitPosition) const
Return a subset of the known bits from [bitPosition,bitPosition+numBits).
Definition KnownBits.h:239
static LLVM_ABI KnownBits avgFloorU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorU.
KnownBits intersectWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for both this and RHS.
Definition KnownBits.h:325
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:184
static LLVM_ABI KnownBits computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, const KnownBits &Borrow)
Compute known bits results from subtracting RHS from LHS with 1-bit Borrow.
KnownBits zextOrTrunc(unsigned BitWidth) const
Return known bits for a zero extension or truncation of the value we're tracking.
Definition KnownBits.h:200
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits fshr(const KnownBits &LHS, const KnownBits &RHS, const APInt &Amt)
Compute known bits for fshr(LHS, RHS, Amt).
static LLVM_ABI KnownBits abds(KnownBits LHS, KnownBits RHS)
Compute known bits for abds(LHS, RHS).
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI KnownBits mulhs(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits from sign-extended multiply-hi.
static LLVM_ABI KnownBits srem(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for srem(LHS, RHS).
static LLVM_ABI KnownBits udiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for udiv(LHS, RHS).
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:112
static LLVM_ABI KnownBits sdiv(const KnownBits &LHS, const KnownBits &RHS, bool Exact=false)
Compute known bits for sdiv(LHS, RHS).
static LLVM_ABI KnownBits avgFloorS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgFloorS.
static bool haveNoCommonBitsSet(const KnownBits &LHS, const KnownBits &RHS)
Return true if LHS and RHS have no common bits set.
Definition KnownBits.h:340
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
LLVM_ABI KnownBits truncSSat(unsigned BitWidth) const
Truncate with signed saturation (signed input -> signed output)
static LLVM_ABI KnownBits computeForAddCarry(const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry)
Compute known bits resulting from adding LHS, RHS and a 1-bit Carry.
Definition KnownBits.cpp:54
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:294
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:233
static LLVM_ABI KnownBits avgCeilU(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilU.
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
KnownBits anyext(unsigned BitWidth) const
Return known bits for an "any" extension of the value we're tracking, where we don't know anything ab...
Definition KnownBits.h:171
static LLVM_ABI KnownBits clmul(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for clmul(LHS, RHS).
LLVM_ABI KnownBits abs(bool IntMinIsPoison=false) const
Compute known bits for the absolute value.
LLVM_ABI KnownBits truncUSat(unsigned BitWidth) const
Truncate with unsigned saturation (unsigned input -> unsigned output)
static LLVM_ABI KnownBits shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW=false, bool NSW=false, bool ShAmtNonZero=false)
Compute known bits for shl(LHS, RHS).
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
LLVM_ABI KnownBits truncSSatU(unsigned BitWidth) const
Truncate with signed saturation to unsigned (signed input -> unsigned output)
static LLVM_ABI KnownBits avgCeilS(const KnownBits &LHS, const KnownBits &RHS)
Compute knownbits resulting from APIntOps::avgCeilS.
const APInt & getConstant() const
Returns the value when all bits have a known value.
Definition KnownBits.h:58
FPClassTest KnownFPClasses
Floating-point classes the value could be one of.
void copysign(const KnownFPClass &Sign)
LLVM_ABI bool isKnownNeverLogicalZero(DenormalMode Mode) const
Return true if it's known this can never be interpreted as a zero.
bool isUnknown() const
KnownFPClass intersectWith(const KnownFPClass &RHS) const
std::optional< bool > SignBit
std::nullopt if the sign bit is unknown, true if the sign bit is definitely set or false if the sign ...
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
static LLVM_ABI KnownFPClass bitcast(const fltSemantics &FltSemantics, const KnownBits &Bits)
Report known values for a bitcast into a float with provided semantics.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)