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"
73#include <algorithm>
74#include <cassert>
75#include <cstdint>
76#include <cstdlib>
77#include <limits>
78#include <optional>
79#include <string>
80#include <utility>
81#include <vector>
82
83using namespace llvm;
84using namespace llvm::SDPatternMatch;
85
86/// makeVTList - Return an instance of the SDVTList struct initialized with the
87/// specified members.
88static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs) {
89 SDVTList Res = {VTs, NumVTs};
90 return Res;
91}
92
93// Default null implementations of the callbacks.
97
98void SelectionDAG::DAGNodeDeletedListener::anchor() {}
99void SelectionDAG::DAGNodeInsertedListener::anchor() {}
100
101#define DEBUG_TYPE "selectiondag"
102
103static cl::opt<bool> EnableMemCpyDAGOpt("enable-memcpy-dag-opt",
104 cl::Hidden, cl::init(true),
105 cl::desc("Gang up loads and stores generated by inlining of memcpy"));
106
107static cl::opt<int> MaxLdStGlue("ldstmemcpy-glue-max",
108 cl::desc("Number limit for gluing ld/st of memcpy."),
109 cl::Hidden, cl::init(0));
110
112 MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
113 cl::desc("DAG combiner limit number of steps when searching DAG "
114 "for predecessor nodes"));
115
117 LLVM_DEBUG(dbgs() << Msg; V.getNode()->dump(G););
118}
119
121
122//===----------------------------------------------------------------------===//
123// ConstantFPSDNode Class
124//===----------------------------------------------------------------------===//
125
126/// isExactlyValue - We don't rely on operator== working on double values, as
127/// it returns true for things that are clearly not equal, like -0.0 and 0.0.
128/// As such, this method can be used to do an exact bit-for-bit comparison of
129/// two floating point values.
131 return getValueAPF().bitwiseIsEqual(V);
132}
133
135 const APFloat& Val) {
136 assert(VT.isFloatingPoint() && "Can only convert between FP types");
137
138 // convert modifies in place, so make a copy.
139 APFloat Val2 = APFloat(Val);
140 bool losesInfo;
142 &losesInfo);
143 return !losesInfo;
144}
145
146//===----------------------------------------------------------------------===//
147// ISD Namespace
148//===----------------------------------------------------------------------===//
149
150bool ISD::isConstantSplatVector(const SDNode *N, APInt &SplatVal) {
151 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
152 if (auto OptAPInt = N->getOperand(0)->bitcastToAPInt()) {
153 unsigned EltSize =
154 N->getValueType(0).getVectorElementType().getSizeInBits();
155 SplatVal = OptAPInt->trunc(EltSize);
156 return true;
157 }
158 }
159
160 auto *BV = dyn_cast<BuildVectorSDNode>(N);
161 if (!BV)
162 return false;
163
164 APInt SplatUndef;
165 unsigned SplatBitSize;
166 bool HasUndefs;
167 unsigned EltSize = N->getValueType(0).getVectorElementType().getSizeInBits();
168 // Endianness does not matter here. We are checking for a splat given the
169 // element size of the vector, and if we find such a splat for little endian
170 // layout, then that should be valid also for big endian (as the full vector
171 // size is known to be a multiple of the element size).
172 const bool IsBigEndian = false;
173 return BV->isConstantSplat(SplatVal, SplatUndef, SplatBitSize, HasUndefs,
174 EltSize, IsBigEndian) &&
175 EltSize == SplatBitSize;
176}
177
178// FIXME: AllOnes and AllZeros duplicate a lot of code. Could these be
179// specializations of the more general isConstantSplatVector()?
180
181bool ISD::isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly) {
182 // Look through a bit convert.
183 while (N->getOpcode() == ISD::BITCAST)
184 N = N->getOperand(0).getNode();
185
186 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
187 APInt SplatVal;
188 return isConstantSplatVector(N, SplatVal) && SplatVal.isAllOnes();
189 }
190
191 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
192
193 unsigned i = 0, e = N->getNumOperands();
194
195 // Skip over all of the undef values.
196 while (i != e && N->getOperand(i).isUndef())
197 ++i;
198
199 // Do not accept an all-undef vector.
200 if (i == e) return false;
201
202 // Do not accept build_vectors that aren't all constants or which have non-~0
203 // elements. We have to be a bit careful here, as the type of the constant
204 // may not be the same as the type of the vector elements due to type
205 // legalization (the elements are promoted to a legal type for the target and
206 // a vector of a type may be legal when the base element type is not).
207 // We only want to check enough bits to cover the vector elements, because
208 // we care if the resultant vector is all ones, not whether the individual
209 // constants are.
210 SDValue NotZero = N->getOperand(i);
211 if (auto OptAPInt = NotZero->bitcastToAPInt()) {
212 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
213 if (OptAPInt->countr_one() < EltSize)
214 return false;
215 } else
216 return false;
217
218 // Okay, we have at least one ~0 value, check to see if the rest match or are
219 // undefs. Even with the above element type twiddling, this should be OK, as
220 // the same type legalization should have applied to all the elements.
221 for (++i; i != e; ++i)
222 if (N->getOperand(i) != NotZero && !N->getOperand(i).isUndef())
223 return false;
224 return true;
225}
226
227bool ISD::isConstantSplatVectorAllZeros(const SDNode *N, bool BuildVectorOnly) {
228 // Look through a bit convert.
229 while (N->getOpcode() == ISD::BITCAST)
230 N = N->getOperand(0).getNode();
231
232 if (!BuildVectorOnly && N->getOpcode() == ISD::SPLAT_VECTOR) {
233 APInt SplatVal;
234 return isConstantSplatVector(N, SplatVal) && SplatVal.isZero();
235 }
236
237 if (N->getOpcode() != ISD::BUILD_VECTOR) return false;
238
239 bool IsAllUndef = true;
240 for (const SDValue &Op : N->op_values()) {
241 if (Op.isUndef())
242 continue;
243 IsAllUndef = false;
244 // Do not accept build_vectors that aren't all constants or which have non-0
245 // elements. We have to be a bit careful here, as the type of the constant
246 // may not be the same as the type of the vector elements due to type
247 // legalization (the elements are promoted to a legal type for the target
248 // and a vector of a type may be legal when the base element type is not).
249 // We only want to check enough bits to cover the vector elements, because
250 // we care if the resultant vector is all zeros, not whether the individual
251 // constants are.
252 if (auto OptAPInt = Op->bitcastToAPInt()) {
253 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
254 if (OptAPInt->countr_zero() < EltSize)
255 return false;
256 } else
257 return false;
258 }
259
260 // Do not accept an all-undef vector.
261 if (IsAllUndef)
262 return false;
263 return true;
264}
265
267 return isConstantSplatVectorAllOnes(N, /*BuildVectorOnly*/ true);
268}
269
271 return isConstantSplatVectorAllZeros(N, /*BuildVectorOnly*/ true);
272}
273
275 if (N->getOpcode() != ISD::BUILD_VECTOR)
276 return false;
277
278 for (const SDValue &Op : N->op_values()) {
279 if (Op.isUndef())
280 continue;
282 return false;
283 }
284 return true;
285}
286
288 if (N->getOpcode() != ISD::BUILD_VECTOR)
289 return false;
290
291 for (const SDValue &Op : N->op_values()) {
292 if (Op.isUndef())
293 continue;
295 return false;
296 }
297 return true;
298}
299
300bool ISD::isVectorShrinkable(const SDNode *N, unsigned NewEltSize,
301 bool Signed) {
302 assert(N->getValueType(0).isVector() && "Expected a vector!");
303
304 unsigned EltSize = N->getValueType(0).getScalarSizeInBits();
305 if (EltSize <= NewEltSize)
306 return false;
307
308 if (N->getOpcode() == ISD::ZERO_EXTEND) {
309 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
310 NewEltSize) &&
311 !Signed;
312 }
313 if (N->getOpcode() == ISD::SIGN_EXTEND) {
314 return (N->getOperand(0).getValueType().getScalarSizeInBits() <=
315 NewEltSize) &&
316 Signed;
317 }
318 if (N->getOpcode() != ISD::BUILD_VECTOR)
319 return false;
320
321 for (const SDValue &Op : N->op_values()) {
322 if (Op.isUndef())
323 continue;
325 return false;
326
327 APInt C = Op->getAsAPIntVal().trunc(EltSize);
328 if (Signed && C.trunc(NewEltSize).sext(EltSize) != C)
329 return false;
330 if (!Signed && C.trunc(NewEltSize).zext(EltSize) != C)
331 return false;
332 }
333
334 return true;
335}
336
338 // Return false if the node has no operands.
339 // This is "logically inconsistent" with the definition of "all" but
340 // is probably the desired behavior.
341 if (N->getNumOperands() == 0)
342 return false;
343 return all_of(N->op_values(), [](SDValue Op) { return Op.isUndef(); });
344}
345
347 return N->getOpcode() == ISD::FREEZE && N->getOperand(0).isUndef();
348}
349
350template <typename ConstNodeType>
352 std::function<bool(ConstNodeType *)> Match,
353 bool AllowUndefs, bool AllowTruncation) {
354 // FIXME: Add support for scalar UNDEF cases?
355 if (auto *C = dyn_cast<ConstNodeType>(Op))
356 return Match(C);
357
358 // FIXME: Add support for vector UNDEF cases?
359 if (ISD::BUILD_VECTOR != Op.getOpcode() &&
360 ISD::SPLAT_VECTOR != Op.getOpcode())
361 return false;
362
363 EVT SVT = Op.getValueType().getScalarType();
364 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
365 if (AllowUndefs && Op.getOperand(i).isUndef()) {
366 if (!Match(nullptr))
367 return false;
368 continue;
369 }
370
371 auto *Cst = dyn_cast<ConstNodeType>(Op.getOperand(i));
372 if (!Cst || (!AllowTruncation && Cst->getValueType(0) != SVT) ||
373 !Match(Cst))
374 return false;
375 }
376 return true;
377}
378// Build used template types.
380 SDValue, std::function<bool(ConstantSDNode *)>, bool, bool);
382 SDValue, std::function<bool(ConstantFPSDNode *)>, bool, bool);
383
385 SDValue LHS, SDValue RHS,
386 std::function<bool(ConstantSDNode *, ConstantSDNode *)> Match,
387 bool AllowUndefs, bool AllowTypeMismatch) {
388 if (!AllowTypeMismatch && LHS.getValueType() != RHS.getValueType())
389 return false;
390
391 // TODO: Add support for scalar UNDEF cases?
392 if (auto *LHSCst = dyn_cast<ConstantSDNode>(LHS))
393 if (auto *RHSCst = dyn_cast<ConstantSDNode>(RHS))
394 return Match(LHSCst, RHSCst);
395
396 // TODO: Add support for vector UNDEF cases?
397 if (LHS.getOpcode() != RHS.getOpcode() ||
398 (LHS.getOpcode() != ISD::BUILD_VECTOR &&
399 LHS.getOpcode() != ISD::SPLAT_VECTOR))
400 return false;
401
402 EVT SVT = LHS.getValueType().getScalarType();
403 for (unsigned i = 0, e = LHS.getNumOperands(); i != e; ++i) {
404 SDValue LHSOp = LHS.getOperand(i);
405 SDValue RHSOp = RHS.getOperand(i);
406 bool LHSUndef = AllowUndefs && LHSOp.isUndef();
407 bool RHSUndef = AllowUndefs && RHSOp.isUndef();
408 auto *LHSCst = dyn_cast<ConstantSDNode>(LHSOp);
409 auto *RHSCst = dyn_cast<ConstantSDNode>(RHSOp);
410 if ((!LHSCst && !LHSUndef) || (!RHSCst && !RHSUndef))
411 return false;
412 if (!AllowTypeMismatch && (LHSOp.getValueType() != SVT ||
413 LHSOp.getValueType() != RHSOp.getValueType()))
414 return false;
415 if (!Match(LHSCst, RHSCst))
416 return false;
417 }
418 return true;
419}
420
422 switch (MinMaxOpc) {
423 default:
424 llvm_unreachable("unrecognized opcode");
425 case ISD::UMIN:
426 return ISD::UMAX;
427 case ISD::UMAX:
428 return ISD::UMIN;
429 case ISD::SMIN:
430 return ISD::SMAX;
431 case ISD::SMAX:
432 return ISD::SMIN;
433 }
434}
435
437 switch (MinMaxOpc) {
438 default:
439 llvm_unreachable("unrecognized min/max opcode");
440 case ISD::SMIN:
441 return ISD::UMIN;
442 case ISD::SMAX:
443 return ISD::UMAX;
444 case ISD::UMIN:
445 return ISD::SMIN;
446 case ISD::UMAX:
447 return ISD::SMAX;
448 }
449}
450
452 switch (VecReduceOpcode) {
453 default:
454 llvm_unreachable("Expected VECREDUCE opcode");
457 case ISD::VP_REDUCE_FADD:
458 case ISD::VP_REDUCE_SEQ_FADD:
459 return ISD::FADD;
462 case ISD::VP_REDUCE_FMUL:
463 case ISD::VP_REDUCE_SEQ_FMUL:
464 return ISD::FMUL;
466 case ISD::VP_REDUCE_ADD:
467 return ISD::ADD;
469 case ISD::VP_REDUCE_MUL:
470 return ISD::MUL;
472 case ISD::VP_REDUCE_AND:
473 return ISD::AND;
475 case ISD::VP_REDUCE_OR:
476 return ISD::OR;
478 case ISD::VP_REDUCE_XOR:
479 return ISD::XOR;
481 case ISD::VP_REDUCE_SMAX:
482 return ISD::SMAX;
484 case ISD::VP_REDUCE_SMIN:
485 return ISD::SMIN;
487 case ISD::VP_REDUCE_UMAX:
488 return ISD::UMAX;
490 case ISD::VP_REDUCE_UMIN:
491 return ISD::UMIN;
493 case ISD::VP_REDUCE_FMAX:
494 return ISD::FMAXNUM;
496 case ISD::VP_REDUCE_FMIN:
497 return ISD::FMINNUM;
499 case ISD::VP_REDUCE_FMAXIMUM:
500 return ISD::FMAXIMUM;
502 case ISD::VP_REDUCE_FMINIMUM:
503 return ISD::FMINIMUM;
504 }
505}
506
507bool ISD::isVPOpcode(unsigned Opcode) {
508 switch (Opcode) {
509 default:
510 return false;
511#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) \
512 case ISD::VPSD: \
513 return true;
514#include "llvm/IR/VPIntrinsics.def"
515 }
516}
517
518bool ISD::isVPBinaryOp(unsigned Opcode) {
519 switch (Opcode) {
520 default:
521 break;
522#define BEGIN_REGISTER_VP_SDNODE(VPSD, ...) case ISD::VPSD:
523#define VP_PROPERTY_BINARYOP return true;
524#define END_REGISTER_VP_SDNODE(VPSD) break;
525#include "llvm/IR/VPIntrinsics.def"
526 }
527 return false;
528}
529
530bool ISD::isVPReduction(unsigned Opcode) {
531 switch (Opcode) {
532 default:
533 return false;
534 case ISD::VP_REDUCE_ADD:
535 case ISD::VP_REDUCE_MUL:
536 case ISD::VP_REDUCE_AND:
537 case ISD::VP_REDUCE_OR:
538 case ISD::VP_REDUCE_XOR:
539 case ISD::VP_REDUCE_SMAX:
540 case ISD::VP_REDUCE_SMIN:
541 case ISD::VP_REDUCE_UMAX:
542 case ISD::VP_REDUCE_UMIN:
543 case ISD::VP_REDUCE_FMAX:
544 case ISD::VP_REDUCE_FMIN:
545 case ISD::VP_REDUCE_FMAXIMUM:
546 case ISD::VP_REDUCE_FMINIMUM:
547 case ISD::VP_REDUCE_FADD:
548 case ISD::VP_REDUCE_FMUL:
549 case ISD::VP_REDUCE_SEQ_FADD:
550 case ISD::VP_REDUCE_SEQ_FMUL:
551 return true;
552 }
553}
554
555/// The operand position of the vector mask.
556std::optional<unsigned> ISD::getVPMaskIdx(unsigned Opcode) {
557 switch (Opcode) {
558 default:
559 return std::nullopt;
560#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, ...) \
561 case ISD::VPSD: \
562 return MASKPOS;
563#include "llvm/IR/VPIntrinsics.def"
564 }
565}
566
567/// The operand position of the explicit vector length parameter.
568std::optional<unsigned> ISD::getVPExplicitVectorLengthIdx(unsigned Opcode) {
569 switch (Opcode) {
570 default:
571 return std::nullopt;
572#define BEGIN_REGISTER_VP_SDNODE(VPSD, LEGALPOS, TDNAME, MASKPOS, EVLPOS) \
573 case ISD::VPSD: \
574 return EVLPOS;
575#include "llvm/IR/VPIntrinsics.def"
576 }
577}
578
579std::optional<unsigned> ISD::getBaseOpcodeForVP(unsigned VPOpcode,
580 bool hasFPExcept) {
581 // FIXME: Return strict opcodes in case of fp exceptions.
582 switch (VPOpcode) {
583 default:
584 return std::nullopt;
585#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) case ISD::VPOPC:
586#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) return ISD::SDOPC;
587#define END_REGISTER_VP_SDNODE(VPOPC) break;
588#include "llvm/IR/VPIntrinsics.def"
589 }
590 return std::nullopt;
591}
592
593std::optional<unsigned> ISD::getVPForBaseOpcode(unsigned Opcode) {
594 switch (Opcode) {
595 default:
596 return std::nullopt;
597#define BEGIN_REGISTER_VP_SDNODE(VPOPC, ...) break;
598#define VP_PROPERTY_FUNCTIONAL_SDOPC(SDOPC) case ISD::SDOPC:
599#define END_REGISTER_VP_SDNODE(VPOPC) return ISD::VPOPC;
600#include "llvm/IR/VPIntrinsics.def"
601 }
602}
603
605 switch (ExtType) {
606 case ISD::EXTLOAD:
607 return IsFP ? ISD::FP_EXTEND : ISD::ANY_EXTEND;
608 case ISD::SEXTLOAD:
609 return ISD::SIGN_EXTEND;
610 case ISD::ZEXTLOAD:
611 return ISD::ZERO_EXTEND;
612 default:
613 break;
614 }
615
616 llvm_unreachable("Invalid LoadExtType");
617}
618
620 // To perform this operation, we just need to swap the L and G bits of the
621 // operation.
622 unsigned OldL = (Operation >> 2) & 1;
623 unsigned OldG = (Operation >> 1) & 1;
624 return ISD::CondCode((Operation & ~6) | // Keep the N, U, E bits
625 (OldL << 1) | // New G bit
626 (OldG << 2)); // New L bit.
627}
628
630 unsigned Operation = Op;
631 if (isIntegerLike)
632 Operation ^= 7; // Flip L, G, E bits, but not U.
633 else
634 Operation ^= 15; // Flip all of the condition bits.
635
637 Operation &= ~8; // Don't let N and U bits get set.
638
639 return ISD::CondCode(Operation);
640}
641
645
647 bool isIntegerLike) {
648 return getSetCCInverseImpl(Op, isIntegerLike);
649}
650
651/// For an integer comparison, return 1 if the comparison is a signed operation
652/// and 2 if the result is an unsigned comparison. Return zero if the operation
653/// does not depend on the sign of the input (setne and seteq).
654static int isSignedOp(ISD::CondCode Opcode) {
655 switch (Opcode) {
656 default: llvm_unreachable("Illegal integer setcc operation!");
657 case ISD::SETEQ:
658 case ISD::SETNE: return 0;
659 case ISD::SETLT:
660 case ISD::SETLE:
661 case ISD::SETGT:
662 case ISD::SETGE: return 1;
663 case ISD::SETULT:
664 case ISD::SETULE:
665 case ISD::SETUGT:
666 case ISD::SETUGE: return 2;
667 }
668}
669
671 EVT Type) {
672 bool IsInteger = Type.isInteger();
673 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
674 // Cannot fold a signed integer setcc with an unsigned integer setcc.
675 return ISD::SETCC_INVALID;
676
677 unsigned Op = Op1 | Op2; // Combine all of the condition bits.
678
679 // If the N and U bits get set, then the resultant comparison DOES suddenly
680 // care about orderedness, and it is true when ordered.
681 if (Op > ISD::SETTRUE2)
682 Op &= ~16; // Clear the U bit if the N bit is set.
683
684 // Canonicalize illegal integer setcc's.
685 if (IsInteger && Op == ISD::SETUNE) // e.g. SETUGT | SETULT
686 Op = ISD::SETNE;
687
688 return ISD::CondCode(Op);
689}
690
692 EVT Type) {
693 bool IsInteger = Type.isInteger();
694 if (IsInteger && (isSignedOp(Op1) | isSignedOp(Op2)) == 3)
695 // Cannot fold a signed setcc with an unsigned setcc.
696 return ISD::SETCC_INVALID;
697
698 // Combine all of the condition bits.
699 ISD::CondCode Result = ISD::CondCode(Op1 & Op2);
700
701 // Canonicalize illegal integer setcc's.
702 if (IsInteger) {
703 switch (Result) {
704 default: break;
705 case ISD::SETUO : Result = ISD::SETFALSE; break; // SETUGT & SETULT
706 case ISD::SETOEQ: // SETEQ & SETU[LG]E
707 case ISD::SETUEQ: Result = ISD::SETEQ ; break; // SETUGE & SETULE
708 case ISD::SETOLT: Result = ISD::SETULT ; break; // SETULT & SETNE
709 case ISD::SETOGT: Result = ISD::SETUGT ; break; // SETUGT & SETNE
710 }
711 }
712
713 return Result;
714}
715
716//===----------------------------------------------------------------------===//
717// SDNode Profile Support
718//===----------------------------------------------------------------------===//
719
720/// AddNodeIDOpcode - Add the node opcode to the NodeID data.
721static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC) {
722 ID.AddInteger(OpC);
723}
724
725/// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
726/// solely with their pointer.
728 ID.AddPointer(VTList.VTs);
729}
730
731/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
734 for (const auto &Op : Ops) {
735 ID.AddPointer(Op.getNode());
736 ID.AddInteger(Op.getResNo());
737 }
738}
739
740/// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
743 for (const auto &Op : Ops) {
744 ID.AddPointer(Op.getNode());
745 ID.AddInteger(Op.getResNo());
746 }
747}
748
749static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC,
750 SDVTList VTList, ArrayRef<SDValue> OpList) {
751 AddNodeIDOpcode(ID, OpC);
752 AddNodeIDValueTypes(ID, VTList);
753 AddNodeIDOperands(ID, OpList);
754}
755
756/// If this is an SDNode with special info, add this info to the NodeID data.
758 switch (N->getOpcode()) {
761 case ISD::MCSymbol:
762 llvm_unreachable("Should only be used on nodes with operands");
763 default: break; // Normal nodes don't need extra info.
765 case ISD::Constant: {
767 ID.AddPointer(C->getConstantIntValue());
768 ID.AddBoolean(C->isOpaque());
769 break;
770 }
772 case ISD::ConstantFP:
773 ID.AddPointer(cast<ConstantFPSDNode>(N)->getConstantFPValue());
774 break;
780 ID.AddPointer(GA->getGlobal());
781 ID.AddInteger(GA->getOffset());
782 ID.AddInteger(GA->getTargetFlags());
783 break;
784 }
785 case ISD::BasicBlock:
787 break;
788 case ISD::Register:
789 ID.AddInteger(cast<RegisterSDNode>(N)->getReg().id());
790 break;
792 ID.AddPointer(cast<RegisterMaskSDNode>(N)->getRegMask());
793 break;
794 case ISD::SRCVALUE:
795 ID.AddPointer(cast<SrcValueSDNode>(N)->getValue());
796 break;
797 case ISD::FrameIndex:
799 ID.AddInteger(cast<FrameIndexSDNode>(N)->getIndex());
800 break;
802 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getGuid());
803 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getIndex());
804 ID.AddInteger(cast<PseudoProbeSDNode>(N)->getAttributes());
805 break;
806 case ISD::JumpTable:
808 ID.AddInteger(cast<JumpTableSDNode>(N)->getIndex());
809 ID.AddInteger(cast<JumpTableSDNode>(N)->getTargetFlags());
810 break;
814 ID.AddInteger(CP->getAlign().value());
815 ID.AddInteger(CP->getOffset());
818 else
819 ID.AddPointer(CP->getConstVal());
820 ID.AddInteger(CP->getTargetFlags());
821 break;
822 }
823 case ISD::TargetIndex: {
825 ID.AddInteger(TI->getIndex());
826 ID.AddInteger(TI->getOffset());
827 ID.AddInteger(TI->getTargetFlags());
828 break;
829 }
830 case ISD::LOAD: {
831 const LoadSDNode *LD = cast<LoadSDNode>(N);
832 ID.AddInteger(LD->getMemoryVT().getRawBits());
833 ID.AddInteger(LD->getRawSubclassData());
834 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
835 ID.AddInteger(LD->getMemOperand()->getFlags());
836 break;
837 }
838 case ISD::STORE: {
839 const StoreSDNode *ST = cast<StoreSDNode>(N);
840 ID.AddInteger(ST->getMemoryVT().getRawBits());
841 ID.AddInteger(ST->getRawSubclassData());
842 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
843 ID.AddInteger(ST->getMemOperand()->getFlags());
844 break;
845 }
846 case ISD::VP_LOAD: {
847 const VPLoadSDNode *ELD = cast<VPLoadSDNode>(N);
848 ID.AddInteger(ELD->getMemoryVT().getRawBits());
849 ID.AddInteger(ELD->getRawSubclassData());
850 ID.AddInteger(ELD->getPointerInfo().getAddrSpace());
851 ID.AddInteger(ELD->getMemOperand()->getFlags());
852 break;
853 }
854 case ISD::VP_LOAD_FF: {
855 const auto *LD = cast<VPLoadFFSDNode>(N);
856 ID.AddInteger(LD->getMemoryVT().getRawBits());
857 ID.AddInteger(LD->getRawSubclassData());
858 ID.AddInteger(LD->getPointerInfo().getAddrSpace());
859 ID.AddInteger(LD->getMemOperand()->getFlags());
860 break;
861 }
862 case ISD::VP_STORE: {
863 const VPStoreSDNode *EST = cast<VPStoreSDNode>(N);
864 ID.AddInteger(EST->getMemoryVT().getRawBits());
865 ID.AddInteger(EST->getRawSubclassData());
866 ID.AddInteger(EST->getPointerInfo().getAddrSpace());
867 ID.AddInteger(EST->getMemOperand()->getFlags());
868 break;
869 }
870 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD: {
872 ID.AddInteger(SLD->getMemoryVT().getRawBits());
873 ID.AddInteger(SLD->getRawSubclassData());
874 ID.AddInteger(SLD->getPointerInfo().getAddrSpace());
875 break;
876 }
877 case ISD::EXPERIMENTAL_VP_STRIDED_STORE: {
879 ID.AddInteger(SST->getMemoryVT().getRawBits());
880 ID.AddInteger(SST->getRawSubclassData());
881 ID.AddInteger(SST->getPointerInfo().getAddrSpace());
882 break;
883 }
884 case ISD::VP_GATHER: {
886 ID.AddInteger(EG->getMemoryVT().getRawBits());
887 ID.AddInteger(EG->getRawSubclassData());
888 ID.AddInteger(EG->getPointerInfo().getAddrSpace());
889 ID.AddInteger(EG->getMemOperand()->getFlags());
890 break;
891 }
892 case ISD::VP_SCATTER: {
894 ID.AddInteger(ES->getMemoryVT().getRawBits());
895 ID.AddInteger(ES->getRawSubclassData());
896 ID.AddInteger(ES->getPointerInfo().getAddrSpace());
897 ID.AddInteger(ES->getMemOperand()->getFlags());
898 break;
899 }
900 case ISD::MLOAD: {
902 ID.AddInteger(MLD->getMemoryVT().getRawBits());
903 ID.AddInteger(MLD->getRawSubclassData());
904 ID.AddInteger(MLD->getPointerInfo().getAddrSpace());
905 ID.AddInteger(MLD->getMemOperand()->getFlags());
906 break;
907 }
908 case ISD::MSTORE: {
910 ID.AddInteger(MST->getMemoryVT().getRawBits());
911 ID.AddInteger(MST->getRawSubclassData());
912 ID.AddInteger(MST->getPointerInfo().getAddrSpace());
913 ID.AddInteger(MST->getMemOperand()->getFlags());
914 break;
915 }
916 case ISD::MGATHER: {
918 ID.AddInteger(MG->getMemoryVT().getRawBits());
919 ID.AddInteger(MG->getRawSubclassData());
920 ID.AddInteger(MG->getPointerInfo().getAddrSpace());
921 ID.AddInteger(MG->getMemOperand()->getFlags());
922 break;
923 }
924 case ISD::MSCATTER: {
926 ID.AddInteger(MS->getMemoryVT().getRawBits());
927 ID.AddInteger(MS->getRawSubclassData());
928 ID.AddInteger(MS->getPointerInfo().getAddrSpace());
929 ID.AddInteger(MS->getMemOperand()->getFlags());
930 break;
931 }
934 case ISD::ATOMIC_SWAP:
946 case ISD::ATOMIC_LOAD:
947 case ISD::ATOMIC_STORE: {
948 const AtomicSDNode *AT = cast<AtomicSDNode>(N);
949 ID.AddInteger(AT->getMemoryVT().getRawBits());
950 ID.AddInteger(AT->getRawSubclassData());
951 ID.AddInteger(AT->getPointerInfo().getAddrSpace());
952 ID.AddInteger(AT->getMemOperand()->getFlags());
953 break;
954 }
955 case ISD::VECTOR_SHUFFLE: {
956 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
957 for (int M : Mask)
958 ID.AddInteger(M);
959 break;
960 }
961 case ISD::ADDRSPACECAST: {
963 ID.AddInteger(ASC->getSrcAddressSpace());
964 ID.AddInteger(ASC->getDestAddressSpace());
965 break;
966 }
968 case ISD::BlockAddress: {
970 ID.AddPointer(BA->getBlockAddress());
971 ID.AddInteger(BA->getOffset());
972 ID.AddInteger(BA->getTargetFlags());
973 break;
974 }
975 case ISD::AssertAlign:
976 ID.AddInteger(cast<AssertAlignSDNode>(N)->getAlign().value());
977 break;
978 case ISD::PREFETCH:
981 // Handled by MemIntrinsicSDNode check after the switch.
982 break;
984 ID.AddPointer(cast<MDNodeSDNode>(N)->getMD());
985 break;
986 } // end switch (N->getOpcode())
987
988 // MemIntrinsic nodes could also have subclass data, address spaces, and flags
989 // to check.
990 if (auto *MN = dyn_cast<MemIntrinsicSDNode>(N)) {
991 ID.AddInteger(MN->getRawSubclassData());
992 ID.AddInteger(MN->getMemoryVT().getRawBits());
993 for (const MachineMemOperand *MMO : MN->memoperands()) {
994 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
995 ID.AddInteger(MMO->getFlags());
996 }
997 }
998}
999
1000/// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
1001/// data.
1003 AddNodeIDOpcode(ID, N->getOpcode());
1004 // Add the return value info.
1005 AddNodeIDValueTypes(ID, N->getVTList());
1006 // Add the operand info.
1007 AddNodeIDOperands(ID, N->ops());
1008
1009 // Handle SDNode leafs with special info.
1011}
1012
1013//===----------------------------------------------------------------------===//
1014// SelectionDAG Class
1015//===----------------------------------------------------------------------===//
1016
1017/// doNotCSE - Return true if CSE should not be performed for this node.
1018static bool doNotCSE(SDNode *N) {
1019 if (N->getValueType(0) == MVT::Glue)
1020 return true; // Never CSE anything that produces a glue result.
1021
1022 switch (N->getOpcode()) {
1023 default: break;
1024 case ISD::HANDLENODE:
1025 case ISD::EH_LABEL:
1026 return true; // Never CSE these nodes.
1027 }
1028
1029 // Check that remaining values produced are not flags.
1030 for (unsigned i = 1, e = N->getNumValues(); i != e; ++i)
1031 if (N->getValueType(i) == MVT::Glue)
1032 return true; // Never CSE anything that produces a glue result.
1033
1034 return false;
1035}
1036
1037/// RemoveDeadNodes - This method deletes all unreachable nodes in the
1038/// SelectionDAG.
1040 // Create a dummy node (which is not added to allnodes), that adds a reference
1041 // to the root node, preventing it from being deleted.
1042 HandleSDNode Dummy(getRoot());
1043
1044 SmallVector<SDNode*, 128> DeadNodes;
1045
1046 // Add all obviously-dead nodes to the DeadNodes worklist.
1047 for (SDNode &Node : allnodes())
1048 if (Node.use_empty())
1049 DeadNodes.push_back(&Node);
1050
1051 RemoveDeadNodes(DeadNodes);
1052
1053 // If the root changed (e.g. it was a dead load, update the root).
1054 setRoot(Dummy.getValue());
1055}
1056
1057/// RemoveDeadNodes - This method deletes the unreachable nodes in the
1058/// given list, and any nodes that become unreachable as a result.
1060
1061 // Process the worklist, deleting the nodes and adding their uses to the
1062 // worklist.
1063 while (!DeadNodes.empty()) {
1064 SDNode *N = DeadNodes.pop_back_val();
1065 // Skip to next node if we've already managed to delete the node. This could
1066 // happen if replacing a node causes a node previously added to the node to
1067 // be deleted.
1068 if (N->getOpcode() == ISD::DELETED_NODE)
1069 continue;
1070
1071 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1072 DUL->NodeDeleted(N, nullptr);
1073
1074 // Take the node out of the appropriate CSE map.
1075 RemoveNodeFromCSEMaps(N);
1076
1077 // Next, brutally remove the operand list. This is safe to do, as there are
1078 // no cycles in the graph.
1079 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
1080 SDUse &Use = *I++;
1081 SDNode *Operand = Use.getNode();
1082 Use.set(SDValue());
1083
1084 // Now that we removed this operand, see if there are no uses of it left.
1085 if (Operand->use_empty())
1086 DeadNodes.push_back(Operand);
1087 }
1088
1089 DeallocateNode(N);
1090 }
1091}
1092
1094 SmallVector<SDNode*, 16> DeadNodes(1, N);
1095
1096 // Create a dummy node that adds a reference to the root node, preventing
1097 // it from being deleted. (This matters if the root is an operand of the
1098 // dead node.)
1099 HandleSDNode Dummy(getRoot());
1100
1101 RemoveDeadNodes(DeadNodes);
1102}
1103
1105 // First take this out of the appropriate CSE map.
1106 RemoveNodeFromCSEMaps(N);
1107
1108 // Finally, remove uses due to operands of this node, remove from the
1109 // AllNodes list, and delete the node.
1110 DeleteNodeNotInCSEMaps(N);
1111}
1112
1113void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
1114 assert(N->getIterator() != AllNodes.begin() &&
1115 "Cannot delete the entry node!");
1116 assert(N->use_empty() && "Cannot delete a node that is not dead!");
1117
1118 // Drop all of the operands and decrement used node's use counts.
1119 N->DropOperands();
1120
1121 DeallocateNode(N);
1122}
1123
1124void SDDbgInfo::add(SDDbgValue *V, bool isParameter) {
1125 assert(!(V->isVariadic() && isParameter));
1126 if (isParameter)
1127 ByvalParmDbgValues.push_back(V);
1128 else
1129 DbgValues.push_back(V);
1130 for (const SDNode *Node : V->getSDNodes())
1131 if (Node)
1132 DbgValMap[Node].push_back(V);
1133}
1134
1136 DbgValMapType::iterator I = DbgValMap.find(Node);
1137 if (I == DbgValMap.end())
1138 return;
1139 for (auto &Val: I->second)
1140 Val->setIsInvalidated();
1141 DbgValMap.erase(I);
1142}
1143
1144void SelectionDAG::DeallocateNode(SDNode *N) {
1145 // If we have operands, deallocate them.
1147
1148 NodeAllocator.Deallocate(AllNodes.remove(N));
1149
1150 // Set the opcode to DELETED_NODE to help catch bugs when node
1151 // memory is reallocated.
1152 // FIXME: There are places in SDag that have grown a dependency on the opcode
1153 // value in the released node.
1154 __asan_unpoison_memory_region(&N->NodeType, sizeof(N->NodeType));
1155 N->NodeType = ISD::DELETED_NODE;
1156
1157 // If any of the SDDbgValue nodes refer to this SDNode, invalidate
1158 // them and forget about that node.
1159 DbgInfo->erase(N);
1160
1161 // Invalidate extra info.
1162 SDEI.erase(N);
1163}
1164
1165#ifndef NDEBUG
1166/// VerifySDNode - Check the given SDNode. Aborts if it is invalid.
1167void SelectionDAG::verifyNode(SDNode *N) const {
1168 switch (N->getOpcode()) {
1169 default:
1170 if (N->isTargetOpcode())
1172 break;
1173 case ISD::BUILD_PAIR: {
1174 EVT VT = N->getValueType(0);
1175 assert(N->getNumValues() == 1 && "Too many results!");
1176 assert(!VT.isVector() && (VT.isInteger() || VT.isFloatingPoint()) &&
1177 "Wrong return type!");
1178 assert(N->getNumOperands() == 2 && "Wrong number of operands!");
1179 assert(N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1180 "Mismatched operand types!");
1181 assert(N->getOperand(0).getValueType().isInteger() == VT.isInteger() &&
1182 "Wrong operand type!");
1183 assert(VT.getSizeInBits() == 2 * N->getOperand(0).getValueSizeInBits() &&
1184 "Wrong return type size");
1185 break;
1186 }
1187 case ISD::BUILD_VECTOR: {
1188 assert(N->getNumValues() == 1 && "Too many results!");
1189 assert(N->getValueType(0).isVector() && "Wrong return type!");
1190 assert(N->getNumOperands() == N->getValueType(0).getVectorNumElements() &&
1191 "Wrong number of operands!");
1192 EVT EltVT = N->getValueType(0).getVectorElementType();
1193 for (const SDUse &Op : N->ops()) {
1194 assert((Op.getValueType() == EltVT ||
1195 (EltVT.isInteger() && Op.getValueType().isInteger() &&
1196 EltVT.bitsLE(Op.getValueType()))) &&
1197 "Wrong operand type!");
1198 assert(Op.getValueType() == N->getOperand(0).getValueType() &&
1199 "Operands must all have the same type");
1200 }
1201 break;
1202 }
1203 case ISD::SADDO:
1204 case ISD::UADDO:
1205 case ISD::SSUBO:
1206 case ISD::USUBO:
1207 assert(N->getNumValues() == 2 && "Wrong number of results!");
1208 assert(N->getVTList().NumVTs == 2 && N->getNumOperands() == 2 &&
1209 "Invalid add/sub overflow op!");
1210 assert(N->getVTList().VTs[0].isInteger() &&
1211 N->getVTList().VTs[1].isInteger() &&
1212 N->getOperand(0).getValueType() == N->getOperand(1).getValueType() &&
1213 N->getOperand(0).getValueType() == N->getVTList().VTs[0] &&
1214 "Binary operator types must match!");
1215 break;
1216 }
1217}
1218#endif // NDEBUG
1219
1220/// Insert a newly allocated node into the DAG.
1221///
1222/// Handles insertion into the all nodes list and CSE map, as well as
1223/// verification and other common operations when a new node is allocated.
1224void SelectionDAG::InsertNode(SDNode *N) {
1225 AllNodes.push_back(N);
1226#ifndef NDEBUG
1227 N->PersistentId = NextPersistentId++;
1228 verifyNode(N);
1229#endif
1230 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1231 DUL->NodeInserted(N);
1232}
1233
1234/// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
1235/// correspond to it. This is useful when we're about to delete or repurpose
1236/// the node. We don't want future request for structurally identical nodes
1237/// to return N anymore.
1238bool SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
1239 bool Erased = false;
1240 switch (N->getOpcode()) {
1241 case ISD::HANDLENODE: return false; // noop.
1242 case ISD::CONDCODE:
1243 assert(CondCodeNodes[cast<CondCodeSDNode>(N)->get()] &&
1244 "Cond code doesn't exist!");
1245 Erased = CondCodeNodes[cast<CondCodeSDNode>(N)->get()] != nullptr;
1246 CondCodeNodes[cast<CondCodeSDNode>(N)->get()] = nullptr;
1247 break;
1249 Erased = ExternalSymbols.erase(cast<ExternalSymbolSDNode>(N)->getSymbol());
1250 break;
1252 ExternalSymbolSDNode *ESN = cast<ExternalSymbolSDNode>(N);
1253 Erased = TargetExternalSymbols.erase(std::pair<std::string, unsigned>(
1254 ESN->getSymbol(), ESN->getTargetFlags()));
1255 break;
1256 }
1257 case ISD::MCSymbol: {
1258 auto *MCSN = cast<MCSymbolSDNode>(N);
1259 Erased = MCSymbols.erase(MCSN->getMCSymbol());
1260 break;
1261 }
1262 case ISD::VALUETYPE: {
1263 EVT VT = cast<VTSDNode>(N)->getVT();
1264 if (VT.isExtended()) {
1265 Erased = ExtendedValueTypeNodes.erase(VT);
1266 } else {
1267 Erased = ValueTypeNodes[VT.getSimpleVT().SimpleTy] != nullptr;
1268 ValueTypeNodes[VT.getSimpleVT().SimpleTy] = nullptr;
1269 }
1270 break;
1271 }
1272 default:
1273 // Remove it from the CSE Map.
1274 assert(N->getOpcode() != ISD::DELETED_NODE && "DELETED_NODE in CSEMap!");
1275 assert(N->getOpcode() != ISD::EntryToken && "EntryToken in CSEMap!");
1276 Erased = CSEMap.RemoveNode(N);
1277 break;
1278 }
1279#ifndef NDEBUG
1280 // Verify that the node was actually in one of the CSE maps, unless it has a
1281 // glue result (which cannot be CSE'd) or is one of the special cases that are
1282 // not subject to CSE.
1283 if (!Erased && N->getValueType(N->getNumValues()-1) != MVT::Glue &&
1284 !N->isMachineOpcode() && !doNotCSE(N)) {
1285 N->dump(this);
1286 dbgs() << "\n";
1287 llvm_unreachable("Node is not in map!");
1288 }
1289#endif
1290 return Erased;
1291}
1292
1293/// AddModifiedNodeToCSEMaps - The specified node has been removed from the CSE
1294/// maps and modified in place. Add it back to the CSE maps, unless an identical
1295/// node already exists, in which case transfer all its users to the existing
1296/// node. This transfer can potentially trigger recursive merging.
1297void
1298SelectionDAG::AddModifiedNodeToCSEMaps(SDNode *N) {
1299 // For node types that aren't CSE'd, just act as if no identical node
1300 // already exists.
1301 if (!doNotCSE(N)) {
1302 SDNode *Existing = CSEMap.GetOrInsertNode(N);
1303 if (Existing != N) {
1304 // If there was already an existing matching node, use ReplaceAllUsesWith
1305 // to replace the dead one with the existing one. This can cause
1306 // recursive merging of other unrelated nodes down the line.
1307 Existing->intersectFlagsWith(N->getFlags());
1308 if (auto *MemNode = dyn_cast<MemSDNode>(Existing))
1309 MemNode->refineRanges(cast<MemSDNode>(N)->memoperands());
1310 ReplaceAllUsesWith(N, Existing);
1311
1312 // N is now dead. Inform the listeners and delete it.
1313 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1314 DUL->NodeDeleted(N, Existing);
1315 DeleteNodeNotInCSEMaps(N);
1316 return;
1317 }
1318 }
1319
1320 // If the node doesn't already exist, we updated it. Inform listeners.
1321 for (DAGUpdateListener *DUL = UpdateListeners; DUL; DUL = DUL->Next)
1322 DUL->NodeUpdated(N);
1323}
1324
1325/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1326/// were replaced with those specified. If this node is never memoized,
1327/// return null, otherwise return a pointer to the slot it would take. If a
1328/// node already exists with these operands, the slot will be non-null.
1329SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, SDValue Op,
1330 void *&InsertPos) {
1331 if (doNotCSE(N))
1332 return nullptr;
1333
1334 SDValue Ops[] = { Op };
1335 FoldingSetNodeID ID;
1336 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1338 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1339 if (Node)
1340 Node->intersectFlagsWith(N->getFlags());
1341 return Node;
1342}
1343
1344/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1345/// were replaced with those specified. If this node is never memoized,
1346/// return null, otherwise return a pointer to the slot it would take. If a
1347/// node already exists with these operands, the slot will be non-null.
1348SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N,
1349 SDValue Op1, SDValue Op2,
1350 void *&InsertPos) {
1351 if (doNotCSE(N))
1352 return nullptr;
1353
1354 SDValue Ops[] = { Op1, Op2 };
1355 FoldingSetNodeID ID;
1356 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1358 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1359 if (Node)
1360 Node->intersectFlagsWith(N->getFlags());
1361 return Node;
1362}
1363
1364/// FindModifiedNodeSlot - Find a slot for the specified node if its operands
1365/// were replaced with those specified. If this node is never memoized,
1366/// return null, otherwise return a pointer to the slot it would take. If a
1367/// node already exists with these operands, the slot will be non-null.
1368SDNode *SelectionDAG::FindModifiedNodeSlot(SDNode *N, ArrayRef<SDValue> Ops,
1369 void *&InsertPos) {
1370 if (doNotCSE(N))
1371 return nullptr;
1372
1373 FoldingSetNodeID ID;
1374 AddNodeIDNode(ID, N->getOpcode(), N->getVTList(), Ops);
1376 SDNode *Node = FindNodeOrInsertPos(ID, SDLoc(N), InsertPos);
1377 if (Node)
1378 Node->intersectFlagsWith(N->getFlags());
1379 return Node;
1380}
1381
1383 Type *Ty = VT == MVT::iPTR ? PointerType::get(*getContext(), 0)
1384 : VT.getTypeForEVT(*getContext());
1385
1386 return getDataLayout().getABITypeAlign(Ty);
1387}
1388
1389// EntryNode could meaningfully have debug info if we can find it...
1391 : TM(tm), OptLevel(OL), EntryNode(ISD::EntryToken, 0, DebugLoc(),
1392 getVTList(MVT::Other, MVT::Glue)),
1393 Root(getEntryNode()) {
1394 InsertNode(&EntryNode);
1395 DbgInfo = new SDDbgInfo();
1396}
1397
1399 OptimizationRemarkEmitter &NewORE, Pass *PassPtr,
1400 const TargetLibraryInfo *LibraryInfo,
1401 const LibcallLoweringInfo *LibcallsInfo,
1402 UniformityInfo *NewUA, ProfileSummaryInfo *PSIin,
1404 FunctionVarLocs const *VarLocs) {
1405 MF = &NewMF;
1406 SDAGISelPass = PassPtr;
1407 ORE = &NewORE;
1410 LibInfo = LibraryInfo;
1411 Libcalls = LibcallsInfo;
1412 Context = &MF->getFunction().getContext();
1413 UA = NewUA;
1414 PSI = PSIin;
1415 BFI = BFIin;
1416 MMI = &MMIin;
1417 FnVarLocs = VarLocs;
1418}
1419
1421 assert(!UpdateListeners && "Dangling registered DAGUpdateListeners");
1422 allnodes_clear();
1423 OperandRecycler.clear(OperandAllocator);
1424 delete DbgInfo;
1425}
1426
1428 return llvm::shouldOptimizeForSize(FLI->MBB->getBasicBlock(), PSI, BFI);
1429}
1430
1431void SelectionDAG::allnodes_clear() {
1432 assert(&*AllNodes.begin() == &EntryNode);
1433 AllNodes.remove(AllNodes.begin());
1434 while (!AllNodes.empty())
1435 DeallocateNode(&AllNodes.front());
1436#ifndef NDEBUG
1437 NextPersistentId = 0;
1438#endif
1439}
1440
1441SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1442 void *&InsertPos) {
1443 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1444 if (N) {
1445 switch (N->getOpcode()) {
1446 default: break;
1447 case ISD::Constant:
1448 case ISD::ConstantFP:
1449 llvm_unreachable("Querying for Constant and ConstantFP nodes requires "
1450 "debug location. Use another overload.");
1451 }
1452 }
1453 return N;
1454}
1455
1456SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
1457 const SDLoc &DL, void *&InsertPos) {
1458 SDNode *N = CSEMap.FindNodeOrInsertPos(ID, InsertPos);
1459 if (N) {
1460 switch (N->getOpcode()) {
1461 case ISD::Constant:
1462 case ISD::ConstantFP:
1463 // Erase debug location from the node if the node is used at several
1464 // different places. Do not propagate one location to all uses as it
1465 // will cause a worse single stepping debugging experience.
1466 if (N->getDebugLoc() != DL.getDebugLoc())
1467 N->setDebugLoc(DebugLoc());
1468 break;
1469 default:
1470 // When the node's point of use is located earlier in the instruction
1471 // sequence than its prior point of use, update its debug info to the
1472 // earlier location.
1473 if (DL.getIROrder() && DL.getIROrder() < N->getIROrder())
1474 N->setDebugLoc(DL.getDebugLoc());
1475 break;
1476 }
1477 }
1478 return N;
1479}
1480
1482 allnodes_clear();
1483 OperandRecycler.clear(OperandAllocator);
1484 OperandAllocator.Reset();
1485 CSEMap.clear();
1486
1487 ExtendedValueTypeNodes.clear();
1488 ExternalSymbols.clear();
1489 TargetExternalSymbols.clear();
1490 MCSymbols.clear();
1491 SDEI.clear();
1492 llvm::fill(CondCodeNodes, nullptr);
1493 llvm::fill(ValueTypeNodes, nullptr);
1494
1495 EntryNode.UseList = nullptr;
1496 InsertNode(&EntryNode);
1497 Root = getEntryNode();
1498 DbgInfo->clear();
1499}
1500
1502 return VT.bitsGT(Op.getValueType())
1503 ? getNode(ISD::FP_EXTEND, DL, VT, Op)
1504 : getNode(ISD::FP_ROUND, DL, VT, Op,
1505 getIntPtrConstant(0, DL, /*isTarget=*/true));
1506}
1507
1508std::pair<SDValue, SDValue>
1510 const SDLoc &DL, EVT VT) {
1511 assert(!VT.bitsEq(Op.getValueType()) &&
1512 "Strict no-op FP extend/round not allowed.");
1513 SDValue Res =
1514 VT.bitsGT(Op.getValueType())
1515 ? getNode(ISD::STRICT_FP_EXTEND, DL, {VT, MVT::Other}, {Chain, Op})
1516 : getNode(ISD::STRICT_FP_ROUND, DL, {VT, MVT::Other},
1517 {Chain, Op, getIntPtrConstant(0, DL, /*isTarget=*/true)});
1518
1519 return std::pair<SDValue, SDValue>(Res, SDValue(Res.getNode(), 1));
1520}
1521
1523 return VT.bitsGT(Op.getValueType()) ?
1524 getNode(ISD::ANY_EXTEND, DL, VT, Op) :
1525 getNode(ISD::TRUNCATE, DL, VT, Op);
1526}
1527
1529 return VT.bitsGT(Op.getValueType()) ?
1530 getNode(ISD::SIGN_EXTEND, DL, VT, Op) :
1531 getNode(ISD::TRUNCATE, DL, VT, Op);
1532}
1533
1535 return VT.bitsGT(Op.getValueType()) ?
1536 getNode(ISD::ZERO_EXTEND, DL, VT, Op) :
1537 getNode(ISD::TRUNCATE, DL, VT, Op);
1538}
1539
1541 EVT VT) {
1542 assert(!VT.isVector());
1543 auto Type = Op.getValueType();
1544 SDValue DestOp;
1545 if (Type == VT)
1546 return Op;
1547 auto Size = Op.getValueSizeInBits();
1548 DestOp = getBitcast(EVT::getIntegerVT(*Context, Size), Op);
1549 if (DestOp.getValueType() == VT)
1550 return DestOp;
1551
1552 return getAnyExtOrTrunc(DestOp, DL, VT);
1553}
1554
1556 EVT VT) {
1557 assert(!VT.isVector());
1558 auto Type = Op.getValueType();
1559 SDValue DestOp;
1560 if (Type == VT)
1561 return Op;
1562 auto Size = Op.getValueSizeInBits();
1563 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1564 if (DestOp.getValueType() == VT)
1565 return DestOp;
1566
1567 return getSExtOrTrunc(DestOp, DL, VT);
1568}
1569
1571 EVT VT) {
1572 assert(!VT.isVector());
1573 auto Type = Op.getValueType();
1574 SDValue DestOp;
1575 if (Type == VT)
1576 return Op;
1577 auto Size = Op.getValueSizeInBits();
1578 DestOp = getBitcast(MVT::getIntegerVT(Size), Op);
1579 if (DestOp.getValueType() == VT)
1580 return DestOp;
1581
1582 return getZExtOrTrunc(DestOp, DL, VT);
1583}
1584
1586 EVT OpVT) {
1587 if (VT.bitsLE(Op.getValueType()))
1588 return getNode(ISD::TRUNCATE, SL, VT, Op);
1589
1590 TargetLowering::BooleanContent BType = TLI->getBooleanContents(OpVT);
1591 return getNode(TLI->getExtendForContent(BType), SL, VT, Op);
1592}
1593
1595 EVT OpVT = Op.getValueType();
1596 assert(VT.isInteger() && OpVT.isInteger() &&
1597 "Cannot getZeroExtendInReg FP types");
1598 assert(VT.isVector() == OpVT.isVector() &&
1599 "getZeroExtendInReg type should be vector iff the operand "
1600 "type is vector!");
1601 assert((!VT.isVector() ||
1603 "Vector element counts must match in getZeroExtendInReg");
1604 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1605 if (OpVT == VT)
1606 return Op;
1607 // TODO: Use computeKnownBits instead of AssertZext.
1608 if (Op.getOpcode() == ISD::AssertZext && cast<VTSDNode>(Op.getOperand(1))
1609 ->getVT()
1610 .getScalarType()
1611 .bitsLE(VT.getScalarType()))
1612 return Op;
1614 VT.getScalarSizeInBits());
1615 return getNode(ISD::AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT));
1616}
1617
1619 SDValue EVL, const SDLoc &DL,
1620 EVT VT) {
1621 EVT OpVT = Op.getValueType();
1622 assert(VT.isInteger() && OpVT.isInteger() &&
1623 "Cannot getVPZeroExtendInReg FP types");
1624 assert(VT.isVector() && OpVT.isVector() &&
1625 "getVPZeroExtendInReg type and operand type should be vector!");
1627 "Vector element counts must match in getZeroExtendInReg");
1628 assert(VT.getScalarType().bitsLE(OpVT.getScalarType()) && "Not extending!");
1629 if (OpVT == VT)
1630 return Op;
1632 VT.getScalarSizeInBits());
1633 return getNode(ISD::VP_AND, DL, OpVT, Op, getConstant(Imm, DL, OpVT), Mask,
1634 EVL);
1635}
1636
1638 // Only unsigned pointer semantics are supported right now. In the future this
1639 // might delegate to TLI to check pointer signedness.
1640 return getZExtOrTrunc(Op, DL, VT);
1641}
1642
1644 // Only unsigned pointer semantics are supported right now. In the future this
1645 // might delegate to TLI to check pointer signedness.
1646 return getZeroExtendInReg(Op, DL, VT);
1647}
1648
1650 return getNode(ISD::SUB, DL, VT, getConstant(0, DL, VT), Val);
1651}
1652
1653/// getNOT - Create a bitwise NOT operation as (XOR Val, -1).
1655 return getNode(ISD::XOR, DL, VT, Val, getAllOnesConstant(DL, VT));
1656}
1657
1659 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1660 return getNode(ISD::XOR, DL, VT, Val, TrueValue);
1661}
1662
1664 SDValue Mask, SDValue EVL, EVT VT) {
1665 SDValue TrueValue = getBoolConstant(true, DL, VT, VT);
1666 return getNode(ISD::VP_XOR, DL, VT, Val, TrueValue, Mask, EVL);
1667}
1668
1670 SDValue Mask, SDValue EVL) {
1671 return getVPZExtOrTrunc(DL, VT, Op, Mask, EVL);
1672}
1673
1675 SDValue Mask, SDValue EVL) {
1676 if (VT.bitsGT(Op.getValueType()))
1677 return getNode(ISD::VP_ZERO_EXTEND, DL, VT, Op, Mask, EVL);
1678 if (VT.bitsLT(Op.getValueType()))
1679 return getNode(ISD::VP_TRUNCATE, DL, VT, Op, Mask, EVL);
1680 return Op;
1681}
1682
1684 EVT OpVT) {
1685 if (!V)
1686 return getConstant(0, DL, VT);
1687
1688 switch (TLI->getBooleanContents(OpVT)) {
1691 return getConstant(1, DL, VT);
1693 return getAllOnesConstant(DL, VT);
1694 }
1695 llvm_unreachable("Unexpected boolean content enum!");
1696}
1697
1699 bool isT, bool isO) {
1700 return getConstant(APInt(VT.getScalarSizeInBits(), Val, /*isSigned=*/false),
1701 DL, VT, isT, isO);
1702}
1703
1705 bool isT, bool isO) {
1706 return getConstant(*ConstantInt::get(*Context, Val), DL, VT, isT, isO);
1707}
1708
1710 EVT VT, bool isT, bool isO) {
1711 assert(VT.isInteger() && "Cannot create FP integer constant!");
1712
1713 EVT EltVT = VT.getScalarType();
1714 const ConstantInt *Elt = &Val;
1715
1716 // Vector splats are explicit within the DAG, with ConstantSDNode holding the
1717 // to-be-splatted scalar ConstantInt.
1718 if (isa<VectorType>(Elt->getType()))
1719 Elt = ConstantInt::get(*getContext(), Elt->getValue());
1720
1721 // In some cases the vector type is legal but the element type is illegal and
1722 // needs to be promoted, for example v8i8 on ARM. In this case, promote the
1723 // inserted value (the type does not need to match the vector element type).
1724 // Any extra bits introduced will be truncated away.
1725 if (VT.isVector() && TLI->getTypeAction(*getContext(), EltVT) ==
1727 EltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1728 APInt NewVal;
1729 if (TLI->isSExtCheaperThanZExt(VT.getScalarType(), EltVT))
1730 NewVal = Elt->getValue().sextOrTrunc(EltVT.getSizeInBits());
1731 else
1732 NewVal = Elt->getValue().zextOrTrunc(EltVT.getSizeInBits());
1733 Elt = ConstantInt::get(*getContext(), NewVal);
1734 }
1735 // In other cases the element type is illegal and needs to be expanded, for
1736 // example v2i64 on MIPS32. In this case, find the nearest legal type, split
1737 // the value into n parts and use a vector type with n-times the elements.
1738 // Then bitcast to the type requested.
1739 // Legalizing constants too early makes the DAGCombiner's job harder so we
1740 // only legalize if the DAG tells us we must produce legal types.
1741 else if (NewNodesMustHaveLegalTypes && VT.isVector() &&
1742 TLI->getTypeAction(*getContext(), EltVT) ==
1744 const APInt &NewVal = Elt->getValue();
1745 EVT ViaEltVT = TLI->getTypeToTransformTo(*getContext(), EltVT);
1746 unsigned ViaEltSizeInBits = ViaEltVT.getSizeInBits();
1747
1748 // For scalable vectors, try to use a SPLAT_VECTOR_PARTS node.
1749 if (VT.isScalableVector() ||
1750 TLI->isOperationLegal(ISD::SPLAT_VECTOR, VT)) {
1751 assert(EltVT.getSizeInBits() % ViaEltSizeInBits == 0 &&
1752 "Can only handle an even split!");
1753 unsigned Parts = EltVT.getSizeInBits() / ViaEltSizeInBits;
1754
1755 SmallVector<SDValue, 2> ScalarParts;
1756 for (unsigned i = 0; i != Parts; ++i)
1757 ScalarParts.push_back(getConstant(
1758 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1759 ViaEltVT, isT, isO));
1760
1761 return getNode(ISD::SPLAT_VECTOR_PARTS, DL, VT, ScalarParts);
1762 }
1763
1764 unsigned ViaVecNumElts = VT.getSizeInBits() / ViaEltSizeInBits;
1765 EVT ViaVecVT = EVT::getVectorVT(*getContext(), ViaEltVT, ViaVecNumElts);
1766
1767 // Check the temporary vector is the correct size. If this fails then
1768 // getTypeToTransformTo() probably returned a type whose size (in bits)
1769 // isn't a power-of-2 factor of the requested type size.
1770 assert(ViaVecVT.getSizeInBits() == VT.getSizeInBits());
1771
1772 SmallVector<SDValue, 2> EltParts;
1773 for (unsigned i = 0; i < ViaVecNumElts / VT.getVectorNumElements(); ++i)
1774 EltParts.push_back(getConstant(
1775 NewVal.extractBits(ViaEltSizeInBits, i * ViaEltSizeInBits), DL,
1776 ViaEltVT, isT, isO));
1777
1778 // EltParts is currently in little endian order. If we actually want
1779 // big-endian order then reverse it now.
1780 if (getDataLayout().isBigEndian())
1781 std::reverse(EltParts.begin(), EltParts.end());
1782
1783 // The elements must be reversed when the element order is different
1784 // to the endianness of the elements (because the BITCAST is itself a
1785 // vector shuffle in this situation). However, we do not need any code to
1786 // perform this reversal because getConstant() is producing a vector
1787 // splat.
1788 // This situation occurs in MIPS MSA.
1789
1791 for (unsigned i = 0, e = VT.getVectorNumElements(); i != e; ++i)
1792 llvm::append_range(Ops, EltParts);
1793
1794 SDValue V =
1795 getNode(ISD::BITCAST, DL, VT, getBuildVector(ViaVecVT, DL, Ops));
1796 return V;
1797 }
1798
1799 assert(Elt->getBitWidth() == EltVT.getSizeInBits() &&
1800 "APInt size does not match type size!");
1801 unsigned Opc = isT ? ISD::TargetConstant : ISD::Constant;
1802 SDVTList VTs = getVTList(EltVT);
1804 AddNodeIDNode(ID, Opc, VTs, {});
1805 ID.AddPointer(Elt);
1806 ID.AddBoolean(isO);
1807 void *IP = nullptr;
1808 SDNode *N = nullptr;
1809 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1810 if (!VT.isVector())
1811 return SDValue(N, 0);
1812
1813 if (!N) {
1814 N = newSDNode<ConstantSDNode>(isT, isO, Elt, VTs);
1815 CSEMap.InsertNode(N, IP);
1816 InsertNode(N);
1817 NewSDValueDbgMsg(SDValue(N, 0), "Creating constant: ", this);
1818 }
1819
1820 SDValue Result(N, 0);
1821 if (VT.isVector())
1822 Result = getSplat(VT, DL, Result);
1823 return Result;
1824}
1825
1827 bool isT, bool isO) {
1828 unsigned Size = VT.getScalarSizeInBits();
1829 return getConstant(APInt(Size, Val, /*isSigned=*/true), DL, VT, isT, isO);
1830}
1831
1833 bool IsOpaque) {
1835 IsTarget, IsOpaque);
1836}
1837
1839 bool isTarget) {
1840 return getConstant(Val, DL, TLI->getPointerTy(getDataLayout()), isTarget);
1841}
1842
1844 const SDLoc &DL) {
1845 assert(VT.isInteger() && "Shift amount is not an integer type!");
1846 EVT ShiftVT = TLI->getShiftAmountTy(VT, getDataLayout());
1847 return getConstant(Val, DL, ShiftVT);
1848}
1849
1851 const SDLoc &DL) {
1852 assert(Val.ult(VT.getScalarSizeInBits()) && "Out of range shift");
1853 return getShiftAmountConstant(Val.getZExtValue(), VT, DL);
1854}
1855
1857 bool isTarget) {
1858 return getConstant(Val, DL, TLI->getVectorIdxTy(getDataLayout()), isTarget);
1859}
1860
1862 bool isTarget) {
1863 return getConstantFP(*ConstantFP::get(*getContext(), V), DL, VT, isTarget);
1864}
1865
1867 EVT VT, bool isTarget) {
1868 assert(VT.isFloatingPoint() && "Cannot create integer FP constant!");
1869
1870 EVT EltVT = VT.getScalarType();
1871 const ConstantFP *Elt = &V;
1872
1873 // Vector splats are explicit within the DAG, with ConstantFPSDNode holding
1874 // the to-be-splatted scalar ConstantFP.
1875 if (isa<VectorType>(Elt->getType()))
1876 Elt = ConstantFP::get(*getContext(), Elt->getValue());
1877
1878 // Do the map lookup using the actual bit pattern for the floating point
1879 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
1880 // we don't have issues with SNANs.
1881 unsigned Opc = isTarget ? ISD::TargetConstantFP : ISD::ConstantFP;
1882 SDVTList VTs = getVTList(EltVT);
1884 AddNodeIDNode(ID, Opc, VTs, {});
1885 ID.AddPointer(Elt);
1886 void *IP = nullptr;
1887 SDNode *N = nullptr;
1888 if ((N = FindNodeOrInsertPos(ID, DL, IP)))
1889 if (!VT.isVector())
1890 return SDValue(N, 0);
1891
1892 if (!N) {
1893 N = newSDNode<ConstantFPSDNode>(isTarget, Elt, VTs);
1894 CSEMap.InsertNode(N, IP);
1895 InsertNode(N);
1896 }
1897
1898 SDValue Result(N, 0);
1899 if (VT.isVector())
1900 Result = getSplat(VT, DL, Result);
1901 NewSDValueDbgMsg(Result, "Creating fp constant: ", this);
1902 return Result;
1903}
1904
1906 bool isTarget) {
1907 EVT EltVT = VT.getScalarType();
1908 if (EltVT == MVT::f32)
1909 return getConstantFP(APFloat((float)Val), DL, VT, isTarget);
1910 if (EltVT == MVT::f64)
1911 return getConstantFP(APFloat(Val), DL, VT, isTarget);
1912 if (EltVT == MVT::f80 || EltVT == MVT::f128 || EltVT == MVT::ppcf128 ||
1913 EltVT == MVT::f16 || EltVT == MVT::bf16) {
1914 bool Ignored;
1915 APFloat APF = APFloat(Val);
1917 &Ignored);
1918 return getConstantFP(APF, DL, VT, isTarget);
1919 }
1920 llvm_unreachable("Unsupported type in getConstantFP");
1921}
1922
1924 EVT VT, int64_t Offset, bool isTargetGA,
1925 unsigned TargetFlags) {
1926 assert((TargetFlags == 0 || isTargetGA) &&
1927 "Cannot set target flags on target-independent globals");
1928
1929 // Truncate (with sign-extension) the offset value to the pointer size.
1931 if (BitWidth < 64)
1933
1934 unsigned Opc;
1935 if (GV->isThreadLocal())
1937 else
1939
1940 SDVTList VTs = getVTList(VT);
1942 AddNodeIDNode(ID, Opc, VTs, {});
1943 ID.AddPointer(GV);
1944 ID.AddInteger(Offset);
1945 ID.AddInteger(TargetFlags);
1946 void *IP = nullptr;
1947 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
1948 return SDValue(E, 0);
1949
1950 auto *N = newSDNode<GlobalAddressSDNode>(
1951 Opc, DL.getIROrder(), DL.getDebugLoc(), GV, VTs, Offset, TargetFlags);
1952 CSEMap.InsertNode(N, IP);
1953 InsertNode(N);
1954 return SDValue(N, 0);
1955}
1956
1958 SDVTList VTs = getVTList(MVT::Untyped);
1961 ID.AddPointer(GV);
1962 void *IP = nullptr;
1963 if (SDNode *E = FindNodeOrInsertPos(ID, SDLoc(), IP))
1964 return SDValue(E, 0);
1965
1966 auto *N = newSDNode<DeactivationSymbolSDNode>(GV, VTs);
1967 CSEMap.InsertNode(N, IP);
1968 InsertNode(N);
1969 return SDValue(N, 0);
1970}
1971
1972SDValue SelectionDAG::getFrameIndex(int FI, EVT VT, bool isTarget) {
1973 unsigned Opc = isTarget ? ISD::TargetFrameIndex : ISD::FrameIndex;
1974 SDVTList VTs = getVTList(VT);
1976 AddNodeIDNode(ID, Opc, VTs, {});
1977 ID.AddInteger(FI);
1978 void *IP = nullptr;
1979 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
1980 return SDValue(E, 0);
1981
1982 auto *N = newSDNode<FrameIndexSDNode>(FI, VTs, isTarget);
1983 CSEMap.InsertNode(N, IP);
1984 InsertNode(N);
1985 return SDValue(N, 0);
1986}
1987
1988SDValue SelectionDAG::getJumpTable(int JTI, EVT VT, bool isTarget,
1989 unsigned TargetFlags) {
1990 assert((TargetFlags == 0 || isTarget) &&
1991 "Cannot set target flags on target-independent jump tables");
1992 unsigned Opc = isTarget ? ISD::TargetJumpTable : ISD::JumpTable;
1993 SDVTList VTs = getVTList(VT);
1995 AddNodeIDNode(ID, Opc, VTs, {});
1996 ID.AddInteger(JTI);
1997 ID.AddInteger(TargetFlags);
1998 void *IP = nullptr;
1999 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2000 return SDValue(E, 0);
2001
2002 auto *N = newSDNode<JumpTableSDNode>(JTI, VTs, isTarget, TargetFlags);
2003 CSEMap.InsertNode(N, IP);
2004 InsertNode(N);
2005 return SDValue(N, 0);
2006}
2007
2009 const SDLoc &DL) {
2011 return getNode(ISD::JUMP_TABLE_DEBUG_INFO, DL, MVT::Other, Chain,
2012 getTargetConstant(static_cast<uint64_t>(JTI), DL, PTy, true));
2013}
2014
2016 MaybeAlign Alignment, int Offset,
2017 bool isTarget, unsigned TargetFlags) {
2018 assert((TargetFlags == 0 || isTarget) &&
2019 "Cannot set target flags on target-independent globals");
2020 if (!Alignment)
2021 Alignment = shouldOptForSize()
2022 ? getDataLayout().getABITypeAlign(C->getType())
2023 : getDataLayout().getPrefTypeAlign(C->getType());
2024 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2025 SDVTList VTs = getVTList(VT);
2027 AddNodeIDNode(ID, Opc, VTs, {});
2028 ID.AddInteger(Alignment->value());
2029 ID.AddInteger(Offset);
2030 ID.AddPointer(C);
2031 ID.AddInteger(TargetFlags);
2032 void *IP = nullptr;
2033 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2034 return SDValue(E, 0);
2035
2036 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2037 TargetFlags);
2038 CSEMap.InsertNode(N, IP);
2039 InsertNode(N);
2040 SDValue V = SDValue(N, 0);
2041 NewSDValueDbgMsg(V, "Creating new constant pool: ", this);
2042 return V;
2043}
2044
2046 MaybeAlign Alignment, int Offset,
2047 bool isTarget, unsigned TargetFlags) {
2048 assert((TargetFlags == 0 || isTarget) &&
2049 "Cannot set target flags on target-independent globals");
2050 if (!Alignment)
2051 Alignment = getDataLayout().getPrefTypeAlign(C->getType());
2052 unsigned Opc = isTarget ? ISD::TargetConstantPool : ISD::ConstantPool;
2053 SDVTList VTs = getVTList(VT);
2055 AddNodeIDNode(ID, Opc, VTs, {});
2056 ID.AddInteger(Alignment->value());
2057 ID.AddInteger(Offset);
2058 C->addSelectionDAGCSEId(ID);
2059 ID.AddInteger(TargetFlags);
2060 void *IP = nullptr;
2061 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2062 return SDValue(E, 0);
2063
2064 auto *N = newSDNode<ConstantPoolSDNode>(isTarget, C, VTs, Offset, *Alignment,
2065 TargetFlags);
2066 CSEMap.InsertNode(N, IP);
2067 InsertNode(N);
2068 return SDValue(N, 0);
2069}
2070
2073 AddNodeIDNode(ID, ISD::BasicBlock, getVTList(MVT::Other), {});
2074 ID.AddPointer(MBB);
2075 void *IP = nullptr;
2076 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2077 return SDValue(E, 0);
2078
2079 auto *N = newSDNode<BasicBlockSDNode>(MBB);
2080 CSEMap.InsertNode(N, IP);
2081 InsertNode(N);
2082 return SDValue(N, 0);
2083}
2084
2086 if (VT.isSimple() && (unsigned)VT.getSimpleVT().SimpleTy >=
2087 ValueTypeNodes.size())
2088 ValueTypeNodes.resize(VT.getSimpleVT().SimpleTy+1);
2089
2090 SDNode *&N = VT.isExtended() ?
2091 ExtendedValueTypeNodes[VT] : ValueTypeNodes[VT.getSimpleVT().SimpleTy];
2092
2093 if (N) return SDValue(N, 0);
2094 N = newSDNode<VTSDNode>(VT);
2095 InsertNode(N);
2096 return SDValue(N, 0);
2097}
2098
2100 SDNode *&N = ExternalSymbols[Sym];
2101 if (N) return SDValue(N, 0);
2102 N = newSDNode<ExternalSymbolSDNode>(false, Sym, 0, getVTList(VT));
2103 InsertNode(N);
2104 return SDValue(N, 0);
2105}
2106
2107SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
2109 return getExternalSymbol(SymName.data(), VT);
2110}
2111
2113 SDNode *&N = MCSymbols[Sym];
2114 if (N)
2115 return SDValue(N, 0);
2116 N = newSDNode<MCSymbolSDNode>(Sym, getVTList(VT));
2117 InsertNode(N);
2118 return SDValue(N, 0);
2119}
2120
2122 unsigned TargetFlags) {
2123 SDNode *&N =
2124 TargetExternalSymbols[std::pair<std::string, unsigned>(Sym, TargetFlags)];
2125 if (N) return SDValue(N, 0);
2126 N = newSDNode<ExternalSymbolSDNode>(true, Sym, TargetFlags, getVTList(VT));
2127 InsertNode(N);
2128 return SDValue(N, 0);
2129}
2130
2132 EVT VT, unsigned TargetFlags) {
2134 return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
2135}
2136
2138 if ((unsigned)Cond >= CondCodeNodes.size())
2139 CondCodeNodes.resize(Cond+1);
2140
2141 if (!CondCodeNodes[Cond]) {
2142 auto *N = newSDNode<CondCodeSDNode>(Cond);
2143 CondCodeNodes[Cond] = N;
2144 InsertNode(N);
2145 }
2146
2147 return SDValue(CondCodeNodes[Cond], 0);
2148}
2149
2151 assert(MulImm.getBitWidth() == VT.getSizeInBits() &&
2152 "APInt size does not match type size!");
2153
2154 if (MulImm == 0)
2155 return getConstant(0, DL, VT);
2156
2157 const MachineFunction &MF = getMachineFunction();
2158 const Function &F = MF.getFunction();
2159 ConstantRange CR = getVScaleRange(&F, 64);
2160 if (const APInt *C = CR.getSingleElement())
2161 return getConstant(MulImm * C->getZExtValue(), DL, VT);
2162
2163 return getNode(ISD::VSCALE, DL, VT, getConstant(MulImm, DL, VT));
2164}
2165
2166/// \returns a value of type \p VT that represents the runtime value of \p
2167/// Quantity, i.e. scaled by vscale if it's scalable, or a fixed constant
2168/// otherwise. Quantity should be a FixedOrScalableQuantity, i.e. ElementCount
2169/// or TypeSize.
2170template <typename Ty>
2172 EVT VT, Ty Quantity) {
2173 if (Quantity.isScalable())
2174 return DAG.getVScale(
2175 DL, VT, APInt(VT.getSizeInBits(), Quantity.getKnownMinValue()));
2176
2177 return DAG.getConstant(Quantity.getKnownMinValue(), DL, VT);
2178}
2179
2181 ElementCount EC) {
2182 return getFixedOrScalableQuantity(*this, DL, VT, EC);
2183}
2184
2186 return getFixedOrScalableQuantity(*this, DL, VT, TS);
2187}
2188
2190 ElementCount EC) {
2191 EVT IdxVT = TLI->getVectorIdxTy(getDataLayout());
2192 EVT MaskVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), DataVT);
2193 return getNode(ISD::GET_ACTIVE_LANE_MASK, DL, MaskVT,
2194 getConstant(0, DL, IdxVT), getElementCount(DL, IdxVT, EC));
2195}
2196
2198 APInt One(ResVT.getScalarSizeInBits(), 1);
2199 return getStepVector(DL, ResVT, One);
2200}
2201
2203 const APInt &StepVal) {
2204 assert(ResVT.getScalarSizeInBits() == StepVal.getBitWidth());
2205 if (ResVT.isScalableVector())
2206 return getNode(
2207 ISD::STEP_VECTOR, DL, ResVT,
2208 getTargetConstant(StepVal, DL, ResVT.getVectorElementType()));
2209
2210 SmallVector<SDValue, 16> OpsStepConstants;
2211 for (uint64_t i = 0; i < ResVT.getVectorNumElements(); i++)
2212 OpsStepConstants.push_back(
2213 getConstant(StepVal * i, DL, ResVT.getVectorElementType()));
2214 return getBuildVector(ResVT, DL, OpsStepConstants);
2215}
2216
2217/// Swaps the values of N1 and N2. Swaps all indices in the shuffle mask M that
2218/// point at N1 to point at N2 and indices that point at N2 to point at N1.
2223
2225 SDValue N2, ArrayRef<int> Mask) {
2226 assert(VT.getVectorNumElements() == Mask.size() &&
2227 "Must have the same number of vector elements as mask elements!");
2228 assert(VT == N1.getValueType() && VT == N2.getValueType() &&
2229 "Invalid VECTOR_SHUFFLE");
2230
2231 // Canonicalize shuffle undef, undef -> undef
2232 if (N1.isUndef() && N2.isUndef())
2233 return getUNDEF(VT);
2234
2235 // Validate that all indices in Mask are within the range of the elements
2236 // input to the shuffle.
2237 int NElts = Mask.size();
2238 assert(llvm::all_of(Mask,
2239 [&](int M) { return M < (NElts * 2) && M >= -1; }) &&
2240 "Index out of range");
2241
2242 // Copy the mask so we can do any needed cleanup.
2243 SmallVector<int, 8> MaskVec(Mask);
2244
2245 // Canonicalize shuffle v, v -> v, undef
2246 if (N1 == N2) {
2247 N2 = getUNDEF(VT);
2248 for (int i = 0; i != NElts; ++i)
2249 if (MaskVec[i] >= NElts) MaskVec[i] -= NElts;
2250 }
2251
2252 // Canonicalize shuffle undef, v -> v, undef. Commute the shuffle mask.
2253 if (N1.isUndef())
2254 commuteShuffle(N1, N2, MaskVec);
2255
2256 if (TLI->hasVectorBlend()) {
2257 // If shuffling a splat, try to blend the splat instead. We do this here so
2258 // that even when this arises during lowering we don't have to re-handle it.
2259 auto BlendSplat = [&](BuildVectorSDNode *BV, int Offset) {
2260 BitVector UndefElements;
2261 SDValue Splat = BV->getSplatValue(&UndefElements);
2262 if (!Splat)
2263 return;
2264
2265 for (int i = 0; i < NElts; ++i) {
2266 if (MaskVec[i] < Offset || MaskVec[i] >= (Offset + NElts))
2267 continue;
2268
2269 // If this input comes from undef, mark it as such.
2270 if (UndefElements[MaskVec[i] - Offset]) {
2271 MaskVec[i] = -1;
2272 continue;
2273 }
2274
2275 // If we can blend a non-undef lane, use that instead.
2276 if (!UndefElements[i])
2277 MaskVec[i] = i + Offset;
2278 }
2279 };
2280 if (auto *N1BV = dyn_cast<BuildVectorSDNode>(N1))
2281 BlendSplat(N1BV, 0);
2282 if (auto *N2BV = dyn_cast<BuildVectorSDNode>(N2))
2283 BlendSplat(N2BV, NElts);
2284 }
2285
2286 // Canonicalize all index into lhs, -> shuffle lhs, undef
2287 // Canonicalize all index into rhs, -> shuffle rhs, undef
2288 bool AllLHS = true, AllRHS = true;
2289 bool N2Undef = N2.isUndef();
2290 for (int i = 0; i != NElts; ++i) {
2291 if (MaskVec[i] >= NElts) {
2292 if (N2Undef)
2293 MaskVec[i] = -1;
2294 else
2295 AllLHS = false;
2296 } else if (MaskVec[i] >= 0) {
2297 AllRHS = false;
2298 }
2299 }
2300 if (AllLHS && AllRHS)
2301 return getUNDEF(VT);
2302 if (AllLHS && !N2Undef)
2303 N2 = getUNDEF(VT);
2304 if (AllRHS) {
2305 N1 = getUNDEF(VT);
2306 commuteShuffle(N1, N2, MaskVec);
2307 }
2308 // Reset our undef status after accounting for the mask.
2309 N2Undef = N2.isUndef();
2310 // Re-check whether both sides ended up undef.
2311 if (N1.isUndef() && N2Undef)
2312 return getUNDEF(VT);
2313
2314 // If Identity shuffle return that node.
2315 bool Identity = true, AllSame = true;
2316 for (int i = 0; i != NElts; ++i) {
2317 if (MaskVec[i] >= 0 && MaskVec[i] != i) Identity = false;
2318 if (MaskVec[i] != MaskVec[0]) AllSame = false;
2319 }
2320 if (Identity && NElts)
2321 return N1;
2322
2323 // Shuffling a constant splat doesn't change the result.
2324 if (N2Undef) {
2325 SDValue V = N1;
2326
2327 // Look through any bitcasts. We check that these don't change the number
2328 // (and size) of elements and just changes their types.
2329 while (V.getOpcode() == ISD::BITCAST)
2330 V = V->getOperand(0);
2331
2332 // A splat should always show up as a build vector node.
2333 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
2334 BitVector UndefElements;
2335 SDValue Splat = BV->getSplatValue(&UndefElements);
2336 // If this is a splat of an undef, shuffling it is also undef.
2337 if (Splat && Splat.isUndef())
2338 return getUNDEF(VT);
2339
2340 bool SameNumElts =
2341 V.getValueType().getVectorNumElements() == VT.getVectorNumElements();
2342
2343 // We only have a splat which can skip shuffles if there is a splatted
2344 // value and no undef lanes rearranged by the shuffle.
2345 if (Splat && UndefElements.none()) {
2346 // Splat of <x, x, ..., x>, return <x, x, ..., x>, provided that the
2347 // number of elements match or the value splatted is a zero constant.
2348 if (SameNumElts || isNullConstant(Splat))
2349 return N1;
2350 }
2351
2352 // If the shuffle itself creates a splat, build the vector directly.
2353 if (AllSame && SameNumElts) {
2354 EVT BuildVT = BV->getValueType(0);
2355 const SDValue &Splatted = BV->getOperand(MaskVec[0]);
2356 SDValue NewBV = getSplatBuildVector(BuildVT, dl, Splatted);
2357
2358 // We may have jumped through bitcasts, so the type of the
2359 // BUILD_VECTOR may not match the type of the shuffle.
2360 if (BuildVT != VT)
2361 NewBV = getNode(ISD::BITCAST, dl, VT, NewBV);
2362 return NewBV;
2363 }
2364 }
2365 }
2366
2367 SDVTList VTs = getVTList(VT);
2369 SDValue Ops[2] = { N1, N2 };
2371 for (int i = 0; i != NElts; ++i)
2372 ID.AddInteger(MaskVec[i]);
2373
2374 void* IP = nullptr;
2375 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2376 return SDValue(E, 0);
2377
2378 // Allocate the mask array for the node out of the BumpPtrAllocator, since
2379 // SDNode doesn't have access to it. This memory will be "leaked" when
2380 // the node is deallocated, but recovered when the NodeAllocator is released.
2381 int *MaskAlloc = OperandAllocator.Allocate<int>(NElts);
2382 llvm::copy(MaskVec, MaskAlloc);
2383
2384 auto *N = newSDNode<ShuffleVectorSDNode>(VTs, dl.getIROrder(),
2385 dl.getDebugLoc(), MaskAlloc);
2386 createOperands(N, Ops);
2387
2388 CSEMap.InsertNode(N, IP);
2389 InsertNode(N);
2390 SDValue V = SDValue(N, 0);
2391 NewSDValueDbgMsg(V, "Creating new node: ", this);
2392 return V;
2393}
2394
2396 EVT VT = SV.getValueType(0);
2397 SmallVector<int, 8> MaskVec(SV.getMask());
2399
2400 SDValue Op0 = SV.getOperand(0);
2401 SDValue Op1 = SV.getOperand(1);
2402 return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
2403}
2404
2406 SDVTList VTs = getVTList(VT);
2408 AddNodeIDNode(ID, ISD::Register, VTs, {});
2409 ID.AddInteger(Reg.id());
2410 void *IP = nullptr;
2411 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2412 return SDValue(E, 0);
2413
2414 auto *N = newSDNode<RegisterSDNode>(Reg, VTs);
2415 N->SDNodeBits.IsDivergent = TLI->isSDNodeSourceOfDivergence(N, FLI, UA);
2416 CSEMap.InsertNode(N, IP);
2417 InsertNode(N);
2418 return SDValue(N, 0);
2419}
2420
2423 AddNodeIDNode(ID, ISD::RegisterMask, getVTList(MVT::Untyped), {});
2424 ID.AddPointer(RegMask);
2425 void *IP = nullptr;
2426 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2427 return SDValue(E, 0);
2428
2429 auto *N = newSDNode<RegisterMaskSDNode>(RegMask);
2430 CSEMap.InsertNode(N, IP);
2431 InsertNode(N);
2432 return SDValue(N, 0);
2433}
2434
2436 MCSymbol *Label) {
2437 return getLabelNode(ISD::EH_LABEL, dl, Root, Label);
2438}
2439
2440SDValue SelectionDAG::getLabelNode(unsigned Opcode, const SDLoc &dl,
2441 SDValue Root, MCSymbol *Label) {
2443 SDValue Ops[] = { Root };
2444 AddNodeIDNode(ID, Opcode, getVTList(MVT::Other), Ops);
2445 ID.AddPointer(Label);
2446 void *IP = nullptr;
2447 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2448 return SDValue(E, 0);
2449
2450 auto *N =
2451 newSDNode<LabelSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), Label);
2452 createOperands(N, Ops);
2453
2454 CSEMap.InsertNode(N, IP);
2455 InsertNode(N);
2456 return SDValue(N, 0);
2457}
2458
2460 int64_t Offset, bool isTarget,
2461 unsigned TargetFlags) {
2462 unsigned Opc = isTarget ? ISD::TargetBlockAddress : ISD::BlockAddress;
2463 SDVTList VTs = getVTList(VT);
2464
2466 AddNodeIDNode(ID, Opc, VTs, {});
2467 ID.AddPointer(BA);
2468 ID.AddInteger(Offset);
2469 ID.AddInteger(TargetFlags);
2470 void *IP = nullptr;
2471 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2472 return SDValue(E, 0);
2473
2474 auto *N = newSDNode<BlockAddressSDNode>(Opc, VTs, BA, Offset, TargetFlags);
2475 CSEMap.InsertNode(N, IP);
2476 InsertNode(N);
2477 return SDValue(N, 0);
2478}
2479
2482 AddNodeIDNode(ID, ISD::SRCVALUE, getVTList(MVT::Other), {});
2483 ID.AddPointer(V);
2484
2485 void *IP = nullptr;
2486 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2487 return SDValue(E, 0);
2488
2489 auto *N = newSDNode<SrcValueSDNode>(V);
2490 CSEMap.InsertNode(N, IP);
2491 InsertNode(N);
2492 return SDValue(N, 0);
2493}
2494
2497 AddNodeIDNode(ID, ISD::MDNODE_SDNODE, getVTList(MVT::Other), {});
2498 ID.AddPointer(MD);
2499
2500 void *IP = nullptr;
2501 if (SDNode *E = FindNodeOrInsertPos(ID, IP))
2502 return SDValue(E, 0);
2503
2504 auto *N = newSDNode<MDNodeSDNode>(MD);
2505 CSEMap.InsertNode(N, IP);
2506 InsertNode(N);
2507 return SDValue(N, 0);
2508}
2509
2511 if (VT == V.getValueType())
2512 return V;
2513
2514 return getNode(ISD::BITCAST, SDLoc(V), VT, V);
2515}
2516
2518 unsigned SrcAS, unsigned DestAS) {
2519 SDVTList VTs = getVTList(VT);
2520 SDValue Ops[] = {Ptr};
2523 ID.AddInteger(SrcAS);
2524 ID.AddInteger(DestAS);
2525
2526 void *IP = nullptr;
2527 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
2528 return SDValue(E, 0);
2529
2530 auto *N = newSDNode<AddrSpaceCastSDNode>(dl.getIROrder(), dl.getDebugLoc(),
2531 VTs, SrcAS, DestAS);
2532 createOperands(N, Ops);
2533
2534 CSEMap.InsertNode(N, IP);
2535 InsertNode(N);
2536 return SDValue(N, 0);
2537}
2538
2540 return getNode(ISD::FREEZE, SDLoc(V), V.getValueType(), V);
2541}
2542
2544 bool PoisonOnly) {
2545 if (isGuaranteedNotToBeUndefOrPoison(V, DemandedElts, PoisonOnly))
2546 return V;
2547 return getFreeze(V);
2548}
2549
2550/// getShiftAmountOperand - Return the specified value casted to
2551/// the target's desired shift amount type.
2553 EVT OpTy = Op.getValueType();
2554 EVT ShTy = TLI->getShiftAmountTy(LHSTy, getDataLayout());
2555 if (OpTy == ShTy || OpTy.isVector()) return Op;
2556
2557 return getZExtOrTrunc(Op, SDLoc(Op), ShTy);
2558}
2559
2561 SDLoc dl(Node);
2563 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue();
2564 EVT VT = Node->getValueType(0);
2565 SDValue Tmp1 = Node->getOperand(0);
2566 SDValue Tmp2 = Node->getOperand(1);
2567 const MaybeAlign MA(Node->getConstantOperandVal(3));
2568
2569 SDValue VAListLoad = getLoad(TLI.getPointerTy(getDataLayout()), dl, Tmp1,
2570 Tmp2, MachinePointerInfo(V));
2571 SDValue VAList = VAListLoad;
2572
2573 if (MA && *MA > TLI.getMinStackArgumentAlignment()) {
2574 VAList = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2575 getConstant(MA->value() - 1, dl, VAList.getValueType()));
2576
2577 VAList = getNode(
2578 ISD::AND, dl, VAList.getValueType(), VAList,
2579 getSignedConstant(-(int64_t)MA->value(), dl, VAList.getValueType()));
2580 }
2581
2582 // Increment the pointer, VAList, to the next vaarg
2583 Tmp1 = getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
2584 getConstant(getDataLayout().getTypeAllocSize(
2585 VT.getTypeForEVT(*getContext())),
2586 dl, VAList.getValueType()));
2587 // Store the incremented VAList to the legalized pointer
2588 Tmp1 =
2589 getStore(VAListLoad.getValue(1), dl, Tmp1, Tmp2, MachinePointerInfo(V));
2590 // Load the actual argument out of the pointer VAList
2591 return getLoad(VT, dl, Tmp1, VAList, MachinePointerInfo());
2592}
2593
2595 SDLoc dl(Node);
2597 // This defaults to loading a pointer from the input and storing it to the
2598 // output, returning the chain.
2599 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue();
2600 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue();
2601 SDValue Tmp1 =
2602 getLoad(TLI.getPointerTy(getDataLayout()), dl, Node->getOperand(0),
2603 Node->getOperand(2), MachinePointerInfo(VS));
2604 return getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1),
2605 MachinePointerInfo(VD));
2606}
2607
2609 const DataLayout &DL = getDataLayout();
2610 Type *Ty = VT.getTypeForEVT(*getContext());
2611 Align RedAlign = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2612
2613 if (TLI->isTypeLegal(VT) || !VT.isVector())
2614 return RedAlign;
2615
2616 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2617 const Align StackAlign = TFI->getStackAlign();
2618
2619 // See if we can choose a smaller ABI alignment in cases where it's an
2620 // illegal vector type that will get broken down.
2621 if (RedAlign > StackAlign) {
2622 EVT IntermediateVT;
2623 MVT RegisterVT;
2624 unsigned NumIntermediates;
2625 TLI->getVectorTypeBreakdown(*getContext(), VT, IntermediateVT,
2626 NumIntermediates, RegisterVT);
2627 Ty = IntermediateVT.getTypeForEVT(*getContext());
2628 Align RedAlign2 = UseABI ? DL.getABITypeAlign(Ty) : DL.getPrefTypeAlign(Ty);
2629 if (RedAlign2 < RedAlign)
2630 RedAlign = RedAlign2;
2631
2632 if (!getMachineFunction().getFrameInfo().isStackRealignable())
2633 // If the stack is not realignable, the alignment should be limited to the
2634 // StackAlignment
2635 RedAlign = std::min(RedAlign, StackAlign);
2636 }
2637
2638 return RedAlign;
2639}
2640
2642 MachineFrameInfo &MFI = MF->getFrameInfo();
2643 const TargetFrameLowering *TFI = MF->getSubtarget().getFrameLowering();
2644 int StackID = 0;
2645 if (Bytes.isScalable())
2646 StackID = TFI->getStackIDForScalableVectors();
2647 // The stack id gives an indication of whether the object is scalable or
2648 // not, so it's safe to pass in the minimum size here.
2649 int FrameIdx = MFI.CreateStackObject(Bytes.getKnownMinValue(), Alignment,
2650 false, nullptr, StackID);
2651 return getFrameIndex(FrameIdx, TLI->getFrameIndexTy(getDataLayout()));
2652}
2653
2655 Type *Ty = VT.getTypeForEVT(*getContext());
2656 Align StackAlign =
2657 std::max(getDataLayout().getPrefTypeAlign(Ty), Align(minAlign));
2658 return CreateStackTemporary(VT.getStoreSize(), StackAlign);
2659}
2660
2662 TypeSize VT1Size = VT1.getStoreSize();
2663 TypeSize VT2Size = VT2.getStoreSize();
2664 assert(VT1Size.isScalable() == VT2Size.isScalable() &&
2665 "Don't know how to choose the maximum size when creating a stack "
2666 "temporary");
2667 TypeSize Bytes = VT1Size.getKnownMinValue() > VT2Size.getKnownMinValue()
2668 ? VT1Size
2669 : VT2Size;
2670
2671 Type *Ty1 = VT1.getTypeForEVT(*getContext());
2672 Type *Ty2 = VT2.getTypeForEVT(*getContext());
2673 const DataLayout &DL = getDataLayout();
2674 Align Align = std::max(DL.getPrefTypeAlign(Ty1), DL.getPrefTypeAlign(Ty2));
2675 return CreateStackTemporary(Bytes, Align);
2676}
2677
2679 ISD::CondCode Cond, const SDLoc &dl,
2680 SDNodeFlags Flags) {
2681 EVT OpVT = N1.getValueType();
2682
2683 auto GetUndefBooleanConstant = [&]() {
2684 if (VT.getScalarType() == MVT::i1 ||
2685 TLI->getBooleanContents(OpVT) ==
2687 return getUNDEF(VT);
2688 // ZeroOrOne / ZeroOrNegative require specific values for the high bits,
2689 // so we cannot use getUNDEF(). Return zero instead.
2690 return getConstant(0, dl, VT);
2691 };
2692
2693 // These setcc operations always fold.
2694 switch (Cond) {
2695 default: break;
2696 case ISD::SETFALSE:
2697 case ISD::SETFALSE2: return getBoolConstant(false, dl, VT, OpVT);
2698 case ISD::SETTRUE:
2699 case ISD::SETTRUE2: return getBoolConstant(true, dl, VT, OpVT);
2700
2701 case ISD::SETOEQ:
2702 case ISD::SETOGT:
2703 case ISD::SETOGE:
2704 case ISD::SETOLT:
2705 case ISD::SETOLE:
2706 case ISD::SETONE:
2707 case ISD::SETO:
2708 case ISD::SETUO:
2709 case ISD::SETUEQ:
2710 case ISD::SETUNE:
2711 assert(!OpVT.isInteger() && "Illegal setcc for integer!");
2712 break;
2713 }
2714
2715 if (OpVT.isInteger()) {
2716 // For EQ and NE, we can always pick a value for the undef to make the
2717 // predicate pass or fail, so we can return undef.
2718 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2719 // icmp eq/ne X, undef -> undef.
2720 if ((N1.isUndef() || N2.isUndef()) &&
2721 (Cond == ISD::SETEQ || Cond == ISD::SETNE))
2722 return GetUndefBooleanConstant();
2723
2724 // If both operands are undef, we can return undef for int comparison.
2725 // icmp undef, undef -> undef.
2726 if (N1.isUndef() && N2.isUndef())
2727 return GetUndefBooleanConstant();
2728
2729 // icmp X, X -> true/false
2730 // icmp X, undef -> true/false because undef could be X.
2731 if (N1.isUndef() || N2.isUndef() || N1 == N2)
2732 return getBoolConstant(ISD::isTrueWhenEqual(Cond), dl, VT, OpVT);
2733 }
2734
2736 const APInt &C2 = N2C->getAPIntValue();
2738 const APInt &C1 = N1C->getAPIntValue();
2739
2741 dl, VT, OpVT);
2742 }
2743 }
2744
2745 auto *N1CFP = dyn_cast<ConstantFPSDNode>(N1);
2746 auto *N2CFP = dyn_cast<ConstantFPSDNode>(N2);
2747
2748 if (N1CFP && N2CFP) {
2749 APFloat::cmpResult R = N1CFP->getValueAPF().compare(N2CFP->getValueAPF());
2750 switch (Cond) {
2751 default: break;
2752 case ISD::SETEQ: if (R==APFloat::cmpUnordered)
2753 return GetUndefBooleanConstant();
2754 [[fallthrough]];
2755 case ISD::SETOEQ: return getBoolConstant(R==APFloat::cmpEqual, dl, VT,
2756 OpVT);
2757 case ISD::SETNE: if (R==APFloat::cmpUnordered)
2758 return GetUndefBooleanConstant();
2759 [[fallthrough]];
2761 R==APFloat::cmpLessThan, dl, VT,
2762 OpVT);
2763 case ISD::SETLT: if (R==APFloat::cmpUnordered)
2764 return GetUndefBooleanConstant();
2765 [[fallthrough]];
2766 case ISD::SETOLT: return getBoolConstant(R==APFloat::cmpLessThan, dl, VT,
2767 OpVT);
2768 case ISD::SETGT: if (R==APFloat::cmpUnordered)
2769 return GetUndefBooleanConstant();
2770 [[fallthrough]];
2772 VT, OpVT);
2773 case ISD::SETLE: if (R==APFloat::cmpUnordered)
2774 return GetUndefBooleanConstant();
2775 [[fallthrough]];
2777 R==APFloat::cmpEqual, dl, VT,
2778 OpVT);
2779 case ISD::SETGE: if (R==APFloat::cmpUnordered)
2780 return GetUndefBooleanConstant();
2781 [[fallthrough]];
2783 R==APFloat::cmpEqual, dl, VT, OpVT);
2784 case ISD::SETO: return getBoolConstant(R!=APFloat::cmpUnordered, dl, VT,
2785 OpVT);
2786 case ISD::SETUO: return getBoolConstant(R==APFloat::cmpUnordered, dl, VT,
2787 OpVT);
2789 R==APFloat::cmpEqual, dl, VT,
2790 OpVT);
2791 case ISD::SETUNE: return getBoolConstant(R!=APFloat::cmpEqual, dl, VT,
2792 OpVT);
2794 R==APFloat::cmpLessThan, dl, VT,
2795 OpVT);
2797 R==APFloat::cmpUnordered, dl, VT,
2798 OpVT);
2800 VT, OpVT);
2801 case ISD::SETUGE: return getBoolConstant(R!=APFloat::cmpLessThan, dl, VT,
2802 OpVT);
2803 }
2804 } else if (N1CFP && OpVT.isSimple() && !N2.isUndef()) {
2805 // Ensure that the constant occurs on the RHS.
2807 if (!TLI->isCondCodeLegal(SwappedCond, OpVT.getSimpleVT()))
2808 return SDValue();
2809 return getSetCC(dl, VT, N2, N1, SwappedCond, /*Chian=*/{},
2810 /*IsSignaling=*/false, Flags);
2811 } else if ((N2CFP && N2CFP->getValueAPF().isNaN()) ||
2812 (OpVT.isFloatingPoint() && (N1.isUndef() || N2.isUndef()))) {
2813 // If an operand is known to be a nan (or undef that could be a nan), we can
2814 // fold it.
2815 // Choosing NaN for the undef will always make unordered comparison succeed
2816 // and ordered comparison fails.
2817 // Matches behavior in llvm::ConstantFoldCompareInstruction.
2818 switch (ISD::getUnorderedFlavor(Cond)) {
2819 default:
2820 llvm_unreachable("Unknown flavor!");
2821 case 0: // Known false.
2822 return getBoolConstant(false, dl, VT, OpVT);
2823 case 1: // Known true.
2824 return getBoolConstant(true, dl, VT, OpVT);
2825 case 2: // Undefined.
2826 return GetUndefBooleanConstant();
2827 }
2828 }
2829
2830 // Could not fold it.
2831 return SDValue();
2832}
2833
2834/// SignBitIsZero - Return true if the sign bit of Op is known to be zero. We
2835/// use this predicate to simplify operations downstream.
2837 unsigned BitWidth = Op.getScalarValueSizeInBits();
2839}
2840
2841// TODO: Should have argument to specify if sign bit of nan is ignorable.
2843 if (Depth >= MaxRecursionDepth)
2844 return false; // Limit search depth.
2845
2846 unsigned Opc = Op.getOpcode();
2847 switch (Opc) {
2848 case ISD::FABS:
2849 return true;
2850 case ISD::AssertNoFPClass: {
2851 FPClassTest NoFPClass =
2852 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
2853
2854 const FPClassTest TestMask = fcNan | fcNegative;
2855 return (NoFPClass & TestMask) == TestMask;
2856 }
2857 case ISD::ARITH_FENCE:
2858 return SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2859 case ISD::FEXP:
2860 case ISD::FEXP2:
2861 case ISD::FEXP10:
2862 return Op->getFlags().hasNoNaNs();
2863 case ISD::FMINNUM:
2864 case ISD::FMINNUM_IEEE:
2865 case ISD::FMINIMUM:
2866 case ISD::FMINIMUMNUM:
2867 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2868 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2869 case ISD::FMAXNUM:
2870 case ISD::FMAXNUM_IEEE:
2871 case ISD::FMAXIMUM:
2872 case ISD::FMAXIMUMNUM:
2873 // TODO: If we can ignore the sign bit of nans, only one side being known 0
2874 // is sufficient.
2875 return SignBitIsZeroFP(Op.getOperand(1), Depth + 1) &&
2876 SignBitIsZeroFP(Op.getOperand(0), Depth + 1);
2877 default:
2878 return false;
2879 }
2880
2881 llvm_unreachable("covered opcode switch");
2882}
2883
2884/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use
2885/// this predicate to simplify operations downstream. Mask is known to be zero
2886/// for bits that V cannot have.
2888 unsigned Depth) const {
2889 return Mask.isSubsetOf(computeKnownBits(V, Depth).Zero);
2890}
2891
2892/// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero in
2893/// DemandedElts. We use this predicate to simplify operations downstream.
2894/// Mask is known to be zero for bits that V cannot have.
2896 const APInt &DemandedElts,
2897 unsigned Depth) const {
2898 return Mask.isSubsetOf(computeKnownBits(V, DemandedElts, Depth).Zero);
2899}
2900
2901/// MaskedVectorIsZero - Return true if 'Op' is known to be zero in
2902/// DemandedElts. We use this predicate to simplify operations downstream.
2904 unsigned Depth /* = 0 */) const {
2905 return computeKnownBits(V, DemandedElts, Depth).isZero();
2906}
2907
2908/// MaskedValueIsAllOnes - Return true if '(Op & Mask) == Mask'.
2910 unsigned Depth) const {
2911 return Mask.isSubsetOf(computeKnownBits(V, Depth).One);
2912}
2913
2915 const APInt &DemandedElts,
2916 unsigned Depth) const {
2917 EVT VT = Op.getValueType();
2918 assert(VT.isVector() && !VT.isScalableVector() && "Only for fixed vectors!");
2919
2920 unsigned NumElts = VT.getVectorNumElements();
2921 assert(DemandedElts.getBitWidth() == NumElts && "Unexpected demanded mask.");
2922
2923 APInt KnownZeroElements = APInt::getZero(NumElts);
2924 for (unsigned EltIdx = 0; EltIdx != NumElts; ++EltIdx) {
2925 if (!DemandedElts[EltIdx])
2926 continue; // Don't query elements that are not demanded.
2927 APInt Mask = APInt::getOneBitSet(NumElts, EltIdx);
2928 if (MaskedVectorIsZero(Op, Mask, Depth))
2929 KnownZeroElements.setBit(EltIdx);
2930 }
2931 return KnownZeroElements;
2932}
2933
2934/// isSplatValue - Return true if the vector V has the same value
2935/// across all DemandedElts. For scalable vectors, we don't know the
2936/// number of lanes at compile time. Instead, we use a 1 bit APInt
2937/// to represent a conservative value for all lanes; that is, that
2938/// one bit value is implicitly splatted across all lanes.
2939bool SelectionDAG::isSplatValue(SDValue V, const APInt &DemandedElts,
2940 APInt &UndefElts, unsigned Depth) const {
2941 unsigned Opcode = V.getOpcode();
2942 EVT VT = V.getValueType();
2943 assert(VT.isVector() && "Vector type expected");
2944 assert((!VT.isScalableVector() || DemandedElts.getBitWidth() == 1) &&
2945 "scalable demanded bits are ignored");
2946
2947 if (!DemandedElts)
2948 return false; // No demanded elts, better to assume we don't know anything.
2949
2950 if (Depth >= MaxRecursionDepth)
2951 return false; // Limit search depth.
2952
2953 // Deal with some common cases here that work for both fixed and scalable
2954 // vector types.
2955 switch (Opcode) {
2956 case ISD::SPLAT_VECTOR:
2957 UndefElts = V.getOperand(0).isUndef()
2958 ? APInt::getAllOnes(DemandedElts.getBitWidth())
2959 : APInt(DemandedElts.getBitWidth(), 0);
2960 return true;
2961 case ISD::ADD:
2962 case ISD::SUB:
2963 case ISD::AND:
2964 case ISD::XOR:
2965 case ISD::OR: {
2966 APInt UndefLHS, UndefRHS;
2967 SDValue LHS = V.getOperand(0);
2968 SDValue RHS = V.getOperand(1);
2969 // Only recognize splats with the same demanded undef elements for both
2970 // operands, otherwise we might fail to handle binop-specific undef
2971 // handling.
2972 // e.g. (and undef, 0) -> 0 etc.
2973 if (isSplatValue(LHS, DemandedElts, UndefLHS, Depth + 1) &&
2974 isSplatValue(RHS, DemandedElts, UndefRHS, Depth + 1) &&
2975 (DemandedElts & UndefLHS) == (DemandedElts & UndefRHS)) {
2976 UndefElts = UndefLHS | UndefRHS;
2977 return true;
2978 }
2979 return false;
2980 }
2981 case ISD::ABS:
2982 case ISD::TRUNCATE:
2983 case ISD::SIGN_EXTEND:
2984 case ISD::ZERO_EXTEND:
2985 return isSplatValue(V.getOperand(0), DemandedElts, UndefElts, Depth + 1);
2986 default:
2987 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
2988 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
2989 return TLI->isSplatValueForTargetNode(V, DemandedElts, UndefElts, *this,
2990 Depth);
2991 break;
2992 }
2993
2994 // We don't support other cases than those above for scalable vectors at
2995 // the moment.
2996 if (VT.isScalableVector())
2997 return false;
2998
2999 unsigned NumElts = VT.getVectorNumElements();
3000 assert(NumElts == DemandedElts.getBitWidth() && "Vector size mismatch");
3001 UndefElts = APInt::getZero(NumElts);
3002
3003 switch (Opcode) {
3004 case ISD::BUILD_VECTOR: {
3005 SDValue Scl;
3006 for (unsigned i = 0; i != NumElts; ++i) {
3007 SDValue Op = V.getOperand(i);
3008 if (Op.isUndef()) {
3009 UndefElts.setBit(i);
3010 continue;
3011 }
3012 if (!DemandedElts[i])
3013 continue;
3014 if (Scl && Scl != Op)
3015 return false;
3016 Scl = Op;
3017 }
3018 return true;
3019 }
3020 case ISD::VECTOR_SHUFFLE: {
3021 // Check if this is a shuffle node doing a splat or a shuffle of a splat.
3022 APInt DemandedLHS = APInt::getZero(NumElts);
3023 APInt DemandedRHS = APInt::getZero(NumElts);
3024 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(V)->getMask();
3025 for (int i = 0; i != (int)NumElts; ++i) {
3026 int M = Mask[i];
3027 if (M < 0) {
3028 UndefElts.setBit(i);
3029 continue;
3030 }
3031 if (!DemandedElts[i])
3032 continue;
3033 if (M < (int)NumElts)
3034 DemandedLHS.setBit(M);
3035 else
3036 DemandedRHS.setBit(M - NumElts);
3037 }
3038
3039 // If we aren't demanding either op, assume there's no splat.
3040 // If we are demanding both ops, assume there's no splat.
3041 if ((DemandedLHS.isZero() && DemandedRHS.isZero()) ||
3042 (!DemandedLHS.isZero() && !DemandedRHS.isZero()))
3043 return false;
3044
3045 // See if the demanded elts of the source op is a splat or we only demand
3046 // one element, which should always be a splat.
3047 // TODO: Handle source ops splats with undefs.
3048 auto CheckSplatSrc = [&](SDValue Src, const APInt &SrcElts) {
3049 APInt SrcUndefs;
3050 return (SrcElts.popcount() == 1) ||
3051 (isSplatValue(Src, SrcElts, SrcUndefs, Depth + 1) &&
3052 (SrcElts & SrcUndefs).isZero());
3053 };
3054 if (!DemandedLHS.isZero())
3055 return CheckSplatSrc(V.getOperand(0), DemandedLHS);
3056 return CheckSplatSrc(V.getOperand(1), DemandedRHS);
3057 }
3059 // Offset the demanded elts by the subvector index.
3060 SDValue Src = V.getOperand(0);
3061 // We don't support scalable vectors at the moment.
3062 if (Src.getValueType().isScalableVector())
3063 return false;
3064 uint64_t Idx = V.getConstantOperandVal(1);
3065 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3066 APInt UndefSrcElts;
3067 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3068 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3069 UndefElts = UndefSrcElts.extractBits(NumElts, Idx);
3070 return true;
3071 }
3072 break;
3073 }
3077 // Widen the demanded elts by the src element count.
3078 SDValue Src = V.getOperand(0);
3079 // We don't support scalable vectors at the moment.
3080 if (Src.getValueType().isScalableVector())
3081 return false;
3082 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3083 APInt UndefSrcElts;
3084 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3085 if (isSplatValue(Src, DemandedSrcElts, UndefSrcElts, Depth + 1)) {
3086 UndefElts = UndefSrcElts.trunc(NumElts);
3087 return true;
3088 }
3089 break;
3090 }
3091 case ISD::BITCAST: {
3092 SDValue Src = V.getOperand(0);
3093 EVT SrcVT = Src.getValueType();
3094 unsigned SrcBitWidth = SrcVT.getScalarSizeInBits();
3095 unsigned BitWidth = VT.getScalarSizeInBits();
3096
3097 // Ignore bitcasts from unsupported types.
3098 // TODO: Add fp support?
3099 if (!SrcVT.isVector() || !SrcVT.isInteger() || !VT.isInteger())
3100 break;
3101
3102 // Bitcast 'small element' vector to 'large element' vector.
3103 if ((BitWidth % SrcBitWidth) == 0) {
3104 // See if each sub element is a splat.
3105 unsigned Scale = BitWidth / SrcBitWidth;
3106 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3107 APInt ScaledDemandedElts =
3108 APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3109 for (unsigned I = 0; I != Scale; ++I) {
3110 APInt SubUndefElts;
3111 APInt SubDemandedElt = APInt::getOneBitSet(Scale, I);
3112 APInt SubDemandedElts = APInt::getSplat(NumSrcElts, SubDemandedElt);
3113 SubDemandedElts &= ScaledDemandedElts;
3114 if (!isSplatValue(Src, SubDemandedElts, SubUndefElts, Depth + 1))
3115 return false;
3116 // TODO: Add support for merging sub undef elements.
3117 if (!SubUndefElts.isZero())
3118 return false;
3119 }
3120 return true;
3121 }
3122 break;
3123 }
3124 }
3125
3126 return false;
3127}
3128
3129/// Helper wrapper to main isSplatValue function.
3130bool SelectionDAG::isSplatValue(SDValue V, bool AllowUndefs) const {
3131 EVT VT = V.getValueType();
3132 assert(VT.isVector() && "Vector type expected");
3133
3134 APInt UndefElts;
3135 // Since the number of lanes in a scalable vector is unknown at compile time,
3136 // we track one bit which is implicitly broadcast to all lanes. This means
3137 // that all lanes in a scalable vector are considered demanded.
3138 APInt DemandedElts
3140 return isSplatValue(V, DemandedElts, UndefElts) &&
3141 (AllowUndefs || !UndefElts);
3142}
3143
3146
3147 EVT VT = V.getValueType();
3148 unsigned Opcode = V.getOpcode();
3149 switch (Opcode) {
3150 default: {
3151 APInt UndefElts;
3152 // Since the number of lanes in a scalable vector is unknown at compile time,
3153 // we track one bit which is implicitly broadcast to all lanes. This means
3154 // that all lanes in a scalable vector are considered demanded.
3155 APInt DemandedElts
3157
3158 if (isSplatValue(V, DemandedElts, UndefElts)) {
3159 if (VT.isScalableVector()) {
3160 // DemandedElts and UndefElts are ignored for scalable vectors, since
3161 // the only supported cases are SPLAT_VECTOR nodes.
3162 SplatIdx = 0;
3163 } else {
3164 // Handle case where all demanded elements are UNDEF.
3165 if (DemandedElts.isSubsetOf(UndefElts)) {
3166 SplatIdx = 0;
3167 return getUNDEF(VT);
3168 }
3169 SplatIdx = (UndefElts & DemandedElts).countr_one();
3170 }
3171 return V;
3172 }
3173 break;
3174 }
3175 case ISD::SPLAT_VECTOR:
3176 SplatIdx = 0;
3177 return V;
3178 case ISD::VECTOR_SHUFFLE: {
3179 assert(!VT.isScalableVector());
3180 // Check if this is a shuffle node doing a splat.
3181 // TODO - remove this and rely purely on SelectionDAG::isSplatValue,
3182 // getTargetVShiftNode currently struggles without the splat source.
3183 auto *SVN = cast<ShuffleVectorSDNode>(V);
3184 if (!SVN->isSplat())
3185 break;
3186 int Idx = SVN->getSplatIndex();
3187 int NumElts = V.getValueType().getVectorNumElements();
3188 SplatIdx = Idx % NumElts;
3189 return V.getOperand(Idx / NumElts);
3190 }
3191 }
3192
3193 return SDValue();
3194}
3195
3197 int SplatIdx;
3198 if (SDValue SrcVector = getSplatSourceVector(V, SplatIdx)) {
3199 EVT SVT = SrcVector.getValueType().getScalarType();
3200 EVT LegalSVT = SVT;
3201 if (LegalTypes && !TLI->isTypeLegal(SVT)) {
3202 if (!SVT.isInteger())
3203 return SDValue();
3204 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
3205 if (LegalSVT.bitsLT(SVT))
3206 return SDValue();
3207 }
3208 return getExtractVectorElt(SDLoc(V), LegalSVT, SrcVector, SplatIdx);
3209 }
3210 return SDValue();
3211}
3212
3213std::optional<ConstantRange>
3215 unsigned Depth) const {
3216 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3217 V.getOpcode() == ISD::SRA) &&
3218 "Unknown shift node");
3219 // Shifting more than the bitwidth is not valid.
3220 unsigned BitWidth = V.getScalarValueSizeInBits();
3221
3222 if (auto *Cst = dyn_cast<ConstantSDNode>(V.getOperand(1))) {
3223 const APInt &ShAmt = Cst->getAPIntValue();
3224 if (ShAmt.uge(BitWidth))
3225 return std::nullopt;
3226 return ConstantRange(ShAmt);
3227 }
3228
3229 if (auto *BV = dyn_cast<BuildVectorSDNode>(V.getOperand(1))) {
3230 const APInt *MinAmt = nullptr, *MaxAmt = nullptr;
3231 for (unsigned i = 0, e = BV->getNumOperands(); i != e; ++i) {
3232 if (!DemandedElts[i])
3233 continue;
3234 auto *SA = dyn_cast<ConstantSDNode>(BV->getOperand(i));
3235 if (!SA) {
3236 MinAmt = MaxAmt = nullptr;
3237 break;
3238 }
3239 const APInt &ShAmt = SA->getAPIntValue();
3240 if (ShAmt.uge(BitWidth))
3241 return std::nullopt;
3242 if (!MinAmt || MinAmt->ugt(ShAmt))
3243 MinAmt = &ShAmt;
3244 if (!MaxAmt || MaxAmt->ult(ShAmt))
3245 MaxAmt = &ShAmt;
3246 }
3247 assert(((!MinAmt && !MaxAmt) || (MinAmt && MaxAmt)) &&
3248 "Failed to find matching min/max shift amounts");
3249 if (MinAmt && MaxAmt)
3250 return ConstantRange(*MinAmt, *MaxAmt + 1);
3251 }
3252
3253 // Use computeKnownBits to find a hidden constant/knownbits (usually type
3254 // legalized). e.g. Hidden behind multiple bitcasts/build_vector/casts etc.
3255 KnownBits KnownAmt = computeKnownBits(V.getOperand(1), DemandedElts, Depth);
3256 if (KnownAmt.getMaxValue().ult(BitWidth))
3257 return ConstantRange::fromKnownBits(KnownAmt, /*IsSigned=*/false);
3258
3259 return std::nullopt;
3260}
3261
3262std::optional<unsigned>
3264 unsigned Depth) const {
3265 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3266 V.getOpcode() == ISD::SRA) &&
3267 "Unknown shift node");
3268 if (std::optional<ConstantRange> AmtRange =
3269 getValidShiftAmountRange(V, DemandedElts, Depth))
3270 if (const APInt *ShAmt = AmtRange->getSingleElement())
3271 return ShAmt->getZExtValue();
3272 return std::nullopt;
3273}
3274
3275std::optional<unsigned>
3277 EVT VT = V.getValueType();
3278 APInt DemandedElts = VT.isFixedLengthVector()
3280 : APInt(1, 1);
3281 return getValidShiftAmount(V, DemandedElts, Depth);
3282}
3283
3284std::optional<unsigned>
3286 unsigned Depth) const {
3287 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3288 V.getOpcode() == ISD::SRA) &&
3289 "Unknown shift node");
3290 if (std::optional<ConstantRange> AmtRange =
3291 getValidShiftAmountRange(V, DemandedElts, Depth))
3292 return AmtRange->getUnsignedMin().getZExtValue();
3293 return std::nullopt;
3294}
3295
3296std::optional<unsigned>
3298 EVT VT = V.getValueType();
3299 APInt DemandedElts = VT.isFixedLengthVector()
3301 : APInt(1, 1);
3302 return getValidMinimumShiftAmount(V, DemandedElts, Depth);
3303}
3304
3305std::optional<unsigned>
3307 unsigned Depth) const {
3308 assert((V.getOpcode() == ISD::SHL || V.getOpcode() == ISD::SRL ||
3309 V.getOpcode() == ISD::SRA) &&
3310 "Unknown shift node");
3311 if (std::optional<ConstantRange> AmtRange =
3312 getValidShiftAmountRange(V, DemandedElts, Depth))
3313 return AmtRange->getUnsignedMax().getZExtValue();
3314 return std::nullopt;
3315}
3316
3317std::optional<unsigned>
3319 EVT VT = V.getValueType();
3320 APInt DemandedElts = VT.isFixedLengthVector()
3322 : APInt(1, 1);
3323 return getValidMaximumShiftAmount(V, DemandedElts, Depth);
3324}
3325
3326/// Determine which bits of Op are known to be either zero or one and return
3327/// them in Known. For vectors, the known bits are those that are shared by
3328/// every vector element.
3330 EVT VT = Op.getValueType();
3331
3332 // Since the number of lanes in a scalable vector is unknown at compile time,
3333 // we track one bit which is implicitly broadcast to all lanes. This means
3334 // that all lanes in a scalable vector are considered demanded.
3335 APInt DemandedElts = VT.isFixedLengthVector()
3337 : APInt(1, 1);
3338 return computeKnownBits(Op, DemandedElts, Depth);
3339}
3340
3341/// Determine which bits of Op are known to be either zero or one and return
3342/// them in Known. The DemandedElts argument allows us to only collect the known
3343/// bits that are shared by the requested vector elements.
3345 unsigned Depth) const {
3346 unsigned BitWidth = Op.getScalarValueSizeInBits();
3347
3348 KnownBits Known(BitWidth); // Don't know anything.
3349
3350 if (auto OptAPInt = Op->bitcastToAPInt()) {
3351 // We know all of the bits for a constant!
3352 return KnownBits::makeConstant(*std::move(OptAPInt));
3353 }
3354
3355 if (Depth >= MaxRecursionDepth)
3356 return Known; // Limit search depth.
3357
3358 KnownBits Known2;
3359 unsigned NumElts = DemandedElts.getBitWidth();
3360 assert((!Op.getValueType().isScalableVector() || NumElts == 1) &&
3361 "DemandedElts for scalable vectors must be 1 to represent all lanes");
3362 assert((!Op.getValueType().isFixedLengthVector() ||
3363 NumElts == Op.getValueType().getVectorNumElements()) &&
3364 "Unexpected vector size");
3365
3366 if (!DemandedElts)
3367 return Known; // No demanded elts, better to assume we don't know anything.
3368
3369 unsigned Opcode = Op.getOpcode();
3370 switch (Opcode) {
3371 case ISD::MERGE_VALUES:
3372 return computeKnownBits(Op.getOperand(Op.getResNo()), DemandedElts,
3373 Depth + 1);
3374 case ISD::SPLAT_VECTOR: {
3375 SDValue SrcOp = Op.getOperand(0);
3376 assert(SrcOp.getValueSizeInBits() >= BitWidth &&
3377 "Expected SPLAT_VECTOR implicit truncation");
3378 // Implicitly truncate the bits to match the official semantics of
3379 // SPLAT_VECTOR.
3380 Known = computeKnownBits(SrcOp, Depth + 1).trunc(BitWidth);
3381 break;
3382 }
3384 unsigned ScalarSize = Op.getOperand(0).getScalarValueSizeInBits();
3385 assert(ScalarSize * Op.getNumOperands() == BitWidth &&
3386 "Expected SPLAT_VECTOR_PARTS scalars to cover element width");
3387 for (auto [I, SrcOp] : enumerate(Op->ops())) {
3388 Known.insertBits(computeKnownBits(SrcOp, Depth + 1), ScalarSize * I);
3389 }
3390 break;
3391 }
3392 case ISD::STEP_VECTOR: {
3393 const APInt &Step = Op.getConstantOperandAPInt(0);
3394
3395 if (Step.isPowerOf2())
3396 Known.Zero.setLowBits(Step.logBase2());
3397
3399
3400 if (!isUIntN(BitWidth, Op.getValueType().getVectorMinNumElements()))
3401 break;
3402 const APInt MinNumElts =
3403 APInt(BitWidth, Op.getValueType().getVectorMinNumElements());
3404
3405 bool Overflow;
3406 const APInt MaxNumElts = getVScaleRange(&F, BitWidth)
3408 .umul_ov(MinNumElts, Overflow);
3409 if (Overflow)
3410 break;
3411
3412 const APInt MaxValue = (MaxNumElts - 1).umul_ov(Step, Overflow);
3413 if (Overflow)
3414 break;
3415
3416 Known.Zero.setHighBits(MaxValue.countl_zero());
3417 break;
3418 }
3419 case ISD::BUILD_VECTOR:
3420 assert(!Op.getValueType().isScalableVector());
3421 // Collect the known bits that are shared by every demanded vector element.
3422 Known.setAllConflict();
3423 for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) {
3424 if (!DemandedElts[i])
3425 continue;
3426
3427 SDValue SrcOp = Op.getOperand(i);
3428 Known2 = computeKnownBits(SrcOp, Depth + 1);
3429
3430 // BUILD_VECTOR can implicitly truncate sources, we must handle this.
3431 if (SrcOp.getValueSizeInBits() != BitWidth) {
3432 assert(SrcOp.getValueSizeInBits() > BitWidth &&
3433 "Expected BUILD_VECTOR implicit truncation");
3434 Known2 = Known2.trunc(BitWidth);
3435 }
3436
3437 // Known bits are the values that are shared by every demanded element.
3438 Known = Known.intersectWith(Known2);
3439
3440 // If we don't know any bits, early out.
3441 if (Known.isUnknown())
3442 break;
3443 }
3444 break;
3445 case ISD::VECTOR_COMPRESS: {
3446 SDValue Vec = Op.getOperand(0);
3447 SDValue PassThru = Op.getOperand(2);
3448 Known = computeKnownBits(PassThru, DemandedElts, Depth + 1);
3449 // If we don't know any bits, early out.
3450 if (Known.isUnknown())
3451 break;
3452 Known2 = computeKnownBits(Vec, Depth + 1);
3453 Known = Known.intersectWith(Known2);
3454 break;
3455 }
3456 case ISD::VECTOR_SHUFFLE: {
3457 assert(!Op.getValueType().isScalableVector());
3458 // Collect the known bits that are shared by every vector element referenced
3459 // by the shuffle.
3460 APInt DemandedLHS, DemandedRHS;
3462 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
3463 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
3464 DemandedLHS, DemandedRHS))
3465 break;
3466
3467 // Known bits are the values that are shared by every demanded element.
3468 Known.setAllConflict();
3469 if (!!DemandedLHS) {
3470 SDValue LHS = Op.getOperand(0);
3471 Known2 = computeKnownBits(LHS, DemandedLHS, Depth + 1);
3472 Known = Known.intersectWith(Known2);
3473 }
3474 // If we don't know any bits, early out.
3475 if (Known.isUnknown())
3476 break;
3477 if (!!DemandedRHS) {
3478 SDValue RHS = Op.getOperand(1);
3479 Known2 = computeKnownBits(RHS, DemandedRHS, Depth + 1);
3480 Known = Known.intersectWith(Known2);
3481 }
3482 break;
3483 }
3484 case ISD::VSCALE: {
3486 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
3487 Known = getVScaleRange(&F, BitWidth).multiply(Multiplier).toKnownBits();
3488 break;
3489 }
3490 case ISD::CONCAT_VECTORS: {
3491 if (Op.getValueType().isScalableVector())
3492 break;
3493 // Split DemandedElts and test each of the demanded subvectors.
3494 Known.setAllConflict();
3495 EVT SubVectorVT = Op.getOperand(0).getValueType();
3496 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
3497 unsigned NumSubVectors = Op.getNumOperands();
3498 for (unsigned i = 0; i != NumSubVectors; ++i) {
3499 APInt DemandedSub =
3500 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
3501 if (!!DemandedSub) {
3502 SDValue Sub = Op.getOperand(i);
3503 Known2 = computeKnownBits(Sub, DemandedSub, Depth + 1);
3504 Known = Known.intersectWith(Known2);
3505 }
3506 // If we don't know any bits, early out.
3507 if (Known.isUnknown())
3508 break;
3509 }
3510 break;
3511 }
3512 case ISD::INSERT_SUBVECTOR: {
3513 if (Op.getValueType().isScalableVector())
3514 break;
3515 // Demand any elements from the subvector and the remainder from the src its
3516 // inserted into.
3517 SDValue Src = Op.getOperand(0);
3518 SDValue Sub = Op.getOperand(1);
3519 uint64_t Idx = Op.getConstantOperandVal(2);
3520 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3521 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3522 APInt DemandedSrcElts = DemandedElts;
3523 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3524
3525 Known.setAllConflict();
3526 if (!!DemandedSubElts) {
3527 Known = computeKnownBits(Sub, DemandedSubElts, Depth + 1);
3528 if (Known.isUnknown())
3529 break; // early-out.
3530 }
3531 if (!!DemandedSrcElts) {
3532 Known2 = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3533 Known = Known.intersectWith(Known2);
3534 }
3535 break;
3536 }
3538 // Offset the demanded elts by the subvector index.
3539 SDValue Src = Op.getOperand(0);
3540
3541 APInt DemandedSrcElts;
3542 if (Src.getValueType().isScalableVector())
3543 DemandedSrcElts = APInt(1, 1); // <=> 'demand all elements'
3544 else {
3545 uint64_t Idx = Op.getConstantOperandVal(1);
3546 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3547 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3548 }
3549 Known = computeKnownBits(Src, DemandedSrcElts, Depth + 1);
3550 break;
3551 }
3552 case ISD::SCALAR_TO_VECTOR: {
3553 if (Op.getValueType().isScalableVector())
3554 break;
3555 // We know about scalar_to_vector as much as we know about it source,
3556 // which becomes the first element of otherwise unknown vector.
3557 if (DemandedElts != 1)
3558 break;
3559
3560 SDValue N0 = Op.getOperand(0);
3561 Known = computeKnownBits(N0, Depth + 1);
3562 if (N0.getValueSizeInBits() != BitWidth)
3563 Known = Known.trunc(BitWidth);
3564
3565 break;
3566 }
3567 case ISD::BITCAST: {
3568 if (Op.getValueType().isScalableVector())
3569 break;
3570
3571 SDValue N0 = Op.getOperand(0);
3572 EVT SubVT = N0.getValueType();
3573 unsigned SubBitWidth = SubVT.getScalarSizeInBits();
3574
3575 // Ignore bitcasts from unsupported types.
3576 if (!(SubVT.isInteger() || SubVT.isFloatingPoint()))
3577 break;
3578
3579 // Fast handling of 'identity' bitcasts.
3580 if (BitWidth == SubBitWidth) {
3581 Known = computeKnownBits(N0, DemandedElts, Depth + 1);
3582 break;
3583 }
3584
3585 bool IsLE = getDataLayout().isLittleEndian();
3586
3587 // Bitcast 'small element' vector to 'large element' scalar/vector.
3588 if ((BitWidth % SubBitWidth) == 0) {
3589 assert(N0.getValueType().isVector() && "Expected bitcast from vector");
3590
3591 // Collect known bits for the (larger) output by collecting the known
3592 // bits from each set of sub elements and shift these into place.
3593 // We need to separately call computeKnownBits for each set of
3594 // sub elements as the knownbits for each is likely to be different.
3595 unsigned SubScale = BitWidth / SubBitWidth;
3596 APInt SubDemandedElts(NumElts * SubScale, 0);
3597 for (unsigned i = 0; i != NumElts; ++i)
3598 if (DemandedElts[i])
3599 SubDemandedElts.setBit(i * SubScale);
3600
3601 for (unsigned i = 0; i != SubScale; ++i) {
3602 Known2 = computeKnownBits(N0, SubDemandedElts.shl(i),
3603 Depth + 1);
3604 unsigned Shifts = IsLE ? i : SubScale - 1 - i;
3605 Known.insertBits(Known2, SubBitWidth * Shifts);
3606 }
3607 }
3608
3609 // Bitcast 'large element' scalar/vector to 'small element' vector.
3610 if ((SubBitWidth % BitWidth) == 0) {
3611 assert(Op.getValueType().isVector() && "Expected bitcast to vector");
3612
3613 // Collect known bits for the (smaller) output by collecting the known
3614 // bits from the overlapping larger input elements and extracting the
3615 // sub sections we actually care about.
3616 unsigned SubScale = SubBitWidth / BitWidth;
3617 APInt SubDemandedElts =
3618 APIntOps::ScaleBitMask(DemandedElts, NumElts / SubScale);
3619 Known2 = computeKnownBits(N0, SubDemandedElts, Depth + 1);
3620
3621 Known.setAllConflict();
3622 for (unsigned i = 0; i != NumElts; ++i)
3623 if (DemandedElts[i]) {
3624 unsigned Shifts = IsLE ? i : NumElts - 1 - i;
3625 unsigned Offset = (Shifts % SubScale) * BitWidth;
3626 Known = Known.intersectWith(Known2.extractBits(BitWidth, Offset));
3627 // If we don't know any bits, early out.
3628 if (Known.isUnknown())
3629 break;
3630 }
3631 }
3632 break;
3633 }
3634 case ISD::AND:
3635 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3636 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3637
3638 Known &= Known2;
3639 break;
3640 case ISD::OR:
3641 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3642 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3643
3644 Known |= Known2;
3645 break;
3646 case ISD::XOR:
3647 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3648 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3649
3650 Known ^= Known2;
3651 break;
3652 case ISD::MUL: {
3653 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3654 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3655 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3656 // TODO: SelfMultiply can be poison, but not undef.
3657 if (SelfMultiply)
3658 SelfMultiply &= isGuaranteedNotToBeUndefOrPoison(
3659 Op.getOperand(0), DemandedElts, false, Depth + 1);
3660 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3661
3662 // If the multiplication is known not to overflow, the product of a number
3663 // with itself is non-negative. Only do this if we didn't already computed
3664 // the opposite value for the sign bit.
3665 if (Op->getFlags().hasNoSignedWrap() &&
3666 Op.getOperand(0) == Op.getOperand(1) &&
3667 !Known.isNegative())
3668 Known.makeNonNegative();
3669 break;
3670 }
3671 case ISD::MULHU: {
3672 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3673 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3674 Known = KnownBits::mulhu(Known, Known2);
3675 break;
3676 }
3677 case ISD::MULHS: {
3678 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3679 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3680 Known = KnownBits::mulhs(Known, Known2);
3681 break;
3682 }
3683 case ISD::ABDU: {
3684 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3685 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3686 Known = KnownBits::abdu(Known, Known2);
3687 break;
3688 }
3689 case ISD::ABDS: {
3690 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3691 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3692 Known = KnownBits::abds(Known, Known2);
3693 unsigned SignBits1 =
3694 ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
3695 if (SignBits1 == 1)
3696 break;
3697 unsigned SignBits0 =
3698 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
3699 Known.Zero.setHighBits(std::min(SignBits0, SignBits1) - 1);
3700 break;
3701 }
3702 case ISD::UMUL_LOHI: {
3703 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3704 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3705 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3706 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3707 if (Op.getResNo() == 0)
3708 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3709 else
3710 Known = KnownBits::mulhu(Known, Known2);
3711 break;
3712 }
3713 case ISD::SMUL_LOHI: {
3714 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3715 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3716 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3717 bool SelfMultiply = Op.getOperand(0) == Op.getOperand(1);
3718 if (Op.getResNo() == 0)
3719 Known = KnownBits::mul(Known, Known2, SelfMultiply);
3720 else
3721 Known = KnownBits::mulhs(Known, Known2);
3722 break;
3723 }
3724 case ISD::AVGFLOORU: {
3725 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3726 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3727 Known = KnownBits::avgFloorU(Known, Known2);
3728 break;
3729 }
3730 case ISD::AVGCEILU: {
3731 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3732 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3733 Known = KnownBits::avgCeilU(Known, Known2);
3734 break;
3735 }
3736 case ISD::AVGFLOORS: {
3737 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3738 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3739 Known = KnownBits::avgFloorS(Known, Known2);
3740 break;
3741 }
3742 case ISD::AVGCEILS: {
3743 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3744 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3745 Known = KnownBits::avgCeilS(Known, Known2);
3746 break;
3747 }
3748 case ISD::SELECT:
3749 case ISD::VSELECT:
3750 Known = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3751 // If we don't know any bits, early out.
3752 if (Known.isUnknown())
3753 break;
3754 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth+1);
3755
3756 // Only known if known in both the LHS and RHS.
3757 Known = Known.intersectWith(Known2);
3758 break;
3759 case ISD::SELECT_CC:
3760 Known = computeKnownBits(Op.getOperand(3), DemandedElts, Depth+1);
3761 // If we don't know any bits, early out.
3762 if (Known.isUnknown())
3763 break;
3764 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth+1);
3765
3766 // Only known if known in both the LHS and RHS.
3767 Known = Known.intersectWith(Known2);
3768 break;
3769 case ISD::SMULO:
3770 case ISD::UMULO:
3771 if (Op.getResNo() != 1)
3772 break;
3773 // The boolean result conforms to getBooleanContents.
3774 // If we know the result of a setcc has the top bits zero, use this info.
3775 // We know that we have an integer-based boolean since these operations
3776 // are only available for integer.
3777 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
3779 BitWidth > 1)
3780 Known.Zero.setBitsFrom(1);
3781 break;
3782 case ISD::SETCC:
3783 case ISD::SETCCCARRY:
3784 case ISD::STRICT_FSETCC:
3785 case ISD::STRICT_FSETCCS: {
3786 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
3787 // If we know the result of a setcc has the top bits zero, use this info.
3788 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
3790 BitWidth > 1)
3791 Known.Zero.setBitsFrom(1);
3792 break;
3793 }
3794 case ISD::SHL: {
3795 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3796 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3797
3798 bool NUW = Op->getFlags().hasNoUnsignedWrap();
3799 bool NSW = Op->getFlags().hasNoSignedWrap();
3800
3801 bool ShAmtNonZero = Known2.isNonZero();
3802
3803 Known = KnownBits::shl(Known, Known2, NUW, NSW, ShAmtNonZero);
3804
3805 // Minimum shift low bits are known zero.
3806 if (std::optional<unsigned> ShMinAmt =
3807 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3808 Known.Zero.setLowBits(*ShMinAmt);
3809 break;
3810 }
3811 case ISD::SRL:
3812 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3813 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3814 Known = KnownBits::lshr(Known, Known2, /*ShAmtNonZero=*/false,
3815 Op->getFlags().hasExact());
3816
3817 // Minimum shift high bits are known zero.
3818 if (std::optional<unsigned> ShMinAmt =
3819 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
3820 Known.Zero.setHighBits(*ShMinAmt);
3821 break;
3822 case ISD::SRA:
3823 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3824 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3825 Known = KnownBits::ashr(Known, Known2, /*ShAmtNonZero=*/false,
3826 Op->getFlags().hasExact());
3827 break;
3828 case ISD::ROTL:
3829 case ISD::ROTR:
3830 if (ConstantSDNode *C =
3831 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
3832 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3833
3834 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3835
3836 // Canonicalize to ROTR.
3837 if (Opcode == ISD::ROTL && Amt != 0)
3838 Amt = BitWidth - Amt;
3839
3840 Known.Zero = Known.Zero.rotr(Amt);
3841 Known.One = Known.One.rotr(Amt);
3842 }
3843 break;
3844 case ISD::FSHL:
3845 case ISD::FSHR:
3846 if (ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(2), DemandedElts)) {
3847 unsigned Amt = C->getAPIntValue().urem(BitWidth);
3848
3849 // For fshl, 0-shift returns the 1st arg.
3850 // For fshr, 0-shift returns the 2nd arg.
3851 if (Amt == 0) {
3852 Known = computeKnownBits(Op.getOperand(Opcode == ISD::FSHL ? 0 : 1),
3853 DemandedElts, Depth + 1);
3854 break;
3855 }
3856
3857 // fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
3858 // fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
3859 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3860 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3861 if (Opcode == ISD::FSHL) {
3862 Known <<= Amt;
3863 Known2 >>= BitWidth - Amt;
3864 } else {
3865 Known <<= BitWidth - Amt;
3866 Known2 >>= Amt;
3867 }
3868 Known = Known.unionWith(Known2);
3869 }
3870 break;
3871 case ISD::SHL_PARTS:
3872 case ISD::SRA_PARTS:
3873 case ISD::SRL_PARTS: {
3874 assert((Op.getResNo() == 0 || Op.getResNo() == 1) && "Unknown result");
3875
3876 // Collect lo/hi source values and concatenate.
3877 unsigned LoBits = Op.getOperand(0).getScalarValueSizeInBits();
3878 unsigned HiBits = Op.getOperand(1).getScalarValueSizeInBits();
3879 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3880 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3881 Known = Known2.concat(Known);
3882
3883 // Collect shift amount.
3884 Known2 = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
3885
3886 if (Opcode == ISD::SHL_PARTS)
3887 Known = KnownBits::shl(Known, Known2);
3888 else if (Opcode == ISD::SRA_PARTS)
3889 Known = KnownBits::ashr(Known, Known2);
3890 else // if (Opcode == ISD::SRL_PARTS)
3891 Known = KnownBits::lshr(Known, Known2);
3892
3893 // TODO: Minimum shift low/high bits are known zero.
3894
3895 if (Op.getResNo() == 0)
3896 Known = Known.extractBits(LoBits, 0);
3897 else
3898 Known = Known.extractBits(HiBits, LoBits);
3899 break;
3900 }
3902 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3903 EVT EVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
3904 Known = Known.sextInReg(EVT.getScalarSizeInBits());
3905 break;
3906 }
3907 case ISD::CTTZ:
3908 case ISD::CTTZ_ZERO_UNDEF: {
3909 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3910 // If we have a known 1, its position is our upper bound.
3911 unsigned PossibleTZ = Known2.countMaxTrailingZeros();
3912 unsigned LowBits = llvm::bit_width(PossibleTZ);
3913 Known.Zero.setBitsFrom(LowBits);
3914 break;
3915 }
3916 case ISD::CTLZ:
3917 case ISD::CTLZ_ZERO_UNDEF: {
3918 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3919 // If we have a known 1, its position is our upper bound.
3920 unsigned PossibleLZ = Known2.countMaxLeadingZeros();
3921 unsigned LowBits = llvm::bit_width(PossibleLZ);
3922 Known.Zero.setBitsFrom(LowBits);
3923 break;
3924 }
3925 case ISD::CTLS: {
3926 unsigned MinRedundantSignBits =
3927 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1;
3928 ConstantRange Range(APInt(BitWidth, MinRedundantSignBits),
3930 Known = Range.toKnownBits();
3931 break;
3932 }
3933 case ISD::CTPOP: {
3934 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3935 // If we know some of the bits are zero, they can't be one.
3936 unsigned PossibleOnes = Known2.countMaxPopulation();
3937 Known.Zero.setBitsFrom(llvm::bit_width(PossibleOnes));
3938 break;
3939 }
3940 case ISD::PARITY: {
3941 // Parity returns 0 everywhere but the LSB.
3942 Known.Zero.setBitsFrom(1);
3943 break;
3944 }
3945 case ISD::CLMUL: {
3946 Known = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
3947 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
3948 Known = KnownBits::clmul(Known, Known2);
3949 break;
3950 }
3951 case ISD::MGATHER:
3952 case ISD::MLOAD: {
3953 ISD::LoadExtType ETy =
3954 (Opcode == ISD::MGATHER)
3955 ? cast<MaskedGatherSDNode>(Op)->getExtensionType()
3956 : cast<MaskedLoadSDNode>(Op)->getExtensionType();
3957 if (ETy == ISD::ZEXTLOAD) {
3958 EVT MemVT = cast<MemSDNode>(Op)->getMemoryVT();
3959 KnownBits Known0(MemVT.getScalarSizeInBits());
3960 return Known0.zext(BitWidth);
3961 }
3962 break;
3963 }
3964 case ISD::LOAD: {
3966 const Constant *Cst = TLI->getTargetConstantFromLoad(LD);
3967 if (ISD::isNON_EXTLoad(LD) && Cst) {
3968 // Determine any common known bits from the loaded constant pool value.
3969 Type *CstTy = Cst->getType();
3970 if ((NumElts * BitWidth) == CstTy->getPrimitiveSizeInBits() &&
3971 !Op.getValueType().isScalableVector()) {
3972 // If its a vector splat, then we can (quickly) reuse the scalar path.
3973 // NOTE: We assume all elements match and none are UNDEF.
3974 if (CstTy->isVectorTy()) {
3975 if (const Constant *Splat = Cst->getSplatValue()) {
3976 Cst = Splat;
3977 CstTy = Cst->getType();
3978 }
3979 }
3980 // TODO - do we need to handle different bitwidths?
3981 if (CstTy->isVectorTy() && BitWidth == CstTy->getScalarSizeInBits()) {
3982 // Iterate across all vector elements finding common known bits.
3983 Known.setAllConflict();
3984 for (unsigned i = 0; i != NumElts; ++i) {
3985 if (!DemandedElts[i])
3986 continue;
3987 if (Constant *Elt = Cst->getAggregateElement(i)) {
3988 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
3989 const APInt &Value = CInt->getValue();
3990 Known.One &= Value;
3991 Known.Zero &= ~Value;
3992 continue;
3993 }
3994 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
3995 APInt Value = CFP->getValueAPF().bitcastToAPInt();
3996 Known.One &= Value;
3997 Known.Zero &= ~Value;
3998 continue;
3999 }
4000 }
4001 Known.One.clearAllBits();
4002 Known.Zero.clearAllBits();
4003 break;
4004 }
4005 } else if (BitWidth == CstTy->getPrimitiveSizeInBits()) {
4006 if (auto *CInt = dyn_cast<ConstantInt>(Cst)) {
4007 Known = KnownBits::makeConstant(CInt->getValue());
4008 } else if (auto *CFP = dyn_cast<ConstantFP>(Cst)) {
4009 Known =
4010 KnownBits::makeConstant(CFP->getValueAPF().bitcastToAPInt());
4011 }
4012 }
4013 }
4014 } else if (Op.getResNo() == 0) {
4015 unsigned ScalarMemorySize = LD->getMemoryVT().getScalarSizeInBits();
4016 KnownBits KnownScalarMemory(ScalarMemorySize);
4017 if (const MDNode *MD = LD->getRanges())
4018 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4019
4020 // Extend the Known bits from memory to the size of the scalar result.
4021 if (ISD::isZEXTLoad(Op.getNode()))
4022 Known = KnownScalarMemory.zext(BitWidth);
4023 else if (ISD::isSEXTLoad(Op.getNode()))
4024 Known = KnownScalarMemory.sext(BitWidth);
4025 else if (ISD::isEXTLoad(Op.getNode()))
4026 Known = KnownScalarMemory.anyext(BitWidth);
4027 else
4028 Known = KnownScalarMemory;
4029 assert(Known.getBitWidth() == BitWidth);
4030 return Known;
4031 }
4032 break;
4033 }
4035 if (Op.getValueType().isScalableVector())
4036 break;
4037 EVT InVT = Op.getOperand(0).getValueType();
4038 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4039 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4040 Known = Known.zext(BitWidth);
4041 break;
4042 }
4043 case ISD::ZERO_EXTEND: {
4044 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4045 Known = Known.zext(BitWidth);
4046 break;
4047 }
4049 if (Op.getValueType().isScalableVector())
4050 break;
4051 EVT InVT = Op.getOperand(0).getValueType();
4052 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4053 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4054 // If the sign bit is known to be zero or one, then sext will extend
4055 // it to the top bits, else it will just zext.
4056 Known = Known.sext(BitWidth);
4057 break;
4058 }
4059 case ISD::SIGN_EXTEND: {
4060 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4061 // If the sign bit is known to be zero or one, then sext will extend
4062 // it to the top bits, else it will just zext.
4063 Known = Known.sext(BitWidth);
4064 break;
4065 }
4067 if (Op.getValueType().isScalableVector())
4068 break;
4069 EVT InVT = Op.getOperand(0).getValueType();
4070 APInt InDemandedElts = DemandedElts.zext(InVT.getVectorNumElements());
4071 Known = computeKnownBits(Op.getOperand(0), InDemandedElts, Depth + 1);
4072 Known = Known.anyext(BitWidth);
4073 break;
4074 }
4075 case ISD::ANY_EXTEND: {
4076 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4077 Known = Known.anyext(BitWidth);
4078 break;
4079 }
4080 case ISD::TRUNCATE: {
4081 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4082 Known = Known.trunc(BitWidth);
4083 break;
4084 }
4085 case ISD::TRUNCATE_SSAT_S: {
4086 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4087 Known = Known.truncSSat(BitWidth);
4088 break;
4089 }
4090 case ISD::TRUNCATE_SSAT_U: {
4091 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4092 Known = Known.truncSSatU(BitWidth);
4093 break;
4094 }
4095 case ISD::TRUNCATE_USAT_U: {
4096 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4097 Known = Known.truncUSat(BitWidth);
4098 break;
4099 }
4100 case ISD::AssertZext: {
4101 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4103 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4104 Known.Zero |= (~InMask);
4105 Known.One &= (~Known.Zero);
4106 break;
4107 }
4108 case ISD::AssertAlign: {
4109 unsigned LogOfAlign = Log2(cast<AssertAlignSDNode>(Op)->getAlign());
4110 assert(LogOfAlign != 0);
4111
4112 // TODO: Should use maximum with source
4113 // If a node is guaranteed to be aligned, set low zero bits accordingly as
4114 // well as clearing one bits.
4115 Known.Zero.setLowBits(LogOfAlign);
4116 Known.One.clearLowBits(LogOfAlign);
4117 break;
4118 }
4119 case ISD::AssertNoFPClass: {
4120 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4121
4122 FPClassTest NoFPClass =
4123 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
4124 const FPClassTest NegativeTestMask = fcNan | fcNegative;
4125 if ((NoFPClass & NegativeTestMask) == NegativeTestMask) {
4126 // Cannot be negative.
4127 Known.makeNonNegative();
4128 }
4129
4130 const FPClassTest PositiveTestMask = fcNan | fcPositive;
4131 if ((NoFPClass & PositiveTestMask) == PositiveTestMask) {
4132 // Cannot be positive.
4133 Known.makeNegative();
4134 }
4135
4136 break;
4137 }
4138 case ISD::FGETSIGN:
4139 // All bits are zero except the low bit.
4140 Known.Zero.setBitsFrom(1);
4141 break;
4142 case ISD::ADD:
4143 case ISD::SUB: {
4144 SDNodeFlags Flags = Op.getNode()->getFlags();
4145 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4146 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4148 Op.getOpcode() == ISD::ADD, Flags.hasNoSignedWrap(),
4149 Flags.hasNoUnsignedWrap(), Known, Known2);
4150 break;
4151 }
4152 case ISD::USUBO:
4153 case ISD::SSUBO:
4154 case ISD::USUBO_CARRY:
4155 case ISD::SSUBO_CARRY:
4156 if (Op.getResNo() == 1) {
4157 // If we know the result of a setcc has the top bits zero, use this info.
4158 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4160 BitWidth > 1)
4161 Known.Zero.setBitsFrom(1);
4162 break;
4163 }
4164 [[fallthrough]];
4165 case ISD::SUBC: {
4166 assert(Op.getResNo() == 0 &&
4167 "We only compute knownbits for the difference here.");
4168
4169 // With USUBO_CARRY and SSUBO_CARRY a borrow bit may be added in.
4170 KnownBits Borrow(1);
4171 if (Opcode == ISD::USUBO_CARRY || Opcode == ISD::SSUBO_CARRY) {
4172 Borrow = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4173 // Borrow has bit width 1
4174 Borrow = Borrow.trunc(1);
4175 } else {
4176 Borrow.setAllZero();
4177 }
4178
4179 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4180 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4181 Known = KnownBits::computeForSubBorrow(Known, Known2, Borrow);
4182 break;
4183 }
4184 case ISD::UADDO:
4185 case ISD::SADDO:
4186 case ISD::UADDO_CARRY:
4187 case ISD::SADDO_CARRY:
4188 if (Op.getResNo() == 1) {
4189 // If we know the result of a setcc has the top bits zero, use this info.
4190 if (TLI->getBooleanContents(Op.getOperand(0).getValueType()) ==
4192 BitWidth > 1)
4193 Known.Zero.setBitsFrom(1);
4194 break;
4195 }
4196 [[fallthrough]];
4197 case ISD::ADDC:
4198 case ISD::ADDE: {
4199 assert(Op.getResNo() == 0 && "We only compute knownbits for the sum here.");
4200
4201 // With ADDE and UADDO_CARRY, a carry bit may be added in.
4202 KnownBits Carry(1);
4203 if (Opcode == ISD::ADDE)
4204 // Can't track carry from glue, set carry to unknown.
4205 Carry.resetAll();
4206 else if (Opcode == ISD::UADDO_CARRY || Opcode == ISD::SADDO_CARRY) {
4207 Carry = computeKnownBits(Op.getOperand(2), DemandedElts, Depth + 1);
4208 // Carry has bit width 1
4209 Carry = Carry.trunc(1);
4210 } else {
4211 Carry.setAllZero();
4212 }
4213
4214 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4215 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4216 Known = KnownBits::computeForAddCarry(Known, Known2, Carry);
4217 break;
4218 }
4219 case ISD::UDIV: {
4220 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4221 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4222 Known = KnownBits::udiv(Known, Known2, Op->getFlags().hasExact());
4223 break;
4224 }
4225 case ISD::SDIV: {
4226 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4227 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4228 Known = KnownBits::sdiv(Known, Known2, Op->getFlags().hasExact());
4229 break;
4230 }
4231 case ISD::SREM: {
4232 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4233 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4234 Known = KnownBits::srem(Known, Known2);
4235 break;
4236 }
4237 case ISD::UREM: {
4238 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4239 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4240 Known = KnownBits::urem(Known, Known2);
4241 break;
4242 }
4243 case ISD::EXTRACT_ELEMENT: {
4244 Known = computeKnownBits(Op.getOperand(0), Depth+1);
4245 const unsigned Index = Op.getConstantOperandVal(1);
4246 const unsigned EltBitWidth = Op.getValueSizeInBits();
4247
4248 // Remove low part of known bits mask
4249 Known.Zero = Known.Zero.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4250 Known.One = Known.One.getHiBits(Known.getBitWidth() - Index * EltBitWidth);
4251
4252 // Remove high part of known bit mask
4253 Known = Known.trunc(EltBitWidth);
4254 break;
4255 }
4257 SDValue InVec = Op.getOperand(0);
4258 SDValue EltNo = Op.getOperand(1);
4259 EVT VecVT = InVec.getValueType();
4260 // computeKnownBits not yet implemented for scalable vectors.
4261 if (VecVT.isScalableVector())
4262 break;
4263 const unsigned EltBitWidth = VecVT.getScalarSizeInBits();
4264 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4265
4266 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
4267 // anything about the extended bits.
4268 if (BitWidth > EltBitWidth)
4269 Known = Known.trunc(EltBitWidth);
4270
4271 // If we know the element index, just demand that vector element, else for
4272 // an unknown element index, ignore DemandedElts and demand them all.
4273 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
4274 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4275 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
4276 DemandedSrcElts =
4277 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
4278
4279 Known = computeKnownBits(InVec, DemandedSrcElts, Depth + 1);
4280 if (BitWidth > EltBitWidth)
4281 Known = Known.anyext(BitWidth);
4282 break;
4283 }
4285 if (Op.getValueType().isScalableVector())
4286 break;
4287
4288 // If we know the element index, split the demand between the
4289 // source vector and the inserted element, otherwise assume we need
4290 // the original demanded vector elements and the value.
4291 SDValue InVec = Op.getOperand(0);
4292 SDValue InVal = Op.getOperand(1);
4293 SDValue EltNo = Op.getOperand(2);
4294 bool DemandedVal = true;
4295 APInt DemandedVecElts = DemandedElts;
4296 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
4297 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
4298 unsigned EltIdx = CEltNo->getZExtValue();
4299 DemandedVal = !!DemandedElts[EltIdx];
4300 DemandedVecElts.clearBit(EltIdx);
4301 }
4302 Known.setAllConflict();
4303 if (DemandedVal) {
4304 Known2 = computeKnownBits(InVal, Depth + 1);
4305 Known = Known.intersectWith(Known2.zextOrTrunc(BitWidth));
4306 }
4307 if (!!DemandedVecElts) {
4308 Known2 = computeKnownBits(InVec, DemandedVecElts, Depth + 1);
4309 Known = Known.intersectWith(Known2);
4310 }
4311 break;
4312 }
4313 case ISD::BITREVERSE: {
4314 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4315 Known = Known2.reverseBits();
4316 break;
4317 }
4318 case ISD::BSWAP: {
4319 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4320 Known = Known2.byteSwap();
4321 break;
4322 }
4323 case ISD::ABS: {
4324 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4325 Known = Known2.abs();
4326 Known.Zero.setHighBits(
4327 ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1) - 1);
4328 break;
4329 }
4330 case ISD::USUBSAT: {
4331 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4332 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4333 Known = KnownBits::usub_sat(Known, Known2);
4334 break;
4335 }
4336 case ISD::UMIN: {
4337 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4338 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4339 Known = KnownBits::umin(Known, Known2);
4340 break;
4341 }
4342 case ISD::UMAX: {
4343 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4344 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4345 Known = KnownBits::umax(Known, Known2);
4346 break;
4347 }
4348 case ISD::SMIN:
4349 case ISD::SMAX: {
4350 // If we have a clamp pattern, we know that the number of sign bits will be
4351 // the minimum of the clamp min/max range.
4352 bool IsMax = (Opcode == ISD::SMAX);
4353 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
4354 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
4355 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
4356 CstHigh =
4357 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
4358 if (CstLow && CstHigh) {
4359 if (!IsMax)
4360 std::swap(CstLow, CstHigh);
4361
4362 const APInt &ValueLow = CstLow->getAPIntValue();
4363 const APInt &ValueHigh = CstHigh->getAPIntValue();
4364 if (ValueLow.sle(ValueHigh)) {
4365 unsigned LowSignBits = ValueLow.getNumSignBits();
4366 unsigned HighSignBits = ValueHigh.getNumSignBits();
4367 unsigned MinSignBits = std::min(LowSignBits, HighSignBits);
4368 if (ValueLow.isNegative() && ValueHigh.isNegative()) {
4369 Known.One.setHighBits(MinSignBits);
4370 break;
4371 }
4372 if (ValueLow.isNonNegative() && ValueHigh.isNonNegative()) {
4373 Known.Zero.setHighBits(MinSignBits);
4374 break;
4375 }
4376 }
4377 }
4378
4379 Known = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4380 Known2 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
4381 if (IsMax)
4382 Known = KnownBits::smax(Known, Known2);
4383 else
4384 Known = KnownBits::smin(Known, Known2);
4385
4386 // For SMAX, if CstLow is non-negative we know the result will be
4387 // non-negative and thus all sign bits are 0.
4388 // TODO: There's an equivalent of this for smin with negative constant for
4389 // known ones.
4390 if (IsMax && CstLow) {
4391 const APInt &ValueLow = CstLow->getAPIntValue();
4392 if (ValueLow.isNonNegative()) {
4393 unsigned SignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4394 Known.Zero.setHighBits(std::min(SignBits, ValueLow.getNumSignBits()));
4395 }
4396 }
4397
4398 break;
4399 }
4400 case ISD::UINT_TO_FP: {
4401 Known.makeNonNegative();
4402 break;
4403 }
4404 case ISD::SINT_TO_FP: {
4405 Known2 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
4406 if (Known2.isNonNegative())
4407 Known.makeNonNegative();
4408 else if (Known2.isNegative())
4409 Known.makeNegative();
4410 break;
4411 }
4412 case ISD::FP_TO_UINT_SAT: {
4413 // FP_TO_UINT_SAT produces an unsigned value that fits in the saturating VT.
4414 EVT VT = cast<VTSDNode>(Op.getOperand(1))->getVT();
4416 break;
4417 }
4418 case ISD::ATOMIC_LOAD: {
4419 // If we are looking at the loaded value.
4420 if (Op.getResNo() == 0) {
4421 auto *AT = cast<AtomicSDNode>(Op);
4422 unsigned ScalarMemorySize = AT->getMemoryVT().getScalarSizeInBits();
4423 KnownBits KnownScalarMemory(ScalarMemorySize);
4424 if (const MDNode *MD = AT->getRanges())
4425 computeKnownBitsFromRangeMetadata(*MD, KnownScalarMemory);
4426
4427 switch (AT->getExtensionType()) {
4428 case ISD::ZEXTLOAD:
4429 Known = KnownScalarMemory.zext(BitWidth);
4430 break;
4431 case ISD::SEXTLOAD:
4432 Known = KnownScalarMemory.sext(BitWidth);
4433 break;
4434 case ISD::EXTLOAD:
4435 switch (TLI->getExtendForAtomicOps()) {
4436 case ISD::ZERO_EXTEND:
4437 Known = KnownScalarMemory.zext(BitWidth);
4438 break;
4439 case ISD::SIGN_EXTEND:
4440 Known = KnownScalarMemory.sext(BitWidth);
4441 break;
4442 default:
4443 Known = KnownScalarMemory.anyext(BitWidth);
4444 break;
4445 }
4446 break;
4447 case ISD::NON_EXTLOAD:
4448 Known = KnownScalarMemory;
4449 break;
4450 }
4451 assert(Known.getBitWidth() == BitWidth);
4452 }
4453 break;
4454 }
4456 if (Op.getResNo() == 1) {
4457 // The boolean result conforms to getBooleanContents.
4458 // If we know the result of a setcc has the top bits zero, use this info.
4459 // We know that we have an integer-based boolean since these operations
4460 // are only available for integer.
4461 if (TLI->getBooleanContents(Op.getValueType().isVector(), false) ==
4463 BitWidth > 1)
4464 Known.Zero.setBitsFrom(1);
4465 break;
4466 }
4467 [[fallthrough]];
4469 case ISD::ATOMIC_SWAP:
4480 case ISD::ATOMIC_LOAD_UMAX: {
4481 // If we are looking at the loaded value.
4482 if (Op.getResNo() == 0) {
4483 auto *AT = cast<AtomicSDNode>(Op);
4484 unsigned MemBits = AT->getMemoryVT().getScalarSizeInBits();
4485
4486 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
4487 Known.Zero.setBitsFrom(MemBits);
4488 }
4489 break;
4490 }
4491 case ISD::FrameIndex:
4493 TLI->computeKnownBitsForFrameIndex(cast<FrameIndexSDNode>(Op)->getIndex(),
4494 Known, getMachineFunction());
4495 break;
4496
4497 default:
4498 if (Opcode < ISD::BUILTIN_OP_END)
4499 break;
4500 [[fallthrough]];
4504 // TODO: Probably okay to remove after audit; here to reduce change size
4505 // in initial enablement patch for scalable vectors
4506 if (Op.getValueType().isScalableVector())
4507 break;
4508
4509 // Allow the target to implement this method for its nodes.
4510 TLI->computeKnownBitsForTargetNode(Op, Known, DemandedElts, *this, Depth);
4511 break;
4512 }
4513
4514 return Known;
4515}
4516
4517/// Convert ConstantRange OverflowResult into SelectionDAG::OverflowKind.
4530
4533 // X + 0 never overflow
4534 if (isNullConstant(N1))
4535 return OFK_Never;
4536
4537 // If both operands each have at least two sign bits, the addition
4538 // cannot overflow.
4539 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4540 return OFK_Never;
4541
4542 // TODO: Add ConstantRange::signedAddMayOverflow handling.
4543 return OFK_Sometime;
4544}
4545
4548 // X + 0 never overflow
4549 if (isNullConstant(N1))
4550 return OFK_Never;
4551
4552 // mulhi + 1 never overflow
4553 KnownBits N1Known = computeKnownBits(N1);
4554 if (N0.getOpcode() == ISD::UMUL_LOHI && N0.getResNo() == 1 &&
4555 N1Known.getMaxValue().ult(2))
4556 return OFK_Never;
4557
4558 KnownBits N0Known = computeKnownBits(N0);
4559 if (N1.getOpcode() == ISD::UMUL_LOHI && N1.getResNo() == 1 &&
4560 N0Known.getMaxValue().ult(2))
4561 return OFK_Never;
4562
4563 // Fallback to ConstantRange::unsignedAddMayOverflow handling.
4564 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4565 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4566 return mapOverflowResult(N0Range.unsignedAddMayOverflow(N1Range));
4567}
4568
4571 // X - 0 never overflow
4572 if (isNullConstant(N1))
4573 return OFK_Never;
4574
4575 // If both operands each have at least two sign bits, the subtraction
4576 // cannot overflow.
4577 if (ComputeNumSignBits(N0) > 1 && ComputeNumSignBits(N1) > 1)
4578 return OFK_Never;
4579
4580 KnownBits N0Known = computeKnownBits(N0);
4581 KnownBits N1Known = computeKnownBits(N1);
4582 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, true);
4583 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, true);
4584 return mapOverflowResult(N0Range.signedSubMayOverflow(N1Range));
4585}
4586
4589 // X - 0 never overflow
4590 if (isNullConstant(N1))
4591 return OFK_Never;
4592
4593 KnownBits N0Known = computeKnownBits(N0);
4594 KnownBits N1Known = computeKnownBits(N1);
4595 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4596 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4597 return mapOverflowResult(N0Range.unsignedSubMayOverflow(N1Range));
4598}
4599
4602 // X * 0 and X * 1 never overflow.
4603 if (isNullConstant(N1) || isOneConstant(N1))
4604 return OFK_Never;
4605
4606 KnownBits N0Known = computeKnownBits(N0);
4607 KnownBits N1Known = computeKnownBits(N1);
4608 ConstantRange N0Range = ConstantRange::fromKnownBits(N0Known, false);
4609 ConstantRange N1Range = ConstantRange::fromKnownBits(N1Known, false);
4610 return mapOverflowResult(N0Range.unsignedMulMayOverflow(N1Range));
4611}
4612
4615 // X * 0 and X * 1 never overflow.
4616 if (isNullConstant(N1) || isOneConstant(N1))
4617 return OFK_Never;
4618
4619 // Get the size of the result.
4620 unsigned BitWidth = N0.getScalarValueSizeInBits();
4621
4622 // Sum of the sign bits.
4623 unsigned SignBits = ComputeNumSignBits(N0) + ComputeNumSignBits(N1);
4624
4625 // If we have enough sign bits, then there's no overflow.
4626 if (SignBits > BitWidth + 1)
4627 return OFK_Never;
4628
4629 if (SignBits == BitWidth + 1) {
4630 // The overflow occurs when the true multiplication of the
4631 // the operands is the minimum negative number.
4632 KnownBits N0Known = computeKnownBits(N0);
4633 KnownBits N1Known = computeKnownBits(N1);
4634 // If one of the operands is non-negative, then there's no
4635 // overflow.
4636 if (N0Known.isNonNegative() || N1Known.isNonNegative())
4637 return OFK_Never;
4638 }
4639
4640 return OFK_Sometime;
4641}
4642
4644 unsigned Depth) const {
4645 EVT VT = Val.getValueType();
4646
4647 // Since the number of lanes in a scalable vector is unknown at compile time,
4648 // we track one bit which is implicitly broadcast to all lanes. This means
4649 // that all lanes in a scalable vector are considered demanded.
4650 APInt DemandedElts = VT.isFixedLengthVector()
4652 : APInt(1, 1);
4653
4654 return isKnownToBeAPowerOfTwo(Val, DemandedElts, OrZero, Depth);
4655}
4656
4658 const APInt &DemandedElts,
4659 bool OrZero, unsigned Depth) const {
4660 if (Depth >= MaxRecursionDepth)
4661 return false; // Limit search depth.
4662
4663 EVT OpVT = Val.getValueType();
4664 unsigned BitWidth = OpVT.getScalarSizeInBits();
4665 [[maybe_unused]] unsigned NumElts = DemandedElts.getBitWidth();
4666 assert((!OpVT.isScalableVector() || NumElts == 1) &&
4667 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4668 assert(
4669 (!OpVT.isFixedLengthVector() || NumElts == OpVT.getVectorNumElements()) &&
4670 "Unexpected vector size");
4671
4672 auto IsPowerOfTwoOrZero = [BitWidth, OrZero](const ConstantSDNode *C) {
4673 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
4674 return (OrZero && V.isZero()) || V.isPowerOf2();
4675 };
4676
4677 // Is the constant a known power of 2 or zero?
4678 if (ISD::matchUnaryPredicate(Val, IsPowerOfTwoOrZero))
4679 return true;
4680
4681 switch (Val.getOpcode()) {
4682 case ISD::BUILD_VECTOR:
4683 // Are all operands of a build vector constant powers of two or zero?
4684 if (all_of(enumerate(Val->ops()), [&](auto P) {
4685 auto *C = dyn_cast<ConstantSDNode>(P.value());
4686 return !DemandedElts[P.index()] || (C && IsPowerOfTwoOrZero(C));
4687 }))
4688 return true;
4689 break;
4690
4691 case ISD::SPLAT_VECTOR:
4692 // Is the operand of a splat vector a constant power of two?
4693 if (auto *C = dyn_cast<ConstantSDNode>(Val->getOperand(0)))
4694 if (IsPowerOfTwoOrZero(C))
4695 return true;
4696 break;
4697
4699 SDValue InVec = Val.getOperand(0);
4700 SDValue EltNo = Val.getOperand(1);
4701 EVT VecVT = InVec.getValueType();
4702
4703 // Skip scalable vectors or implicit extensions.
4704 if (VecVT.isScalableVector() ||
4705 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
4706 break;
4707
4708 // If we know the element index, just demand that vector element, else for
4709 // an unknown element index, ignore DemandedElts and demand them all.
4710 const unsigned NumSrcElts = VecVT.getVectorNumElements();
4711 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
4712 APInt DemandedSrcElts =
4713 ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts)
4714 ? APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue())
4715 : APInt::getAllOnes(NumSrcElts);
4716 return isKnownToBeAPowerOfTwo(InVec, DemandedSrcElts, OrZero, Depth + 1);
4717 }
4718
4719 case ISD::AND: {
4720 // Looking for `x & -x` pattern:
4721 // If x == 0:
4722 // x & -x -> 0
4723 // If x != 0:
4724 // x & -x -> non-zero pow2
4725 // so if we find the pattern return whether we know `x` is non-zero.
4726 SDValue X;
4727 if (sd_match(Val, m_And(m_Value(X), m_Neg(m_Deferred(X)))))
4728 return OrZero || isKnownNeverZero(X, DemandedElts, Depth);
4729 break;
4730 }
4731
4732 case ISD::SHL: {
4733 // A left-shift of a constant one will have exactly one bit set because
4734 // shifting the bit off the end is undefined.
4735 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4736 if (C && C->getAPIntValue() == 1)
4737 return true;
4738 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4739 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4740 Depth + 1);
4741 }
4742
4743 case ISD::SRL: {
4744 // A logical right-shift of a constant sign-bit will have exactly
4745 // one bit set.
4746 auto *C = isConstOrConstSplat(Val.getOperand(0), DemandedElts);
4747 if (C && C->getAPIntValue().isSignMask())
4748 return true;
4749 return (OrZero || isKnownNeverZero(Val, DemandedElts, Depth)) &&
4750 isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4751 Depth + 1);
4752 }
4753
4754 case ISD::ROTL:
4755 case ISD::ROTR:
4756 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4757 Depth + 1);
4758 case ISD::BSWAP:
4759 case ISD::BITREVERSE:
4760 return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
4761 Depth + 1);
4762
4763 case ISD::SMIN:
4764 case ISD::SMAX:
4765 case ISD::UMIN:
4766 case ISD::UMAX:
4767 return isKnownToBeAPowerOfTwo(Val.getOperand(1), /*OrZero=*/false,
4768 Depth + 1) &&
4769 isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4770 Depth + 1);
4771
4772 case ISD::SELECT:
4773 case ISD::VSELECT:
4774 return isKnownToBeAPowerOfTwo(Val.getOperand(2), DemandedElts, OrZero,
4775 Depth + 1) &&
4776 isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedElts, OrZero,
4777 Depth + 1);
4778
4779 case ISD::ZERO_EXTEND:
4780 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4781 Depth + 1);
4782
4783 case ISD::VSCALE:
4784 // vscale(power-of-two) is a power-of-two
4785 return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
4786 Depth + 1);
4787
4788 case ISD::VECTOR_SHUFFLE: {
4790 // Demanded elements with undef shuffle mask elements are unknown
4791 // - we cannot guarantee they are a power of two, so return false.
4792 APInt DemandedLHS, DemandedRHS;
4794 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4795 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4796 DemandedLHS, DemandedRHS))
4797 return false;
4798
4799 // All demanded elements from LHS must be known power of two.
4800 if (!!DemandedLHS && !isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedLHS,
4801 OrZero, Depth + 1))
4802 return false;
4803
4804 // All demanded elements from RHS must be known power of two.
4805 if (!!DemandedRHS && !isKnownToBeAPowerOfTwo(Val.getOperand(1), DemandedRHS,
4806 OrZero, Depth + 1))
4807 return false;
4808
4809 return true;
4810 }
4811 }
4812
4813 // More could be done here, though the above checks are enough
4814 // to handle some common cases.
4815 return false;
4816}
4817
4819 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Val, true))
4820 return C1->getValueAPF().getExactLog2Abs() >= 0;
4821
4822 if (Val.getOpcode() == ISD::UINT_TO_FP || Val.getOpcode() == ISD::SINT_TO_FP)
4823 return isKnownToBeAPowerOfTwo(Val.getOperand(0), Depth + 1);
4824
4825 return false;
4826}
4827
4829 EVT VT = Op.getValueType();
4830
4831 // Since the number of lanes in a scalable vector is unknown at compile time,
4832 // we track one bit which is implicitly broadcast to all lanes. This means
4833 // that all lanes in a scalable vector are considered demanded.
4834 APInt DemandedElts = VT.isFixedLengthVector()
4836 : APInt(1, 1);
4837 return ComputeNumSignBits(Op, DemandedElts, Depth);
4838}
4839
4840unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
4841 unsigned Depth) const {
4842 EVT VT = Op.getValueType();
4843 assert((VT.isInteger() || VT.isFloatingPoint()) && "Invalid VT!");
4844 unsigned VTBits = VT.getScalarSizeInBits();
4845 unsigned NumElts = DemandedElts.getBitWidth();
4846 unsigned Tmp, Tmp2;
4847 unsigned FirstAnswer = 1;
4848
4849 assert((!VT.isScalableVector() || NumElts == 1) &&
4850 "DemandedElts for scalable vectors must be 1 to represent all lanes");
4851
4852 if (auto *C = dyn_cast<ConstantSDNode>(Op)) {
4853 const APInt &Val = C->getAPIntValue();
4854 return Val.getNumSignBits();
4855 }
4856
4857 if (Depth >= MaxRecursionDepth)
4858 return 1; // Limit search depth.
4859
4860 if (!DemandedElts)
4861 return 1; // No demanded elts, better to assume we don't know anything.
4862
4863 unsigned Opcode = Op.getOpcode();
4864 switch (Opcode) {
4865 default: break;
4866 case ISD::AssertSext:
4867 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4868 return VTBits-Tmp+1;
4869 case ISD::AssertZext:
4870 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getSizeInBits();
4871 return VTBits-Tmp;
4872 case ISD::FREEZE:
4873 if (isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
4874 /*PoisonOnly=*/false))
4875 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
4876 break;
4877 case ISD::MERGE_VALUES:
4878 return ComputeNumSignBits(Op.getOperand(Op.getResNo()), DemandedElts,
4879 Depth + 1);
4880 case ISD::SPLAT_VECTOR: {
4881 // Check if the sign bits of source go down as far as the truncated value.
4882 unsigned NumSrcBits = Op.getOperand(0).getValueSizeInBits();
4883 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
4884 if (NumSrcSignBits > (NumSrcBits - VTBits))
4885 return NumSrcSignBits - (NumSrcBits - VTBits);
4886 break;
4887 }
4888 case ISD::BUILD_VECTOR:
4889 assert(!VT.isScalableVector());
4890 Tmp = VTBits;
4891 for (unsigned i = 0, e = Op.getNumOperands(); (i < e) && (Tmp > 1); ++i) {
4892 if (!DemandedElts[i])
4893 continue;
4894
4895 SDValue SrcOp = Op.getOperand(i);
4896 // BUILD_VECTOR can implicitly truncate sources, we handle this specially
4897 // for constant nodes to ensure we only look at the sign bits.
4899 APInt T = C->getAPIntValue().trunc(VTBits);
4900 Tmp2 = T.getNumSignBits();
4901 } else {
4902 Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1);
4903
4904 if (SrcOp.getValueSizeInBits() != VTBits) {
4905 assert(SrcOp.getValueSizeInBits() > VTBits &&
4906 "Expected BUILD_VECTOR implicit truncation");
4907 unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits;
4908 Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1);
4909 }
4910 }
4911 Tmp = std::min(Tmp, Tmp2);
4912 }
4913 return Tmp;
4914
4915 case ISD::VECTOR_COMPRESS: {
4916 SDValue Vec = Op.getOperand(0);
4917 SDValue PassThru = Op.getOperand(2);
4918 Tmp = ComputeNumSignBits(PassThru, DemandedElts, Depth + 1);
4919 if (Tmp == 1)
4920 return 1;
4921 Tmp2 = ComputeNumSignBits(Vec, Depth + 1);
4922 Tmp = std::min(Tmp, Tmp2);
4923 return Tmp;
4924 }
4925
4926 case ISD::VECTOR_SHUFFLE: {
4927 // Collect the minimum number of sign bits that are shared by every vector
4928 // element referenced by the shuffle.
4929 APInt DemandedLHS, DemandedRHS;
4931 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
4932 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
4933 DemandedLHS, DemandedRHS))
4934 return 1;
4935
4936 Tmp = std::numeric_limits<unsigned>::max();
4937 if (!!DemandedLHS)
4938 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedLHS, Depth + 1);
4939 if (!!DemandedRHS) {
4940 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedRHS, Depth + 1);
4941 Tmp = std::min(Tmp, Tmp2);
4942 }
4943 // If we don't know anything, early out and try computeKnownBits fall-back.
4944 if (Tmp == 1)
4945 break;
4946 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
4947 return Tmp;
4948 }
4949
4950 case ISD::BITCAST: {
4951 if (VT.isScalableVector())
4952 break;
4953 SDValue N0 = Op.getOperand(0);
4954 EVT SrcVT = N0.getValueType();
4955 unsigned SrcBits = SrcVT.getScalarSizeInBits();
4956
4957 // Ignore bitcasts from unsupported types..
4958 if (!(SrcVT.isInteger() || SrcVT.isFloatingPoint()))
4959 break;
4960
4961 // Fast handling of 'identity' bitcasts.
4962 if (VTBits == SrcBits)
4963 return ComputeNumSignBits(N0, DemandedElts, Depth + 1);
4964
4965 bool IsLE = getDataLayout().isLittleEndian();
4966
4967 // Bitcast 'large element' scalar/vector to 'small element' vector.
4968 if ((SrcBits % VTBits) == 0) {
4969 assert(VT.isVector() && "Expected bitcast to vector");
4970
4971 unsigned Scale = SrcBits / VTBits;
4972 APInt SrcDemandedElts =
4973 APIntOps::ScaleBitMask(DemandedElts, NumElts / Scale);
4974
4975 // Fast case - sign splat can be simply split across the small elements.
4976 Tmp = ComputeNumSignBits(N0, SrcDemandedElts, Depth + 1);
4977 if (Tmp == SrcBits)
4978 return VTBits;
4979
4980 // Slow case - determine how far the sign extends into each sub-element.
4981 Tmp2 = VTBits;
4982 for (unsigned i = 0; i != NumElts; ++i)
4983 if (DemandedElts[i]) {
4984 unsigned SubOffset = i % Scale;
4985 SubOffset = (IsLE ? ((Scale - 1) - SubOffset) : SubOffset);
4986 SubOffset = SubOffset * VTBits;
4987 if (Tmp <= SubOffset)
4988 return 1;
4989 Tmp2 = std::min(Tmp2, Tmp - SubOffset);
4990 }
4991 return Tmp2;
4992 }
4993 break;
4994 }
4995
4997 // FP_TO_SINT_SAT produces a signed value that fits in the saturating VT.
4998 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
4999 return VTBits - Tmp + 1;
5000 case ISD::SIGN_EXTEND:
5001 Tmp = VTBits - Op.getOperand(0).getScalarValueSizeInBits();
5002 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1) + Tmp;
5004 // Max of the input and what this extends.
5005 Tmp = cast<VTSDNode>(Op.getOperand(1))->getVT().getScalarSizeInBits();
5006 Tmp = VTBits-Tmp+1;
5007 Tmp2 = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5008 return std::max(Tmp, Tmp2);
5010 if (VT.isScalableVector())
5011 break;
5012 SDValue Src = Op.getOperand(0);
5013 EVT SrcVT = Src.getValueType();
5014 APInt DemandedSrcElts = DemandedElts.zext(SrcVT.getVectorNumElements());
5015 Tmp = VTBits - SrcVT.getScalarSizeInBits();
5016 return ComputeNumSignBits(Src, DemandedSrcElts, Depth+1) + Tmp;
5017 }
5018 case ISD::SRA:
5019 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5020 // SRA X, C -> adds C sign bits.
5021 if (std::optional<unsigned> ShAmt =
5022 getValidMinimumShiftAmount(Op, DemandedElts, Depth + 1))
5023 Tmp = std::min(Tmp + *ShAmt, VTBits);
5024 return Tmp;
5025 case ISD::SHL:
5026 if (std::optional<ConstantRange> ShAmtRange =
5027 getValidShiftAmountRange(Op, DemandedElts, Depth + 1)) {
5028 unsigned MaxShAmt = ShAmtRange->getUnsignedMax().getZExtValue();
5029 unsigned MinShAmt = ShAmtRange->getUnsignedMin().getZExtValue();
5030 // Try to look through ZERO/SIGN/ANY_EXTEND. If all extended bits are
5031 // shifted out, then we can compute the number of sign bits for the
5032 // operand being extended. A future improvement could be to pass along the
5033 // "shifted left by" information in the recursive calls to
5034 // ComputeKnownSignBits. Allowing us to handle this more generically.
5035 if (ISD::isExtOpcode(Op.getOperand(0).getOpcode())) {
5036 SDValue Ext = Op.getOperand(0);
5037 EVT ExtVT = Ext.getValueType();
5038 SDValue Extendee = Ext.getOperand(0);
5039 EVT ExtendeeVT = Extendee.getValueType();
5040 unsigned SizeDifference =
5041 ExtVT.getScalarSizeInBits() - ExtendeeVT.getScalarSizeInBits();
5042 if (SizeDifference <= MinShAmt) {
5043 Tmp = SizeDifference +
5044 ComputeNumSignBits(Extendee, DemandedElts, Depth + 1);
5045 if (MaxShAmt < Tmp)
5046 return Tmp - MaxShAmt;
5047 }
5048 }
5049 // shl destroys sign bits, ensure it doesn't shift out all sign bits.
5050 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5051 if (MaxShAmt < Tmp)
5052 return Tmp - MaxShAmt;
5053 }
5054 break;
5055 case ISD::AND:
5056 case ISD::OR:
5057 case ISD::XOR: // NOT is handled here.
5058 // Logical binary ops preserve the number of sign bits at the worst.
5059 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth+1);
5060 if (Tmp != 1) {
5061 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5062 FirstAnswer = std::min(Tmp, Tmp2);
5063 // We computed what we know about the sign bits as our first
5064 // answer. Now proceed to the generic code that uses
5065 // computeKnownBits, and pick whichever answer is better.
5066 }
5067 break;
5068
5069 case ISD::SELECT:
5070 case ISD::VSELECT:
5071 Tmp = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth+1);
5072 if (Tmp == 1) return 1; // Early out.
5073 Tmp2 = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5074 return std::min(Tmp, Tmp2);
5075 case ISD::SELECT_CC:
5076 Tmp = ComputeNumSignBits(Op.getOperand(2), DemandedElts, Depth+1);
5077 if (Tmp == 1) return 1; // Early out.
5078 Tmp2 = ComputeNumSignBits(Op.getOperand(3), DemandedElts, Depth+1);
5079 return std::min(Tmp, Tmp2);
5080
5081 case ISD::SMIN:
5082 case ISD::SMAX: {
5083 // If we have a clamp pattern, we know that the number of sign bits will be
5084 // the minimum of the clamp min/max range.
5085 bool IsMax = (Opcode == ISD::SMAX);
5086 ConstantSDNode *CstLow = nullptr, *CstHigh = nullptr;
5087 if ((CstLow = isConstOrConstSplat(Op.getOperand(1), DemandedElts)))
5088 if (Op.getOperand(0).getOpcode() == (IsMax ? ISD::SMIN : ISD::SMAX))
5089 CstHigh =
5090 isConstOrConstSplat(Op.getOperand(0).getOperand(1), DemandedElts);
5091 if (CstLow && CstHigh) {
5092 if (!IsMax)
5093 std::swap(CstLow, CstHigh);
5094 if (CstLow->getAPIntValue().sle(CstHigh->getAPIntValue())) {
5095 Tmp = CstLow->getAPIntValue().getNumSignBits();
5096 Tmp2 = CstHigh->getAPIntValue().getNumSignBits();
5097 return std::min(Tmp, Tmp2);
5098 }
5099 }
5100
5101 // Fallback - just get the minimum number of sign bits of the operands.
5102 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5103 if (Tmp == 1)
5104 return 1; // Early out.
5105 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5106 return std::min(Tmp, Tmp2);
5107 }
5108 case ISD::UMIN:
5109 case ISD::UMAX:
5110 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5111 if (Tmp == 1)
5112 return 1; // Early out.
5113 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5114 return std::min(Tmp, Tmp2);
5115 case ISD::SSUBO_CARRY:
5116 case ISD::USUBO_CARRY:
5117 // sub_carry(x,x,c) -> 0/-1 (sext carry)
5118 if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
5119 return VTBits;
5120 [[fallthrough]];
5121 case ISD::SADDO:
5122 case ISD::UADDO:
5123 case ISD::SADDO_CARRY:
5124 case ISD::UADDO_CARRY:
5125 case ISD::SSUBO:
5126 case ISD::USUBO:
5127 case ISD::SMULO:
5128 case ISD::UMULO:
5129 if (Op.getResNo() != 1)
5130 break;
5131 // The boolean result conforms to getBooleanContents. Fall through.
5132 // If setcc returns 0/-1, all bits are sign bits.
5133 // We know that we have an integer-based boolean since these operations
5134 // are only available for integer.
5135 if (TLI->getBooleanContents(VT.isVector(), false) ==
5137 return VTBits;
5138 break;
5139 case ISD::SETCC:
5140 case ISD::SETCCCARRY:
5141 case ISD::STRICT_FSETCC:
5142 case ISD::STRICT_FSETCCS: {
5143 unsigned OpNo = Op->isStrictFPOpcode() ? 1 : 0;
5144 // If setcc returns 0/-1, all bits are sign bits.
5145 if (TLI->getBooleanContents(Op.getOperand(OpNo).getValueType()) ==
5147 return VTBits;
5148 break;
5149 }
5150 case ISD::ROTL:
5151 case ISD::ROTR:
5152 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5153
5154 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
5155 if (Tmp == VTBits)
5156 return VTBits;
5157
5158 if (ConstantSDNode *C =
5159 isConstOrConstSplat(Op.getOperand(1), DemandedElts)) {
5160 unsigned RotAmt = C->getAPIntValue().urem(VTBits);
5161
5162 // Handle rotate right by N like a rotate left by 32-N.
5163 if (Opcode == ISD::ROTR)
5164 RotAmt = (VTBits - RotAmt) % VTBits;
5165
5166 // If we aren't rotating out all of the known-in sign bits, return the
5167 // number that are left. This handles rotl(sext(x), 1) for example.
5168 if (Tmp > (RotAmt + 1)) return (Tmp - RotAmt);
5169 }
5170 break;
5171 case ISD::ADD:
5172 case ISD::ADDC:
5173 // TODO: Move Operand 1 check before Operand 0 check
5174 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5175 if (Tmp == 1) return 1; // Early out.
5176
5177 // Special case decrementing a value (ADD X, -1):
5178 if (ConstantSDNode *CRHS =
5179 isConstOrConstSplat(Op.getOperand(1), DemandedElts))
5180 if (CRHS->isAllOnes()) {
5181 KnownBits Known =
5182 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
5183
5184 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5185 // sign bits set.
5186 if ((Known.Zero | 1).isAllOnes())
5187 return VTBits;
5188
5189 // If we are subtracting one from a positive number, there is no carry
5190 // out of the result.
5191 if (Known.isNonNegative())
5192 return Tmp;
5193 }
5194
5195 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5196 if (Tmp2 == 1) return 1; // Early out.
5197
5198 // Add can have at most one carry bit. Thus we know that the output
5199 // is, at worst, one more bit than the inputs.
5200 return std::min(Tmp, Tmp2) - 1;
5201 case ISD::SUB:
5202 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5203 if (Tmp2 == 1) return 1; // Early out.
5204
5205 // Handle NEG.
5206 if (ConstantSDNode *CLHS =
5207 isConstOrConstSplat(Op.getOperand(0), DemandedElts))
5208 if (CLHS->isZero()) {
5209 KnownBits Known =
5210 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
5211 // If the input is known to be 0 or 1, the output is 0/-1, which is all
5212 // sign bits set.
5213 if ((Known.Zero | 1).isAllOnes())
5214 return VTBits;
5215
5216 // If the input is known to be positive (the sign bit is known clear),
5217 // the output of the NEG has the same number of sign bits as the input.
5218 if (Known.isNonNegative())
5219 return Tmp2;
5220
5221 // Otherwise, we treat this like a SUB.
5222 }
5223
5224 // Sub can have at most one carry bit. Thus we know that the output
5225 // is, at worst, one more bit than the inputs.
5226 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5227 if (Tmp == 1) return 1; // Early out.
5228 return std::min(Tmp, Tmp2) - 1;
5229 case ISD::MUL: {
5230 // The output of the Mul can be at most twice the valid bits in the inputs.
5231 unsigned SignBitsOp0 = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5232 if (SignBitsOp0 == 1)
5233 break;
5234 unsigned SignBitsOp1 = ComputeNumSignBits(Op.getOperand(1), Depth + 1);
5235 if (SignBitsOp1 == 1)
5236 break;
5237 unsigned OutValidBits =
5238 (VTBits - SignBitsOp0 + 1) + (VTBits - SignBitsOp1 + 1);
5239 return OutValidBits > VTBits ? 1 : VTBits - OutValidBits + 1;
5240 }
5241 case ISD::AVGCEILS:
5242 case ISD::AVGFLOORS:
5243 Tmp = ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5244 if (Tmp == 1)
5245 return 1; // Early out.
5246 Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
5247 return std::min(Tmp, Tmp2);
5248 case ISD::SREM:
5249 // The sign bit is the LHS's sign bit, except when the result of the
5250 // remainder is zero. The magnitude of the result should be less than or
5251 // equal to the magnitude of the LHS. Therefore, the result should have
5252 // at least as many sign bits as the left hand side.
5253 return ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
5254 case ISD::TRUNCATE: {
5255 // Check if the sign bits of source go down as far as the truncated value.
5256 unsigned NumSrcBits = Op.getOperand(0).getScalarValueSizeInBits();
5257 unsigned NumSrcSignBits = ComputeNumSignBits(Op.getOperand(0), Depth + 1);
5258 if (NumSrcSignBits > (NumSrcBits - VTBits))
5259 return NumSrcSignBits - (NumSrcBits - VTBits);
5260 break;
5261 }
5262 case ISD::EXTRACT_ELEMENT: {
5263 if (VT.isScalableVector())
5264 break;
5265 const int KnownSign = ComputeNumSignBits(Op.getOperand(0), Depth+1);
5266 const int BitWidth = Op.getValueSizeInBits();
5267 const int Items = Op.getOperand(0).getValueSizeInBits() / BitWidth;
5268
5269 // Get reverse index (starting from 1), Op1 value indexes elements from
5270 // little end. Sign starts at big end.
5271 const int rIndex = Items - 1 - Op.getConstantOperandVal(1);
5272
5273 // If the sign portion ends in our element the subtraction gives correct
5274 // result. Otherwise it gives either negative or > bitwidth result
5275 return std::clamp(KnownSign - rIndex * BitWidth, 1, BitWidth);
5276 }
5278 if (VT.isScalableVector())
5279 break;
5280 // If we know the element index, split the demand between the
5281 // source vector and the inserted element, otherwise assume we need
5282 // the original demanded vector elements and the value.
5283 SDValue InVec = Op.getOperand(0);
5284 SDValue InVal = Op.getOperand(1);
5285 SDValue EltNo = Op.getOperand(2);
5286 bool DemandedVal = true;
5287 APInt DemandedVecElts = DemandedElts;
5288 auto *CEltNo = dyn_cast<ConstantSDNode>(EltNo);
5289 if (CEltNo && CEltNo->getAPIntValue().ult(NumElts)) {
5290 unsigned EltIdx = CEltNo->getZExtValue();
5291 DemandedVal = !!DemandedElts[EltIdx];
5292 DemandedVecElts.clearBit(EltIdx);
5293 }
5294 Tmp = std::numeric_limits<unsigned>::max();
5295 if (DemandedVal) {
5296 // TODO - handle implicit truncation of inserted elements.
5297 if (InVal.getScalarValueSizeInBits() != VTBits)
5298 break;
5299 Tmp2 = ComputeNumSignBits(InVal, Depth + 1);
5300 Tmp = std::min(Tmp, Tmp2);
5301 }
5302 if (!!DemandedVecElts) {
5303 Tmp2 = ComputeNumSignBits(InVec, DemandedVecElts, Depth + 1);
5304 Tmp = std::min(Tmp, Tmp2);
5305 }
5306 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5307 return Tmp;
5308 }
5310 SDValue InVec = Op.getOperand(0);
5311 SDValue EltNo = Op.getOperand(1);
5312 EVT VecVT = InVec.getValueType();
5313 // ComputeNumSignBits not yet implemented for scalable vectors.
5314 if (VecVT.isScalableVector())
5315 break;
5316 const unsigned BitWidth = Op.getValueSizeInBits();
5317 const unsigned EltBitWidth = Op.getOperand(0).getScalarValueSizeInBits();
5318 const unsigned NumSrcElts = VecVT.getVectorNumElements();
5319
5320 // If BitWidth > EltBitWidth the value is anyext:ed, and we do not know
5321 // anything about sign bits. But if the sizes match we can derive knowledge
5322 // about sign bits from the vector operand.
5323 if (BitWidth != EltBitWidth)
5324 break;
5325
5326 // If we know the element index, just demand that vector element, else for
5327 // an unknown element index, ignore DemandedElts and demand them all.
5328 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
5329 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
5330 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
5331 DemandedSrcElts =
5332 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
5333
5334 return ComputeNumSignBits(InVec, DemandedSrcElts, Depth + 1);
5335 }
5337 // Offset the demanded elts by the subvector index.
5338 SDValue Src = Op.getOperand(0);
5339
5340 APInt DemandedSrcElts;
5341 if (Src.getValueType().isScalableVector())
5342 DemandedSrcElts = APInt(1, 1);
5343 else {
5344 uint64_t Idx = Op.getConstantOperandVal(1);
5345 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5346 DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5347 }
5348 return ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5349 }
5350 case ISD::CONCAT_VECTORS: {
5351 if (VT.isScalableVector())
5352 break;
5353 // Determine the minimum number of sign bits across all demanded
5354 // elts of the input vectors. Early out if the result is already 1.
5355 Tmp = std::numeric_limits<unsigned>::max();
5356 EVT SubVectorVT = Op.getOperand(0).getValueType();
5357 unsigned NumSubVectorElts = SubVectorVT.getVectorNumElements();
5358 unsigned NumSubVectors = Op.getNumOperands();
5359 for (unsigned i = 0; (i < NumSubVectors) && (Tmp > 1); ++i) {
5360 APInt DemandedSub =
5361 DemandedElts.extractBits(NumSubVectorElts, i * NumSubVectorElts);
5362 if (!DemandedSub)
5363 continue;
5364 Tmp2 = ComputeNumSignBits(Op.getOperand(i), DemandedSub, Depth + 1);
5365 Tmp = std::min(Tmp, Tmp2);
5366 }
5367 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5368 return Tmp;
5369 }
5370 case ISD::INSERT_SUBVECTOR: {
5371 if (VT.isScalableVector())
5372 break;
5373 // Demand any elements from the subvector and the remainder from the src its
5374 // inserted into.
5375 SDValue Src = Op.getOperand(0);
5376 SDValue Sub = Op.getOperand(1);
5377 uint64_t Idx = Op.getConstantOperandVal(2);
5378 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5379 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5380 APInt DemandedSrcElts = DemandedElts;
5381 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5382
5383 Tmp = std::numeric_limits<unsigned>::max();
5384 if (!!DemandedSubElts) {
5385 Tmp = ComputeNumSignBits(Sub, DemandedSubElts, Depth + 1);
5386 if (Tmp == 1)
5387 return 1; // early-out
5388 }
5389 if (!!DemandedSrcElts) {
5390 Tmp2 = ComputeNumSignBits(Src, DemandedSrcElts, Depth + 1);
5391 Tmp = std::min(Tmp, Tmp2);
5392 }
5393 assert(Tmp <= VTBits && "Failed to determine minimum sign bits");
5394 return Tmp;
5395 }
5396 case ISD::LOAD: {
5397 // If we are looking at the loaded value of the SDNode.
5398 if (Op.getResNo() != 0)
5399 break;
5400
5402 if (const MDNode *Ranges = LD->getRanges()) {
5403 if (DemandedElts != 1)
5404 break;
5405
5407 if (VTBits > CR.getBitWidth()) {
5408 switch (LD->getExtensionType()) {
5409 case ISD::SEXTLOAD:
5410 CR = CR.signExtend(VTBits);
5411 break;
5412 case ISD::ZEXTLOAD:
5413 CR = CR.zeroExtend(VTBits);
5414 break;
5415 default:
5416 break;
5417 }
5418 }
5419
5420 if (VTBits != CR.getBitWidth())
5421 break;
5422 return std::min(CR.getSignedMin().getNumSignBits(),
5424 }
5425
5426 unsigned ExtType = LD->getExtensionType();
5427 switch (ExtType) {
5428 default:
5429 break;
5430 case ISD::SEXTLOAD: // e.g. i16->i32 = '17' bits known.
5431 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5432 return VTBits - Tmp + 1;
5433 case ISD::ZEXTLOAD: // e.g. i16->i32 = '16' bits known.
5434 Tmp = LD->getMemoryVT().getScalarSizeInBits();
5435 return VTBits - Tmp;
5436 case ISD::NON_EXTLOAD:
5437 if (const Constant *Cst = TLI->getTargetConstantFromLoad(LD)) {
5438 // We only need to handle vectors - computeKnownBits should handle
5439 // scalar cases.
5440 Type *CstTy = Cst->getType();
5441 if (CstTy->isVectorTy() && !VT.isScalableVector() &&
5442 (NumElts * VTBits) == CstTy->getPrimitiveSizeInBits() &&
5443 VTBits == CstTy->getScalarSizeInBits()) {
5444 Tmp = VTBits;
5445 for (unsigned i = 0; i != NumElts; ++i) {
5446 if (!DemandedElts[i])
5447 continue;
5448 if (Constant *Elt = Cst->getAggregateElement(i)) {
5449 if (auto *CInt = dyn_cast<ConstantInt>(Elt)) {
5450 const APInt &Value = CInt->getValue();
5451 Tmp = std::min(Tmp, Value.getNumSignBits());
5452 continue;
5453 }
5454 if (auto *CFP = dyn_cast<ConstantFP>(Elt)) {
5455 APInt Value = CFP->getValueAPF().bitcastToAPInt();
5456 Tmp = std::min(Tmp, Value.getNumSignBits());
5457 continue;
5458 }
5459 }
5460 // Unknown type. Conservatively assume no bits match sign bit.
5461 return 1;
5462 }
5463 return Tmp;
5464 }
5465 }
5466 break;
5467 }
5468
5469 break;
5470 }
5473 case ISD::ATOMIC_SWAP:
5485 case ISD::ATOMIC_LOAD: {
5486 auto *AT = cast<AtomicSDNode>(Op);
5487 // If we are looking at the loaded value.
5488 if (Op.getResNo() == 0) {
5489 Tmp = AT->getMemoryVT().getScalarSizeInBits();
5490 if (Tmp == VTBits)
5491 return 1; // early-out
5492
5493 // For atomic_load, prefer to use the extension type.
5494 if (Op->getOpcode() == ISD::ATOMIC_LOAD) {
5495 switch (AT->getExtensionType()) {
5496 default:
5497 break;
5498 case ISD::SEXTLOAD:
5499 return VTBits - Tmp + 1;
5500 case ISD::ZEXTLOAD:
5501 return VTBits - Tmp;
5502 }
5503 }
5504
5505 if (TLI->getExtendForAtomicOps() == ISD::SIGN_EXTEND)
5506 return VTBits - Tmp + 1;
5507 if (TLI->getExtendForAtomicOps() == ISD::ZERO_EXTEND)
5508 return VTBits - Tmp;
5509 }
5510 break;
5511 }
5512 }
5513
5514 // Allow the target to implement this method for its nodes.
5515 if (Opcode >= ISD::BUILTIN_OP_END ||
5516 Opcode == ISD::INTRINSIC_WO_CHAIN ||
5517 Opcode == ISD::INTRINSIC_W_CHAIN ||
5518 Opcode == ISD::INTRINSIC_VOID) {
5519 // TODO: This can probably be removed once target code is audited. This
5520 // is here purely to reduce patch size and review complexity.
5521 if (!VT.isScalableVector()) {
5522 unsigned NumBits =
5523 TLI->ComputeNumSignBitsForTargetNode(Op, DemandedElts, *this, Depth);
5524 if (NumBits > 1)
5525 FirstAnswer = std::max(FirstAnswer, NumBits);
5526 }
5527 }
5528
5529 // Finally, if we can prove that the top bits of the result are 0's or 1's,
5530 // use this information.
5531 KnownBits Known = computeKnownBits(Op, DemandedElts, Depth);
5532 return std::max(FirstAnswer, Known.countMinSignBits());
5533}
5534
5536 unsigned Depth) const {
5537 unsigned SignBits = ComputeNumSignBits(Op, Depth);
5538 return Op.getScalarValueSizeInBits() - SignBits + 1;
5539}
5540
5542 const APInt &DemandedElts,
5543 unsigned Depth) const {
5544 unsigned SignBits = ComputeNumSignBits(Op, DemandedElts, Depth);
5545 return Op.getScalarValueSizeInBits() - SignBits + 1;
5546}
5547
5549 unsigned Depth) const {
5550 // Early out for FREEZE.
5551 if (Op.getOpcode() == ISD::FREEZE)
5552 return true;
5553
5554 EVT VT = Op.getValueType();
5555 APInt DemandedElts = VT.isFixedLengthVector()
5557 : APInt(1, 1);
5558 return isGuaranteedNotToBeUndefOrPoison(Op, DemandedElts, PoisonOnly, Depth);
5559}
5560
5562 const APInt &DemandedElts,
5563 bool PoisonOnly,
5564 unsigned Depth) const {
5565 unsigned Opcode = Op.getOpcode();
5566
5567 // Early out for FREEZE.
5568 if (Opcode == ISD::FREEZE)
5569 return true;
5570
5571 if (Depth >= MaxRecursionDepth)
5572 return false; // Limit search depth.
5573
5574 if (isIntOrFPConstant(Op))
5575 return true;
5576
5577 switch (Opcode) {
5578 case ISD::CONDCODE:
5579 case ISD::VALUETYPE:
5580 case ISD::FrameIndex:
5582 case ISD::CopyFromReg:
5583 return true;
5584
5585 case ISD::POISON:
5586 return false;
5587
5588 case ISD::UNDEF:
5589 return PoisonOnly;
5590
5591 case ISD::BUILD_VECTOR:
5592 // NOTE: BUILD_VECTOR has implicit truncation of wider scalar elements -
5593 // this shouldn't affect the result.
5594 for (unsigned i = 0, e = Op.getNumOperands(); i < e; ++i) {
5595 if (!DemandedElts[i])
5596 continue;
5598 Depth + 1))
5599 return false;
5600 }
5601 return true;
5602
5604 SDValue Src = Op.getOperand(0);
5605 if (Src.getValueType().isScalableVector())
5606 break;
5607 uint64_t Idx = Op.getConstantOperandVal(1);
5608 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
5609 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
5610 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
5611 Depth + 1);
5612 }
5613
5614 case ISD::INSERT_SUBVECTOR: {
5615 if (Op.getValueType().isScalableVector())
5616 break;
5617 SDValue Src = Op.getOperand(0);
5618 SDValue Sub = Op.getOperand(1);
5619 uint64_t Idx = Op.getConstantOperandVal(2);
5620 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
5621 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
5622 APInt DemandedSrcElts = DemandedElts;
5623 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
5624
5625 if (!!DemandedSubElts && !isGuaranteedNotToBeUndefOrPoison(
5626 Sub, DemandedSubElts, PoisonOnly, Depth + 1))
5627 return false;
5628 if (!!DemandedSrcElts && !isGuaranteedNotToBeUndefOrPoison(
5629 Src, DemandedSrcElts, PoisonOnly, Depth + 1))
5630 return false;
5631 return true;
5632 }
5633
5635 SDValue Src = Op.getOperand(0);
5636 auto *IndexC = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5637 EVT SrcVT = Src.getValueType();
5638 if (SrcVT.isFixedLengthVector() && IndexC &&
5639 IndexC->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
5640 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
5641 IndexC->getZExtValue());
5642 return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
5643 Depth + 1);
5644 }
5645 break;
5646 }
5647
5649 SDValue InVec = Op.getOperand(0);
5650 SDValue InVal = Op.getOperand(1);
5651 SDValue EltNo = Op.getOperand(2);
5652 EVT VT = InVec.getValueType();
5653 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
5654 if (IndexC && VT.isFixedLengthVector() &&
5655 IndexC->getAPIntValue().ult(VT.getVectorNumElements())) {
5656 if (DemandedElts[IndexC->getZExtValue()] &&
5658 return false;
5659 APInt InVecDemandedElts = DemandedElts;
5660 InVecDemandedElts.clearBit(IndexC->getZExtValue());
5661 if (!!InVecDemandedElts &&
5663 peekThroughInsertVectorElt(InVec, InVecDemandedElts),
5664 InVecDemandedElts, PoisonOnly, Depth + 1))
5665 return false;
5666 return true;
5667 }
5668 break;
5669 }
5670
5672 // Check upper (known undef) elements.
5673 if (DemandedElts.ugt(1) && !PoisonOnly)
5674 return false;
5675 // Check element zero.
5676 if (DemandedElts[0] && !isGuaranteedNotToBeUndefOrPoison(
5677 Op.getOperand(0), PoisonOnly, Depth + 1))
5678 return false;
5679 return true;
5680
5681 case ISD::SPLAT_VECTOR:
5682 return isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), PoisonOnly,
5683 Depth + 1);
5684
5685 case ISD::VECTOR_SHUFFLE: {
5686 APInt DemandedLHS, DemandedRHS;
5687 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5688 if (!getShuffleDemandedElts(DemandedElts.getBitWidth(), SVN->getMask(),
5689 DemandedElts, DemandedLHS, DemandedRHS,
5690 /*AllowUndefElts=*/false))
5691 return false;
5692 if (!DemandedLHS.isZero() &&
5693 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedLHS,
5694 PoisonOnly, Depth + 1))
5695 return false;
5696 if (!DemandedRHS.isZero() &&
5697 !isGuaranteedNotToBeUndefOrPoison(Op.getOperand(1), DemandedRHS,
5698 PoisonOnly, Depth + 1))
5699 return false;
5700 return true;
5701 }
5702
5703 case ISD::SHL:
5704 case ISD::SRL:
5705 case ISD::SRA:
5706 // Shift amount operand is checked by canCreateUndefOrPoison. So it is
5707 // enough to check operand 0 if Op can't create undef/poison.
5708 return !canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly,
5709 /*ConsiderFlags*/ true, Depth) &&
5710 isGuaranteedNotToBeUndefOrPoison(Op.getOperand(0), DemandedElts,
5711 PoisonOnly, Depth + 1);
5712
5713 case ISD::BSWAP:
5714 case ISD::CTPOP:
5715 case ISD::BITREVERSE:
5716 case ISD::AND:
5717 case ISD::OR:
5718 case ISD::XOR:
5719 case ISD::ADD:
5720 case ISD::SUB:
5721 case ISD::MUL:
5722 case ISD::SADDSAT:
5723 case ISD::UADDSAT:
5724 case ISD::SSUBSAT:
5725 case ISD::USUBSAT:
5726 case ISD::SSHLSAT:
5727 case ISD::USHLSAT:
5728 case ISD::SMIN:
5729 case ISD::SMAX:
5730 case ISD::UMIN:
5731 case ISD::UMAX:
5732 case ISD::ZERO_EXTEND:
5733 case ISD::SIGN_EXTEND:
5734 case ISD::ANY_EXTEND:
5735 case ISD::TRUNCATE:
5736 case ISD::VSELECT: {
5737 // If Op can't create undef/poison and none of its operands are undef/poison
5738 // then Op is never undef/poison. A difference from the more common check
5739 // below, outside the switch, is that we handle elementwise operations for
5740 // which the DemandedElts mask is valid for all operands here.
5741 return !canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly,
5742 /*ConsiderFlags*/ true, Depth) &&
5743 all_of(Op->ops(), [&](SDValue V) {
5744 return isGuaranteedNotToBeUndefOrPoison(V, DemandedElts,
5745 PoisonOnly, Depth + 1);
5746 });
5747 }
5748
5749 // TODO: Search for noundef attributes from library functions.
5750
5751 // TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
5752
5753 default:
5754 // Allow the target to implement this method for its nodes.
5755 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5756 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5757 return TLI->isGuaranteedNotToBeUndefOrPoisonForTargetNode(
5758 Op, DemandedElts, *this, PoisonOnly, Depth);
5759 break;
5760 }
5761
5762 // If Op can't create undef/poison and none of its operands are undef/poison
5763 // then Op is never undef/poison.
5764 // NOTE: TargetNodes can handle this in themselves in
5765 // isGuaranteedNotToBeUndefOrPoisonForTargetNode or let
5766 // TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode handle it.
5767 return !canCreateUndefOrPoison(Op, PoisonOnly, /*ConsiderFlags*/ true,
5768 Depth) &&
5769 all_of(Op->ops(), [&](SDValue V) {
5770 return isGuaranteedNotToBeUndefOrPoison(V, PoisonOnly, Depth + 1);
5771 });
5772}
5773
5775 bool ConsiderFlags,
5776 unsigned Depth) const {
5777 EVT VT = Op.getValueType();
5778 APInt DemandedElts = VT.isFixedLengthVector()
5780 : APInt(1, 1);
5781 return canCreateUndefOrPoison(Op, DemandedElts, PoisonOnly, ConsiderFlags,
5782 Depth);
5783}
5784
5786 bool PoisonOnly, bool ConsiderFlags,
5787 unsigned Depth) const {
5788 if (ConsiderFlags && Op->hasPoisonGeneratingFlags())
5789 return true;
5790
5791 unsigned Opcode = Op.getOpcode();
5792 switch (Opcode) {
5793 case ISD::AssertSext:
5794 case ISD::AssertZext:
5795 case ISD::AssertAlign:
5797 // Assertion nodes can create poison if the assertion fails.
5798 return true;
5799
5800 case ISD::FREEZE:
5804 case ISD::SADDSAT:
5805 case ISD::UADDSAT:
5806 case ISD::SSUBSAT:
5807 case ISD::USUBSAT:
5808 case ISD::MULHU:
5809 case ISD::MULHS:
5810 case ISD::AVGFLOORS:
5811 case ISD::AVGFLOORU:
5812 case ISD::AVGCEILS:
5813 case ISD::AVGCEILU:
5814 case ISD::ABDU:
5815 case ISD::ABDS:
5816 case ISD::SMIN:
5817 case ISD::SMAX:
5818 case ISD::SCMP:
5819 case ISD::UMIN:
5820 case ISD::UMAX:
5821 case ISD::UCMP:
5822 case ISD::AND:
5823 case ISD::XOR:
5824 case ISD::ROTL:
5825 case ISD::ROTR:
5826 case ISD::FSHL:
5827 case ISD::FSHR:
5828 case ISD::BSWAP:
5829 case ISD::CTTZ:
5830 case ISD::CTLZ:
5831 case ISD::CTLS:
5832 case ISD::CTPOP:
5833 case ISD::BITREVERSE:
5834 case ISD::PARITY:
5835 case ISD::SIGN_EXTEND:
5836 case ISD::TRUNCATE:
5840 case ISD::BITCAST:
5841 case ISD::BUILD_VECTOR:
5842 case ISD::BUILD_PAIR:
5843 case ISD::SPLAT_VECTOR:
5844 case ISD::FABS:
5845 return false;
5846
5847 case ISD::ABS:
5848 // ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5849 // Different to Intrinsic::abs.
5850 return false;
5851
5852 case ISD::ADDC:
5853 case ISD::SUBC:
5854 case ISD::ADDE:
5855 case ISD::SUBE:
5856 case ISD::SADDO:
5857 case ISD::SSUBO:
5858 case ISD::SMULO:
5859 case ISD::SADDO_CARRY:
5860 case ISD::SSUBO_CARRY:
5861 case ISD::UADDO:
5862 case ISD::USUBO:
5863 case ISD::UMULO:
5864 case ISD::UADDO_CARRY:
5865 case ISD::USUBO_CARRY:
5866 // No poison on result or overflow flags.
5867 return false;
5868
5869 case ISD::SELECT_CC:
5870 case ISD::SETCC: {
5871 // Integer setcc cannot create undef or poison.
5872 if (Op.getOperand(0).getValueType().isInteger())
5873 return false;
5874
5875 // FP compares are more complicated. They can create poison for nan/infinity
5876 // based on options and flags. The options and flags also cause special
5877 // nonan condition codes to be used. Those condition codes may be preserved
5878 // even if the nonan flag is dropped somewhere.
5879 unsigned CCOp = Opcode == ISD::SETCC ? 2 : 4;
5880 ISD::CondCode CCCode = cast<CondCodeSDNode>(Op.getOperand(CCOp))->get();
5881 return (unsigned)CCCode & 0x10U;
5882 }
5883
5884 case ISD::OR:
5885 case ISD::ZERO_EXTEND:
5886 case ISD::SELECT:
5887 case ISD::VSELECT:
5888 case ISD::ADD:
5889 case ISD::SUB:
5890 case ISD::MUL:
5891 case ISD::FNEG:
5892 case ISD::FADD:
5893 case ISD::FSUB:
5894 case ISD::FMUL:
5895 case ISD::FDIV:
5896 case ISD::FREM:
5897 case ISD::FCOPYSIGN:
5898 case ISD::FMA:
5899 case ISD::FMAD:
5900 case ISD::FMULADD:
5901 case ISD::FP_EXTEND:
5907 // No poison except from flags (which is handled above)
5908 return false;
5909
5910 case ISD::SHL:
5911 case ISD::SRL:
5912 case ISD::SRA:
5913 // If the max shift amount isn't in range, then the shift can
5914 // create poison.
5915 return !getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1);
5916
5919 // If the amount is zero then the result will be poison.
5920 // TODO: Add isKnownNeverZero DemandedElts handling.
5921 return !isKnownNeverZero(Op.getOperand(0), Depth + 1);
5922
5924 // Check if we demand any upper (undef) elements.
5925 return !PoisonOnly && DemandedElts.ugt(1);
5926
5929 // Ensure that the element index is in bounds.
5930 EVT VecVT = Op.getOperand(0).getValueType();
5931 SDValue Idx = Op.getOperand(Opcode == ISD::INSERT_VECTOR_ELT ? 2 : 1);
5932 KnownBits KnownIdx = computeKnownBits(Idx, Depth + 1);
5933 return KnownIdx.getMaxValue().uge(VecVT.getVectorMinNumElements());
5934 }
5935
5936 case ISD::VECTOR_SHUFFLE: {
5937 // Check for any demanded shuffle element that is undef.
5938 auto *SVN = cast<ShuffleVectorSDNode>(Op);
5939 for (auto [Idx, Elt] : enumerate(SVN->getMask()))
5940 if (Elt < 0 && DemandedElts[Idx])
5941 return true;
5942 return false;
5943 }
5944
5946 return false;
5947
5948 default:
5949 // Allow the target to implement this method for its nodes.
5950 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
5951 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID)
5952 return TLI->canCreateUndefOrPoisonForTargetNode(
5953 Op, DemandedElts, *this, PoisonOnly, ConsiderFlags, Depth);
5954 break;
5955 }
5956
5957 // Be conservative and return true.
5958 return true;
5959}
5960
5961bool SelectionDAG::isADDLike(SDValue Op, bool NoWrap) const {
5962 unsigned Opcode = Op.getOpcode();
5963 if (Opcode == ISD::OR)
5964 return Op->getFlags().hasDisjoint() ||
5965 haveNoCommonBitsSet(Op.getOperand(0), Op.getOperand(1));
5966 if (Opcode == ISD::XOR)
5967 return !NoWrap && isMinSignedConstant(Op.getOperand(1));
5968 return false;
5969}
5970
5972 return Op.getNumOperands() == 2 && isa<ConstantSDNode>(Op.getOperand(1)) &&
5973 (Op.isAnyAdd() || isADDLike(Op));
5974}
5975
5977 unsigned Depth) const {
5978 EVT VT = Op.getValueType();
5979
5980 // Since the number of lanes in a scalable vector is unknown at compile time,
5981 // we track one bit which is implicitly broadcast to all lanes. This means
5982 // that all lanes in a scalable vector are considered demanded.
5983 APInt DemandedElts = VT.isFixedLengthVector()
5985 : APInt(1, 1);
5986
5987 return isKnownNeverNaN(Op, DemandedElts, SNaN, Depth);
5988}
5989
5991 bool SNaN, unsigned Depth) const {
5992 assert(!DemandedElts.isZero() && "No demanded elements");
5993
5994 // If we're told that NaNs won't happen, assume they won't.
5995 if (Op->getFlags().hasNoNaNs())
5996 return true;
5997
5998 if (Depth >= MaxRecursionDepth)
5999 return false; // Limit search depth.
6000
6001 // If the value is a constant, we can obviously see if it is a NaN or not.
6003 return !C->getValueAPF().isNaN() ||
6004 (SNaN && !C->getValueAPF().isSignaling());
6005 }
6006
6007 unsigned Opcode = Op.getOpcode();
6008 switch (Opcode) {
6009 case ISD::FADD:
6010 case ISD::FSUB:
6011 case ISD::FMUL:
6012 case ISD::FDIV:
6013 case ISD::FREM:
6014 case ISD::FSIN:
6015 case ISD::FCOS:
6016 case ISD::FTAN:
6017 case ISD::FASIN:
6018 case ISD::FACOS:
6019 case ISD::FATAN:
6020 case ISD::FATAN2:
6021 case ISD::FSINH:
6022 case ISD::FCOSH:
6023 case ISD::FTANH:
6024 case ISD::FMA:
6025 case ISD::FMULADD:
6026 case ISD::FMAD: {
6027 if (SNaN)
6028 return true;
6029 // TODO: Need isKnownNeverInfinity
6030 return false;
6031 }
6032 case ISD::FCANONICALIZE:
6033 case ISD::FEXP:
6034 case ISD::FEXP2:
6035 case ISD::FEXP10:
6036 case ISD::FTRUNC:
6037 case ISD::FFLOOR:
6038 case ISD::FCEIL:
6039 case ISD::FROUND:
6040 case ISD::FROUNDEVEN:
6041 case ISD::LROUND:
6042 case ISD::LLROUND:
6043 case ISD::FRINT:
6044 case ISD::LRINT:
6045 case ISD::LLRINT:
6046 case ISD::FNEARBYINT:
6047 case ISD::FLDEXP: {
6048 if (SNaN)
6049 return true;
6050 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6051 }
6052 case ISD::FABS:
6053 case ISD::FNEG:
6054 case ISD::FCOPYSIGN: {
6055 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6056 }
6057 case ISD::SELECT:
6058 return isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1) &&
6059 isKnownNeverNaN(Op.getOperand(2), DemandedElts, SNaN, Depth + 1);
6060 case ISD::FP_EXTEND:
6061 case ISD::FP_ROUND: {
6062 if (SNaN)
6063 return true;
6064 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6065 }
6066 case ISD::SINT_TO_FP:
6067 case ISD::UINT_TO_FP:
6068 return true;
6069 case ISD::FSQRT: // Need is known positive
6070 case ISD::FLOG:
6071 case ISD::FLOG2:
6072 case ISD::FLOG10:
6073 case ISD::FPOWI:
6074 case ISD::FPOW: {
6075 if (SNaN)
6076 return true;
6077 // TODO: Refine on operand
6078 return false;
6079 }
6080 case ISD::FMINNUM:
6081 case ISD::FMAXNUM:
6082 case ISD::FMINIMUMNUM:
6083 case ISD::FMAXIMUMNUM: {
6084 // Only one needs to be known not-nan, since it will be returned if the
6085 // other ends up being one.
6086 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) ||
6087 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6088 }
6089 case ISD::FMINNUM_IEEE:
6090 case ISD::FMAXNUM_IEEE: {
6091 if (SNaN)
6092 return true;
6093 // This can return a NaN if either operand is an sNaN, or if both operands
6094 // are NaN.
6095 return (isKnownNeverNaN(Op.getOperand(0), DemandedElts, false, Depth + 1) &&
6096 isKnownNeverSNaN(Op.getOperand(1), DemandedElts, Depth + 1)) ||
6097 (isKnownNeverNaN(Op.getOperand(1), DemandedElts, false, Depth + 1) &&
6098 isKnownNeverSNaN(Op.getOperand(0), DemandedElts, Depth + 1));
6099 }
6100 case ISD::FMINIMUM:
6101 case ISD::FMAXIMUM: {
6102 // TODO: Does this quiet or return the origina NaN as-is?
6103 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1) &&
6104 isKnownNeverNaN(Op.getOperand(1), DemandedElts, SNaN, Depth + 1);
6105 }
6107 SDValue Src = Op.getOperand(0);
6108 auto *Idx = dyn_cast<ConstantSDNode>(Op.getOperand(1));
6109 EVT SrcVT = Src.getValueType();
6110 if (SrcVT.isFixedLengthVector() && Idx &&
6111 Idx->getAPIntValue().ult(SrcVT.getVectorNumElements())) {
6112 APInt DemandedSrcElts = APInt::getOneBitSet(SrcVT.getVectorNumElements(),
6113 Idx->getZExtValue());
6114 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6115 }
6116 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6117 }
6119 SDValue Src = Op.getOperand(0);
6120 if (Src.getValueType().isFixedLengthVector()) {
6121 unsigned Idx = Op.getConstantOperandVal(1);
6122 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
6123 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
6124 return isKnownNeverNaN(Src, DemandedSrcElts, SNaN, Depth + 1);
6125 }
6126 return isKnownNeverNaN(Src, SNaN, Depth + 1);
6127 }
6128 case ISD::INSERT_SUBVECTOR: {
6129 SDValue BaseVector = Op.getOperand(0);
6130 SDValue SubVector = Op.getOperand(1);
6131 EVT BaseVectorVT = BaseVector.getValueType();
6132 if (BaseVectorVT.isFixedLengthVector()) {
6133 unsigned Idx = Op.getConstantOperandVal(2);
6134 unsigned NumBaseElts = BaseVectorVT.getVectorNumElements();
6135 unsigned NumSubElts = SubVector.getValueType().getVectorNumElements();
6136
6137 // Clear/Extract the bits at the position where the subvector will be
6138 // inserted.
6139 APInt DemandedMask =
6140 APInt::getBitsSet(NumBaseElts, Idx, Idx + NumSubElts);
6141 APInt DemandedSrcElts = DemandedElts & ~DemandedMask;
6142 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
6143
6144 bool NeverNaN = true;
6145 if (!DemandedSrcElts.isZero())
6146 NeverNaN &=
6147 isKnownNeverNaN(BaseVector, DemandedSrcElts, SNaN, Depth + 1);
6148 if (NeverNaN && !DemandedSubElts.isZero())
6149 NeverNaN &=
6150 isKnownNeverNaN(SubVector, DemandedSubElts, SNaN, Depth + 1);
6151 return NeverNaN;
6152 }
6153 return isKnownNeverNaN(BaseVector, SNaN, Depth + 1) &&
6154 isKnownNeverNaN(SubVector, SNaN, Depth + 1);
6155 }
6156 case ISD::BUILD_VECTOR: {
6157 unsigned NumElts = Op.getNumOperands();
6158 for (unsigned I = 0; I != NumElts; ++I)
6159 if (DemandedElts[I] &&
6160 !isKnownNeverNaN(Op.getOperand(I), SNaN, Depth + 1))
6161 return false;
6162 return true;
6163 }
6164 case ISD::SPLAT_VECTOR:
6165 return isKnownNeverNaN(Op.getOperand(0), SNaN, Depth + 1);
6166 case ISD::AssertNoFPClass: {
6167 FPClassTest NoFPClass =
6168 static_cast<FPClassTest>(Op.getConstantOperandVal(1));
6169 if ((NoFPClass & fcNan) == fcNan)
6170 return true;
6171 if (SNaN && (NoFPClass & fcSNan) == fcSNan)
6172 return true;
6173 return isKnownNeverNaN(Op.getOperand(0), DemandedElts, SNaN, Depth + 1);
6174 }
6175 default:
6176 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::INTRINSIC_WO_CHAIN ||
6177 Opcode == ISD::INTRINSIC_W_CHAIN || Opcode == ISD::INTRINSIC_VOID) {
6178 return TLI->isKnownNeverNaNForTargetNode(Op, DemandedElts, *this, SNaN,
6179 Depth);
6180 }
6181
6182 return false;
6183 }
6184}
6185
6187 assert(Op.getValueType().isFloatingPoint() &&
6188 "Floating point type expected");
6189
6190 // If the value is a constant, we can obviously see if it is a zero or not.
6192 Op, [](ConstantFPSDNode *C) { return !C->isZero(); });
6193}
6194
6196 EVT VT = Op.getValueType();
6197
6198 // Since the number of lanes in a scalable vector is unknown at compile time,
6199 // we track one bit which is implicitly broadcast to all lanes. This means
6200 // that all lanes in a scalable vector are considered demanded.
6201 APInt DemandedElts = VT.isFixedLengthVector()
6203 : APInt(1, 1);
6204
6205 return isKnownNeverZero(Op, DemandedElts, Depth);
6206}
6207
6209 unsigned Depth) const {
6210 if (Depth >= MaxRecursionDepth)
6211 return false; // Limit search depth.
6212
6213 EVT OpVT = Op.getValueType();
6214 unsigned BitWidth = OpVT.getScalarSizeInBits();
6215
6216 assert(!Op.getValueType().isFloatingPoint() &&
6217 "Floating point types unsupported - use isKnownNeverZeroFloat");
6218
6219 // If the value is a constant, we can obviously see if it is a zero or not.
6220 auto IsNeverZero = [BitWidth](const ConstantSDNode *C) {
6221 APInt V = C->getAPIntValue().zextOrTrunc(BitWidth);
6222 return !V.isZero();
6223 };
6224
6225 if (ISD::matchUnaryPredicate(Op, IsNeverZero))
6226 return true;
6227
6228 // TODO: Recognize more cases here. Most of the cases are also incomplete to
6229 // some degree.
6230 switch (Op.getOpcode()) {
6231 default:
6232 break;
6233
6234 case ISD::BUILD_VECTOR:
6235 // Are all operands of a build vector constant non-zero?
6236 if (all_of(enumerate(Op->ops()), [&](auto P) {
6237 auto *C = dyn_cast<ConstantSDNode>(P.value());
6238 return !DemandedElts[P.index()] || (C && IsNeverZero(C));
6239 }))
6240 return true;
6241 break;
6242
6243 case ISD::SPLAT_VECTOR:
6244 // Is the operand of a splat vector a constant non-zero?
6245 if (auto *C = dyn_cast<ConstantSDNode>(Op->getOperand(0)))
6246 if (IsNeverZero(C))
6247 return true;
6248 break;
6249
6251 SDValue InVec = Op.getOperand(0);
6252 SDValue EltNo = Op.getOperand(1);
6253 EVT VecVT = InVec.getValueType();
6254
6255 // Skip scalable vectors or implicit extensions.
6256 if (VecVT.isScalableVector() ||
6257 OpVT.getScalarSizeInBits() != VecVT.getScalarSizeInBits())
6258 break;
6259
6260 // If we know the element index, just demand that vector element, else for
6261 // an unknown element index, ignore DemandedElts and demand them all.
6262 const unsigned NumSrcElts = VecVT.getVectorNumElements();
6263 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
6264 auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo);
6265 if (ConstEltNo && ConstEltNo->getAPIntValue().ult(NumSrcElts))
6266 DemandedSrcElts =
6267 APInt::getOneBitSet(NumSrcElts, ConstEltNo->getZExtValue());
6268
6269 return isKnownNeverZero(InVec, DemandedSrcElts, Depth + 1);
6270 }
6271
6272 case ISD::OR:
6273 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6274 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6275
6276 case ISD::VSELECT:
6277 case ISD::SELECT:
6278 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6279 isKnownNeverZero(Op.getOperand(2), DemandedElts, Depth + 1);
6280
6281 case ISD::SHL: {
6282 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6283 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6284 KnownBits ValKnown =
6285 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6286 // 1 << X is never zero.
6287 if (ValKnown.One[0])
6288 return true;
6289 // If max shift cnt of known ones is non-zero, result is non-zero.
6290 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6291 .getMaxValue();
6292 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6293 !ValKnown.One.shl(MaxCnt).isZero())
6294 return true;
6295 break;
6296 }
6297
6298 case ISD::VECTOR_SHUFFLE: {
6299 if (Op.getValueType().isScalableVector())
6300 return false;
6301
6302 unsigned NumElts = DemandedElts.getBitWidth();
6303
6304 // All demanded elements from LHS and RHS must be known non-zero.
6305 // Demanded elements with undef shuffle mask elements are unknown.
6306
6307 APInt DemandedLHS, DemandedRHS;
6308 auto *SVN = cast<ShuffleVectorSDNode>(Op);
6309 assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
6310 if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
6311 DemandedLHS, DemandedRHS))
6312 return false;
6313
6314 return (!DemandedLHS ||
6315 isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1)) &&
6316 (!DemandedRHS ||
6317 isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1));
6318 }
6319
6320 case ISD::UADDSAT:
6321 case ISD::UMAX:
6322 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6323 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6324
6325 case ISD::UMIN:
6326 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6327 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6328
6329 // For smin/smax: If either operand is known negative/positive
6330 // respectively we don't need the other to be known at all.
6331 case ISD::SMAX: {
6332 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6333 if (Op1.isStrictlyPositive())
6334 return true;
6335
6336 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6337 if (Op0.isStrictlyPositive())
6338 return true;
6339
6340 if (Op1.isNonZero() && Op0.isNonZero())
6341 return true;
6342
6343 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6344 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6345 }
6346 case ISD::SMIN: {
6347 KnownBits Op1 = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
6348 if (Op1.isNegative())
6349 return true;
6350
6351 KnownBits Op0 = computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6352 if (Op0.isNegative())
6353 return true;
6354
6355 if (Op1.isNonZero() && Op0.isNonZero())
6356 return true;
6357
6358 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) &&
6359 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6360 }
6361
6362 case ISD::ROTL:
6363 case ISD::ROTR:
6364 case ISD::BITREVERSE:
6365 case ISD::BSWAP:
6366 case ISD::CTPOP:
6367 case ISD::ABS:
6368 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6369
6370 case ISD::SRA:
6371 case ISD::SRL: {
6372 if (Op->getFlags().hasExact())
6373 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6374 KnownBits ValKnown =
6375 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
6376 if (ValKnown.isNegative())
6377 return true;
6378 // If max shift cnt of known ones is non-zero, result is non-zero.
6379 APInt MaxCnt = computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1)
6380 .getMaxValue();
6381 if (MaxCnt.ult(ValKnown.getBitWidth()) &&
6382 !ValKnown.One.lshr(MaxCnt).isZero())
6383 return true;
6384 break;
6385 }
6386 case ISD::UDIV:
6387 case ISD::SDIV:
6388 // div exact can only produce a zero if the dividend is zero.
6389 // TODO: For udiv this is also true if Op1 u<= Op0
6390 if (Op->getFlags().hasExact())
6391 return isKnownNeverZero(Op.getOperand(0), Depth + 1);
6392 break;
6393
6394 case ISD::ADD:
6395 if (Op->getFlags().hasNoUnsignedWrap())
6396 if (isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
6397 isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1))
6398 return true;
6399 // TODO: There are a lot more cases we can prove for add.
6400 break;
6401
6402 case ISD::SUB: {
6403 if (isNullConstant(Op.getOperand(0)))
6404 return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1);
6405
6406 std::optional<bool> ne = KnownBits::ne(
6407 computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1),
6408 computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1));
6409 return ne && *ne;
6410 }
6411
6412 case ISD::MUL:
6413 if (Op->getFlags().hasNoSignedWrap() || Op->getFlags().hasNoUnsignedWrap())
6414 if (isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
6415 isKnownNeverZero(Op.getOperand(0), Depth + 1))
6416 return true;
6417 break;
6418
6419 case ISD::ZERO_EXTEND:
6420 case ISD::SIGN_EXTEND:
6421 return isKnownNeverZero(Op.getOperand(0), DemandedElts, Depth + 1);
6422 case ISD::VSCALE: {
6424 const APInt &Multiplier = Op.getConstantOperandAPInt(0);
6425 ConstantRange CR =
6426 getVScaleRange(&F, Op.getScalarValueSizeInBits()).multiply(Multiplier);
6427 if (!CR.contains(APInt(CR.getBitWidth(), 0)))
6428 return true;
6429 break;
6430 }
6431 }
6432
6434}
6435
6437 if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true))
6438 return !C1->isNegative();
6439
6440 switch (Op.getOpcode()) {
6441 case ISD::FABS:
6442 case ISD::FEXP:
6443 case ISD::FEXP2:
6444 case ISD::FEXP10:
6445 return true;
6446 default:
6447 return false;
6448 }
6449
6450 llvm_unreachable("covered opcode switch");
6451}
6452
6454 assert(Use.getValueType().isFloatingPoint());
6455 const SDNode *User = Use.getUser();
6456 if (User->getFlags().hasNoSignedZeros())
6457 return true;
6458
6459 unsigned OperandNo = Use.getOperandNo();
6460 // Check if this use is insensitive to the sign of zero
6461 switch (User->getOpcode()) {
6462 case ISD::SETCC:
6463 // Comparisons: IEEE-754 specifies +0.0 == -0.0.
6464 case ISD::FABS:
6465 // fabs always produces +0.0.
6466 return true;
6467 case ISD::FCOPYSIGN:
6468 // copysign overwrites the sign bit of the first operand.
6469 return OperandNo == 0;
6470 case ISD::FADD:
6471 case ISD::FSUB: {
6472 // Arithmetic with non-zero constants fixes the uncertainty around the
6473 // sign bit.
6474 SDValue Other = User->getOperand(1 - OperandNo);
6476 }
6477 case ISD::FP_TO_SINT:
6478 case ISD::FP_TO_UINT:
6479 // fp-to-int conversions normalize signed zeros.
6480 return true;
6481 default:
6482 return false;
6483 }
6484}
6485
6487 if (Op->getFlags().hasNoSignedZeros())
6488 return true;
6489 // FIXME: Limit the amount of checked uses to not introduce a compile-time
6490 // regression. Ideally, this should be implemented as a demanded-bits
6491 // optimization that stems from the users.
6492 if (Op->use_size() > 2)
6493 return false;
6494 return all_of(Op->uses(),
6495 [&](const SDUse &Use) { return canIgnoreSignBitOfZero(Use); });
6496}
6497
6499 // Check the obvious case.
6500 if (A == B) return true;
6501
6502 // For negative and positive zero.
6505 if (CA->isZero() && CB->isZero()) return true;
6506
6507 // Otherwise they may not be equal.
6508 return false;
6509}
6510
6511// Only bits set in Mask must be negated, other bits may be arbitrary.
6513 if (isBitwiseNot(V, AllowUndefs))
6514 return V.getOperand(0);
6515
6516 // Handle any_extend (not (truncate X)) pattern, where Mask only sets
6517 // bits in the non-extended part.
6518 ConstantSDNode *MaskC = isConstOrConstSplat(Mask);
6519 if (!MaskC || V.getOpcode() != ISD::ANY_EXTEND)
6520 return SDValue();
6521 SDValue ExtArg = V.getOperand(0);
6522 if (ExtArg.getScalarValueSizeInBits() >=
6523 MaskC->getAPIntValue().getActiveBits() &&
6524 isBitwiseNot(ExtArg, AllowUndefs) &&
6525 ExtArg.getOperand(0).getOpcode() == ISD::TRUNCATE &&
6526 ExtArg.getOperand(0).getOperand(0).getValueType() == V.getValueType())
6527 return ExtArg.getOperand(0).getOperand(0);
6528 return SDValue();
6529}
6530
6532 // Match masked merge pattern (X & ~M) op (Y & M)
6533 // Including degenerate case (X & ~M) op M
6534 auto MatchNoCommonBitsPattern = [&](SDValue Not, SDValue Mask,
6535 SDValue Other) {
6536 if (SDValue NotOperand =
6537 getBitwiseNotOperand(Not, Mask, /* AllowUndefs */ true)) {
6538 if (NotOperand->getOpcode() == ISD::ZERO_EXTEND ||
6539 NotOperand->getOpcode() == ISD::TRUNCATE)
6540 NotOperand = NotOperand->getOperand(0);
6541
6542 if (Other == NotOperand)
6543 return true;
6544 if (Other->getOpcode() == ISD::AND)
6545 return NotOperand == Other->getOperand(0) ||
6546 NotOperand == Other->getOperand(1);
6547 }
6548 return false;
6549 };
6550
6551 if (A->getOpcode() == ISD::ZERO_EXTEND || A->getOpcode() == ISD::TRUNCATE)
6552 A = A->getOperand(0);
6553
6554 if (B->getOpcode() == ISD::ZERO_EXTEND || B->getOpcode() == ISD::TRUNCATE)
6555 B = B->getOperand(0);
6556
6557 if (A->getOpcode() == ISD::AND)
6558 return MatchNoCommonBitsPattern(A->getOperand(0), A->getOperand(1), B) ||
6559 MatchNoCommonBitsPattern(A->getOperand(1), A->getOperand(0), B);
6560 return false;
6561}
6562
6563// FIXME: unify with llvm::haveNoCommonBitsSet.
6565 assert(A.getValueType() == B.getValueType() &&
6566 "Values must have the same type");
6569 return true;
6572}
6573
6574static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step,
6575 SelectionDAG &DAG) {
6576 if (cast<ConstantSDNode>(Step)->isZero())
6577 return DAG.getConstant(0, DL, VT);
6578
6579 return SDValue();
6580}
6581
6584 SelectionDAG &DAG) {
6585 int NumOps = Ops.size();
6586 assert(NumOps != 0 && "Can't build an empty vector!");
6587 assert(!VT.isScalableVector() &&
6588 "BUILD_VECTOR cannot be used with scalable types");
6589 assert(VT.getVectorNumElements() == (unsigned)NumOps &&
6590 "Incorrect element count in BUILD_VECTOR!");
6591
6592 // BUILD_VECTOR of UNDEFs is UNDEF.
6593 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6594 return DAG.getUNDEF(VT);
6595
6596 // BUILD_VECTOR of seq extract/insert from the same vector + type is Identity.
6597 SDValue IdentitySrc;
6598 bool IsIdentity = true;
6599 for (int i = 0; i != NumOps; ++i) {
6601 Ops[i].getOperand(0).getValueType() != VT ||
6602 (IdentitySrc && Ops[i].getOperand(0) != IdentitySrc) ||
6603 !isa<ConstantSDNode>(Ops[i].getOperand(1)) ||
6604 Ops[i].getConstantOperandAPInt(1) != i) {
6605 IsIdentity = false;
6606 break;
6607 }
6608 IdentitySrc = Ops[i].getOperand(0);
6609 }
6610 if (IsIdentity)
6611 return IdentitySrc;
6612
6613 return SDValue();
6614}
6615
6616/// Try to simplify vector concatenation to an input value, undef, or build
6617/// vector.
6620 SelectionDAG &DAG) {
6621 assert(!Ops.empty() && "Can't concatenate an empty list of vectors!");
6623 [Ops](SDValue Op) {
6624 return Ops[0].getValueType() == Op.getValueType();
6625 }) &&
6626 "Concatenation of vectors with inconsistent value types!");
6627 assert((Ops[0].getValueType().getVectorElementCount() * Ops.size()) ==
6628 VT.getVectorElementCount() &&
6629 "Incorrect element count in vector concatenation!");
6630
6631 if (Ops.size() == 1)
6632 return Ops[0];
6633
6634 // Concat of UNDEFs is UNDEF.
6635 if (llvm::all_of(Ops, [](SDValue Op) { return Op.isUndef(); }))
6636 return DAG.getUNDEF(VT);
6637
6638 // Scan the operands and look for extract operations from a single source
6639 // that correspond to insertion at the same location via this concatenation:
6640 // concat (extract X, 0*subvec_elts), (extract X, 1*subvec_elts), ...
6641 SDValue IdentitySrc;
6642 bool IsIdentity = true;
6643 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
6644 SDValue Op = Ops[i];
6645 unsigned IdentityIndex = i * Op.getValueType().getVectorMinNumElements();
6646 if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
6647 Op.getOperand(0).getValueType() != VT ||
6648 (IdentitySrc && Op.getOperand(0) != IdentitySrc) ||
6649 Op.getConstantOperandVal(1) != IdentityIndex) {
6650 IsIdentity = false;
6651 break;
6652 }
6653 assert((!IdentitySrc || IdentitySrc == Op.getOperand(0)) &&
6654 "Unexpected identity source vector for concat of extracts");
6655 IdentitySrc = Op.getOperand(0);
6656 }
6657 if (IsIdentity) {
6658 assert(IdentitySrc && "Failed to set source vector of extracts");
6659 return IdentitySrc;
6660 }
6661
6662 // The code below this point is only designed to work for fixed width
6663 // vectors, so we bail out for now.
6664 if (VT.isScalableVector())
6665 return SDValue();
6666
6667 // A CONCAT_VECTOR of scalar sources, such as UNDEF, BUILD_VECTOR and
6668 // single-element INSERT_VECTOR_ELT operands can be simplified to one big
6669 // BUILD_VECTOR.
6670 // FIXME: Add support for SCALAR_TO_VECTOR as well.
6671 EVT SVT = VT.getScalarType();
6673 for (SDValue Op : Ops) {
6674 EVT OpVT = Op.getValueType();
6675 if (Op.isUndef())
6676 Elts.append(OpVT.getVectorNumElements(), DAG.getUNDEF(SVT));
6677 else if (Op.getOpcode() == ISD::BUILD_VECTOR)
6678 Elts.append(Op->op_begin(), Op->op_end());
6679 else if (Op.getOpcode() == ISD::INSERT_VECTOR_ELT &&
6680 OpVT.getVectorNumElements() == 1 &&
6681 isNullConstant(Op.getOperand(2)))
6682 Elts.push_back(Op.getOperand(1));
6683 else
6684 return SDValue();
6685 }
6686
6687 // BUILD_VECTOR requires all inputs to be of the same type, find the
6688 // maximum type and extend them all.
6689 for (SDValue Op : Elts)
6690 SVT = (SVT.bitsLT(Op.getValueType()) ? Op.getValueType() : SVT);
6691
6692 if (SVT.bitsGT(VT.getScalarType())) {
6693 for (SDValue &Op : Elts) {
6694 if (Op.isUndef())
6695 Op = DAG.getUNDEF(SVT);
6696 else
6697 Op = DAG.getTargetLoweringInfo().isZExtFree(Op.getValueType(), SVT)
6698 ? DAG.getZExtOrTrunc(Op, DL, SVT)
6699 : DAG.getSExtOrTrunc(Op, DL, SVT);
6700 }
6701 }
6702
6703 SDValue V = DAG.getBuildVector(VT, DL, Elts);
6704 NewSDValueDbgMsg(V, "New node fold concat vectors: ", &DAG);
6705 return V;
6706}
6707
6708/// Gets or creates the specified node.
6709SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT) {
6710 SDVTList VTs = getVTList(VT);
6712 AddNodeIDNode(ID, Opcode, VTs, {});
6713 void *IP = nullptr;
6714 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
6715 return SDValue(E, 0);
6716
6717 auto *N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
6718 CSEMap.InsertNode(N, IP);
6719
6720 InsertNode(N);
6721 SDValue V = SDValue(N, 0);
6722 NewSDValueDbgMsg(V, "Creating new node: ", this);
6723 return V;
6724}
6725
6726SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6727 SDValue N1) {
6728 SDNodeFlags Flags;
6729 if (Inserter)
6730 Flags = Inserter->getFlags();
6731 return getNode(Opcode, DL, VT, N1, Flags);
6732}
6733
6734SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
6735 SDValue N1, const SDNodeFlags Flags) {
6736 assert(N1.getOpcode() != ISD::DELETED_NODE && "Operand is DELETED_NODE!");
6737
6738 // Constant fold unary operations with a vector integer or float operand.
6739 switch (Opcode) {
6740 default:
6741 // FIXME: Entirely reasonable to perform folding of other unary
6742 // operations here as the need arises.
6743 break;
6744 case ISD::FNEG:
6745 case ISD::FABS:
6746 case ISD::FCEIL:
6747 case ISD::FTRUNC:
6748 case ISD::FFLOOR:
6749 case ISD::FP_EXTEND:
6750 case ISD::FP_TO_SINT:
6751 case ISD::FP_TO_UINT:
6752 case ISD::FP_TO_FP16:
6753 case ISD::FP_TO_BF16:
6754 case ISD::TRUNCATE:
6755 case ISD::ANY_EXTEND:
6756 case ISD::ZERO_EXTEND:
6757 case ISD::SIGN_EXTEND:
6758 case ISD::UINT_TO_FP:
6759 case ISD::SINT_TO_FP:
6760 case ISD::FP16_TO_FP:
6761 case ISD::BF16_TO_FP:
6762 case ISD::BITCAST:
6763 case ISD::ABS:
6764 case ISD::BITREVERSE:
6765 case ISD::BSWAP:
6766 case ISD::CTLZ:
6768 case ISD::CTTZ:
6770 case ISD::CTPOP:
6771 case ISD::CTLS:
6772 case ISD::STEP_VECTOR: {
6773 SDValue Ops = {N1};
6774 if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
6775 return Fold;
6776 }
6777 }
6778
6779 unsigned OpOpcode = N1.getNode()->getOpcode();
6780 switch (Opcode) {
6781 case ISD::STEP_VECTOR:
6782 assert(VT.isScalableVector() &&
6783 "STEP_VECTOR can only be used with scalable types");
6784 assert(OpOpcode == ISD::TargetConstant &&
6785 VT.getVectorElementType() == N1.getValueType() &&
6786 "Unexpected step operand");
6787 break;
6788 case ISD::FREEZE:
6789 assert(VT == N1.getValueType() && "Unexpected VT!");
6790 if (isGuaranteedNotToBeUndefOrPoison(N1, /*PoisonOnly=*/false))
6791 return N1;
6792 break;
6793 case ISD::TokenFactor:
6794 case ISD::MERGE_VALUES:
6796 return N1; // Factor, merge or concat of one node? No need.
6797 case ISD::BUILD_VECTOR: {
6798 // Attempt to simplify BUILD_VECTOR.
6799 SDValue Ops[] = {N1};
6800 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
6801 return V;
6802 break;
6803 }
6804 case ISD::FP_ROUND: llvm_unreachable("Invalid method to make FP_ROUND node");
6805 case ISD::FP_EXTEND:
6807 "Invalid FP cast!");
6808 if (N1.getValueType() == VT) return N1; // noop conversion.
6809 assert((!VT.isVector() || VT.getVectorElementCount() ==
6811 "Vector element count mismatch!");
6812 assert(N1.getValueType().bitsLT(VT) && "Invalid fpext node, dst < src!");
6813 if (N1.isUndef())
6814 return getUNDEF(VT);
6815 break;
6816 case ISD::FP_TO_SINT:
6817 case ISD::FP_TO_UINT:
6818 if (N1.isUndef())
6819 return getUNDEF(VT);
6820 break;
6821 case ISD::SINT_TO_FP:
6822 case ISD::UINT_TO_FP:
6823 // [us]itofp(undef) = 0, because the result value is bounded.
6824 if (N1.isUndef())
6825 return getConstantFP(0.0, DL, VT);
6826 break;
6827 case ISD::SIGN_EXTEND:
6828 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6829 "Invalid SIGN_EXTEND!");
6830 assert(VT.isVector() == N1.getValueType().isVector() &&
6831 "SIGN_EXTEND result type type should be vector iff the operand "
6832 "type is vector!");
6833 if (N1.getValueType() == VT) return N1; // noop extension
6834 assert((!VT.isVector() || VT.getVectorElementCount() ==
6836 "Vector element count mismatch!");
6837 assert(N1.getValueType().bitsLT(VT) && "Invalid sext node, dst < src!");
6838 if (OpOpcode == ISD::SIGN_EXTEND || OpOpcode == ISD::ZERO_EXTEND) {
6839 SDNodeFlags Flags;
6840 if (OpOpcode == ISD::ZERO_EXTEND)
6841 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6842 SDValue NewVal = getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
6843 transferDbgValues(N1, NewVal);
6844 return NewVal;
6845 }
6846
6847 if (OpOpcode == ISD::POISON)
6848 return getPOISON(VT);
6849
6850 if (N1.isUndef())
6851 // sext(undef) = 0, because the top bits will all be the same.
6852 return getConstant(0, DL, VT);
6853
6854 // Skip unnecessary sext_inreg pattern:
6855 // (sext (trunc x)) -> x iff the upper bits are all signbits.
6856 if (OpOpcode == ISD::TRUNCATE) {
6857 SDValue OpOp = N1.getOperand(0);
6858 if (OpOp.getValueType() == VT) {
6859 unsigned NumSignExtBits =
6861 if (ComputeNumSignBits(OpOp) > NumSignExtBits) {
6862 transferDbgValues(N1, OpOp);
6863 return OpOp;
6864 }
6865 }
6866 }
6867 break;
6868 case ISD::ZERO_EXTEND:
6869 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6870 "Invalid ZERO_EXTEND!");
6871 assert(VT.isVector() == N1.getValueType().isVector() &&
6872 "ZERO_EXTEND result type type should be vector iff the operand "
6873 "type is vector!");
6874 if (N1.getValueType() == VT) return N1; // noop extension
6875 assert((!VT.isVector() || VT.getVectorElementCount() ==
6877 "Vector element count mismatch!");
6878 assert(N1.getValueType().bitsLT(VT) && "Invalid zext node, dst < src!");
6879 if (OpOpcode == ISD::ZERO_EXTEND) { // (zext (zext x)) -> (zext x)
6880 SDNodeFlags Flags;
6881 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6882 SDValue NewVal =
6883 getNode(ISD::ZERO_EXTEND, DL, VT, N1.getOperand(0), Flags);
6884 transferDbgValues(N1, NewVal);
6885 return NewVal;
6886 }
6887
6888 if (OpOpcode == ISD::POISON)
6889 return getPOISON(VT);
6890
6891 if (N1.isUndef())
6892 // zext(undef) = 0, because the top bits will be zero.
6893 return getConstant(0, DL, VT);
6894
6895 // Skip unnecessary zext_inreg pattern:
6896 // (zext (trunc x)) -> x iff the upper bits are known zero.
6897 // TODO: Remove (zext (trunc (and x, c))) exception which some targets
6898 // use to recognise zext_inreg patterns.
6899 if (OpOpcode == ISD::TRUNCATE) {
6900 SDValue OpOp = N1.getOperand(0);
6901 if (OpOp.getValueType() == VT) {
6902 if (OpOp.getOpcode() != ISD::AND) {
6905 if (MaskedValueIsZero(OpOp, HiBits)) {
6906 transferDbgValues(N1, OpOp);
6907 return OpOp;
6908 }
6909 }
6910 }
6911 }
6912 break;
6913 case ISD::ANY_EXTEND:
6914 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6915 "Invalid ANY_EXTEND!");
6916 assert(VT.isVector() == N1.getValueType().isVector() &&
6917 "ANY_EXTEND result type type should be vector iff the operand "
6918 "type is vector!");
6919 if (N1.getValueType() == VT) return N1; // noop extension
6920 assert((!VT.isVector() || VT.getVectorElementCount() ==
6922 "Vector element count mismatch!");
6923 assert(N1.getValueType().bitsLT(VT) && "Invalid anyext node, dst < src!");
6924
6925 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
6926 OpOpcode == ISD::ANY_EXTEND) {
6927 SDNodeFlags Flags;
6928 if (OpOpcode == ISD::ZERO_EXTEND)
6929 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6930 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
6931 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
6932 }
6933 if (N1.isUndef())
6934 return getUNDEF(VT);
6935
6936 // (ext (trunc x)) -> x
6937 if (OpOpcode == ISD::TRUNCATE) {
6938 SDValue OpOp = N1.getOperand(0);
6939 if (OpOp.getValueType() == VT) {
6940 transferDbgValues(N1, OpOp);
6941 return OpOp;
6942 }
6943 }
6944 break;
6945 case ISD::TRUNCATE:
6946 assert(VT.isInteger() && N1.getValueType().isInteger() &&
6947 "Invalid TRUNCATE!");
6948 assert(VT.isVector() == N1.getValueType().isVector() &&
6949 "TRUNCATE result type type should be vector iff the operand "
6950 "type is vector!");
6951 if (N1.getValueType() == VT) return N1; // noop truncate
6952 assert((!VT.isVector() || VT.getVectorElementCount() ==
6954 "Vector element count mismatch!");
6955 assert(N1.getValueType().bitsGT(VT) && "Invalid truncate node, src < dst!");
6956 if (OpOpcode == ISD::TRUNCATE)
6957 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
6958 if (OpOpcode == ISD::ZERO_EXTEND || OpOpcode == ISD::SIGN_EXTEND ||
6959 OpOpcode == ISD::ANY_EXTEND) {
6960 // If the source is smaller than the dest, we still need an extend.
6962 VT.getScalarType())) {
6963 SDNodeFlags Flags;
6964 if (OpOpcode == ISD::ZERO_EXTEND)
6965 Flags.setNonNeg(N1->getFlags().hasNonNeg());
6966 return getNode(OpOpcode, DL, VT, N1.getOperand(0), Flags);
6967 }
6968 if (N1.getOperand(0).getValueType().bitsGT(VT))
6969 return getNode(ISD::TRUNCATE, DL, VT, N1.getOperand(0));
6970 return N1.getOperand(0);
6971 }
6972 if (N1.isUndef())
6973 return getUNDEF(VT);
6974 if (OpOpcode == ISD::VSCALE && !NewNodesMustHaveLegalTypes)
6975 return getVScale(DL, VT,
6977 break;
6981 assert(VT.isVector() && "This DAG node is restricted to vector types.");
6982 assert(N1.getValueType().bitsLE(VT) &&
6983 "The input must be the same size or smaller than the result.");
6986 "The destination vector type must have fewer lanes than the input.");
6987 break;
6988 case ISD::ABS:
6989 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid ABS!");
6990 if (N1.isUndef())
6991 return getConstant(0, DL, VT);
6992 break;
6993 case ISD::BSWAP:
6994 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BSWAP!");
6995 assert((VT.getScalarSizeInBits() % 16 == 0) &&
6996 "BSWAP types must be a multiple of 16 bits!");
6997 if (N1.isUndef())
6998 return getUNDEF(VT);
6999 // bswap(bswap(X)) -> X.
7000 if (OpOpcode == ISD::BSWAP)
7001 return N1.getOperand(0);
7002 break;
7003 case ISD::BITREVERSE:
7004 assert(VT.isInteger() && VT == N1.getValueType() && "Invalid BITREVERSE!");
7005 if (N1.isUndef())
7006 return getUNDEF(VT);
7007 break;
7008 case ISD::BITCAST:
7010 "Cannot BITCAST between types of different sizes!");
7011 if (VT == N1.getValueType()) return N1; // noop conversion.
7012 if (OpOpcode == ISD::BITCAST) // bitconv(bitconv(x)) -> bitconv(x)
7013 return getNode(ISD::BITCAST, DL, VT, N1.getOperand(0));
7014 if (N1.isUndef())
7015 return getUNDEF(VT);
7016 break;
7018 assert(VT.isVector() && !N1.getValueType().isVector() &&
7019 (VT.getVectorElementType() == N1.getValueType() ||
7021 N1.getValueType().isInteger() &&
7023 "Illegal SCALAR_TO_VECTOR node!");
7024 if (N1.isUndef())
7025 return getUNDEF(VT);
7026 // scalar_to_vector(extract_vector_elt V, 0) -> V, top bits are undefined.
7027 if (OpOpcode == ISD::EXTRACT_VECTOR_ELT &&
7029 N1.getConstantOperandVal(1) == 0 &&
7030 N1.getOperand(0).getValueType() == VT)
7031 return N1.getOperand(0);
7032 break;
7033 case ISD::FNEG:
7034 // Negation of an unknown bag of bits is still completely undefined.
7035 if (N1.isUndef())
7036 return getUNDEF(VT);
7037
7038 if (OpOpcode == ISD::FNEG) // --X -> X
7039 return N1.getOperand(0);
7040 break;
7041 case ISD::FABS:
7042 if (OpOpcode == ISD::FNEG) // abs(-X) -> abs(X)
7043 return getNode(ISD::FABS, DL, VT, N1.getOperand(0));
7044 break;
7045 case ISD::VSCALE:
7046 assert(VT == N1.getValueType() && "Unexpected VT!");
7047 break;
7048 case ISD::CTPOP:
7049 if (N1.getValueType().getScalarType() == MVT::i1)
7050 return N1;
7051 break;
7052 case ISD::CTLZ:
7053 case ISD::CTTZ:
7054 if (N1.getValueType().getScalarType() == MVT::i1)
7055 return getNOT(DL, N1, N1.getValueType());
7056 break;
7057 case ISD::CTLS:
7058 if (N1.getValueType().getScalarType() == MVT::i1)
7059 return getConstant(0, DL, VT);
7060 break;
7061 case ISD::VECREDUCE_ADD:
7062 if (N1.getValueType().getScalarType() == MVT::i1)
7063 return getNode(ISD::VECREDUCE_XOR, DL, VT, N1);
7064 break;
7067 if (N1.getValueType().getScalarType() == MVT::i1)
7068 return getNode(ISD::VECREDUCE_OR, DL, VT, N1);
7069 break;
7072 if (N1.getValueType().getScalarType() == MVT::i1)
7073 return getNode(ISD::VECREDUCE_AND, DL, VT, N1);
7074 break;
7075 case ISD::SPLAT_VECTOR:
7076 assert(VT.isVector() && "Wrong return type!");
7077 // FIXME: Hexagon uses i32 scalar for a floating point zero vector so allow
7078 // that for now.
7080 (VT.isFloatingPoint() && N1.getValueType() == MVT::i32) ||
7082 N1.getValueType().isInteger() &&
7084 "Wrong operand type!");
7085 break;
7086 }
7087
7088 SDNode *N;
7089 SDVTList VTs = getVTList(VT);
7090 SDValue Ops[] = {N1};
7091 if (VT != MVT::Glue) { // Don't CSE glue producing nodes
7093 AddNodeIDNode(ID, Opcode, VTs, Ops);
7094 void *IP = nullptr;
7095 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
7096 E->intersectFlagsWith(Flags);
7097 return SDValue(E, 0);
7098 }
7099
7100 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7101 N->setFlags(Flags);
7102 createOperands(N, Ops);
7103 CSEMap.InsertNode(N, IP);
7104 } else {
7105 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
7106 createOperands(N, Ops);
7107 }
7108
7109 InsertNode(N);
7110 SDValue V = SDValue(N, 0);
7111 NewSDValueDbgMsg(V, "Creating new node: ", this);
7112 return V;
7113}
7114
7115static std::optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
7116 const APInt &C2) {
7117 switch (Opcode) {
7118 case ISD::ADD: return C1 + C2;
7119 case ISD::SUB: return C1 - C2;
7120 case ISD::MUL: return C1 * C2;
7121 case ISD::AND: return C1 & C2;
7122 case ISD::OR: return C1 | C2;
7123 case ISD::XOR: return C1 ^ C2;
7124 case ISD::SHL: return C1 << C2;
7125 case ISD::SRL: return C1.lshr(C2);
7126 case ISD::SRA: return C1.ashr(C2);
7127 case ISD::ROTL: return C1.rotl(C2);
7128 case ISD::ROTR: return C1.rotr(C2);
7129 case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
7130 case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
7131 case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
7132 case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
7133 case ISD::SADDSAT: return C1.sadd_sat(C2);
7134 case ISD::UADDSAT: return C1.uadd_sat(C2);
7135 case ISD::SSUBSAT: return C1.ssub_sat(C2);
7136 case ISD::USUBSAT: return C1.usub_sat(C2);
7137 case ISD::SSHLSAT: return C1.sshl_sat(C2);
7138 case ISD::USHLSAT: return C1.ushl_sat(C2);
7139 case ISD::UDIV:
7140 if (!C2.getBoolValue())
7141 break;
7142 return C1.udiv(C2);
7143 case ISD::UREM:
7144 if (!C2.getBoolValue())
7145 break;
7146 return C1.urem(C2);
7147 case ISD::SDIV:
7148 if (!C2.getBoolValue())
7149 break;
7150 return C1.sdiv(C2);
7151 case ISD::SREM:
7152 if (!C2.getBoolValue())
7153 break;
7154 return C1.srem(C2);
7155 case ISD::AVGFLOORS:
7156 return APIntOps::avgFloorS(C1, C2);
7157 case ISD::AVGFLOORU:
7158 return APIntOps::avgFloorU(C1, C2);
7159 case ISD::AVGCEILS:
7160 return APIntOps::avgCeilS(C1, C2);
7161 case ISD::AVGCEILU:
7162 return APIntOps::avgCeilU(C1, C2);
7163 case ISD::ABDS:
7164 return APIntOps::abds(C1, C2);
7165 case ISD::ABDU:
7166 return APIntOps::abdu(C1, C2);
7167 case ISD::MULHS:
7168 return APIntOps::mulhs(C1, C2);
7169 case ISD::MULHU:
7170 return APIntOps::mulhu(C1, C2);
7171 case ISD::CLMUL:
7172 return APIntOps::clmul(C1, C2);
7173 case ISD::CLMULR:
7174 return APIntOps::clmulr(C1, C2);
7175 case ISD::CLMULH:
7176 return APIntOps::clmulh(C1, C2);
7177 }
7178 return std::nullopt;
7179}
7180// Handle constant folding with UNDEF.
7181// TODO: Handle more cases.
7182static std::optional<APInt> FoldValueWithUndef(unsigned Opcode, const APInt &C1,
7183 bool IsUndef1, const APInt &C2,
7184 bool IsUndef2) {
7185 if (!(IsUndef1 || IsUndef2))
7186 return FoldValue(Opcode, C1, C2);
7187
7188 // Fold and(x, undef) -> 0
7189 // Fold mul(x, undef) -> 0
7190 if (Opcode == ISD::AND || Opcode == ISD::MUL)
7191 return APInt::getZero(C1.getBitWidth());
7192
7193 return std::nullopt;
7194}
7195
7197 const GlobalAddressSDNode *GA,
7198 const SDNode *N2) {
7199 if (GA->getOpcode() != ISD::GlobalAddress)
7200 return SDValue();
7201 if (!TLI->isOffsetFoldingLegal(GA))
7202 return SDValue();
7203 auto *C2 = dyn_cast<ConstantSDNode>(N2);
7204 if (!C2)
7205 return SDValue();
7206 int64_t Offset = C2->getSExtValue();
7207 switch (Opcode) {
7208 case ISD::ADD:
7209 case ISD::PTRADD:
7210 break;
7211 case ISD::SUB: Offset = -uint64_t(Offset); break;
7212 default: return SDValue();
7213 }
7214 return getGlobalAddress(GA->getGlobal(), SDLoc(C2), VT,
7215 GA->getOffset() + uint64_t(Offset));
7216}
7217
7219 switch (Opcode) {
7220 case ISD::SDIV:
7221 case ISD::UDIV:
7222 case ISD::SREM:
7223 case ISD::UREM: {
7224 // If a divisor is zero/undef or any element of a divisor vector is
7225 // zero/undef, the whole op is undef.
7226 assert(Ops.size() == 2 && "Div/rem should have 2 operands");
7227 SDValue Divisor = Ops[1];
7228 if (Divisor.isUndef() || isNullConstant(Divisor))
7229 return true;
7230
7231 return ISD::isBuildVectorOfConstantSDNodes(Divisor.getNode()) &&
7232 llvm::any_of(Divisor->op_values(),
7233 [](SDValue V) { return V.isUndef() ||
7234 isNullConstant(V); });
7235 // TODO: Handle signed overflow.
7236 }
7237 // TODO: Handle oversized shifts.
7238 default:
7239 return false;
7240 }
7241}
7242
7245 SDNodeFlags Flags) {
7246 // If the opcode is a target-specific ISD node, there's nothing we can
7247 // do here and the operand rules may not line up with the below, so
7248 // bail early.
7249 // We can't create a scalar CONCAT_VECTORS so skip it. It will break
7250 // for concats involving SPLAT_VECTOR. Concats of BUILD_VECTORS are handled by
7251 // foldCONCAT_VECTORS in getNode before this is called.
7252 if (Opcode >= ISD::BUILTIN_OP_END || Opcode == ISD::CONCAT_VECTORS)
7253 return SDValue();
7254
7255 unsigned NumOps = Ops.size();
7256 if (NumOps == 0)
7257 return SDValue();
7258
7259 if (isUndef(Opcode, Ops))
7260 return getUNDEF(VT);
7261
7262 // Handle unary special cases.
7263 if (NumOps == 1) {
7264 SDValue N1 = Ops[0];
7265
7266 // Constant fold unary operations with an integer constant operand. Even
7267 // opaque constant will be folded, because the folding of unary operations
7268 // doesn't create new constants with different values. Nevertheless, the
7269 // opaque flag is preserved during folding to prevent future folding with
7270 // other constants.
7271 if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
7272 const APInt &Val = C->getAPIntValue();
7273 switch (Opcode) {
7274 case ISD::SIGN_EXTEND:
7275 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7276 C->isTargetOpcode(), C->isOpaque());
7277 case ISD::TRUNCATE:
7278 if (C->isOpaque())
7279 break;
7280 [[fallthrough]];
7281 case ISD::ZERO_EXTEND:
7282 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7283 C->isTargetOpcode(), C->isOpaque());
7284 case ISD::ANY_EXTEND:
7285 // Some targets like RISCV prefer to sign extend some types.
7286 if (TLI->isSExtCheaperThanZExt(N1.getValueType(), VT))
7287 return getConstant(Val.sextOrTrunc(VT.getSizeInBits()), DL, VT,
7288 C->isTargetOpcode(), C->isOpaque());
7289 return getConstant(Val.zextOrTrunc(VT.getSizeInBits()), DL, VT,
7290 C->isTargetOpcode(), C->isOpaque());
7291 case ISD::ABS:
7292 return getConstant(Val.abs(), DL, VT, C->isTargetOpcode(),
7293 C->isOpaque());
7294 case ISD::BITREVERSE:
7295 return getConstant(Val.reverseBits(), DL, VT, C->isTargetOpcode(),
7296 C->isOpaque());
7297 case ISD::BSWAP:
7298 return getConstant(Val.byteSwap(), DL, VT, C->isTargetOpcode(),
7299 C->isOpaque());
7300 case ISD::CTPOP:
7301 return getConstant(Val.popcount(), DL, VT, C->isTargetOpcode(),
7302 C->isOpaque());
7303 case ISD::CTLZ:
7305 return getConstant(Val.countl_zero(), DL, VT, C->isTargetOpcode(),
7306 C->isOpaque());
7307 case ISD::CTTZ:
7309 return getConstant(Val.countr_zero(), DL, VT, C->isTargetOpcode(),
7310 C->isOpaque());
7311 case ISD::CTLS:
7312 // CTLS returns the number of extra sign bits so subtract one.
7313 return getConstant(Val.getNumSignBits() - 1, DL, VT,
7314 C->isTargetOpcode(), C->isOpaque());
7315 case ISD::UINT_TO_FP:
7316 case ISD::SINT_TO_FP: {
7318 (void)FPV.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
7320 return getConstantFP(FPV, DL, VT);
7321 }
7322 case ISD::FP16_TO_FP:
7323 case ISD::BF16_TO_FP: {
7324 bool Ignored;
7325 APFloat FPV(Opcode == ISD::FP16_TO_FP ? APFloat::IEEEhalf()
7326 : APFloat::BFloat(),
7327 (Val.getBitWidth() == 16) ? Val : Val.trunc(16));
7328
7329 // This can return overflow, underflow, or inexact; we don't care.
7330 // FIXME need to be more flexible about rounding mode.
7332 &Ignored);
7333 return getConstantFP(FPV, DL, VT);
7334 }
7335 case ISD::STEP_VECTOR:
7336 if (SDValue V = FoldSTEP_VECTOR(DL, VT, N1, *this))
7337 return V;
7338 break;
7339 case ISD::BITCAST:
7340 if (VT == MVT::f16 && C->getValueType(0) == MVT::i16)
7341 return getConstantFP(APFloat(APFloat::IEEEhalf(), Val), DL, VT);
7342 if (VT == MVT::f32 && C->getValueType(0) == MVT::i32)
7343 return getConstantFP(APFloat(APFloat::IEEEsingle(), Val), DL, VT);
7344 if (VT == MVT::f64 && C->getValueType(0) == MVT::i64)
7345 return getConstantFP(APFloat(APFloat::IEEEdouble(), Val), DL, VT);
7346 if (VT == MVT::f128 && C->getValueType(0) == MVT::i128)
7347 return getConstantFP(APFloat(APFloat::IEEEquad(), Val), DL, VT);
7348 break;
7349 }
7350 }
7351
7352 // Constant fold unary operations with a floating point constant operand.
7353 if (auto *C = dyn_cast<ConstantFPSDNode>(N1)) {
7354 APFloat V = C->getValueAPF(); // make copy
7355 switch (Opcode) {
7356 case ISD::FNEG:
7357 V.changeSign();
7358 return getConstantFP(V, DL, VT);
7359 case ISD::FABS:
7360 V.clearSign();
7361 return getConstantFP(V, DL, VT);
7362 case ISD::FCEIL: {
7363 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardPositive);
7365 return getConstantFP(V, DL, VT);
7366 return SDValue();
7367 }
7368 case ISD::FTRUNC: {
7369 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardZero);
7371 return getConstantFP(V, DL, VT);
7372 return SDValue();
7373 }
7374 case ISD::FFLOOR: {
7375 APFloat::opStatus fs = V.roundToIntegral(APFloat::rmTowardNegative);
7377 return getConstantFP(V, DL, VT);
7378 return SDValue();
7379 }
7380 case ISD::FP_EXTEND: {
7381 bool ignored;
7382 // This can return overflow, underflow, or inexact; we don't care.
7383 // FIXME need to be more flexible about rounding mode.
7384 (void)V.convert(VT.getFltSemantics(), APFloat::rmNearestTiesToEven,
7385 &ignored);
7386 return getConstantFP(V, DL, VT);
7387 }
7388 case ISD::FP_TO_SINT:
7389 case ISD::FP_TO_UINT: {
7390 bool ignored;
7391 APSInt IntVal(VT.getSizeInBits(), Opcode == ISD::FP_TO_UINT);
7392 // FIXME need to be more flexible about rounding mode.
7394 V.convertToInteger(IntVal, APFloat::rmTowardZero, &ignored);
7395 if (s == APFloat::opInvalidOp) // inexact is OK, in fact usual
7396 break;
7397 return getConstant(IntVal, DL, VT);
7398 }
7399 case ISD::FP_TO_FP16:
7400 case ISD::FP_TO_BF16: {
7401 bool Ignored;
7402 // This can return overflow, underflow, or inexact; we don't care.
7403 // FIXME need to be more flexible about rounding mode.
7404 (void)V.convert(Opcode == ISD::FP_TO_FP16 ? APFloat::IEEEhalf()
7405 : APFloat::BFloat(),
7407 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7408 }
7409 case ISD::BITCAST:
7410 if (VT == MVT::i16 && C->getValueType(0) == MVT::f16)
7411 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7412 VT);
7413 if (VT == MVT::i16 && C->getValueType(0) == MVT::bf16)
7414 return getConstant((uint16_t)V.bitcastToAPInt().getZExtValue(), DL,
7415 VT);
7416 if (VT == MVT::i32 && C->getValueType(0) == MVT::f32)
7417 return getConstant((uint32_t)V.bitcastToAPInt().getZExtValue(), DL,
7418 VT);
7419 if (VT == MVT::i64 && C->getValueType(0) == MVT::f64)
7420 return getConstant(V.bitcastToAPInt().getZExtValue(), DL, VT);
7421 break;
7422 }
7423 }
7424
7425 // Early-out if we failed to constant fold a bitcast.
7426 if (Opcode == ISD::BITCAST)
7427 return SDValue();
7428 }
7429
7430 // Handle binops special cases.
7431 if (NumOps == 2) {
7432 if (SDValue CFP = foldConstantFPMath(Opcode, DL, VT, Ops))
7433 return CFP;
7434
7435 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7436 if (auto *C2 = dyn_cast<ConstantSDNode>(Ops[1])) {
7437 if (C1->isOpaque() || C2->isOpaque())
7438 return SDValue();
7439
7440 std::optional<APInt> FoldAttempt =
7441 FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue());
7442 if (!FoldAttempt)
7443 return SDValue();
7444
7445 SDValue Folded = getConstant(*FoldAttempt, DL, VT);
7446 assert((!Folded || !VT.isVector()) &&
7447 "Can't fold vectors ops with scalar operands");
7448 return Folded;
7449 }
7450 }
7451
7452 // fold (add Sym, c) -> Sym+c
7454 return FoldSymbolOffset(Opcode, VT, GA, Ops[1].getNode());
7455 if (TLI->isCommutativeBinOp(Opcode))
7457 return FoldSymbolOffset(Opcode, VT, GA, Ops[0].getNode());
7458
7459 // fold (sext_in_reg c1) -> c2
7460 if (Opcode == ISD::SIGN_EXTEND_INREG) {
7461 EVT EVT = cast<VTSDNode>(Ops[1])->getVT();
7462
7463 auto SignExtendInReg = [&](APInt Val, llvm::EVT ConstantVT) {
7464 unsigned FromBits = EVT.getScalarSizeInBits();
7465 Val <<= Val.getBitWidth() - FromBits;
7466 Val.ashrInPlace(Val.getBitWidth() - FromBits);
7467 return getConstant(Val, DL, ConstantVT);
7468 };
7469
7470 if (auto *C1 = dyn_cast<ConstantSDNode>(Ops[0])) {
7471 const APInt &Val = C1->getAPIntValue();
7472 return SignExtendInReg(Val, VT);
7473 }
7474
7476 SmallVector<SDValue, 8> ScalarOps;
7477 llvm::EVT OpVT = Ops[0].getOperand(0).getValueType();
7478 for (int I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
7479 SDValue Op = Ops[0].getOperand(I);
7480 if (Op.isUndef()) {
7481 ScalarOps.push_back(getUNDEF(OpVT));
7482 continue;
7483 }
7484 const APInt &Val = cast<ConstantSDNode>(Op)->getAPIntValue();
7485 ScalarOps.push_back(SignExtendInReg(Val, OpVT));
7486 }
7487 return getBuildVector(VT, DL, ScalarOps);
7488 }
7489
7490 if (Ops[0].getOpcode() == ISD::SPLAT_VECTOR &&
7491 isa<ConstantSDNode>(Ops[0].getOperand(0)))
7492 return getNode(ISD::SPLAT_VECTOR, DL, VT,
7493 SignExtendInReg(Ops[0].getConstantOperandAPInt(0),
7494 Ops[0].getOperand(0).getValueType()));
7495 }
7496 }
7497
7498 // Handle fshl/fshr special cases.
7499 if (Opcode == ISD::FSHL || Opcode == ISD::FSHR) {
7500 auto *C1 = dyn_cast<ConstantSDNode>(Ops[0]);
7501 auto *C2 = dyn_cast<ConstantSDNode>(Ops[1]);
7502 auto *C3 = dyn_cast<ConstantSDNode>(Ops[2]);
7503
7504 if (C1 && C2 && C3) {
7505 if (C1->isOpaque() || C2->isOpaque() || C3->isOpaque())
7506 return SDValue();
7507 const APInt &V1 = C1->getAPIntValue(), &V2 = C2->getAPIntValue(),
7508 &V3 = C3->getAPIntValue();
7509
7510 APInt FoldedVal = Opcode == ISD::FSHL ? APIntOps::fshl(V1, V2, V3)
7511 : APIntOps::fshr(V1, V2, V3);
7512 return getConstant(FoldedVal, DL, VT);
7513 }
7514 }
7515
7516 // Handle fma/fmad special cases.
7517 if (Opcode == ISD::FMA || Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7518 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
7519 assert(Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7520 Ops[2].getValueType() == VT && "FMA types must match!");
7524 if (C1 && C2 && C3) {
7525 APFloat V1 = C1->getValueAPF();
7526 const APFloat &V2 = C2->getValueAPF();
7527 const APFloat &V3 = C3->getValueAPF();
7528 if (Opcode == ISD::FMAD || Opcode == ISD::FMULADD) {
7531 } else
7533 return getConstantFP(V1, DL, VT);
7534 }
7535 }
7536
7537 // This is for vector folding only from here on.
7538 if (!VT.isVector())
7539 return SDValue();
7540
7541 ElementCount NumElts = VT.getVectorElementCount();
7542
7543 // See if we can fold through any bitcasted integer ops.
7544 if (NumOps == 2 && VT.isFixedLengthVector() && VT.isInteger() &&
7545 Ops[0].getValueType() == VT && Ops[1].getValueType() == VT &&
7546 (Ops[0].getOpcode() == ISD::BITCAST ||
7547 Ops[1].getOpcode() == ISD::BITCAST)) {
7550 auto *BV1 = dyn_cast<BuildVectorSDNode>(N1);
7551 auto *BV2 = dyn_cast<BuildVectorSDNode>(N2);
7552 if (BV1 && BV2 && N1.getValueType().isInteger() &&
7553 N2.getValueType().isInteger()) {
7554 bool IsLE = getDataLayout().isLittleEndian();
7555 unsigned EltBits = VT.getScalarSizeInBits();
7556 SmallVector<APInt> RawBits1, RawBits2;
7557 BitVector UndefElts1, UndefElts2;
7558 if (BV1->getConstantRawBits(IsLE, EltBits, RawBits1, UndefElts1) &&
7559 BV2->getConstantRawBits(IsLE, EltBits, RawBits2, UndefElts2)) {
7560 SmallVector<APInt> RawBits;
7561 for (unsigned I = 0, E = NumElts.getFixedValue(); I != E; ++I) {
7562 std::optional<APInt> Fold = FoldValueWithUndef(
7563 Opcode, RawBits1[I], UndefElts1[I], RawBits2[I], UndefElts2[I]);
7564 if (!Fold)
7565 break;
7566 RawBits.push_back(*Fold);
7567 }
7568 if (RawBits.size() == NumElts.getFixedValue()) {
7569 // We have constant folded, but we might need to cast this again back
7570 // to the original (possibly legalized) type.
7571 EVT BVVT, BVEltVT;
7572 if (N1.getValueType() == VT) {
7573 BVVT = N1.getValueType();
7574 BVEltVT = BV1->getOperand(0).getValueType();
7575 } else {
7576 BVVT = N2.getValueType();
7577 BVEltVT = BV2->getOperand(0).getValueType();
7578 }
7579 unsigned BVEltBits = BVEltVT.getSizeInBits();
7580 SmallVector<APInt> DstBits;
7581 BitVector DstUndefs;
7583 DstBits, RawBits, DstUndefs,
7584 BitVector(RawBits.size(), false));
7585 SmallVector<SDValue> Ops(DstBits.size(), getUNDEF(BVEltVT));
7586 for (unsigned I = 0, E = DstBits.size(); I != E; ++I) {
7587 if (DstUndefs[I])
7588 continue;
7589 Ops[I] = getConstant(DstBits[I].sext(BVEltBits), DL, BVEltVT);
7590 }
7591 return getBitcast(VT, getBuildVector(BVVT, DL, Ops));
7592 }
7593 }
7594 }
7595 }
7596
7597 // Fold (mul step_vector(C0), C1) to (step_vector(C0 * C1)).
7598 // (shl step_vector(C0), C1) -> (step_vector(C0 << C1))
7599 if ((Opcode == ISD::MUL || Opcode == ISD::SHL) &&
7600 Ops[0].getOpcode() == ISD::STEP_VECTOR) {
7601 APInt RHSVal;
7602 if (ISD::isConstantSplatVector(Ops[1].getNode(), RHSVal)) {
7603 APInt NewStep = Opcode == ISD::MUL
7604 ? Ops[0].getConstantOperandAPInt(0) * RHSVal
7605 : Ops[0].getConstantOperandAPInt(0) << RHSVal;
7606 return getStepVector(DL, VT, NewStep);
7607 }
7608 }
7609
7610 auto IsScalarOrSameVectorSize = [NumElts](const SDValue &Op) {
7611 return !Op.getValueType().isVector() ||
7612 Op.getValueType().getVectorElementCount() == NumElts;
7613 };
7614
7615 auto IsBuildVectorSplatVectorOrUndef = [](const SDValue &Op) {
7616 return Op.isUndef() || Op.getOpcode() == ISD::CONDCODE ||
7617 Op.getOpcode() == ISD::BUILD_VECTOR ||
7618 Op.getOpcode() == ISD::SPLAT_VECTOR;
7619 };
7620
7621 // All operands must be vector types with the same number of elements as
7622 // the result type and must be either UNDEF or a build/splat vector
7623 // or UNDEF scalars.
7624 if (!llvm::all_of(Ops, IsBuildVectorSplatVectorOrUndef) ||
7625 !llvm::all_of(Ops, IsScalarOrSameVectorSize))
7626 return SDValue();
7627
7628 // If we are comparing vectors, then the result needs to be a i1 boolean that
7629 // is then extended back to the legal result type depending on how booleans
7630 // are represented.
7631 EVT SVT = (Opcode == ISD::SETCC ? MVT::i1 : VT.getScalarType());
7632 ISD::NodeType ExtendCode =
7633 (Opcode == ISD::SETCC && SVT != VT.getScalarType())
7634 ? TargetLowering::getExtendForContent(TLI->getBooleanContents(VT))
7636
7637 // Find legal integer scalar type for constant promotion and
7638 // ensure that its scalar size is at least as large as source.
7639 EVT LegalSVT = VT.getScalarType();
7640 if (NewNodesMustHaveLegalTypes && LegalSVT.isInteger()) {
7641 LegalSVT = TLI->getTypeToTransformTo(*getContext(), LegalSVT);
7642 if (LegalSVT.bitsLT(VT.getScalarType()))
7643 return SDValue();
7644 }
7645
7646 // For scalable vector types we know we're dealing with SPLAT_VECTORs. We
7647 // only have one operand to check. For fixed-length vector types we may have
7648 // a combination of BUILD_VECTOR and SPLAT_VECTOR.
7649 unsigned NumVectorElts = NumElts.isScalable() ? 1 : NumElts.getFixedValue();
7650
7651 // Constant fold each scalar lane separately.
7652 SmallVector<SDValue, 4> ScalarResults;
7653 for (unsigned I = 0; I != NumVectorElts; I++) {
7654 SmallVector<SDValue, 4> ScalarOps;
7655 for (SDValue Op : Ops) {
7656 EVT InSVT = Op.getValueType().getScalarType();
7657 if (Op.getOpcode() != ISD::BUILD_VECTOR &&
7658 Op.getOpcode() != ISD::SPLAT_VECTOR) {
7659 if (Op.isUndef())
7660 ScalarOps.push_back(getUNDEF(InSVT));
7661 else
7662 ScalarOps.push_back(Op);
7663 continue;
7664 }
7665
7666 SDValue ScalarOp =
7667 Op.getOperand(Op.getOpcode() == ISD::SPLAT_VECTOR ? 0 : I);
7668 EVT ScalarVT = ScalarOp.getValueType();
7669
7670 // Build vector (integer) scalar operands may need implicit
7671 // truncation - do this before constant folding.
7672 if (ScalarVT.isInteger() && ScalarVT.bitsGT(InSVT)) {
7673 // Don't create illegally-typed nodes unless they're constants or undef
7674 // - if we fail to constant fold we can't guarantee the (dead) nodes
7675 // we're creating will be cleaned up before being visited for
7676 // legalization.
7677 if (NewNodesMustHaveLegalTypes && !ScalarOp.isUndef() &&
7678 !isa<ConstantSDNode>(ScalarOp) &&
7679 TLI->getTypeAction(*getContext(), InSVT) !=
7681 return SDValue();
7682 ScalarOp = getNode(ISD::TRUNCATE, DL, InSVT, ScalarOp);
7683 }
7684
7685 ScalarOps.push_back(ScalarOp);
7686 }
7687
7688 // Constant fold the scalar operands.
7689 SDValue ScalarResult = getNode(Opcode, DL, SVT, ScalarOps, Flags);
7690
7691 // Scalar folding only succeeded if the result is a constant or UNDEF.
7692 if (!ScalarResult.isUndef() && ScalarResult.getOpcode() != ISD::Constant &&
7693 ScalarResult.getOpcode() != ISD::ConstantFP)
7694 return SDValue();
7695
7696 // Legalize the (integer) scalar constant if necessary. We only do
7697 // this once we know the folding succeeded, since otherwise we would
7698 // get a node with illegal type which has a user.
7699 if (LegalSVT != SVT)
7700 ScalarResult = getNode(ExtendCode, DL, LegalSVT, ScalarResult);
7701
7702 ScalarResults.push_back(ScalarResult);
7703 }
7704
7705 SDValue V = NumElts.isScalable() ? getSplatVector(VT, DL, ScalarResults[0])
7706 : getBuildVector(VT, DL, ScalarResults);
7707 NewSDValueDbgMsg(V, "New node fold constant vector: ", this);
7708 return V;
7709}
7710
7713 // TODO: Add support for unary/ternary fp opcodes.
7714 if (Ops.size() != 2)
7715 return SDValue();
7716
7717 // TODO: We don't do any constant folding for strict FP opcodes here, but we
7718 // should. That will require dealing with a potentially non-default
7719 // rounding mode, checking the "opStatus" return value from the APFloat
7720 // math calculations, and possibly other variations.
7721 SDValue N1 = Ops[0];
7722 SDValue N2 = Ops[1];
7723 ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1, /*AllowUndefs*/ false);
7724 ConstantFPSDNode *N2CFP = isConstOrConstSplatFP(N2, /*AllowUndefs*/ false);
7725 if (N1CFP && N2CFP) {
7726 APFloat C1 = N1CFP->getValueAPF(); // make copy
7727 const APFloat &C2 = N2CFP->getValueAPF();
7728 switch (Opcode) {
7729 case ISD::FADD:
7731 return getConstantFP(C1, DL, VT);
7732 case ISD::FSUB:
7734 return getConstantFP(C1, DL, VT);
7735 case ISD::FMUL:
7737 return getConstantFP(C1, DL, VT);
7738 case ISD::FDIV:
7740 return getConstantFP(C1, DL, VT);
7741 case ISD::FREM:
7742 C1.mod(C2);
7743 return getConstantFP(C1, DL, VT);
7744 case ISD::FCOPYSIGN:
7745 C1.copySign(C2);
7746 return getConstantFP(C1, DL, VT);
7747 case ISD::FMINNUM:
7748 return getConstantFP(minnum(C1, C2), DL, VT);
7749 case ISD::FMAXNUM:
7750 return getConstantFP(maxnum(C1, C2), DL, VT);
7751 case ISD::FMINIMUM:
7752 return getConstantFP(minimum(C1, C2), DL, VT);
7753 case ISD::FMAXIMUM:
7754 return getConstantFP(maximum(C1, C2), DL, VT);
7755 case ISD::FMINIMUMNUM:
7756 return getConstantFP(minimumnum(C1, C2), DL, VT);
7757 case ISD::FMAXIMUMNUM:
7758 return getConstantFP(maximumnum(C1, C2), DL, VT);
7759 default: break;
7760 }
7761 }
7762 if (N1CFP && Opcode == ISD::FP_ROUND) {
7763 APFloat C1 = N1CFP->getValueAPF(); // make copy
7764 bool Unused;
7765 // This can return overflow, underflow, or inexact; we don't care.
7766 // FIXME need to be more flexible about rounding mode.
7768 &Unused);
7769 return getConstantFP(C1, DL, VT);
7770 }
7771
7772 switch (Opcode) {
7773 case ISD::FSUB:
7774 // -0.0 - undef --> undef (consistent with "fneg undef")
7775 if (ConstantFPSDNode *N1C = isConstOrConstSplatFP(N1, /*AllowUndefs*/ true))
7776 if (N1C && N1C->getValueAPF().isNegZero() && N2.isUndef())
7777 return getUNDEF(VT);
7778 [[fallthrough]];
7779
7780 case ISD::FADD:
7781 case ISD::FMUL:
7782 case ISD::FDIV:
7783 case ISD::FREM:
7784 // If both operands are undef, the result is undef. If 1 operand is undef,
7785 // the result is NaN. This should match the behavior of the IR optimizer.
7786 if (N1.isUndef() && N2.isUndef())
7787 return getUNDEF(VT);
7788 if (N1.isUndef() || N2.isUndef())
7790 }
7791 return SDValue();
7792}
7793
7795 const SDLoc &DL, EVT DstEltVT) {
7796 EVT SrcEltVT = BV->getValueType(0).getVectorElementType();
7797
7798 // If this is already the right type, we're done.
7799 if (SrcEltVT == DstEltVT)
7800 return SDValue(BV, 0);
7801
7802 unsigned SrcBitSize = SrcEltVT.getSizeInBits();
7803 unsigned DstBitSize = DstEltVT.getSizeInBits();
7804
7805 // If this is a conversion of N elements of one type to N elements of another
7806 // type, convert each element. This handles FP<->INT cases.
7807 if (SrcBitSize == DstBitSize) {
7809 for (SDValue Op : BV->op_values()) {
7810 // If the vector element type is not legal, the BUILD_VECTOR operands
7811 // are promoted and implicitly truncated. Make that explicit here.
7812 if (Op.getValueType() != SrcEltVT)
7813 Op = getNode(ISD::TRUNCATE, DL, SrcEltVT, Op);
7814 Ops.push_back(getBitcast(DstEltVT, Op));
7815 }
7816 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT,
7818 return getBuildVector(VT, DL, Ops);
7819 }
7820
7821 // Otherwise, we're growing or shrinking the elements. To avoid having to
7822 // handle annoying details of growing/shrinking FP values, we convert them to
7823 // int first.
7824 if (SrcEltVT.isFloatingPoint()) {
7825 // Convert the input float vector to a int vector where the elements are the
7826 // same sizes.
7827 EVT IntEltVT = EVT::getIntegerVT(*getContext(), SrcEltVT.getSizeInBits());
7828 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
7830 DstEltVT);
7831 return SDValue();
7832 }
7833
7834 // Now we know the input is an integer vector. If the output is a FP type,
7835 // convert to integer first, then to FP of the right size.
7836 if (DstEltVT.isFloatingPoint()) {
7837 EVT IntEltVT = EVT::getIntegerVT(*getContext(), DstEltVT.getSizeInBits());
7838 if (SDValue Tmp = FoldConstantBuildVector(BV, DL, IntEltVT))
7840 DstEltVT);
7841 return SDValue();
7842 }
7843
7844 // Okay, we know the src/dst types are both integers of differing types.
7845 assert(SrcEltVT.isInteger() && DstEltVT.isInteger());
7846
7847 // Extract the constant raw bit data.
7848 BitVector UndefElements;
7849 SmallVector<APInt> RawBits;
7850 bool IsLE = getDataLayout().isLittleEndian();
7851 if (!BV->getConstantRawBits(IsLE, DstBitSize, RawBits, UndefElements))
7852 return SDValue();
7853
7855 for (unsigned I = 0, E = RawBits.size(); I != E; ++I) {
7856 if (UndefElements[I])
7857 Ops.push_back(getUNDEF(DstEltVT));
7858 else
7859 Ops.push_back(getConstant(RawBits[I], DL, DstEltVT));
7860 }
7861
7862 EVT VT = EVT::getVectorVT(*getContext(), DstEltVT, Ops.size());
7863 return getBuildVector(VT, DL, Ops);
7864}
7865
7867 assert(Val.getValueType().isInteger() && "Invalid AssertAlign!");
7868
7869 // There's no need to assert on a byte-aligned pointer. All pointers are at
7870 // least byte aligned.
7871 if (A == Align(1))
7872 return Val;
7873
7874 SDVTList VTs = getVTList(Val.getValueType());
7876 AddNodeIDNode(ID, ISD::AssertAlign, VTs, {Val});
7877 ID.AddInteger(A.value());
7878
7879 void *IP = nullptr;
7880 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP))
7881 return SDValue(E, 0);
7882
7883 auto *N =
7884 newSDNode<AssertAlignSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, A);
7885 createOperands(N, {Val});
7886
7887 CSEMap.InsertNode(N, IP);
7888 InsertNode(N);
7889
7890 SDValue V(N, 0);
7891 NewSDValueDbgMsg(V, "Creating new node: ", this);
7892 return V;
7893}
7894
7895SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7896 SDValue N1, SDValue N2) {
7897 SDNodeFlags Flags;
7898 if (Inserter)
7899 Flags = Inserter->getFlags();
7900 return getNode(Opcode, DL, VT, N1, N2, Flags);
7901}
7902
7904 SDValue &N2) const {
7905 if (!TLI->isCommutativeBinOp(Opcode))
7906 return;
7907
7908 // Canonicalize:
7909 // binop(const, nonconst) -> binop(nonconst, const)
7912 bool N1CFP = isConstantFPBuildVectorOrConstantFP(N1);
7913 bool N2CFP = isConstantFPBuildVectorOrConstantFP(N2);
7914 if ((N1C && !N2C) || (N1CFP && !N2CFP))
7915 std::swap(N1, N2);
7916
7917 // Canonicalize:
7918 // binop(splat(x), step_vector) -> binop(step_vector, splat(x))
7919 else if (N1.getOpcode() == ISD::SPLAT_VECTOR &&
7921 std::swap(N1, N2);
7922}
7923
7924SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
7925 SDValue N1, SDValue N2, const SDNodeFlags Flags) {
7927 N2.getOpcode() != ISD::DELETED_NODE &&
7928 "Operand is DELETED_NODE!");
7929
7930 canonicalizeCommutativeBinop(Opcode, N1, N2);
7931
7932 auto *N1C = dyn_cast<ConstantSDNode>(N1);
7933 auto *N2C = dyn_cast<ConstantSDNode>(N2);
7934
7935 // Don't allow undefs in vector splats - we might be returning N2 when folding
7936 // to zero etc.
7937 ConstantSDNode *N2CV =
7938 isConstOrConstSplat(N2, /*AllowUndefs*/ false, /*AllowTruncation*/ true);
7939
7940 switch (Opcode) {
7941 default: break;
7942 case ISD::TokenFactor:
7943 assert(VT == MVT::Other && N1.getValueType() == MVT::Other &&
7944 N2.getValueType() == MVT::Other && "Invalid token factor!");
7945 // Fold trivial token factors.
7946 if (N1.getOpcode() == ISD::EntryToken) return N2;
7947 if (N2.getOpcode() == ISD::EntryToken) return N1;
7948 if (N1 == N2) return N1;
7949 break;
7950 case ISD::BUILD_VECTOR: {
7951 // Attempt to simplify BUILD_VECTOR.
7952 SDValue Ops[] = {N1, N2};
7953 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
7954 return V;
7955 break;
7956 }
7957 case ISD::CONCAT_VECTORS: {
7958 SDValue Ops[] = {N1, N2};
7959 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
7960 return V;
7961 break;
7962 }
7963 case ISD::AND:
7964 assert(VT.isInteger() && "This operator does not apply to FP types!");
7965 assert(N1.getValueType() == N2.getValueType() &&
7966 N1.getValueType() == VT && "Binary operator types must match!");
7967 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
7968 // worth handling here.
7969 if (N2CV && N2CV->isZero())
7970 return N2;
7971 if (N2CV && N2CV->isAllOnes()) // X & -1 -> X
7972 return N1;
7973 break;
7974 case ISD::OR:
7975 case ISD::XOR:
7976 case ISD::ADD:
7977 case ISD::PTRADD:
7978 case ISD::SUB:
7979 assert(VT.isInteger() && "This operator does not apply to FP types!");
7980 assert(N1.getValueType() == N2.getValueType() &&
7981 N1.getValueType() == VT && "Binary operator types must match!");
7982 // The equal operand types requirement is unnecessarily strong for PTRADD.
7983 // However, the SelectionDAGBuilder does not generate PTRADDs with different
7984 // operand types, and we'd need to re-implement GEP's non-standard wrapping
7985 // logic everywhere where PTRADDs may be folded or combined to properly
7986 // support them. If/when we introduce pointer types to the SDAG, we will
7987 // need to relax this constraint.
7988
7989 // (X ^|+- 0) -> X. This commonly occurs when legalizing i64 values, so
7990 // it's worth handling here.
7991 if (N2CV && N2CV->isZero())
7992 return N1;
7993 if ((Opcode == ISD::ADD || Opcode == ISD::SUB) &&
7994 VT.getScalarType() == MVT::i1)
7995 return getNode(ISD::XOR, DL, VT, N1, N2);
7996 // Fold (add (vscale * C0), (vscale * C1)) to (vscale * (C0 + C1)).
7997 if (Opcode == ISD::ADD && N1.getOpcode() == ISD::VSCALE &&
7998 N2.getOpcode() == ISD::VSCALE) {
7999 const APInt &C1 = N1->getConstantOperandAPInt(0);
8000 const APInt &C2 = N2->getConstantOperandAPInt(0);
8001 return getVScale(DL, VT, C1 + C2);
8002 }
8003 break;
8004 case ISD::MUL:
8005 assert(VT.isInteger() && "This operator does not apply to FP types!");
8006 assert(N1.getValueType() == N2.getValueType() &&
8007 N1.getValueType() == VT && "Binary operator types must match!");
8008 if (VT.getScalarType() == MVT::i1)
8009 return getNode(ISD::AND, DL, VT, N1, N2);
8010 if (N2CV && N2CV->isZero())
8011 return N2;
8012 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8013 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8014 const APInt &N2CImm = N2C->getAPIntValue();
8015 return getVScale(DL, VT, MulImm * N2CImm);
8016 }
8017 break;
8018 case ISD::UDIV:
8019 case ISD::UREM:
8020 case ISD::MULHU:
8021 case ISD::MULHS:
8022 case ISD::SDIV:
8023 case ISD::SREM:
8024 case ISD::SADDSAT:
8025 case ISD::SSUBSAT:
8026 case ISD::UADDSAT:
8027 case ISD::USUBSAT:
8028 assert(VT.isInteger() && "This operator does not apply to FP types!");
8029 assert(N1.getValueType() == N2.getValueType() &&
8030 N1.getValueType() == VT && "Binary operator types must match!");
8031 if (VT.getScalarType() == MVT::i1) {
8032 // fold (add_sat x, y) -> (or x, y) for bool types.
8033 if (Opcode == ISD::SADDSAT || Opcode == ISD::UADDSAT)
8034 return getNode(ISD::OR, DL, VT, N1, N2);
8035 // fold (sub_sat x, y) -> (and x, ~y) for bool types.
8036 if (Opcode == ISD::SSUBSAT || Opcode == ISD::USUBSAT)
8037 return getNode(ISD::AND, DL, VT, N1, getNOT(DL, N2, VT));
8038 }
8039 break;
8040 case ISD::SCMP:
8041 case ISD::UCMP:
8042 assert(N1.getValueType() == N2.getValueType() &&
8043 "Types of operands of UCMP/SCMP must match");
8044 assert(N1.getValueType().isVector() == VT.isVector() &&
8045 "Operands and return type of must both be scalars or vectors");
8046 if (VT.isVector())
8049 "Result and operands must have the same number of elements");
8050 break;
8051 case ISD::AVGFLOORS:
8052 case ISD::AVGFLOORU:
8053 case ISD::AVGCEILS:
8054 case ISD::AVGCEILU:
8055 assert(VT.isInteger() && "This operator does not apply to FP types!");
8056 assert(N1.getValueType() == N2.getValueType() &&
8057 N1.getValueType() == VT && "Binary operator types must match!");
8058 break;
8059 case ISD::ABDS:
8060 case ISD::ABDU:
8061 assert(VT.isInteger() && "This operator does not apply to FP types!");
8062 assert(N1.getValueType() == N2.getValueType() &&
8063 N1.getValueType() == VT && "Binary operator types must match!");
8064 if (VT.getScalarType() == MVT::i1)
8065 return getNode(ISD::XOR, DL, VT, N1, N2);
8066 break;
8067 case ISD::SMIN:
8068 case ISD::UMAX:
8069 assert(VT.isInteger() && "This operator does not apply to FP types!");
8070 assert(N1.getValueType() == N2.getValueType() &&
8071 N1.getValueType() == VT && "Binary operator types must match!");
8072 if (VT.getScalarType() == MVT::i1)
8073 return getNode(ISD::OR, DL, VT, N1, N2);
8074 break;
8075 case ISD::SMAX:
8076 case ISD::UMIN:
8077 assert(VT.isInteger() && "This operator does not apply to FP types!");
8078 assert(N1.getValueType() == N2.getValueType() &&
8079 N1.getValueType() == VT && "Binary operator types must match!");
8080 if (VT.getScalarType() == MVT::i1)
8081 return getNode(ISD::AND, DL, VT, N1, N2);
8082 break;
8083 case ISD::FADD:
8084 case ISD::FSUB:
8085 case ISD::FMUL:
8086 case ISD::FDIV:
8087 case ISD::FREM:
8088 assert(VT.isFloatingPoint() && "This operator only applies to FP types!");
8089 assert(N1.getValueType() == N2.getValueType() &&
8090 N1.getValueType() == VT && "Binary operator types must match!");
8091 if (SDValue V = simplifyFPBinop(Opcode, N1, N2, Flags))
8092 return V;
8093 break;
8094 case ISD::FCOPYSIGN: // N1 and result must match. N1/N2 need not match.
8095 assert(N1.getValueType() == VT &&
8098 "Invalid FCOPYSIGN!");
8099 break;
8100 case ISD::SHL:
8101 if (N2C && (N1.getOpcode() == ISD::VSCALE) && Flags.hasNoSignedWrap()) {
8102 const APInt &MulImm = N1->getConstantOperandAPInt(0);
8103 const APInt &ShiftImm = N2C->getAPIntValue();
8104 return getVScale(DL, VT, MulImm << ShiftImm);
8105 }
8106 [[fallthrough]];
8107 case ISD::SRA:
8108 case ISD::SRL:
8109 if (SDValue V = simplifyShift(N1, N2))
8110 return V;
8111 [[fallthrough]];
8112 case ISD::ROTL:
8113 case ISD::ROTR:
8114 case ISD::SSHLSAT:
8115 case ISD::USHLSAT:
8116 assert(VT == N1.getValueType() &&
8117 "Shift operators return type must be the same as their first arg");
8118 assert(VT.isInteger() && N2.getValueType().isInteger() &&
8119 "Shifts only work on integers");
8120 assert((!VT.isVector() || VT == N2.getValueType()) &&
8121 "Vector shift amounts must be in the same as their first arg");
8122 // Verify that the shift amount VT is big enough to hold valid shift
8123 // amounts. This catches things like trying to shift an i1024 value by an
8124 // i8, which is easy to fall into in generic code that uses
8125 // TLI.getShiftAmount().
8128 "Invalid use of small shift amount with oversized value!");
8129
8130 // Always fold shifts of i1 values so the code generator doesn't need to
8131 // handle them. Since we know the size of the shift has to be less than the
8132 // size of the value, the shift/rotate count is guaranteed to be zero.
8133 if (VT == MVT::i1)
8134 return N1;
8135 if (N2CV && N2CV->isZero())
8136 return N1;
8137 break;
8138 case ISD::FP_ROUND:
8140 VT.bitsLE(N1.getValueType()) && N2C &&
8141 (N2C->getZExtValue() == 0 || N2C->getZExtValue() == 1) &&
8142 N2.getOpcode() == ISD::TargetConstant && "Invalid FP_ROUND!");
8143 if (N1.getValueType() == VT) return N1; // noop conversion.
8144 break;
8145 case ISD::AssertNoFPClass: {
8147 "AssertNoFPClass is used for a non-floating type");
8148 assert(isa<ConstantSDNode>(N2) && "NoFPClass is not Constant");
8149 FPClassTest NoFPClass = static_cast<FPClassTest>(N2->getAsZExtVal());
8150 assert(llvm::to_underlying(NoFPClass) <=
8152 "FPClassTest value too large");
8153 (void)NoFPClass;
8154 break;
8155 }
8156 case ISD::AssertSext:
8157 case ISD::AssertZext: {
8158 EVT EVT = cast<VTSDNode>(N2)->getVT();
8159 assert(VT == N1.getValueType() && "Not an inreg extend!");
8160 assert(VT.isInteger() && EVT.isInteger() &&
8161 "Cannot *_EXTEND_INREG FP types");
8162 assert(!EVT.isVector() &&
8163 "AssertSExt/AssertZExt type should be the vector element type "
8164 "rather than the vector type!");
8165 assert(EVT.bitsLE(VT.getScalarType()) && "Not extending!");
8166 if (VT.getScalarType() == EVT) return N1; // noop assertion.
8167 break;
8168 }
8170 EVT EVT = cast<VTSDNode>(N2)->getVT();
8171 assert(VT == N1.getValueType() && "Not an inreg extend!");
8172 assert(VT.isInteger() && EVT.isInteger() &&
8173 "Cannot *_EXTEND_INREG FP types");
8174 assert(EVT.isVector() == VT.isVector() &&
8175 "SIGN_EXTEND_INREG type should be vector iff the operand "
8176 "type is vector!");
8177 assert((!EVT.isVector() ||
8179 "Vector element counts must match in SIGN_EXTEND_INREG");
8180 assert(EVT.getScalarType().bitsLE(VT.getScalarType()) && "Not extending!");
8181 if (EVT == VT) return N1; // Not actually extending
8182 break;
8183 }
8185 case ISD::FP_TO_UINT_SAT: {
8186 assert(VT.isInteger() && cast<VTSDNode>(N2)->getVT().isInteger() &&
8187 N1.getValueType().isFloatingPoint() && "Invalid FP_TO_*INT_SAT");
8188 assert(N1.getValueType().isVector() == VT.isVector() &&
8189 "FP_TO_*INT_SAT type should be vector iff the operand type is "
8190 "vector!");
8191 assert((!VT.isVector() || VT.getVectorElementCount() ==
8193 "Vector element counts must match in FP_TO_*INT_SAT");
8194 assert(!cast<VTSDNode>(N2)->getVT().isVector() &&
8195 "Type to saturate to must be a scalar.");
8196 assert(cast<VTSDNode>(N2)->getVT().bitsLE(VT.getScalarType()) &&
8197 "Not extending!");
8198 break;
8199 }
8202 "The result of EXTRACT_VECTOR_ELT must be at least as wide as the \
8203 element type of the vector.");
8204
8205 // Extract from an undefined value or using an undefined index is undefined.
8206 if (N1.isUndef() || N2.isUndef())
8207 return getUNDEF(VT);
8208
8209 // EXTRACT_VECTOR_ELT of out-of-bounds element is an UNDEF for fixed length
8210 // vectors. For scalable vectors we will provide appropriate support for
8211 // dealing with arbitrary indices.
8212 if (N2C && N1.getValueType().isFixedLengthVector() &&
8213 N2C->getAPIntValue().uge(N1.getValueType().getVectorNumElements()))
8214 return getUNDEF(VT);
8215
8216 // EXTRACT_VECTOR_ELT of CONCAT_VECTORS is often formed while lowering is
8217 // expanding copies of large vectors from registers. This only works for
8218 // fixed length vectors, since we need to know the exact number of
8219 // elements.
8220 if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS &&
8222 unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements();
8223 return getExtractVectorElt(DL, VT,
8224 N1.getOperand(N2C->getZExtValue() / Factor),
8225 N2C->getZExtValue() % Factor);
8226 }
8227
8228 // EXTRACT_VECTOR_ELT of BUILD_VECTOR or SPLAT_VECTOR is often formed while
8229 // lowering is expanding large vector constants.
8230 if (N2C && (N1.getOpcode() == ISD::BUILD_VECTOR ||
8231 N1.getOpcode() == ISD::SPLAT_VECTOR)) {
8234 "BUILD_VECTOR used for scalable vectors");
8235 unsigned Index =
8236 N1.getOpcode() == ISD::BUILD_VECTOR ? N2C->getZExtValue() : 0;
8237 SDValue Elt = N1.getOperand(Index);
8238
8239 if (VT != Elt.getValueType())
8240 // If the vector element type is not legal, the BUILD_VECTOR operands
8241 // are promoted and implicitly truncated, and the result implicitly
8242 // extended. Make that explicit here.
8243 Elt = getAnyExtOrTrunc(Elt, DL, VT);
8244
8245 return Elt;
8246 }
8247
8248 // EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
8249 // operations are lowered to scalars.
8250 if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
8251 // If the indices are the same, return the inserted element else
8252 // if the indices are known different, extract the element from
8253 // the original vector.
8254 SDValue N1Op2 = N1.getOperand(2);
8256
8257 if (N1Op2C && N2C) {
8258 if (N1Op2C->getZExtValue() == N2C->getZExtValue()) {
8259 if (VT == N1.getOperand(1).getValueType())
8260 return N1.getOperand(1);
8261 if (VT.isFloatingPoint()) {
8263 return getFPExtendOrRound(N1.getOperand(1), DL, VT);
8264 }
8265 return getSExtOrTrunc(N1.getOperand(1), DL, VT);
8266 }
8267 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
8268 }
8269 }
8270
8271 // EXTRACT_VECTOR_ELT of v1iX EXTRACT_SUBVECTOR could be formed
8272 // when vector types are scalarized and v1iX is legal.
8273 // vextract (v1iX extract_subvector(vNiX, Idx)) -> vextract(vNiX,Idx).
8274 // Here we are completely ignoring the extract element index (N2),
8275 // which is fine for fixed width vectors, since any index other than 0
8276 // is undefined anyway. However, this cannot be ignored for scalable
8277 // vectors - in theory we could support this, but we don't want to do this
8278 // without a profitability check.
8279 if (N1.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8281 N1.getValueType().getVectorNumElements() == 1) {
8282 return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0),
8283 N1.getOperand(1));
8284 }
8285 break;
8287 assert(N2C && (unsigned)N2C->getZExtValue() < 2 && "Bad EXTRACT_ELEMENT!");
8288 assert(!N1.getValueType().isVector() && !VT.isVector() &&
8289 (N1.getValueType().isInteger() == VT.isInteger()) &&
8290 N1.getValueType() != VT &&
8291 "Wrong types for EXTRACT_ELEMENT!");
8292
8293 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
8294 // 64-bit integers into 32-bit parts. Instead of building the extract of
8295 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
8296 if (N1.getOpcode() == ISD::BUILD_PAIR)
8297 return N1.getOperand(N2C->getZExtValue());
8298
8299 // EXTRACT_ELEMENT of a constant int is also very common.
8300 if (N1C) {
8301 unsigned ElementSize = VT.getSizeInBits();
8302 unsigned Shift = ElementSize * N2C->getZExtValue();
8303 const APInt &Val = N1C->getAPIntValue();
8304 return getConstant(Val.extractBits(ElementSize, Shift), DL, VT);
8305 }
8306 break;
8308 EVT N1VT = N1.getValueType();
8309 assert(VT.isVector() && N1VT.isVector() &&
8310 "Extract subvector VTs must be vectors!");
8312 "Extract subvector VTs must have the same element type!");
8313 assert((VT.isFixedLengthVector() || N1VT.isScalableVector()) &&
8314 "Cannot extract a scalable vector from a fixed length vector!");
8315 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8317 "Extract subvector must be from larger vector to smaller vector!");
8318 assert(N2C && "Extract subvector index must be a constant");
8319 assert((VT.isScalableVector() != N1VT.isScalableVector() ||
8320 (VT.getVectorMinNumElements() + N2C->getZExtValue()) <=
8321 N1VT.getVectorMinNumElements()) &&
8322 "Extract subvector overflow!");
8323 assert(N2C->getAPIntValue().getBitWidth() ==
8324 TLI->getVectorIdxWidth(getDataLayout()) &&
8325 "Constant index for EXTRACT_SUBVECTOR has an invalid size");
8326 assert(N2C->getZExtValue() % VT.getVectorMinNumElements() == 0 &&
8327 "Extract index is not a multiple of the output vector length");
8328
8329 // Trivial extraction.
8330 if (VT == N1VT)
8331 return N1;
8332
8333 // EXTRACT_SUBVECTOR of an UNDEF is an UNDEF.
8334 if (N1.isUndef())
8335 return getUNDEF(VT);
8336
8337 // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of
8338 // the concat have the same type as the extract.
8339 if (N1.getOpcode() == ISD::CONCAT_VECTORS &&
8340 VT == N1.getOperand(0).getValueType()) {
8341 unsigned Factor = VT.getVectorMinNumElements();
8342 return N1.getOperand(N2C->getZExtValue() / Factor);
8343 }
8344
8345 // EXTRACT_SUBVECTOR of INSERT_SUBVECTOR is often created
8346 // during shuffle legalization.
8347 if (N1.getOpcode() == ISD::INSERT_SUBVECTOR && N2 == N1.getOperand(2) &&
8348 VT == N1.getOperand(1).getValueType())
8349 return N1.getOperand(1);
8350 break;
8351 }
8352 }
8353
8354 if (N1.getOpcode() == ISD::POISON || N2.getOpcode() == ISD::POISON) {
8355 switch (Opcode) {
8356 case ISD::XOR:
8357 case ISD::ADD:
8358 case ISD::PTRADD:
8359 case ISD::SUB:
8361 case ISD::UDIV:
8362 case ISD::SDIV:
8363 case ISD::UREM:
8364 case ISD::SREM:
8365 case ISD::MUL:
8366 case ISD::AND:
8367 case ISD::SSUBSAT:
8368 case ISD::USUBSAT:
8369 case ISD::UMIN:
8370 case ISD::OR:
8371 case ISD::SADDSAT:
8372 case ISD::UADDSAT:
8373 case ISD::UMAX:
8374 case ISD::SMAX:
8375 case ISD::SMIN:
8376 // fold op(arg1, poison) -> poison, fold op(poison, arg2) -> poison.
8377 return N2.getOpcode() == ISD::POISON ? N2 : N1;
8378 }
8379 }
8380
8381 // Canonicalize an UNDEF to the RHS, even over a constant.
8382 if (N1.getOpcode() == ISD::UNDEF && N2.getOpcode() != ISD::UNDEF) {
8383 if (TLI->isCommutativeBinOp(Opcode)) {
8384 std::swap(N1, N2);
8385 } else {
8386 switch (Opcode) {
8387 case ISD::PTRADD:
8388 case ISD::SUB:
8389 // fold op(undef, non_undef_arg2) -> undef.
8390 return N1;
8392 case ISD::UDIV:
8393 case ISD::SDIV:
8394 case ISD::UREM:
8395 case ISD::SREM:
8396 case ISD::SSUBSAT:
8397 case ISD::USUBSAT:
8398 // fold op(undef, non_undef_arg2) -> 0.
8399 return getConstant(0, DL, VT);
8400 }
8401 }
8402 }
8403
8404 // Fold a bunch of operators when the RHS is undef.
8405 if (N2.getOpcode() == ISD::UNDEF) {
8406 switch (Opcode) {
8407 case ISD::XOR:
8408 if (N1.getOpcode() == ISD::UNDEF)
8409 // Handle undef ^ undef -> 0 special case. This is a common
8410 // idiom (misuse).
8411 return getConstant(0, DL, VT);
8412 [[fallthrough]];
8413 case ISD::ADD:
8414 case ISD::PTRADD:
8415 case ISD::SUB:
8416 // fold op(arg1, undef) -> undef.
8417 return N2;
8418 case ISD::UDIV:
8419 case ISD::SDIV:
8420 case ISD::UREM:
8421 case ISD::SREM:
8422 // fold op(arg1, undef) -> poison.
8423 return getPOISON(VT);
8424 case ISD::MUL:
8425 case ISD::AND:
8426 case ISD::SSUBSAT:
8427 case ISD::USUBSAT:
8428 case ISD::UMIN:
8429 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> 0.
8430 return N1.getOpcode() == ISD::UNDEF ? N2 : getConstant(0, DL, VT);
8431 case ISD::OR:
8432 case ISD::SADDSAT:
8433 case ISD::UADDSAT:
8434 case ISD::UMAX:
8435 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> -1.
8436 return N1.getOpcode() == ISD::UNDEF ? N2 : getAllOnesConstant(DL, VT);
8437 case ISD::SMAX:
8438 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MAX_INT.
8439 return N1.getOpcode() == ISD::UNDEF
8440 ? N2
8441 : getConstant(
8443 VT);
8444 case ISD::SMIN:
8445 // fold op(undef, undef) -> undef, fold op(arg1, undef) -> MIN_INT.
8446 return N1.getOpcode() == ISD::UNDEF
8447 ? N2
8448 : getConstant(
8450 VT);
8451 }
8452 }
8453
8454 // Perform trivial constant folding.
8455 if (SDValue SV = FoldConstantArithmetic(Opcode, DL, VT, {N1, N2}, Flags))
8456 return SV;
8457
8458 // Memoize this node if possible.
8459 SDNode *N;
8460 SDVTList VTs = getVTList(VT);
8461 SDValue Ops[] = {N1, N2};
8462 if (VT != MVT::Glue) {
8464 AddNodeIDNode(ID, Opcode, VTs, Ops);
8465 void *IP = nullptr;
8466 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8467 E->intersectFlagsWith(Flags);
8468 return SDValue(E, 0);
8469 }
8470
8471 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8472 N->setFlags(Flags);
8473 createOperands(N, Ops);
8474 CSEMap.InsertNode(N, IP);
8475 } else {
8476 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8477 createOperands(N, Ops);
8478 }
8479
8480 InsertNode(N);
8481 SDValue V = SDValue(N, 0);
8482 NewSDValueDbgMsg(V, "Creating new node: ", this);
8483 return V;
8484}
8485
8486SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8487 SDValue N1, SDValue N2, SDValue N3) {
8488 SDNodeFlags Flags;
8489 if (Inserter)
8490 Flags = Inserter->getFlags();
8491 return getNode(Opcode, DL, VT, N1, N2, N3, Flags);
8492}
8493
8494SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8495 SDValue N1, SDValue N2, SDValue N3,
8496 const SDNodeFlags Flags) {
8498 N2.getOpcode() != ISD::DELETED_NODE &&
8499 N3.getOpcode() != ISD::DELETED_NODE &&
8500 "Operand is DELETED_NODE!");
8501 // Perform various simplifications.
8502 switch (Opcode) {
8503 case ISD::BUILD_VECTOR: {
8504 // Attempt to simplify BUILD_VECTOR.
8505 SDValue Ops[] = {N1, N2, N3};
8506 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
8507 return V;
8508 break;
8509 }
8510 case ISD::CONCAT_VECTORS: {
8511 SDValue Ops[] = {N1, N2, N3};
8512 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
8513 return V;
8514 break;
8515 }
8516 case ISD::SETCC: {
8517 assert(VT.isInteger() && "SETCC result type must be an integer!");
8518 assert(N1.getValueType() == N2.getValueType() &&
8519 "SETCC operands must have the same type!");
8520 assert(VT.isVector() == N1.getValueType().isVector() &&
8521 "SETCC type should be vector iff the operand type is vector!");
8522 assert((!VT.isVector() || VT.getVectorElementCount() ==
8524 "SETCC vector element counts must match!");
8525 // Use FoldSetCC to simplify SETCC's.
8526 if (SDValue V =
8527 FoldSetCC(VT, N1, N2, cast<CondCodeSDNode>(N3)->get(), DL, Flags))
8528 return V;
8529 break;
8530 }
8531 case ISD::SELECT:
8532 case ISD::VSELECT:
8533 if (SDValue V = simplifySelect(N1, N2, N3))
8534 return V;
8535 break;
8537 llvm_unreachable("should use getVectorShuffle constructor!");
8539 if (isNullConstant(N3))
8540 return N1;
8541 break;
8543 if (isNullConstant(N3))
8544 return N2;
8545 break;
8547 assert(VT.isVector() && VT == N1.getValueType() &&
8548 "INSERT_VECTOR_ELT vector type mismatch");
8550 "INSERT_VECTOR_ELT scalar fp/int mismatch");
8551 assert((!VT.isFloatingPoint() ||
8552 VT.getVectorElementType() == N2.getValueType()) &&
8553 "INSERT_VECTOR_ELT fp scalar type mismatch");
8554 assert((!VT.isInteger() ||
8556 "INSERT_VECTOR_ELT int scalar size mismatch");
8557
8558 auto *N3C = dyn_cast<ConstantSDNode>(N3);
8559 // INSERT_VECTOR_ELT into out-of-bounds element is an UNDEF, except
8560 // for scalable vectors where we will generate appropriate code to
8561 // deal with out-of-bounds cases correctly.
8562 if (N3C && VT.isFixedLengthVector() &&
8563 N3C->getZExtValue() >= VT.getVectorNumElements())
8564 return getUNDEF(VT);
8565
8566 // Undefined index can be assumed out-of-bounds, so that's UNDEF too.
8567 if (N3.isUndef())
8568 return getUNDEF(VT);
8569
8570 // If inserting poison, just use the input vector.
8571 if (N2.getOpcode() == ISD::POISON)
8572 return N1;
8573
8574 // Inserting undef into undef/poison is still undef.
8575 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8576 return getUNDEF(VT);
8577
8578 // If the inserted element is an UNDEF, just use the input vector.
8579 // But not if skipping the insert could make the result more poisonous.
8580 if (N2.isUndef()) {
8581 if (N3C && VT.isFixedLengthVector()) {
8582 APInt EltMask =
8583 APInt::getOneBitSet(VT.getVectorNumElements(), N3C->getZExtValue());
8584 if (isGuaranteedNotToBePoison(N1, EltMask))
8585 return N1;
8586 } else if (isGuaranteedNotToBePoison(N1))
8587 return N1;
8588 }
8589 break;
8590 }
8591 case ISD::INSERT_SUBVECTOR: {
8592 // If inserting poison, just use the input vector,
8593 if (N2.getOpcode() == ISD::POISON)
8594 return N1;
8595
8596 // Inserting undef into undef/poison is still undef.
8597 if (N2.getOpcode() == ISD::UNDEF && N1.isUndef())
8598 return getUNDEF(VT);
8599
8600 EVT N2VT = N2.getValueType();
8601 assert(VT == N1.getValueType() &&
8602 "Dest and insert subvector source types must match!");
8603 assert(VT.isVector() && N2VT.isVector() &&
8604 "Insert subvector VTs must be vectors!");
8606 "Insert subvector VTs must have the same element type!");
8607 assert((VT.isScalableVector() || N2VT.isFixedLengthVector()) &&
8608 "Cannot insert a scalable vector into a fixed length vector!");
8609 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8611 "Insert subvector must be from smaller vector to larger vector!");
8613 "Insert subvector index must be constant");
8614 assert((VT.isScalableVector() != N2VT.isScalableVector() ||
8615 (N2VT.getVectorMinNumElements() + N3->getAsZExtVal()) <=
8617 "Insert subvector overflow!");
8619 TLI->getVectorIdxWidth(getDataLayout()) &&
8620 "Constant index for INSERT_SUBVECTOR has an invalid size");
8621
8622 // Trivial insertion.
8623 if (VT == N2VT)
8624 return N2;
8625
8626 // If this is an insert of an extracted vector into an undef/poison vector,
8627 // we can just use the input to the extract. But not if skipping the
8628 // extract+insert could make the result more poisonous.
8629 if (N1.isUndef() && N2.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
8630 N2.getOperand(1) == N3 && N2.getOperand(0).getValueType() == VT) {
8631 if (N1.getOpcode() == ISD::POISON)
8632 return N2.getOperand(0);
8633 if (VT.isFixedLengthVector() && N2VT.isFixedLengthVector()) {
8634 unsigned LoBit = N3->getAsZExtVal();
8635 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8636 APInt EltMask =
8637 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8638 if (isGuaranteedNotToBePoison(N2.getOperand(0), ~EltMask))
8639 return N2.getOperand(0);
8640 } else if (isGuaranteedNotToBePoison(N2.getOperand(0)))
8641 return N2.getOperand(0);
8642 }
8643
8644 // If the inserted subvector is UNDEF, just use the input vector.
8645 // But not if skipping the insert could make the result more poisonous.
8646 if (N2.isUndef()) {
8647 if (VT.isFixedLengthVector()) {
8648 unsigned LoBit = N3->getAsZExtVal();
8649 unsigned HiBit = LoBit + N2VT.getVectorNumElements();
8650 APInt EltMask =
8651 APInt::getBitsSet(VT.getVectorNumElements(), LoBit, HiBit);
8652 if (isGuaranteedNotToBePoison(N1, EltMask))
8653 return N1;
8654 } else if (isGuaranteedNotToBePoison(N1))
8655 return N1;
8656 }
8657 break;
8658 }
8659 case ISD::BITCAST:
8660 // Fold bit_convert nodes from a type to themselves.
8661 if (N1.getValueType() == VT)
8662 return N1;
8663 break;
8664 case ISD::VP_TRUNCATE:
8665 case ISD::VP_SIGN_EXTEND:
8666 case ISD::VP_ZERO_EXTEND:
8667 // Don't create noop casts.
8668 if (N1.getValueType() == VT)
8669 return N1;
8670 break;
8671 case ISD::VECTOR_COMPRESS: {
8672 [[maybe_unused]] EVT VecVT = N1.getValueType();
8673 [[maybe_unused]] EVT MaskVT = N2.getValueType();
8674 [[maybe_unused]] EVT PassthruVT = N3.getValueType();
8675 assert(VT == VecVT && "Vector and result type don't match.");
8676 assert(VecVT.isVector() && MaskVT.isVector() && PassthruVT.isVector() &&
8677 "All inputs must be vectors.");
8678 assert(VecVT == PassthruVT && "Vector and passthru types don't match.");
8680 "Vector and mask must have same number of elements.");
8681
8682 if (N1.isUndef() || N2.isUndef())
8683 return N3;
8684
8685 break;
8686 }
8691 [[maybe_unused]] EVT AccVT = N1.getValueType();
8692 [[maybe_unused]] EVT Input1VT = N2.getValueType();
8693 [[maybe_unused]] EVT Input2VT = N3.getValueType();
8694 assert(Input1VT.isVector() && Input1VT == Input2VT &&
8695 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8696 "node to have the same type!");
8697 assert(VT.isVector() && VT == AccVT &&
8698 "Expected the first operand of the PARTIAL_REDUCE_MLA node to have "
8699 "the same type as its result!");
8701 AccVT.getVectorElementCount()) &&
8702 "Expected the element count of the second and third operands of the "
8703 "PARTIAL_REDUCE_MLA node to be a positive integer multiple of the "
8704 "element count of the first operand and the result!");
8706 "Expected the second and third operands of the PARTIAL_REDUCE_MLA "
8707 "node to have an element type which is the same as or smaller than "
8708 "the element type of the first operand and result!");
8709 break;
8710 }
8711 }
8712
8713 // Perform trivial constant folding for arithmetic operators.
8714 switch (Opcode) {
8715 case ISD::FMA:
8716 case ISD::FMAD:
8717 case ISD::SETCC:
8718 case ISD::FSHL:
8719 case ISD::FSHR:
8720 if (SDValue SV =
8721 FoldConstantArithmetic(Opcode, DL, VT, {N1, N2, N3}, Flags))
8722 return SV;
8723 break;
8724 }
8725
8726 // Memoize node if it doesn't produce a glue result.
8727 SDNode *N;
8728 SDVTList VTs = getVTList(VT);
8729 SDValue Ops[] = {N1, N2, N3};
8730 if (VT != MVT::Glue) {
8732 AddNodeIDNode(ID, Opcode, VTs, Ops);
8733 void *IP = nullptr;
8734 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
8735 E->intersectFlagsWith(Flags);
8736 return SDValue(E, 0);
8737 }
8738
8739 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8740 N->setFlags(Flags);
8741 createOperands(N, Ops);
8742 CSEMap.InsertNode(N, IP);
8743 } else {
8744 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
8745 createOperands(N, Ops);
8746 }
8747
8748 InsertNode(N);
8749 SDValue V = SDValue(N, 0);
8750 NewSDValueDbgMsg(V, "Creating new node: ", this);
8751 return V;
8752}
8753
8754SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8755 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8756 const SDNodeFlags Flags) {
8757 SDValue Ops[] = { N1, N2, N3, N4 };
8758 return getNode(Opcode, DL, VT, Ops, Flags);
8759}
8760
8761SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8762 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
8763 SDNodeFlags Flags;
8764 if (Inserter)
8765 Flags = Inserter->getFlags();
8766 return getNode(Opcode, DL, VT, N1, N2, N3, N4, Flags);
8767}
8768
8769SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8770 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8771 SDValue N5, const SDNodeFlags Flags) {
8772 SDValue Ops[] = { N1, N2, N3, N4, N5 };
8773 return getNode(Opcode, DL, VT, Ops, Flags);
8774}
8775
8776SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
8777 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
8778 SDValue N5) {
8779 SDNodeFlags Flags;
8780 if (Inserter)
8781 Flags = Inserter->getFlags();
8782 return getNode(Opcode, DL, VT, N1, N2, N3, N4, N5, Flags);
8783}
8784
8785/// getStackArgumentTokenFactor - Compute a TokenFactor to force all
8786/// the incoming stack arguments to be loaded from the stack.
8788 SmallVector<SDValue, 8> ArgChains;
8789
8790 // Include the original chain at the beginning of the list. When this is
8791 // used by target LowerCall hooks, this helps legalize find the
8792 // CALLSEQ_BEGIN node.
8793 ArgChains.push_back(Chain);
8794
8795 // Add a chain value for each stack argument.
8796 for (SDNode *U : getEntryNode().getNode()->users())
8797 if (LoadSDNode *L = dyn_cast<LoadSDNode>(U))
8798 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(L->getBasePtr()))
8799 if (FI->getIndex() < 0)
8800 ArgChains.push_back(SDValue(L, 1));
8801
8802 // Build a tokenfactor for all the chains.
8803 return getNode(ISD::TokenFactor, SDLoc(Chain), MVT::Other, ArgChains);
8804}
8805
8806/// getMemsetValue - Vectorized representation of the memset value
8807/// operand.
8809 const SDLoc &dl) {
8810 assert(!Value.isUndef());
8811
8812 unsigned NumBits = VT.getScalarSizeInBits();
8814 assert(C->getAPIntValue().getBitWidth() == 8);
8815 APInt Val = APInt::getSplat(NumBits, C->getAPIntValue());
8816 if (VT.isInteger()) {
8817 bool IsOpaque = VT.getSizeInBits() > 64 ||
8818 !DAG.getTargetLoweringInfo().isLegalStoreImmediate(C->getSExtValue());
8819 return DAG.getConstant(Val, dl, VT, false, IsOpaque);
8820 }
8821 return DAG.getConstantFP(APFloat(VT.getFltSemantics(), Val), dl, VT);
8822 }
8823
8824 assert(Value.getValueType() == MVT::i8 && "memset with non-byte fill value?");
8825 EVT IntVT = VT.getScalarType();
8826 if (!IntVT.isInteger())
8827 IntVT = EVT::getIntegerVT(*DAG.getContext(), IntVT.getSizeInBits());
8828
8829 Value = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, Value);
8830 if (NumBits > 8) {
8831 // Use a multiplication with 0x010101... to extend the input to the
8832 // required length.
8833 APInt Magic = APInt::getSplat(NumBits, APInt(8, 0x01));
8834 Value = DAG.getNode(ISD::MUL, dl, IntVT, Value,
8835 DAG.getConstant(Magic, dl, IntVT));
8836 }
8837
8838 if (VT != Value.getValueType() && !VT.isInteger())
8839 Value = DAG.getBitcast(VT.getScalarType(), Value);
8840 if (VT != Value.getValueType())
8841 Value = DAG.getSplatBuildVector(VT, dl, Value);
8842
8843 return Value;
8844}
8845
8846/// getMemsetStringVal - Similar to getMemsetValue. Except this is only
8847/// used when a memcpy is turned into a memset when the source is a constant
8848/// string ptr.
8850 const TargetLowering &TLI,
8851 const ConstantDataArraySlice &Slice) {
8852 // Handle vector with all elements zero.
8853 if (Slice.Array == nullptr) {
8854 if (VT.isInteger())
8855 return DAG.getConstant(0, dl, VT);
8856 return DAG.getNode(ISD::BITCAST, dl, VT,
8857 DAG.getConstant(0, dl, VT.changeTypeToInteger()));
8858 }
8859
8860 assert(!VT.isVector() && "Can't handle vector type here!");
8861 unsigned NumVTBits = VT.getSizeInBits();
8862 unsigned NumVTBytes = NumVTBits / 8;
8863 unsigned NumBytes = std::min(NumVTBytes, unsigned(Slice.Length));
8864
8865 APInt Val(NumVTBits, 0);
8866 if (DAG.getDataLayout().isLittleEndian()) {
8867 for (unsigned i = 0; i != NumBytes; ++i)
8868 Val |= (uint64_t)(unsigned char)Slice[i] << i*8;
8869 } else {
8870 for (unsigned i = 0; i != NumBytes; ++i)
8871 Val |= (uint64_t)(unsigned char)Slice[i] << (NumVTBytes-i-1)*8;
8872 }
8873
8874 // If the "cost" of materializing the integer immediate is less than the cost
8875 // of a load, then it is cost effective to turn the load into the immediate.
8876 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
8877 if (TLI.shouldConvertConstantLoadToIntImm(Val, Ty))
8878 return DAG.getConstant(Val, dl, VT);
8879 return SDValue();
8880}
8881
8883 const SDLoc &DL,
8884 const SDNodeFlags Flags) {
8885 SDValue Index = getTypeSize(DL, Base.getValueType(), Offset);
8886 return getMemBasePlusOffset(Base, Index, DL, Flags);
8887}
8888
8890 const SDLoc &DL,
8891 const SDNodeFlags Flags) {
8892 assert(Offset.getValueType().isInteger());
8893 EVT BasePtrVT = Ptr.getValueType();
8894 if (TLI->shouldPreservePtrArith(this->getMachineFunction().getFunction(),
8895 BasePtrVT))
8896 return getNode(ISD::PTRADD, DL, BasePtrVT, Ptr, Offset, Flags);
8897 // InBounds only applies to PTRADD, don't set it if we generate ADD.
8898 SDNodeFlags AddFlags = Flags;
8899 AddFlags.setInBounds(false);
8900 return getNode(ISD::ADD, DL, BasePtrVT, Ptr, Offset, AddFlags);
8901}
8902
8903/// Returns true if memcpy source is constant data.
8905 uint64_t SrcDelta = 0;
8906 GlobalAddressSDNode *G = nullptr;
8907 if (Src.getOpcode() == ISD::GlobalAddress)
8909 else if (Src->isAnyAdd() &&
8910 Src.getOperand(0).getOpcode() == ISD::GlobalAddress &&
8911 Src.getOperand(1).getOpcode() == ISD::Constant) {
8912 G = cast<GlobalAddressSDNode>(Src.getOperand(0));
8913 SrcDelta = Src.getConstantOperandVal(1);
8914 }
8915 if (!G)
8916 return false;
8917
8918 return getConstantDataArrayInfo(G->getGlobal(), Slice, 8,
8919 SrcDelta + G->getOffset());
8920}
8921
8923 SelectionDAG &DAG) {
8924 // On Darwin, -Os means optimize for size without hurting performance, so
8925 // only really optimize for size when -Oz (MinSize) is used.
8927 return MF.getFunction().hasMinSize();
8928 return DAG.shouldOptForSize();
8929}
8930
8932 SmallVector<SDValue, 32> &OutChains, unsigned From,
8933 unsigned To, SmallVector<SDValue, 16> &OutLoadChains,
8934 SmallVector<SDValue, 16> &OutStoreChains) {
8935 assert(OutLoadChains.size() && "Missing loads in memcpy inlining");
8936 assert(OutStoreChains.size() && "Missing stores in memcpy inlining");
8937 SmallVector<SDValue, 16> GluedLoadChains;
8938 for (unsigned i = From; i < To; ++i) {
8939 OutChains.push_back(OutLoadChains[i]);
8940 GluedLoadChains.push_back(OutLoadChains[i]);
8941 }
8942
8943 // Chain for all loads.
8944 SDValue LoadToken = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
8945 GluedLoadChains);
8946
8947 for (unsigned i = From; i < To; ++i) {
8948 StoreSDNode *ST = dyn_cast<StoreSDNode>(OutStoreChains[i]);
8949 SDValue NewStore = DAG.getTruncStore(LoadToken, dl, ST->getValue(),
8950 ST->getBasePtr(), ST->getMemoryVT(),
8951 ST->getMemOperand());
8952 OutChains.push_back(NewStore);
8953 }
8954}
8955
8957 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
8958 uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline,
8959 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo,
8960 const AAMDNodes &AAInfo, BatchAAResults *BatchAA) {
8961 // Turn a memcpy of undef to nop.
8962 // FIXME: We need to honor volatile even is Src is undef.
8963 if (Src.isUndef())
8964 return Chain;
8965
8966 // Expand memcpy to a series of load and store ops if the size operand falls
8967 // below a certain threshold.
8968 // TODO: In the AlwaysInline case, if the size is big then generate a loop
8969 // rather than maybe a humongous number of loads and stores.
8970 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
8971 const DataLayout &DL = DAG.getDataLayout();
8972 LLVMContext &C = *DAG.getContext();
8973 std::vector<EVT> MemOps;
8974 bool DstAlignCanChange = false;
8976 MachineFrameInfo &MFI = MF.getFrameInfo();
8977 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
8979 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
8980 DstAlignCanChange = true;
8981 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
8982 if (!SrcAlign || Alignment > *SrcAlign)
8983 SrcAlign = Alignment;
8984 assert(SrcAlign && "SrcAlign must be set");
8986 // If marked as volatile, perform a copy even when marked as constant.
8987 bool CopyFromConstant = !isVol && isMemSrcFromConstant(Src, Slice);
8988 bool isZeroConstant = CopyFromConstant && Slice.Array == nullptr;
8989 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemcpy(OptSize);
8990 const MemOp Op = isZeroConstant
8991 ? MemOp::Set(Size, DstAlignCanChange, Alignment,
8992 /*IsZeroMemset*/ true, isVol)
8993 : MemOp::Copy(Size, DstAlignCanChange, Alignment,
8994 *SrcAlign, isVol, CopyFromConstant);
8995 if (!TLI.findOptimalMemOpLowering(
8996 C, MemOps, Limit, Op, DstPtrInfo.getAddrSpace(),
8997 SrcPtrInfo.getAddrSpace(), MF.getFunction().getAttributes(), nullptr))
8998 return SDValue();
8999
9000 if (DstAlignCanChange) {
9001 Type *Ty = MemOps[0].getTypeForEVT(C);
9002 Align NewAlign = DL.getABITypeAlign(Ty);
9003
9004 // Don't promote to an alignment that would require dynamic stack
9005 // realignment which may conflict with optimizations such as tail call
9006 // optimization.
9008 if (!TRI->hasStackRealignment(MF))
9009 if (MaybeAlign StackAlign = DL.getStackAlignment())
9010 NewAlign = std::min(NewAlign, *StackAlign);
9011
9012 if (NewAlign > Alignment) {
9013 // Give the stack frame object a larger alignment if needed.
9014 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9015 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9016 Alignment = NewAlign;
9017 }
9018 }
9019
9020 // Prepare AAInfo for loads/stores after lowering this memcpy.
9021 AAMDNodes NewAAInfo = AAInfo;
9022 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9023
9024 const Value *SrcVal = dyn_cast_if_present<const Value *>(SrcPtrInfo.V);
9025 bool isConstant =
9026 BatchAA && SrcVal &&
9027 BatchAA->pointsToConstantMemory(MemoryLocation(SrcVal, Size, AAInfo));
9028
9029 MachineMemOperand::Flags MMOFlags =
9031 SmallVector<SDValue, 16> OutLoadChains;
9032 SmallVector<SDValue, 16> OutStoreChains;
9033 SmallVector<SDValue, 32> OutChains;
9034 unsigned NumMemOps = MemOps.size();
9035 uint64_t SrcOff = 0, DstOff = 0;
9036 for (unsigned i = 0; i != NumMemOps; ++i) {
9037 EVT VT = MemOps[i];
9038 unsigned VTSize = VT.getSizeInBits() / 8;
9039 SDValue Value, Store;
9040
9041 if (VTSize > Size) {
9042 // Issuing an unaligned load / store pair that overlaps with the previous
9043 // pair. Adjust the offset accordingly.
9044 assert(i == NumMemOps-1 && i != 0);
9045 SrcOff -= VTSize - Size;
9046 DstOff -= VTSize - Size;
9047 }
9048
9049 if (CopyFromConstant &&
9050 (isZeroConstant || (VT.isInteger() && !VT.isVector()))) {
9051 // It's unlikely a store of a vector immediate can be done in a single
9052 // instruction. It would require a load from a constantpool first.
9053 // We only handle zero vectors here.
9054 // FIXME: Handle other cases where store of vector immediate is done in
9055 // a single instruction.
9056 ConstantDataArraySlice SubSlice;
9057 if (SrcOff < Slice.Length) {
9058 SubSlice = Slice;
9059 SubSlice.move(SrcOff);
9060 } else {
9061 // This is an out-of-bounds access and hence UB. Pretend we read zero.
9062 SubSlice.Array = nullptr;
9063 SubSlice.Offset = 0;
9064 SubSlice.Length = VTSize;
9065 }
9066 Value = getMemsetStringVal(VT, dl, DAG, TLI, SubSlice);
9067 if (Value.getNode()) {
9068 Store = DAG.getStore(
9069 Chain, dl, Value,
9070 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9071 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
9072 OutChains.push_back(Store);
9073 }
9074 }
9075
9076 if (!Store.getNode()) {
9077 // The type might not be legal for the target. This should only happen
9078 // if the type is smaller than a legal type, as on PPC, so the right
9079 // thing to do is generate a LoadExt/StoreTrunc pair. These simplify
9080 // to Load/Store if NVT==VT.
9081 // FIXME does the case above also need this?
9082 EVT NVT = TLI.getTypeToTransformTo(C, VT);
9083 assert(NVT.bitsGE(VT));
9084
9085 bool isDereferenceable =
9086 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9087 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9088 if (isDereferenceable)
9090 if (isConstant)
9091 SrcMMOFlags |= MachineMemOperand::MOInvariant;
9092
9093 Value = DAG.getExtLoad(
9094 ISD::EXTLOAD, dl, NVT, Chain,
9095 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9096 SrcPtrInfo.getWithOffset(SrcOff), VT,
9097 commonAlignment(*SrcAlign, SrcOff), SrcMMOFlags, NewAAInfo);
9098 OutLoadChains.push_back(Value.getValue(1));
9099
9100 Store = DAG.getTruncStore(
9101 Chain, dl, Value,
9102 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9103 DstPtrInfo.getWithOffset(DstOff), VT, Alignment, MMOFlags, NewAAInfo);
9104 OutStoreChains.push_back(Store);
9105 }
9106 SrcOff += VTSize;
9107 DstOff += VTSize;
9108 Size -= VTSize;
9109 }
9110
9111 unsigned GluedLdStLimit = MaxLdStGlue == 0 ?
9113 unsigned NumLdStInMemcpy = OutStoreChains.size();
9114
9115 if (NumLdStInMemcpy) {
9116 // It may be that memcpy might be converted to memset if it's memcpy
9117 // of constants. In such a case, we won't have loads and stores, but
9118 // just stores. In the absence of loads, there is nothing to gang up.
9119 if ((GluedLdStLimit <= 1) || !EnableMemCpyDAGOpt) {
9120 // If target does not care, just leave as it.
9121 for (unsigned i = 0; i < NumLdStInMemcpy; ++i) {
9122 OutChains.push_back(OutLoadChains[i]);
9123 OutChains.push_back(OutStoreChains[i]);
9124 }
9125 } else {
9126 // Ld/St less than/equal limit set by target.
9127 if (NumLdStInMemcpy <= GluedLdStLimit) {
9128 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, 0,
9129 NumLdStInMemcpy, OutLoadChains,
9130 OutStoreChains);
9131 } else {
9132 unsigned NumberLdChain = NumLdStInMemcpy / GluedLdStLimit;
9133 unsigned RemainingLdStInMemcpy = NumLdStInMemcpy % GluedLdStLimit;
9134 unsigned GlueIter = 0;
9135
9136 // Residual ld/st.
9137 if (RemainingLdStInMemcpy) {
9139 DAG, dl, OutChains, NumLdStInMemcpy - RemainingLdStInMemcpy,
9140 NumLdStInMemcpy, OutLoadChains, OutStoreChains);
9141 }
9142
9143 for (unsigned cnt = 0; cnt < NumberLdChain; ++cnt) {
9144 unsigned IndexFrom = NumLdStInMemcpy - RemainingLdStInMemcpy -
9145 GlueIter - GluedLdStLimit;
9146 unsigned IndexTo = NumLdStInMemcpy - RemainingLdStInMemcpy - GlueIter;
9147 chainLoadsAndStoresForMemcpy(DAG, dl, OutChains, IndexFrom, IndexTo,
9148 OutLoadChains, OutStoreChains);
9149 GlueIter += GluedLdStLimit;
9150 }
9151 }
9152 }
9153 }
9154 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9155}
9156
9158 SDValue Chain, SDValue Dst, SDValue Src,
9159 uint64_t Size, Align Alignment,
9160 bool isVol, bool AlwaysInline,
9161 MachinePointerInfo DstPtrInfo,
9162 MachinePointerInfo SrcPtrInfo,
9163 const AAMDNodes &AAInfo) {
9164 // Turn a memmove of undef to nop.
9165 // FIXME: We need to honor volatile even is Src is undef.
9166 if (Src.isUndef())
9167 return Chain;
9168
9169 // Expand memmove to a series of load and store ops if the size operand falls
9170 // below a certain threshold.
9171 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9172 const DataLayout &DL = DAG.getDataLayout();
9173 LLVMContext &C = *DAG.getContext();
9174 std::vector<EVT> MemOps;
9175 bool DstAlignCanChange = false;
9177 MachineFrameInfo &MFI = MF.getFrameInfo();
9178 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9180 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9181 DstAlignCanChange = true;
9182 MaybeAlign SrcAlign = DAG.InferPtrAlign(Src);
9183 if (!SrcAlign || Alignment > *SrcAlign)
9184 SrcAlign = Alignment;
9185 assert(SrcAlign && "SrcAlign must be set");
9186 unsigned Limit = AlwaysInline ? ~0U : TLI.getMaxStoresPerMemmove(OptSize);
9187 if (!TLI.findOptimalMemOpLowering(
9188 C, MemOps, Limit,
9189 MemOp::Copy(Size, DstAlignCanChange, Alignment, *SrcAlign,
9190 /*IsVolatile*/ true),
9191 DstPtrInfo.getAddrSpace(), SrcPtrInfo.getAddrSpace(),
9192 MF.getFunction().getAttributes(), nullptr))
9193 return SDValue();
9194
9195 if (DstAlignCanChange) {
9196 Type *Ty = MemOps[0].getTypeForEVT(C);
9197 Align NewAlign = DL.getABITypeAlign(Ty);
9198
9199 // Don't promote to an alignment that would require dynamic stack
9200 // realignment which may conflict with optimizations such as tail call
9201 // optimization.
9203 if (!TRI->hasStackRealignment(MF))
9204 if (MaybeAlign StackAlign = DL.getStackAlignment())
9205 NewAlign = std::min(NewAlign, *StackAlign);
9206
9207 if (NewAlign > Alignment) {
9208 // Give the stack frame object a larger alignment if needed.
9209 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9210 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9211 Alignment = NewAlign;
9212 }
9213 }
9214
9215 // Prepare AAInfo for loads/stores after lowering this memmove.
9216 AAMDNodes NewAAInfo = AAInfo;
9217 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9218
9219 MachineMemOperand::Flags MMOFlags =
9221 uint64_t SrcOff = 0, DstOff = 0;
9222 SmallVector<SDValue, 8> LoadValues;
9223 SmallVector<SDValue, 8> LoadChains;
9224 SmallVector<SDValue, 8> OutChains;
9225 unsigned NumMemOps = MemOps.size();
9226 for (unsigned i = 0; i < NumMemOps; i++) {
9227 EVT VT = MemOps[i];
9228 unsigned VTSize = VT.getSizeInBits() / 8;
9229 SDValue Value;
9230
9231 bool isDereferenceable =
9232 SrcPtrInfo.getWithOffset(SrcOff).isDereferenceable(VTSize, C, DL);
9233 MachineMemOperand::Flags SrcMMOFlags = MMOFlags;
9234 if (isDereferenceable)
9236
9237 Value = DAG.getLoad(
9238 VT, dl, Chain,
9239 DAG.getObjectPtrOffset(dl, Src, TypeSize::getFixed(SrcOff)),
9240 SrcPtrInfo.getWithOffset(SrcOff), *SrcAlign, SrcMMOFlags, NewAAInfo);
9241 LoadValues.push_back(Value);
9242 LoadChains.push_back(Value.getValue(1));
9243 SrcOff += VTSize;
9244 }
9245 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoadChains);
9246 OutChains.clear();
9247 for (unsigned i = 0; i < NumMemOps; i++) {
9248 EVT VT = MemOps[i];
9249 unsigned VTSize = VT.getSizeInBits() / 8;
9250 SDValue Store;
9251
9252 Store = DAG.getStore(
9253 Chain, dl, LoadValues[i],
9254 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9255 DstPtrInfo.getWithOffset(DstOff), Alignment, MMOFlags, NewAAInfo);
9256 OutChains.push_back(Store);
9257 DstOff += VTSize;
9258 }
9259
9260 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9261}
9262
9263/// Lower the call to 'memset' intrinsic function into a series of store
9264/// operations.
9265///
9266/// \param DAG Selection DAG where lowered code is placed.
9267/// \param dl Link to corresponding IR location.
9268/// \param Chain Control flow dependency.
9269/// \param Dst Pointer to destination memory location.
9270/// \param Src Value of byte to write into the memory.
9271/// \param Size Number of bytes to write.
9272/// \param Alignment Alignment of the destination in bytes.
9273/// \param isVol True if destination is volatile.
9274/// \param AlwaysInline Makes sure no function call is generated.
9275/// \param DstPtrInfo IR information on the memory pointer.
9276/// \returns New head in the control flow, if lowering was successful, empty
9277/// SDValue otherwise.
9278///
9279/// The function tries to replace 'llvm.memset' intrinsic with several store
9280/// operations and value calculation code. This is usually profitable for small
9281/// memory size or when the semantic requires inlining.
9283 SDValue Chain, SDValue Dst, SDValue Src,
9284 uint64_t Size, Align Alignment, bool isVol,
9285 bool AlwaysInline, MachinePointerInfo DstPtrInfo,
9286 const AAMDNodes &AAInfo) {
9287 // Turn a memset of undef to nop.
9288 // FIXME: We need to honor volatile even is Src is undef.
9289 if (Src.isUndef())
9290 return Chain;
9291
9292 // Expand memset to a series of load/store ops if the size operand
9293 // falls below a certain threshold.
9294 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
9295 std::vector<EVT> MemOps;
9296 bool DstAlignCanChange = false;
9297 LLVMContext &C = *DAG.getContext();
9299 MachineFrameInfo &MFI = MF.getFrameInfo();
9300 bool OptSize = shouldLowerMemFuncForSize(MF, DAG);
9302 if (FI && !MFI.isFixedObjectIndex(FI->getIndex()))
9303 DstAlignCanChange = true;
9304 bool IsZeroVal = isNullConstant(Src);
9305 unsigned Limit = AlwaysInline ? ~0 : TLI.getMaxStoresPerMemset(OptSize);
9306
9307 EVT LargestVT;
9308 if (!TLI.findOptimalMemOpLowering(
9309 C, MemOps, Limit,
9310 MemOp::Set(Size, DstAlignCanChange, Alignment, IsZeroVal, isVol),
9311 DstPtrInfo.getAddrSpace(), ~0u, MF.getFunction().getAttributes(),
9312 &LargestVT))
9313 return SDValue();
9314
9315 if (DstAlignCanChange) {
9316 Type *Ty = MemOps[0].getTypeForEVT(*DAG.getContext());
9317 const DataLayout &DL = DAG.getDataLayout();
9318 Align NewAlign = DL.getABITypeAlign(Ty);
9319
9320 // Don't promote to an alignment that would require dynamic stack
9321 // realignment which may conflict with optimizations such as tail call
9322 // optimization.
9324 if (!TRI->hasStackRealignment(MF))
9325 if (MaybeAlign StackAlign = DL.getStackAlignment())
9326 NewAlign = std::min(NewAlign, *StackAlign);
9327
9328 if (NewAlign > Alignment) {
9329 // Give the stack frame object a larger alignment if needed.
9330 if (MFI.getObjectAlign(FI->getIndex()) < NewAlign)
9331 MFI.setObjectAlignment(FI->getIndex(), NewAlign);
9332 Alignment = NewAlign;
9333 }
9334 }
9335
9336 SmallVector<SDValue, 8> OutChains;
9337 uint64_t DstOff = 0;
9338 unsigned NumMemOps = MemOps.size();
9339
9340 // Find the largest store and generate the bit pattern for it.
9341 // If target didn't set LargestVT, compute it from MemOps.
9342 if (!LargestVT.isSimple()) {
9343 LargestVT = MemOps[0];
9344 for (unsigned i = 1; i < NumMemOps; i++)
9345 if (MemOps[i].bitsGT(LargestVT))
9346 LargestVT = MemOps[i];
9347 }
9348 SDValue MemSetValue = getMemsetValue(Src, LargestVT, DAG, dl);
9349
9350 // Prepare AAInfo for loads/stores after lowering this memset.
9351 AAMDNodes NewAAInfo = AAInfo;
9352 NewAAInfo.TBAA = NewAAInfo.TBAAStruct = nullptr;
9353
9354 for (unsigned i = 0; i < NumMemOps; i++) {
9355 EVT VT = MemOps[i];
9356 unsigned VTSize = VT.getSizeInBits() / 8;
9357 // The target should specify store types that exactly cover the memset size
9358 // (with the last store potentially being oversized for overlapping stores).
9359 assert(Size > 0 && "Target specified more stores than needed in "
9360 "findOptimalMemOpLowering");
9361 if (VTSize > Size) {
9362 // Issuing an unaligned load / store pair that overlaps with the previous
9363 // pair. Adjust the offset accordingly.
9364 assert(i == NumMemOps-1 && i != 0);
9365 DstOff -= VTSize - Size;
9366 }
9367
9368 // If this store is smaller than the largest store see whether we can get
9369 // the smaller value for free with a truncate or extract vector element and
9370 // then store.
9371 SDValue Value = MemSetValue;
9372 if (VT.bitsLT(LargestVT)) {
9373 unsigned Index;
9374 unsigned NElts = LargestVT.getSizeInBits() / VT.getSizeInBits();
9375 EVT SVT = EVT::getVectorVT(*DAG.getContext(), VT.getScalarType(), NElts);
9376 if (!LargestVT.isVector() && !VT.isVector() &&
9377 TLI.isTruncateFree(LargestVT, VT))
9378 Value = DAG.getNode(ISD::TRUNCATE, dl, VT, MemSetValue);
9379 else if (LargestVT.isVector() && !VT.isVector() &&
9381 LargestVT.getTypeForEVT(*DAG.getContext()),
9382 VT.getSizeInBits(), Index) &&
9383 TLI.isTypeLegal(SVT) &&
9384 LargestVT.getSizeInBits() == SVT.getSizeInBits()) {
9385 // Target which can combine store(extractelement VectorTy, Idx) can get
9386 // the smaller value for free.
9387 SDValue TailValue = DAG.getNode(ISD::BITCAST, dl, SVT, MemSetValue);
9388 Value = DAG.getExtractVectorElt(dl, VT, TailValue, Index);
9389 } else
9390 Value = getMemsetValue(Src, VT, DAG, dl);
9391 }
9392 assert(Value.getValueType() == VT && "Value with wrong type.");
9393 SDValue Store = DAG.getStore(
9394 Chain, dl, Value,
9395 DAG.getObjectPtrOffset(dl, Dst, TypeSize::getFixed(DstOff)),
9396 DstPtrInfo.getWithOffset(DstOff), Alignment,
9398 NewAAInfo);
9399 OutChains.push_back(Store);
9400 DstOff += VT.getSizeInBits() / 8;
9401 // For oversized overlapping stores, only subtract the remaining bytes.
9402 // For normal stores, subtract the full store size.
9403 if (VTSize > Size) {
9404 Size = 0;
9405 } else {
9406 Size -= VTSize;
9407 }
9408 }
9409
9410 // After processing all stores, Size should be exactly 0. Any remaining bytes
9411 // indicate a bug in the target's findOptimalMemOpLowering implementation.
9412 assert(Size == 0 && "Target's findOptimalMemOpLowering did not specify "
9413 "stores that exactly cover the memset size");
9414
9415 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
9416}
9417
9419 unsigned AS) {
9420 // Lowering memcpy / memset / memmove intrinsics to calls is only valid if all
9421 // pointer operands can be losslessly bitcasted to pointers of address space 0
9422 if (AS != 0 && !TLI->getTargetMachine().isNoopAddrSpaceCast(AS, 0)) {
9423 report_fatal_error("cannot lower memory intrinsic in address space " +
9424 Twine(AS));
9425 }
9426}
9427
9429 const SelectionDAG *SelDAG,
9430 bool AllowReturnsFirstArg) {
9431 if (!CI || !CI->isTailCall())
9432 return false;
9433 // TODO: Fix "returns-first-arg" determination so it doesn't depend on which
9434 // helper symbol we lower to.
9435 return isInTailCallPosition(*CI, SelDAG->getTarget(),
9436 AllowReturnsFirstArg &&
9438}
9439
9440static std::pair<SDValue, SDValue>
9443 const CallInst *CI, RTLIB::Libcall Call,
9444 SelectionDAG *DAG, const TargetLowering *TLI) {
9445 RTLIB::LibcallImpl LCImpl = DAG->getLibcalls().getLibcallImpl(Call);
9446
9447 if (LCImpl == RTLIB::Unsupported)
9448 return {};
9449
9451 bool IsTailCall =
9452 isInTailCallPositionWrapper(CI, DAG, /*AllowReturnsFirstArg=*/true);
9453 SDValue Callee =
9454 DAG->getExternalSymbol(LCImpl, TLI->getPointerTy(DAG->getDataLayout()));
9455
9456 CLI.setDebugLoc(dl)
9457 .setChain(Chain)
9459 CI->getType(), Callee, std::move(Args))
9460 .setTailCall(IsTailCall);
9461
9462 return TLI->LowerCallTo(CLI);
9463}
9464
9465std::pair<SDValue, SDValue> SelectionDAG::getStrcmp(SDValue Chain,
9466 const SDLoc &dl, SDValue S1,
9467 SDValue S2,
9468 const CallInst *CI) {
9470 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9471 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9472 RTLIB::STRCMP, this, TLI);
9473}
9474
9475std::pair<SDValue, SDValue> SelectionDAG::getStrstr(SDValue Chain,
9476 const SDLoc &dl, SDValue S1,
9477 SDValue S2,
9478 const CallInst *CI) {
9480 TargetLowering::ArgListTy Args = {{S1, PT}, {S2, PT}};
9481 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9482 RTLIB::STRSTR, this, TLI);
9483}
9484
9485std::pair<SDValue, SDValue> SelectionDAG::getMemccpy(SDValue Chain,
9486 const SDLoc &dl,
9487 SDValue Dst, SDValue Src,
9489 const CallInst *CI) {
9491
9493 {Dst, PT},
9494 {Src, PT},
9497 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9498 RTLIB::MEMCCPY, this, TLI);
9499}
9500
9501std::pair<SDValue, SDValue>
9503 SDValue Mem1, SDValue Size, const CallInst *CI) {
9506 {Mem0, PT},
9507 {Mem1, PT},
9509 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9510 RTLIB::MEMCMP, this, TLI);
9511}
9512
9513std::pair<SDValue, SDValue> SelectionDAG::getStrcpy(SDValue Chain,
9514 const SDLoc &dl,
9515 SDValue Dst, SDValue Src,
9516 const CallInst *CI) {
9518 TargetLowering::ArgListTy Args = {{Dst, PT}, {Src, PT}};
9519 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9520 RTLIB::STRCPY, this, TLI);
9521}
9522
9523std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
9524 const SDLoc &dl,
9525 SDValue Src,
9526 const CallInst *CI) {
9527 // Emit a library call.
9530 return getRuntimeCallSDValueHelper(Chain, dl, std::move(Args), CI,
9531 RTLIB::STRLEN, this, TLI);
9532}
9533
9535 SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size,
9536 Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI,
9537 std::optional<bool> OverrideTailCall, MachinePointerInfo DstPtrInfo,
9538 MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo,
9539 BatchAAResults *BatchAA) {
9540 // Check to see if we should lower the memcpy to loads and stores first.
9541 // For cases within the target-specified limits, this is the best choice.
9543 if (ConstantSize) {
9544 // Memcpy with size zero? Just return the original chain.
9545 if (ConstantSize->isZero())
9546 return Chain;
9547
9549 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9550 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9551 if (Result.getNode())
9552 return Result;
9553 }
9554
9555 // Then check to see if we should lower the memcpy with target-specific
9556 // code. If the target chooses to do this, this is the next best.
9557 if (TSI) {
9558 SDValue Result = TSI->EmitTargetCodeForMemcpy(
9559 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
9560 DstPtrInfo, SrcPtrInfo);
9561 if (Result.getNode())
9562 return Result;
9563 }
9564
9565 // If we really need inline code and the target declined to provide it,
9566 // use a (potentially long) sequence of loads and stores.
9567 if (AlwaysInline) {
9568 assert(ConstantSize && "AlwaysInline requires a constant size!");
9570 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9571 isVol, true, DstPtrInfo, SrcPtrInfo, AAInfo, BatchAA);
9572 }
9573
9576
9577 // FIXME: If the memcpy is volatile (isVol), lowering it to a plain libc
9578 // memcpy is not guaranteed to be safe. libc memcpys aren't required to
9579 // respect volatile, so they may do things like read or write memory
9580 // beyond the given memory regions. But fixing this isn't easy, and most
9581 // people don't care.
9582
9583 // Emit a library call.
9586 Args.emplace_back(Dst, PtrTy);
9587 Args.emplace_back(Src, PtrTy);
9588 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9589 // FIXME: pass in SDLoc
9591 bool IsTailCall = false;
9592 RTLIB::LibcallImpl MemCpyImpl = TLI->getMemcpyImpl();
9593
9594 if (OverrideTailCall.has_value()) {
9595 IsTailCall = *OverrideTailCall;
9596 } else {
9597 bool LowersToMemcpy = MemCpyImpl == RTLIB::impl_memcpy;
9598 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemcpy);
9599 }
9600
9601 CLI.setDebugLoc(dl)
9602 .setChain(Chain)
9603 .setLibCallee(
9604 Libcalls->getLibcallImplCallingConv(MemCpyImpl),
9605 Dst.getValueType().getTypeForEVT(*getContext()),
9606 getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
9607 std::move(Args))
9609 .setTailCall(IsTailCall);
9610
9611 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9612 return CallResult.second;
9613}
9614
9616 SDValue Dst, SDValue Src, SDValue Size,
9617 Type *SizeTy, unsigned ElemSz,
9618 bool isTailCall,
9619 MachinePointerInfo DstPtrInfo,
9620 MachinePointerInfo SrcPtrInfo) {
9621 // Emit a library call.
9624 Args.emplace_back(Dst, ArgTy);
9625 Args.emplace_back(Src, ArgTy);
9626 Args.emplace_back(Size, SizeTy);
9627
9628 RTLIB::Libcall LibraryCall =
9630 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9631 if (LibcallImpl == RTLIB::Unsupported)
9632 report_fatal_error("Unsupported element size");
9633
9635 CLI.setDebugLoc(dl)
9636 .setChain(Chain)
9637 .setLibCallee(
9638 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9640 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9641 std::move(Args))
9643 .setTailCall(isTailCall);
9644
9645 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9646 return CallResult.second;
9647}
9648
9650 SDValue Src, SDValue Size, Align Alignment,
9651 bool isVol, const CallInst *CI,
9652 std::optional<bool> OverrideTailCall,
9653 MachinePointerInfo DstPtrInfo,
9654 MachinePointerInfo SrcPtrInfo,
9655 const AAMDNodes &AAInfo,
9656 BatchAAResults *BatchAA) {
9657 // Check to see if we should lower the memmove to loads and stores first.
9658 // For cases within the target-specified limits, this is the best choice.
9660 if (ConstantSize) {
9661 // Memmove with size zero? Just return the original chain.
9662 if (ConstantSize->isZero())
9663 return Chain;
9664
9666 *this, dl, Chain, Dst, Src, ConstantSize->getZExtValue(), Alignment,
9667 isVol, false, DstPtrInfo, SrcPtrInfo, AAInfo);
9668 if (Result.getNode())
9669 return Result;
9670 }
9671
9672 // Then check to see if we should lower the memmove with target-specific
9673 // code. If the target chooses to do this, this is the next best.
9674 if (TSI) {
9675 SDValue Result =
9676 TSI->EmitTargetCodeForMemmove(*this, dl, Chain, Dst, Src, Size,
9677 Alignment, isVol, DstPtrInfo, SrcPtrInfo);
9678 if (Result.getNode())
9679 return Result;
9680 }
9681
9684
9685 // FIXME: If the memmove is volatile, lowering it to plain libc memmove may
9686 // not be safe. See memcpy above for more details.
9687
9688 // Emit a library call.
9691 Args.emplace_back(Dst, PtrTy);
9692 Args.emplace_back(Src, PtrTy);
9693 Args.emplace_back(Size, getDataLayout().getIntPtrType(*getContext()));
9694 // FIXME: pass in SDLoc
9696
9697 RTLIB::LibcallImpl MemmoveImpl = Libcalls->getLibcallImpl(RTLIB::MEMMOVE);
9698
9699 bool IsTailCall = false;
9700 if (OverrideTailCall.has_value()) {
9701 IsTailCall = *OverrideTailCall;
9702 } else {
9703 bool LowersToMemmove = MemmoveImpl == RTLIB::impl_memmove;
9704 IsTailCall = isInTailCallPositionWrapper(CI, this, LowersToMemmove);
9705 }
9706
9707 CLI.setDebugLoc(dl)
9708 .setChain(Chain)
9709 .setLibCallee(
9710 Libcalls->getLibcallImplCallingConv(MemmoveImpl),
9711 Dst.getValueType().getTypeForEVT(*getContext()),
9712 getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
9713 std::move(Args))
9715 .setTailCall(IsTailCall);
9716
9717 std::pair<SDValue,SDValue> CallResult = TLI->LowerCallTo(CLI);
9718 return CallResult.second;
9719}
9720
9722 SDValue Dst, SDValue Src, SDValue Size,
9723 Type *SizeTy, unsigned ElemSz,
9724 bool isTailCall,
9725 MachinePointerInfo DstPtrInfo,
9726 MachinePointerInfo SrcPtrInfo) {
9727 // Emit a library call.
9729 Type *IntPtrTy = getDataLayout().getIntPtrType(*getContext());
9730 Args.emplace_back(Dst, IntPtrTy);
9731 Args.emplace_back(Src, IntPtrTy);
9732 Args.emplace_back(Size, SizeTy);
9733
9734 RTLIB::Libcall LibraryCall =
9736 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9737 if (LibcallImpl == RTLIB::Unsupported)
9738 report_fatal_error("Unsupported element size");
9739
9741 CLI.setDebugLoc(dl)
9742 .setChain(Chain)
9743 .setLibCallee(
9744 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9746 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9747 std::move(Args))
9749 .setTailCall(isTailCall);
9750
9751 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9752 return CallResult.second;
9753}
9754
9756 SDValue Src, SDValue Size, Align Alignment,
9757 bool isVol, bool AlwaysInline,
9758 const CallInst *CI,
9759 MachinePointerInfo DstPtrInfo,
9760 const AAMDNodes &AAInfo) {
9761 // Check to see if we should lower the memset to stores first.
9762 // For cases within the target-specified limits, this is the best choice.
9764 if (ConstantSize) {
9765 // Memset with size zero? Just return the original chain.
9766 if (ConstantSize->isZero())
9767 return Chain;
9768
9769 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
9770 ConstantSize->getZExtValue(), Alignment,
9771 isVol, false, DstPtrInfo, AAInfo);
9772
9773 if (Result.getNode())
9774 return Result;
9775 }
9776
9777 // Then check to see if we should lower the memset with target-specific
9778 // code. If the target chooses to do this, this is the next best.
9779 if (TSI) {
9780 SDValue Result = TSI->EmitTargetCodeForMemset(
9781 *this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline, DstPtrInfo);
9782 if (Result.getNode())
9783 return Result;
9784 }
9785
9786 // If we really need inline code and the target declined to provide it,
9787 // use a (potentially long) sequence of loads and stores.
9788 if (AlwaysInline) {
9789 assert(ConstantSize && "AlwaysInline requires a constant size!");
9790 SDValue Result = getMemsetStores(*this, dl, Chain, Dst, Src,
9791 ConstantSize->getZExtValue(), Alignment,
9792 isVol, true, DstPtrInfo, AAInfo);
9793 assert(Result &&
9794 "getMemsetStores must return a valid sequence when AlwaysInline");
9795 return Result;
9796 }
9797
9799
9800 // Emit a library call.
9801 auto &Ctx = *getContext();
9802 const auto& DL = getDataLayout();
9803
9805 // FIXME: pass in SDLoc
9806 CLI.setDebugLoc(dl).setChain(Chain);
9807
9808 RTLIB::LibcallImpl BzeroImpl = Libcalls->getLibcallImpl(RTLIB::BZERO);
9809 bool UseBZero = BzeroImpl != RTLIB::Unsupported && isNullConstant(Src);
9810
9811 // If zeroing out and bzero is present, use it.
9812 if (UseBZero) {
9814 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
9815 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
9816 CLI.setLibCallee(
9817 Libcalls->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
9818 getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
9819 } else {
9820 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
9821
9823 Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
9824 Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
9825 Args.emplace_back(Size, DL.getIntPtrType(Ctx));
9826 CLI.setLibCallee(Libcalls->getLibcallImplCallingConv(MemsetImpl),
9827 Dst.getValueType().getTypeForEVT(Ctx),
9828 getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
9829 std::move(Args));
9830 }
9831
9832 RTLIB::LibcallImpl MemsetImpl = Libcalls->getLibcallImpl(RTLIB::MEMSET);
9833 bool LowersToMemset = MemsetImpl == RTLIB::impl_memset;
9834
9835 // If we're going to use bzero, make sure not to tail call unless the
9836 // subsequent return doesn't need a value, as bzero doesn't return the first
9837 // arg unlike memset.
9838 bool ReturnsFirstArg = CI && funcReturnsFirstArgOfCall(*CI) && !UseBZero;
9839 bool IsTailCall =
9840 CI && CI->isTailCall() &&
9841 isInTailCallPosition(*CI, getTarget(), ReturnsFirstArg && LowersToMemset);
9842 CLI.setDiscardResult().setTailCall(IsTailCall);
9843
9844 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9845 return CallResult.second;
9846}
9847
9850 Type *SizeTy, unsigned ElemSz,
9851 bool isTailCall,
9852 MachinePointerInfo DstPtrInfo) {
9853 // Emit a library call.
9855 Args.emplace_back(Dst, getDataLayout().getIntPtrType(*getContext()));
9856 Args.emplace_back(Value, Type::getInt8Ty(*getContext()));
9857 Args.emplace_back(Size, SizeTy);
9858
9859 RTLIB::Libcall LibraryCall =
9861 RTLIB::LibcallImpl LibcallImpl = Libcalls->getLibcallImpl(LibraryCall);
9862 if (LibcallImpl == RTLIB::Unsupported)
9863 report_fatal_error("Unsupported element size");
9864
9866 CLI.setDebugLoc(dl)
9867 .setChain(Chain)
9868 .setLibCallee(
9869 Libcalls->getLibcallImplCallingConv(LibcallImpl),
9871 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
9872 std::move(Args))
9874 .setTailCall(isTailCall);
9875
9876 std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
9877 return CallResult.second;
9878}
9879
9880SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
9882 MachineMemOperand *MMO,
9883 ISD::LoadExtType ExtType) {
9885 AddNodeIDNode(ID, Opcode, VTList, Ops);
9886 ID.AddInteger(MemVT.getRawBits());
9887 ID.AddInteger(getSyntheticNodeSubclassData<AtomicSDNode>(
9888 dl.getIROrder(), Opcode, VTList, MemVT, MMO, ExtType));
9889 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
9890 ID.AddInteger(MMO->getFlags());
9891 void* IP = nullptr;
9892 if (auto *E = cast_or_null<AtomicSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
9893 E->refineAlignment(MMO);
9894 E->refineRanges(MMO);
9895 return SDValue(E, 0);
9896 }
9897
9898 auto *N = newSDNode<AtomicSDNode>(dl.getIROrder(), dl.getDebugLoc(), Opcode,
9899 VTList, MemVT, MMO, ExtType);
9900 createOperands(N, Ops);
9901
9902 CSEMap.InsertNode(N, IP);
9903 InsertNode(N);
9904 SDValue V(N, 0);
9905 NewSDValueDbgMsg(V, "Creating new node: ", this);
9906 return V;
9907}
9908
9910 EVT MemVT, SDVTList VTs, SDValue Chain,
9911 SDValue Ptr, SDValue Cmp, SDValue Swp,
9912 MachineMemOperand *MMO) {
9913 assert(Opcode == ISD::ATOMIC_CMP_SWAP ||
9915 assert(Cmp.getValueType() == Swp.getValueType() && "Invalid Atomic Op Types");
9916
9917 SDValue Ops[] = {Chain, Ptr, Cmp, Swp};
9918 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
9919}
9920
9921SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
9922 SDValue Chain, SDValue Ptr, SDValue Val,
9923 MachineMemOperand *MMO) {
9924 assert((Opcode == ISD::ATOMIC_LOAD_ADD || Opcode == ISD::ATOMIC_LOAD_SUB ||
9925 Opcode == ISD::ATOMIC_LOAD_AND || Opcode == ISD::ATOMIC_LOAD_CLR ||
9926 Opcode == ISD::ATOMIC_LOAD_OR || Opcode == ISD::ATOMIC_LOAD_XOR ||
9927 Opcode == ISD::ATOMIC_LOAD_NAND || Opcode == ISD::ATOMIC_LOAD_MIN ||
9928 Opcode == ISD::ATOMIC_LOAD_MAX || Opcode == ISD::ATOMIC_LOAD_UMIN ||
9929 Opcode == ISD::ATOMIC_LOAD_UMAX || Opcode == ISD::ATOMIC_LOAD_FADD ||
9930 Opcode == ISD::ATOMIC_LOAD_FSUB || Opcode == ISD::ATOMIC_LOAD_FMAX ||
9931 Opcode == ISD::ATOMIC_LOAD_FMIN ||
9932 Opcode == ISD::ATOMIC_LOAD_FMINIMUM ||
9933 Opcode == ISD::ATOMIC_LOAD_FMAXIMUM ||
9934 Opcode == ISD::ATOMIC_LOAD_UINC_WRAP ||
9935 Opcode == ISD::ATOMIC_LOAD_UDEC_WRAP ||
9936 Opcode == ISD::ATOMIC_LOAD_USUB_COND ||
9937 Opcode == ISD::ATOMIC_LOAD_USUB_SAT || Opcode == ISD::ATOMIC_SWAP ||
9938 Opcode == ISD::ATOMIC_STORE) &&
9939 "Invalid Atomic Op");
9940
9941 EVT VT = Val.getValueType();
9942
9943 SDVTList VTs = Opcode == ISD::ATOMIC_STORE ? getVTList(MVT::Other) :
9944 getVTList(VT, MVT::Other);
9945 SDValue Ops[] = {Chain, Ptr, Val};
9946 return getAtomic(Opcode, dl, MemVT, VTs, Ops, MMO);
9947}
9948
9950 EVT MemVT, EVT VT, SDValue Chain,
9951 SDValue Ptr, MachineMemOperand *MMO) {
9952 SDVTList VTs = getVTList(VT, MVT::Other);
9953 SDValue Ops[] = {Chain, Ptr};
9954 return getAtomic(ISD::ATOMIC_LOAD, dl, MemVT, VTs, Ops, MMO, ExtType);
9955}
9956
9957/// getMergeValues - Create a MERGE_VALUES node from the given operands.
9959 if (Ops.size() == 1)
9960 return Ops[0];
9961
9963 VTs.reserve(Ops.size());
9964 for (const SDValue &Op : Ops)
9965 VTs.push_back(Op.getValueType());
9966 return getNode(ISD::MERGE_VALUES, dl, getVTList(VTs), Ops);
9967}
9968
9970 unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef<SDValue> Ops,
9971 EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment,
9973 const AAMDNodes &AAInfo) {
9974 if (Size.hasValue() && !Size.getValue())
9976
9978 MachineMemOperand *MMO =
9979 MF.getMachineMemOperand(PtrInfo, Flags, Size, Alignment, AAInfo);
9980
9981 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, MMO);
9982}
9983
9985 SDVTList VTList,
9986 ArrayRef<SDValue> Ops, EVT MemVT,
9987 MachineMemOperand *MMO) {
9988 return getMemIntrinsicNode(Opcode, dl, VTList, Ops, MemVT, ArrayRef(MMO));
9989}
9990
9992 SDVTList VTList,
9993 ArrayRef<SDValue> Ops, EVT MemVT,
9995 assert(!MMOs.empty() && "Must have at least one MMO");
9996 assert(
9997 (Opcode == ISD::INTRINSIC_VOID || Opcode == ISD::INTRINSIC_W_CHAIN ||
9998 Opcode == ISD::PREFETCH ||
9999 (Opcode <= (unsigned)std::numeric_limits<int>::max() &&
10000 Opcode >= ISD::BUILTIN_OP_END && TSI->isTargetMemoryOpcode(Opcode))) &&
10001 "Opcode is not a memory-accessing opcode!");
10002
10004 if (MMOs.size() == 1) {
10005 MemRefs = MMOs[0];
10006 } else {
10007 // Allocate: [size_t count][MMO*][MMO*]...
10008 size_t AllocSize =
10009 sizeof(size_t) + MMOs.size() * sizeof(MachineMemOperand *);
10010 void *Buffer = Allocator.Allocate(AllocSize, alignof(size_t));
10011 size_t *CountPtr = static_cast<size_t *>(Buffer);
10012 *CountPtr = MMOs.size();
10013 MachineMemOperand **Array =
10014 reinterpret_cast<MachineMemOperand **>(CountPtr + 1);
10015 llvm::copy(MMOs, Array);
10016 MemRefs = Array;
10017 }
10018
10019 // Memoize the node unless it returns a glue result.
10021 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
10023 AddNodeIDNode(ID, Opcode, VTList, Ops);
10024 ID.AddInteger(getSyntheticNodeSubclassData<MemIntrinsicSDNode>(
10025 Opcode, dl.getIROrder(), VTList, MemVT, MemRefs));
10026 ID.AddInteger(MemVT.getRawBits());
10027 for (const MachineMemOperand *MMO : MMOs) {
10028 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10029 ID.AddInteger(MMO->getFlags());
10030 }
10031 void *IP = nullptr;
10032 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10033 cast<MemIntrinsicSDNode>(E)->refineAlignment(MMOs);
10034 return SDValue(E, 0);
10035 }
10036
10037 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10038 VTList, MemVT, MemRefs);
10039 createOperands(N, Ops);
10040 CSEMap.InsertNode(N, IP);
10041 } else {
10042 N = newSDNode<MemIntrinsicSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(),
10043 VTList, MemVT, MemRefs);
10044 createOperands(N, Ops);
10045 }
10046 InsertNode(N);
10047 SDValue V(N, 0);
10048 NewSDValueDbgMsg(V, "Creating new node: ", this);
10049 return V;
10050}
10051
10053 SDValue Chain, int FrameIndex) {
10054 const unsigned Opcode = IsStart ? ISD::LIFETIME_START : ISD::LIFETIME_END;
10055 const auto VTs = getVTList(MVT::Other);
10056 SDValue Ops[2] = {
10057 Chain,
10058 getFrameIndex(FrameIndex,
10059 getTargetLoweringInfo().getFrameIndexTy(getDataLayout()),
10060 true)};
10061
10063 AddNodeIDNode(ID, Opcode, VTs, Ops);
10064 ID.AddInteger(FrameIndex);
10065 void *IP = nullptr;
10066 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10067 return SDValue(E, 0);
10068
10069 LifetimeSDNode *N =
10070 newSDNode<LifetimeSDNode>(Opcode, dl.getIROrder(), dl.getDebugLoc(), VTs);
10071 createOperands(N, Ops);
10072 CSEMap.InsertNode(N, IP);
10073 InsertNode(N);
10074 SDValue V(N, 0);
10075 NewSDValueDbgMsg(V, "Creating new node: ", this);
10076 return V;
10077}
10078
10080 uint64_t Guid, uint64_t Index,
10081 uint32_t Attr) {
10082 const unsigned Opcode = ISD::PSEUDO_PROBE;
10083 const auto VTs = getVTList(MVT::Other);
10084 SDValue Ops[] = {Chain};
10086 AddNodeIDNode(ID, Opcode, VTs, Ops);
10087 ID.AddInteger(Guid);
10088 ID.AddInteger(Index);
10089 void *IP = nullptr;
10090 if (SDNode *E = FindNodeOrInsertPos(ID, Dl, IP))
10091 return SDValue(E, 0);
10092
10093 auto *N = newSDNode<PseudoProbeSDNode>(
10094 Opcode, Dl.getIROrder(), Dl.getDebugLoc(), VTs, Guid, Index, Attr);
10095 createOperands(N, Ops);
10096 CSEMap.InsertNode(N, IP);
10097 InsertNode(N);
10098 SDValue V(N, 0);
10099 NewSDValueDbgMsg(V, "Creating new node: ", this);
10100 return V;
10101}
10102
10103/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10104/// MachinePointerInfo record from it. This is particularly useful because the
10105/// code generator has many cases where it doesn't bother passing in a
10106/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10108 SelectionDAG &DAG, SDValue Ptr,
10109 int64_t Offset = 0) {
10110 // If this is FI+Offset, we can model it.
10111 if (const FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Ptr))
10113 FI->getIndex(), Offset);
10114
10115 // If this is (FI+Offset1)+Offset2, we can model it.
10116 if (Ptr.getOpcode() != ISD::ADD ||
10119 return Info;
10120
10121 int FI = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
10123 DAG.getMachineFunction(), FI,
10124 Offset + cast<ConstantSDNode>(Ptr.getOperand(1))->getSExtValue());
10125}
10126
10127/// InferPointerInfo - If the specified ptr/offset is a frame index, infer a
10128/// MachinePointerInfo record from it. This is particularly useful because the
10129/// code generator has many cases where it doesn't bother passing in a
10130/// MachinePointerInfo to getLoad or getStore when it has "FI+Cst".
10132 SelectionDAG &DAG, SDValue Ptr,
10133 SDValue OffsetOp) {
10134 // If the 'Offset' value isn't a constant, we can't handle this.
10136 return InferPointerInfo(Info, DAG, Ptr, OffsetNode->getSExtValue());
10137 if (OffsetOp.isUndef())
10138 return InferPointerInfo(Info, DAG, Ptr);
10139 return Info;
10140}
10141
10143 EVT VT, const SDLoc &dl, SDValue Chain,
10144 SDValue Ptr, SDValue Offset,
10145 MachinePointerInfo PtrInfo, EVT MemVT,
10146 Align Alignment,
10147 MachineMemOperand::Flags MMOFlags,
10148 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10149 assert(Chain.getValueType() == MVT::Other &&
10150 "Invalid chain type");
10151
10152 MMOFlags |= MachineMemOperand::MOLoad;
10153 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10154 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10155 // clients.
10156 if (PtrInfo.V.isNull())
10157 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10158
10159 TypeSize Size = MemVT.getStoreSize();
10161 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10162 Alignment, AAInfo, Ranges);
10163 return getLoad(AM, ExtType, VT, dl, Chain, Ptr, Offset, MemVT, MMO);
10164}
10165
10167 EVT VT, const SDLoc &dl, SDValue Chain,
10168 SDValue Ptr, SDValue Offset, EVT MemVT,
10169 MachineMemOperand *MMO) {
10170 if (VT == MemVT) {
10171 ExtType = ISD::NON_EXTLOAD;
10172 } else if (ExtType == ISD::NON_EXTLOAD) {
10173 assert(VT == MemVT && "Non-extending load from different memory type!");
10174 } else {
10175 // Extending load.
10176 assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) &&
10177 "Should only be an extending load, not truncating!");
10178 assert(VT.isInteger() == MemVT.isInteger() &&
10179 "Cannot convert from FP to Int or Int -> FP!");
10180 assert(VT.isVector() == MemVT.isVector() &&
10181 "Cannot use an ext load to convert to or from a vector!");
10182 assert((!VT.isVector() ||
10184 "Cannot use an ext load to change the number of vector elements!");
10185 }
10186
10187 assert((!MMO->getRanges() ||
10189 ->getBitWidth() == MemVT.getScalarSizeInBits() &&
10190 MemVT.isInteger())) &&
10191 "Range metadata and load type must match!");
10192
10193 bool Indexed = AM != ISD::UNINDEXED;
10194 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10195
10196 SDVTList VTs = Indexed ?
10197 getVTList(VT, Ptr.getValueType(), MVT::Other) : getVTList(VT, MVT::Other);
10198 SDValue Ops[] = { Chain, Ptr, Offset };
10200 AddNodeIDNode(ID, ISD::LOAD, VTs, Ops);
10201 ID.AddInteger(MemVT.getRawBits());
10202 ID.AddInteger(getSyntheticNodeSubclassData<LoadSDNode>(
10203 dl.getIROrder(), VTs, AM, ExtType, MemVT, MMO));
10204 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10205 ID.AddInteger(MMO->getFlags());
10206 void *IP = nullptr;
10207 if (auto *E = cast_or_null<LoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10208 E->refineAlignment(MMO);
10209 E->refineRanges(MMO);
10210 return SDValue(E, 0);
10211 }
10212 auto *N = newSDNode<LoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10213 ExtType, MemVT, MMO);
10214 createOperands(N, Ops);
10215
10216 CSEMap.InsertNode(N, IP);
10217 InsertNode(N);
10218 SDValue V(N, 0);
10219 NewSDValueDbgMsg(V, "Creating new node: ", this);
10220 return V;
10221}
10222
10224 SDValue Ptr, MachinePointerInfo PtrInfo,
10225 MaybeAlign Alignment,
10226 MachineMemOperand::Flags MMOFlags,
10227 const AAMDNodes &AAInfo, const MDNode *Ranges) {
10229 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10230 PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges);
10231}
10232
10234 SDValue Ptr, MachineMemOperand *MMO) {
10236 return getLoad(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10237 VT, MMO);
10238}
10239
10241 EVT VT, SDValue Chain, SDValue Ptr,
10242 MachinePointerInfo PtrInfo, EVT MemVT,
10243 MaybeAlign Alignment,
10244 MachineMemOperand::Flags MMOFlags,
10245 const AAMDNodes &AAInfo) {
10247 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, PtrInfo,
10248 MemVT, Alignment, MMOFlags, AAInfo);
10249}
10250
10252 EVT VT, SDValue Chain, SDValue Ptr, EVT MemVT,
10253 MachineMemOperand *MMO) {
10255 return getLoad(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef,
10256 MemVT, MMO);
10257}
10258
10262 LoadSDNode *LD = cast<LoadSDNode>(OrigLoad);
10263 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10264 // Don't propagate the invariant or dereferenceable flags.
10265 auto MMOFlags =
10266 LD->getMemOperand()->getFlags() &
10268 return getLoad(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10269 LD->getChain(), Base, Offset, LD->getPointerInfo(),
10270 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo());
10271}
10272
10274 SDValue Ptr, MachinePointerInfo PtrInfo,
10275 Align Alignment,
10276 MachineMemOperand::Flags MMOFlags,
10277 const AAMDNodes &AAInfo) {
10278 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10279
10280 MMOFlags |= MachineMemOperand::MOStore;
10281 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10282
10283 if (PtrInfo.V.isNull())
10284 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10285
10288 MachineMemOperand *MMO =
10289 MF.getMachineMemOperand(PtrInfo, MMOFlags, Size, Alignment, AAInfo);
10290 return getStore(Chain, dl, Val, Ptr, MMO);
10291}
10292
10294 SDValue Ptr, MachineMemOperand *MMO) {
10296 return getStore(Chain, dl, Val, Ptr, Undef, Val.getValueType(), MMO,
10298}
10299
10301 SDValue Ptr, SDValue Offset, EVT SVT,
10303 bool IsTruncating) {
10304 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10305 EVT VT = Val.getValueType();
10306 if (VT == SVT) {
10307 IsTruncating = false;
10308 } else if (!IsTruncating) {
10309 assert(VT == SVT && "No-truncating store from different memory type!");
10310 } else {
10312 "Should only be a truncating store, not extending!");
10313 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10314 assert(VT.isVector() == SVT.isVector() &&
10315 "Cannot use trunc store to convert to or from a vector!");
10316 assert((!VT.isVector() ||
10318 "Cannot use trunc store to change the number of vector elements!");
10319 }
10320
10321 bool Indexed = AM != ISD::UNINDEXED;
10322 assert((Indexed || Offset.isUndef()) && "Unindexed store with an offset!");
10323 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10324 : getVTList(MVT::Other);
10325 SDValue Ops[] = {Chain, Val, Ptr, Offset};
10328 ID.AddInteger(SVT.getRawBits());
10329 ID.AddInteger(getSyntheticNodeSubclassData<StoreSDNode>(
10330 dl.getIROrder(), VTs, AM, IsTruncating, SVT, MMO));
10331 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10332 ID.AddInteger(MMO->getFlags());
10333 void *IP = nullptr;
10334 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10335 cast<StoreSDNode>(E)->refineAlignment(MMO);
10336 return SDValue(E, 0);
10337 }
10338 auto *N = newSDNode<StoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10339 IsTruncating, SVT, MMO);
10340 createOperands(N, Ops);
10341
10342 CSEMap.InsertNode(N, IP);
10343 InsertNode(N);
10344 SDValue V(N, 0);
10345 NewSDValueDbgMsg(V, "Creating new node: ", this);
10346 return V;
10347}
10348
10350 SDValue Ptr, MachinePointerInfo PtrInfo,
10351 EVT SVT, Align Alignment,
10352 MachineMemOperand::Flags MMOFlags,
10353 const AAMDNodes &AAInfo) {
10354 assert(Chain.getValueType() == MVT::Other &&
10355 "Invalid chain type");
10356
10357 MMOFlags |= MachineMemOperand::MOStore;
10358 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10359
10360 if (PtrInfo.V.isNull())
10361 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10362
10364 MachineMemOperand *MMO = MF.getMachineMemOperand(
10365 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10366 return getTruncStore(Chain, dl, Val, Ptr, SVT, MMO);
10367}
10368
10370 SDValue Ptr, EVT SVT,
10371 MachineMemOperand *MMO) {
10373 return getStore(Chain, dl, Val, Ptr, Undef, SVT, MMO, ISD::UNINDEXED, true);
10374}
10375
10379 StoreSDNode *ST = cast<StoreSDNode>(OrigStore);
10380 assert(ST->getOffset().isUndef() && "Store is already a indexed store!");
10381 return getStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10382 ST->getMemoryVT(), ST->getMemOperand(), AM,
10383 ST->isTruncatingStore());
10384}
10385
10387 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl,
10388 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL,
10389 MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment,
10390 MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo,
10391 const MDNode *Ranges, bool IsExpanding) {
10392 MMOFlags |= MachineMemOperand::MOLoad;
10393 assert((MMOFlags & MachineMemOperand::MOStore) == 0);
10394 // If we don't have a PtrInfo, infer the trivial frame index case to simplify
10395 // clients.
10396 if (PtrInfo.V.isNull())
10397 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr, Offset);
10398
10399 TypeSize Size = MemVT.getStoreSize();
10401 MachineMemOperand *MMO = MF.getMachineMemOperand(PtrInfo, MMOFlags, Size,
10402 Alignment, AAInfo, Ranges);
10403 return getLoadVP(AM, ExtType, VT, dl, Chain, Ptr, Offset, Mask, EVL, MemVT,
10404 MMO, IsExpanding);
10405}
10406
10408 ISD::LoadExtType ExtType, EVT VT,
10409 const SDLoc &dl, SDValue Chain, SDValue Ptr,
10410 SDValue Offset, SDValue Mask, SDValue EVL,
10411 EVT MemVT, MachineMemOperand *MMO,
10412 bool IsExpanding) {
10413 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10414 assert(Mask.getValueType().getVectorElementCount() ==
10415 VT.getVectorElementCount() &&
10416 "Vector width mismatch between mask and data");
10417
10418 bool Indexed = AM != ISD::UNINDEXED;
10419 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10420
10421 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10422 : getVTList(VT, MVT::Other);
10423 SDValue Ops[] = {Chain, Ptr, Offset, Mask, EVL};
10425 AddNodeIDNode(ID, ISD::VP_LOAD, VTs, Ops);
10426 ID.AddInteger(MemVT.getRawBits());
10427 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadSDNode>(
10428 dl.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10429 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10430 ID.AddInteger(MMO->getFlags());
10431 void *IP = nullptr;
10432 if (auto *E = cast_or_null<VPLoadSDNode>(FindNodeOrInsertPos(ID, dl, IP))) {
10433 E->refineAlignment(MMO);
10434 E->refineRanges(MMO);
10435 return SDValue(E, 0);
10436 }
10437 auto *N = newSDNode<VPLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10438 ExtType, IsExpanding, MemVT, MMO);
10439 createOperands(N, Ops);
10440
10441 CSEMap.InsertNode(N, IP);
10442 InsertNode(N);
10443 SDValue V(N, 0);
10444 NewSDValueDbgMsg(V, "Creating new node: ", this);
10445 return V;
10446}
10447
10449 SDValue Ptr, SDValue Mask, SDValue EVL,
10450 MachinePointerInfo PtrInfo,
10451 MaybeAlign Alignment,
10452 MachineMemOperand::Flags MMOFlags,
10453 const AAMDNodes &AAInfo, const MDNode *Ranges,
10454 bool IsExpanding) {
10456 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10457 Mask, EVL, PtrInfo, VT, Alignment, MMOFlags, AAInfo, Ranges,
10458 IsExpanding);
10459}
10460
10462 SDValue Ptr, SDValue Mask, SDValue EVL,
10463 MachineMemOperand *MMO, bool IsExpanding) {
10465 return getLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, dl, Chain, Ptr, Undef,
10466 Mask, EVL, VT, MMO, IsExpanding);
10467}
10468
10470 EVT VT, SDValue Chain, SDValue Ptr,
10471 SDValue Mask, SDValue EVL,
10472 MachinePointerInfo PtrInfo, EVT MemVT,
10473 MaybeAlign Alignment,
10474 MachineMemOperand::Flags MMOFlags,
10475 const AAMDNodes &AAInfo, bool IsExpanding) {
10477 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10478 EVL, PtrInfo, MemVT, Alignment, MMOFlags, AAInfo, nullptr,
10479 IsExpanding);
10480}
10481
10483 EVT VT, SDValue Chain, SDValue Ptr,
10484 SDValue Mask, SDValue EVL, EVT MemVT,
10485 MachineMemOperand *MMO, bool IsExpanding) {
10487 return getLoadVP(ISD::UNINDEXED, ExtType, VT, dl, Chain, Ptr, Undef, Mask,
10488 EVL, MemVT, MMO, IsExpanding);
10489}
10490
10494 auto *LD = cast<VPLoadSDNode>(OrigLoad);
10495 assert(LD->getOffset().isUndef() && "Load is already a indexed load!");
10496 // Don't propagate the invariant or dereferenceable flags.
10497 auto MMOFlags =
10498 LD->getMemOperand()->getFlags() &
10500 return getLoadVP(AM, LD->getExtensionType(), OrigLoad.getValueType(), dl,
10501 LD->getChain(), Base, Offset, LD->getMask(),
10502 LD->getVectorLength(), LD->getPointerInfo(),
10503 LD->getMemoryVT(), LD->getAlign(), MMOFlags, LD->getAAInfo(),
10504 nullptr, LD->isExpandingLoad());
10505}
10506
10508 SDValue Ptr, SDValue Offset, SDValue Mask,
10509 SDValue EVL, EVT MemVT, MachineMemOperand *MMO,
10510 ISD::MemIndexedMode AM, bool IsTruncating,
10511 bool IsCompressing) {
10512 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10513 assert(Mask.getValueType().getVectorElementCount() ==
10515 "Vector width mismatch between mask and data");
10516
10517 bool Indexed = AM != ISD::UNINDEXED;
10518 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10519 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10520 : getVTList(MVT::Other);
10521 SDValue Ops[] = {Chain, Val, Ptr, Offset, Mask, EVL};
10523 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10524 ID.AddInteger(MemVT.getRawBits());
10525 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10526 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10527 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10528 ID.AddInteger(MMO->getFlags());
10529 void *IP = nullptr;
10530 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10531 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10532 return SDValue(E, 0);
10533 }
10534 auto *N = newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10535 IsTruncating, IsCompressing, MemVT, MMO);
10536 createOperands(N, Ops);
10537
10538 CSEMap.InsertNode(N, IP);
10539 InsertNode(N);
10540 SDValue V(N, 0);
10541 NewSDValueDbgMsg(V, "Creating new node: ", this);
10542 return V;
10543}
10544
10546 SDValue Val, SDValue Ptr, SDValue Mask,
10547 SDValue EVL, MachinePointerInfo PtrInfo,
10548 EVT SVT, Align Alignment,
10549 MachineMemOperand::Flags MMOFlags,
10550 const AAMDNodes &AAInfo,
10551 bool IsCompressing) {
10552 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10553
10554 MMOFlags |= MachineMemOperand::MOStore;
10555 assert((MMOFlags & MachineMemOperand::MOLoad) == 0);
10556
10557 if (PtrInfo.V.isNull())
10558 PtrInfo = InferPointerInfo(PtrInfo, *this, Ptr);
10559
10561 MachineMemOperand *MMO = MF.getMachineMemOperand(
10562 PtrInfo, MMOFlags, SVT.getStoreSize(), Alignment, AAInfo);
10563 return getTruncStoreVP(Chain, dl, Val, Ptr, Mask, EVL, SVT, MMO,
10564 IsCompressing);
10565}
10566
10568 SDValue Val, SDValue Ptr, SDValue Mask,
10569 SDValue EVL, EVT SVT,
10570 MachineMemOperand *MMO,
10571 bool IsCompressing) {
10572 EVT VT = Val.getValueType();
10573
10574 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10575 if (VT == SVT)
10576 return getStoreVP(Chain, dl, Val, Ptr, getUNDEF(Ptr.getValueType()), Mask,
10577 EVL, VT, MMO, ISD::UNINDEXED,
10578 /*IsTruncating*/ false, IsCompressing);
10579
10581 "Should only be a truncating store, not extending!");
10582 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10583 assert(VT.isVector() == SVT.isVector() &&
10584 "Cannot use trunc store to convert to or from a vector!");
10585 assert((!VT.isVector() ||
10587 "Cannot use trunc store to change the number of vector elements!");
10588
10589 SDVTList VTs = getVTList(MVT::Other);
10591 SDValue Ops[] = {Chain, Val, Ptr, Undef, Mask, EVL};
10593 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10594 ID.AddInteger(SVT.getRawBits());
10595 ID.AddInteger(getSyntheticNodeSubclassData<VPStoreSDNode>(
10596 dl.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
10597 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10598 ID.AddInteger(MMO->getFlags());
10599 void *IP = nullptr;
10600 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10601 cast<VPStoreSDNode>(E)->refineAlignment(MMO);
10602 return SDValue(E, 0);
10603 }
10604 auto *N =
10605 newSDNode<VPStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10606 ISD::UNINDEXED, true, IsCompressing, SVT, MMO);
10607 createOperands(N, Ops);
10608
10609 CSEMap.InsertNode(N, IP);
10610 InsertNode(N);
10611 SDValue V(N, 0);
10612 NewSDValueDbgMsg(V, "Creating new node: ", this);
10613 return V;
10614}
10615
10619 auto *ST = cast<VPStoreSDNode>(OrigStore);
10620 assert(ST->getOffset().isUndef() && "Store is already an indexed store!");
10621 SDVTList VTs = getVTList(Base.getValueType(), MVT::Other);
10622 SDValue Ops[] = {ST->getChain(), ST->getValue(), Base,
10623 Offset, ST->getMask(), ST->getVectorLength()};
10625 AddNodeIDNode(ID, ISD::VP_STORE, VTs, Ops);
10626 ID.AddInteger(ST->getMemoryVT().getRawBits());
10627 ID.AddInteger(ST->getRawSubclassData());
10628 ID.AddInteger(ST->getPointerInfo().getAddrSpace());
10629 ID.AddInteger(ST->getMemOperand()->getFlags());
10630 void *IP = nullptr;
10631 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
10632 return SDValue(E, 0);
10633
10634 auto *N = newSDNode<VPStoreSDNode>(
10635 dl.getIROrder(), dl.getDebugLoc(), VTs, AM, ST->isTruncatingStore(),
10636 ST->isCompressingStore(), ST->getMemoryVT(), ST->getMemOperand());
10637 createOperands(N, Ops);
10638
10639 CSEMap.InsertNode(N, IP);
10640 InsertNode(N);
10641 SDValue V(N, 0);
10642 NewSDValueDbgMsg(V, "Creating new node: ", this);
10643 return V;
10644}
10645
10647 ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL,
10648 SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask,
10649 SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding) {
10650 bool Indexed = AM != ISD::UNINDEXED;
10651 assert((Indexed || Offset.isUndef()) && "Unindexed load with an offset!");
10652
10653 SDValue Ops[] = {Chain, Ptr, Offset, Stride, Mask, EVL};
10654 SDVTList VTs = Indexed ? getVTList(VT, Ptr.getValueType(), MVT::Other)
10655 : getVTList(VT, MVT::Other);
10657 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_LOAD, VTs, Ops);
10658 ID.AddInteger(VT.getRawBits());
10659 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedLoadSDNode>(
10660 DL.getIROrder(), VTs, AM, ExtType, IsExpanding, MemVT, MMO));
10661 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10662
10663 void *IP = nullptr;
10664 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10665 cast<VPStridedLoadSDNode>(E)->refineAlignment(MMO);
10666 return SDValue(E, 0);
10667 }
10668
10669 auto *N =
10670 newSDNode<VPStridedLoadSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs, AM,
10671 ExtType, IsExpanding, MemVT, MMO);
10672 createOperands(N, Ops);
10673 CSEMap.InsertNode(N, IP);
10674 InsertNode(N);
10675 SDValue V(N, 0);
10676 NewSDValueDbgMsg(V, "Creating new node: ", this);
10677 return V;
10678}
10679
10681 SDValue Ptr, SDValue Stride,
10682 SDValue Mask, SDValue EVL,
10683 MachineMemOperand *MMO,
10684 bool IsExpanding) {
10686 return getStridedLoadVP(ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, DL, Chain, Ptr,
10687 Undef, Stride, Mask, EVL, VT, MMO, IsExpanding);
10688}
10689
10691 ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain,
10692 SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT,
10693 MachineMemOperand *MMO, bool IsExpanding) {
10695 return getStridedLoadVP(ISD::UNINDEXED, ExtType, VT, DL, Chain, Ptr, Undef,
10696 Stride, Mask, EVL, MemVT, MMO, IsExpanding);
10697}
10698
10700 SDValue Val, SDValue Ptr,
10701 SDValue Offset, SDValue Stride,
10702 SDValue Mask, SDValue EVL, EVT MemVT,
10703 MachineMemOperand *MMO,
10705 bool IsTruncating, bool IsCompressing) {
10706 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10707 bool Indexed = AM != ISD::UNINDEXED;
10708 assert((Indexed || Offset.isUndef()) && "Unindexed vp_store with an offset!");
10709 SDVTList VTs = Indexed ? getVTList(Ptr.getValueType(), MVT::Other)
10710 : getVTList(MVT::Other);
10711 SDValue Ops[] = {Chain, Val, Ptr, Offset, Stride, Mask, EVL};
10713 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
10714 ID.AddInteger(MemVT.getRawBits());
10715 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
10716 DL.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10717 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10718 void *IP = nullptr;
10719 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10720 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
10721 return SDValue(E, 0);
10722 }
10723 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
10724 VTs, AM, IsTruncating,
10725 IsCompressing, MemVT, MMO);
10726 createOperands(N, Ops);
10727
10728 CSEMap.InsertNode(N, IP);
10729 InsertNode(N);
10730 SDValue V(N, 0);
10731 NewSDValueDbgMsg(V, "Creating new node: ", this);
10732 return V;
10733}
10734
10736 SDValue Val, SDValue Ptr,
10737 SDValue Stride, SDValue Mask,
10738 SDValue EVL, EVT SVT,
10739 MachineMemOperand *MMO,
10740 bool IsCompressing) {
10741 EVT VT = Val.getValueType();
10742
10743 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
10744 if (VT == SVT)
10745 return getStridedStoreVP(Chain, DL, Val, Ptr, getUNDEF(Ptr.getValueType()),
10746 Stride, Mask, EVL, VT, MMO, ISD::UNINDEXED,
10747 /*IsTruncating*/ false, IsCompressing);
10748
10750 "Should only be a truncating store, not extending!");
10751 assert(VT.isInteger() == SVT.isInteger() && "Can't do FP-INT conversion!");
10752 assert(VT.isVector() == SVT.isVector() &&
10753 "Cannot use trunc store to convert to or from a vector!");
10754 assert((!VT.isVector() ||
10756 "Cannot use trunc store to change the number of vector elements!");
10757
10758 SDVTList VTs = getVTList(MVT::Other);
10760 SDValue Ops[] = {Chain, Val, Ptr, Undef, Stride, Mask, EVL};
10762 AddNodeIDNode(ID, ISD::EXPERIMENTAL_VP_STRIDED_STORE, VTs, Ops);
10763 ID.AddInteger(SVT.getRawBits());
10764 ID.AddInteger(getSyntheticNodeSubclassData<VPStridedStoreSDNode>(
10765 DL.getIROrder(), VTs, ISD::UNINDEXED, true, IsCompressing, SVT, MMO));
10766 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10767 void *IP = nullptr;
10768 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
10769 cast<VPStridedStoreSDNode>(E)->refineAlignment(MMO);
10770 return SDValue(E, 0);
10771 }
10772 auto *N = newSDNode<VPStridedStoreSDNode>(DL.getIROrder(), DL.getDebugLoc(),
10773 VTs, ISD::UNINDEXED, true,
10774 IsCompressing, SVT, MMO);
10775 createOperands(N, Ops);
10776
10777 CSEMap.InsertNode(N, IP);
10778 InsertNode(N);
10779 SDValue V(N, 0);
10780 NewSDValueDbgMsg(V, "Creating new node: ", this);
10781 return V;
10782}
10783
10786 ISD::MemIndexType IndexType) {
10787 assert(Ops.size() == 6 && "Incompatible number of operands");
10788
10790 AddNodeIDNode(ID, ISD::VP_GATHER, VTs, Ops);
10791 ID.AddInteger(VT.getRawBits());
10792 ID.AddInteger(getSyntheticNodeSubclassData<VPGatherSDNode>(
10793 dl.getIROrder(), VTs, VT, MMO, IndexType));
10794 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10795 ID.AddInteger(MMO->getFlags());
10796 void *IP = nullptr;
10797 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10798 cast<VPGatherSDNode>(E)->refineAlignment(MMO);
10799 return SDValue(E, 0);
10800 }
10801
10802 auto *N = newSDNode<VPGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10803 VT, MMO, IndexType);
10804 createOperands(N, Ops);
10805
10806 assert(N->getMask().getValueType().getVectorElementCount() ==
10807 N->getValueType(0).getVectorElementCount() &&
10808 "Vector width mismatch between mask and data");
10809 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10810 N->getValueType(0).getVectorElementCount().isScalable() &&
10811 "Scalable flags of index and data do not match");
10813 N->getIndex().getValueType().getVectorElementCount(),
10814 N->getValueType(0).getVectorElementCount()) &&
10815 "Vector width mismatch between index and data");
10816 assert(isa<ConstantSDNode>(N->getScale()) &&
10817 N->getScale()->getAsAPIntVal().isPowerOf2() &&
10818 "Scale should be a constant power of 2");
10819
10820 CSEMap.InsertNode(N, IP);
10821 InsertNode(N);
10822 SDValue V(N, 0);
10823 NewSDValueDbgMsg(V, "Creating new node: ", this);
10824 return V;
10825}
10826
10829 MachineMemOperand *MMO,
10830 ISD::MemIndexType IndexType) {
10831 assert(Ops.size() == 7 && "Incompatible number of operands");
10832
10834 AddNodeIDNode(ID, ISD::VP_SCATTER, VTs, Ops);
10835 ID.AddInteger(VT.getRawBits());
10836 ID.AddInteger(getSyntheticNodeSubclassData<VPScatterSDNode>(
10837 dl.getIROrder(), VTs, VT, MMO, IndexType));
10838 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10839 ID.AddInteger(MMO->getFlags());
10840 void *IP = nullptr;
10841 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10842 cast<VPScatterSDNode>(E)->refineAlignment(MMO);
10843 return SDValue(E, 0);
10844 }
10845 auto *N = newSDNode<VPScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10846 VT, MMO, IndexType);
10847 createOperands(N, Ops);
10848
10849 assert(N->getMask().getValueType().getVectorElementCount() ==
10850 N->getValue().getValueType().getVectorElementCount() &&
10851 "Vector width mismatch between mask and data");
10852 assert(
10853 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10854 N->getValue().getValueType().getVectorElementCount().isScalable() &&
10855 "Scalable flags of index and data do not match");
10857 N->getIndex().getValueType().getVectorElementCount(),
10858 N->getValue().getValueType().getVectorElementCount()) &&
10859 "Vector width mismatch between index and data");
10860 assert(isa<ConstantSDNode>(N->getScale()) &&
10861 N->getScale()->getAsAPIntVal().isPowerOf2() &&
10862 "Scale should be a constant power of 2");
10863
10864 CSEMap.InsertNode(N, IP);
10865 InsertNode(N);
10866 SDValue V(N, 0);
10867 NewSDValueDbgMsg(V, "Creating new node: ", this);
10868 return V;
10869}
10870
10873 SDValue PassThru, EVT MemVT,
10874 MachineMemOperand *MMO,
10876 ISD::LoadExtType ExtTy, bool isExpanding) {
10877 bool Indexed = AM != ISD::UNINDEXED;
10878 assert((Indexed || Offset.isUndef()) &&
10879 "Unindexed masked load with an offset!");
10880 SDVTList VTs = Indexed ? getVTList(VT, Base.getValueType(), MVT::Other)
10881 : getVTList(VT, MVT::Other);
10882 SDValue Ops[] = {Chain, Base, Offset, Mask, PassThru};
10885 ID.AddInteger(MemVT.getRawBits());
10886 ID.AddInteger(getSyntheticNodeSubclassData<MaskedLoadSDNode>(
10887 dl.getIROrder(), VTs, AM, ExtTy, isExpanding, MemVT, MMO));
10888 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10889 ID.AddInteger(MMO->getFlags());
10890 void *IP = nullptr;
10891 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10892 cast<MaskedLoadSDNode>(E)->refineAlignment(MMO);
10893 return SDValue(E, 0);
10894 }
10895 auto *N = newSDNode<MaskedLoadSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs,
10896 AM, ExtTy, isExpanding, MemVT, MMO);
10897 createOperands(N, Ops);
10898
10899 CSEMap.InsertNode(N, IP);
10900 InsertNode(N);
10901 SDValue V(N, 0);
10902 NewSDValueDbgMsg(V, "Creating new node: ", this);
10903 return V;
10904}
10905
10910 assert(LD->getOffset().isUndef() && "Masked load is already a indexed load!");
10911 return getMaskedLoad(OrigLoad.getValueType(), dl, LD->getChain(), Base,
10912 Offset, LD->getMask(), LD->getPassThru(),
10913 LD->getMemoryVT(), LD->getMemOperand(), AM,
10914 LD->getExtensionType(), LD->isExpandingLoad());
10915}
10916
10919 SDValue Mask, EVT MemVT,
10920 MachineMemOperand *MMO,
10921 ISD::MemIndexedMode AM, bool IsTruncating,
10922 bool IsCompressing) {
10923 assert(Chain.getValueType() == MVT::Other &&
10924 "Invalid chain type");
10925 bool Indexed = AM != ISD::UNINDEXED;
10926 assert((Indexed || Offset.isUndef()) &&
10927 "Unindexed masked store with an offset!");
10928 SDVTList VTs = Indexed ? getVTList(Base.getValueType(), MVT::Other)
10929 : getVTList(MVT::Other);
10930 SDValue Ops[] = {Chain, Val, Base, Offset, Mask};
10933 ID.AddInteger(MemVT.getRawBits());
10934 ID.AddInteger(getSyntheticNodeSubclassData<MaskedStoreSDNode>(
10935 dl.getIROrder(), VTs, AM, IsTruncating, IsCompressing, MemVT, MMO));
10936 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10937 ID.AddInteger(MMO->getFlags());
10938 void *IP = nullptr;
10939 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10940 cast<MaskedStoreSDNode>(E)->refineAlignment(MMO);
10941 return SDValue(E, 0);
10942 }
10943 auto *N =
10944 newSDNode<MaskedStoreSDNode>(dl.getIROrder(), dl.getDebugLoc(), VTs, AM,
10945 IsTruncating, IsCompressing, MemVT, MMO);
10946 createOperands(N, Ops);
10947
10948 CSEMap.InsertNode(N, IP);
10949 InsertNode(N);
10950 SDValue V(N, 0);
10951 NewSDValueDbgMsg(V, "Creating new node: ", this);
10952 return V;
10953}
10954
10959 assert(ST->getOffset().isUndef() &&
10960 "Masked store is already a indexed store!");
10961 return getMaskedStore(ST->getChain(), dl, ST->getValue(), Base, Offset,
10962 ST->getMask(), ST->getMemoryVT(), ST->getMemOperand(),
10963 AM, ST->isTruncatingStore(), ST->isCompressingStore());
10964}
10965
10968 MachineMemOperand *MMO,
10969 ISD::MemIndexType IndexType,
10970 ISD::LoadExtType ExtTy) {
10971 assert(Ops.size() == 6 && "Incompatible number of operands");
10972
10975 ID.AddInteger(MemVT.getRawBits());
10976 ID.AddInteger(getSyntheticNodeSubclassData<MaskedGatherSDNode>(
10977 dl.getIROrder(), VTs, MemVT, MMO, IndexType, ExtTy));
10978 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
10979 ID.AddInteger(MMO->getFlags());
10980 void *IP = nullptr;
10981 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
10982 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
10983 return SDValue(E, 0);
10984 }
10985
10986 auto *N = newSDNode<MaskedGatherSDNode>(dl.getIROrder(), dl.getDebugLoc(),
10987 VTs, MemVT, MMO, IndexType, ExtTy);
10988 createOperands(N, Ops);
10989
10990 assert(N->getPassThru().getValueType() == N->getValueType(0) &&
10991 "Incompatible type of the PassThru value in MaskedGatherSDNode");
10992 assert(N->getMask().getValueType().getVectorElementCount() ==
10993 N->getValueType(0).getVectorElementCount() &&
10994 "Vector width mismatch between mask and data");
10995 assert(N->getIndex().getValueType().getVectorElementCount().isScalable() ==
10996 N->getValueType(0).getVectorElementCount().isScalable() &&
10997 "Scalable flags of index and data do not match");
10999 N->getIndex().getValueType().getVectorElementCount(),
11000 N->getValueType(0).getVectorElementCount()) &&
11001 "Vector width mismatch between index and data");
11002 assert(isa<ConstantSDNode>(N->getScale()) &&
11003 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11004 "Scale should be a constant power of 2");
11005
11006 CSEMap.InsertNode(N, IP);
11007 InsertNode(N);
11008 SDValue V(N, 0);
11009 NewSDValueDbgMsg(V, "Creating new node: ", this);
11010 return V;
11011}
11012
11015 MachineMemOperand *MMO,
11016 ISD::MemIndexType IndexType,
11017 bool IsTrunc) {
11018 assert(Ops.size() == 6 && "Incompatible number of operands");
11019
11022 ID.AddInteger(MemVT.getRawBits());
11023 ID.AddInteger(getSyntheticNodeSubclassData<MaskedScatterSDNode>(
11024 dl.getIROrder(), VTs, MemVT, MMO, IndexType, IsTrunc));
11025 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11026 ID.AddInteger(MMO->getFlags());
11027 void *IP = nullptr;
11028 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11029 cast<MaskedScatterSDNode>(E)->refineAlignment(MMO);
11030 return SDValue(E, 0);
11031 }
11032
11033 auto *N = newSDNode<MaskedScatterSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11034 VTs, MemVT, MMO, IndexType, IsTrunc);
11035 createOperands(N, Ops);
11036
11037 assert(N->getMask().getValueType().getVectorElementCount() ==
11038 N->getValue().getValueType().getVectorElementCount() &&
11039 "Vector width mismatch between mask and data");
11040 assert(
11041 N->getIndex().getValueType().getVectorElementCount().isScalable() ==
11042 N->getValue().getValueType().getVectorElementCount().isScalable() &&
11043 "Scalable flags of index and data do not match");
11045 N->getIndex().getValueType().getVectorElementCount(),
11046 N->getValue().getValueType().getVectorElementCount()) &&
11047 "Vector width mismatch between index and data");
11048 assert(isa<ConstantSDNode>(N->getScale()) &&
11049 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11050 "Scale should be a constant power of 2");
11051
11052 CSEMap.InsertNode(N, IP);
11053 InsertNode(N);
11054 SDValue V(N, 0);
11055 NewSDValueDbgMsg(V, "Creating new node: ", this);
11056 return V;
11057}
11058
11060 const SDLoc &dl, ArrayRef<SDValue> Ops,
11061 MachineMemOperand *MMO,
11062 ISD::MemIndexType IndexType) {
11063 assert(Ops.size() == 7 && "Incompatible number of operands");
11064
11067 ID.AddInteger(MemVT.getRawBits());
11068 ID.AddInteger(getSyntheticNodeSubclassData<MaskedHistogramSDNode>(
11069 dl.getIROrder(), VTs, MemVT, MMO, IndexType));
11070 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11071 ID.AddInteger(MMO->getFlags());
11072 void *IP = nullptr;
11073 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP)) {
11074 cast<MaskedGatherSDNode>(E)->refineAlignment(MMO);
11075 return SDValue(E, 0);
11076 }
11077
11078 auto *N = newSDNode<MaskedHistogramSDNode>(dl.getIROrder(), dl.getDebugLoc(),
11079 VTs, MemVT, MMO, IndexType);
11080 createOperands(N, Ops);
11081
11082 assert(N->getMask().getValueType().getVectorElementCount() ==
11083 N->getIndex().getValueType().getVectorElementCount() &&
11084 "Vector width mismatch between mask and data");
11085 assert(isa<ConstantSDNode>(N->getScale()) &&
11086 N->getScale()->getAsAPIntVal().isPowerOf2() &&
11087 "Scale should be a constant power of 2");
11088 assert(N->getInc().getValueType().isInteger() && "Non integer update value");
11089
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 Mask, SDValue EVL,
11099 MachineMemOperand *MMO) {
11100 SDVTList VTs = getVTList(VT, EVL.getValueType(), MVT::Other);
11101 SDValue Ops[] = {Chain, Ptr, Mask, EVL};
11103 AddNodeIDNode(ID, ISD::VP_LOAD_FF, VTs, Ops);
11104 ID.AddInteger(VT.getRawBits());
11105 ID.AddInteger(getSyntheticNodeSubclassData<VPLoadFFSDNode>(DL.getIROrder(),
11106 VTs, VT, MMO));
11107 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11108 ID.AddInteger(MMO->getFlags());
11109 void *IP = nullptr;
11110 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11111 cast<VPLoadFFSDNode>(E)->refineAlignment(MMO);
11112 return SDValue(E, 0);
11113 }
11114 auto *N = newSDNode<VPLoadFFSDNode>(DL.getIROrder(), DL.getDebugLoc(), VTs,
11115 VT, MMO);
11116 createOperands(N, Ops);
11117
11118 CSEMap.InsertNode(N, IP);
11119 InsertNode(N);
11120 SDValue V(N, 0);
11121 NewSDValueDbgMsg(V, "Creating new node: ", this);
11122 return V;
11123}
11124
11126 EVT MemVT, MachineMemOperand *MMO) {
11127 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11128 SDVTList VTs = getVTList(MVT::Other);
11129 SDValue Ops[] = {Chain, Ptr};
11132 ID.AddInteger(MemVT.getRawBits());
11133 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11134 ISD::GET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11135 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11136 ID.AddInteger(MMO->getFlags());
11137 void *IP = nullptr;
11138 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11139 return SDValue(E, 0);
11140
11141 auto *N = newSDNode<FPStateAccessSDNode>(ISD::GET_FPENV_MEM, dl.getIROrder(),
11142 dl.getDebugLoc(), VTs, 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 EVT MemVT, MachineMemOperand *MMO) {
11154 assert(Chain.getValueType() == MVT::Other && "Invalid chain type");
11155 SDVTList VTs = getVTList(MVT::Other);
11156 SDValue Ops[] = {Chain, Ptr};
11159 ID.AddInteger(MemVT.getRawBits());
11160 ID.AddInteger(getSyntheticNodeSubclassData<FPStateAccessSDNode>(
11161 ISD::SET_FPENV_MEM, dl.getIROrder(), VTs, MemVT, MMO));
11162 ID.AddInteger(MMO->getPointerInfo().getAddrSpace());
11163 ID.AddInteger(MMO->getFlags());
11164 void *IP = nullptr;
11165 if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
11166 return SDValue(E, 0);
11167
11168 auto *N = newSDNode<FPStateAccessSDNode>(ISD::SET_FPENV_MEM, dl.getIROrder(),
11169 dl.getDebugLoc(), VTs, MemVT, MMO);
11170 createOperands(N, Ops);
11171
11172 CSEMap.InsertNode(N, IP);
11173 InsertNode(N);
11174 SDValue V(N, 0);
11175 NewSDValueDbgMsg(V, "Creating new node: ", this);
11176 return V;
11177}
11178
11180 // select undef, T, F --> T (if T is a constant), otherwise F
11181 // select, ?, undef, F --> F
11182 // select, ?, T, undef --> T
11183 if (Cond.isUndef())
11184 return isConstantValueOfAnyType(T) ? T : F;
11185 if (T.isUndef())
11187 if (F.isUndef())
11189
11190 // select true, T, F --> T
11191 // select false, T, F --> F
11192 if (auto C = isBoolConstant(Cond))
11193 return *C ? T : F;
11194
11195 // select ?, T, T --> T
11196 if (T == F)
11197 return T;
11198
11199 return SDValue();
11200}
11201
11203 // shift undef, Y --> 0 (can always assume that the undef value is 0)
11204 if (X.isUndef())
11205 return getConstant(0, SDLoc(X.getNode()), X.getValueType());
11206 // shift X, undef --> undef (because it may shift by the bitwidth)
11207 if (Y.isUndef())
11208 return getUNDEF(X.getValueType());
11209
11210 // shift 0, Y --> 0
11211 // shift X, 0 --> X
11213 return X;
11214
11215 // shift X, C >= bitwidth(X) --> undef
11216 // All vector elements must be too big (or undef) to avoid partial undefs.
11217 auto isShiftTooBig = [X](ConstantSDNode *Val) {
11218 return !Val || Val->getAPIntValue().uge(X.getScalarValueSizeInBits());
11219 };
11220 if (ISD::matchUnaryPredicate(Y, isShiftTooBig, true))
11221 return getUNDEF(X.getValueType());
11222
11223 // shift i1/vXi1 X, Y --> X (any non-zero shift amount is undefined).
11224 if (X.getValueType().getScalarType() == MVT::i1)
11225 return X;
11226
11227 return SDValue();
11228}
11229
11231 SDNodeFlags Flags) {
11232 // If this operation has 'nnan' or 'ninf' and at least 1 disallowed operand
11233 // (an undef operand can be chosen to be Nan/Inf), then the result of this
11234 // operation is poison. That result can be relaxed to undef.
11235 ConstantFPSDNode *XC = isConstOrConstSplatFP(X, /* AllowUndefs */ true);
11236 ConstantFPSDNode *YC = isConstOrConstSplatFP(Y, /* AllowUndefs */ true);
11237 bool HasNan = (XC && XC->getValueAPF().isNaN()) ||
11238 (YC && YC->getValueAPF().isNaN());
11239 bool HasInf = (XC && XC->getValueAPF().isInfinity()) ||
11240 (YC && YC->getValueAPF().isInfinity());
11241
11242 if (Flags.hasNoNaNs() && (HasNan || X.isUndef() || Y.isUndef()))
11243 return getUNDEF(X.getValueType());
11244
11245 if (Flags.hasNoInfs() && (HasInf || X.isUndef() || Y.isUndef()))
11246 return getUNDEF(X.getValueType());
11247
11248 if (!YC)
11249 return SDValue();
11250
11251 // X + -0.0 --> X
11252 if (Opcode == ISD::FADD)
11253 if (YC->getValueAPF().isNegZero())
11254 return X;
11255
11256 // X - +0.0 --> X
11257 if (Opcode == ISD::FSUB)
11258 if (YC->getValueAPF().isPosZero())
11259 return X;
11260
11261 // X * 1.0 --> X
11262 // X / 1.0 --> X
11263 if (Opcode == ISD::FMUL || Opcode == ISD::FDIV)
11264 if (YC->getValueAPF().isExactlyValue(1.0))
11265 return X;
11266
11267 // X * 0.0 --> 0.0
11268 if (Opcode == ISD::FMUL && Flags.hasNoNaNs() && Flags.hasNoSignedZeros())
11269 if (YC->getValueAPF().isZero())
11270 return getConstantFP(0.0, SDLoc(Y), Y.getValueType());
11271
11272 return SDValue();
11273}
11274
11276 SDValue Ptr, SDValue SV, unsigned Align) {
11277 SDValue Ops[] = { Chain, Ptr, SV, getTargetConstant(Align, dl, MVT::i32) };
11278 return getNode(ISD::VAARG, dl, getVTList(VT, MVT::Other), Ops);
11279}
11280
11281SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11283 switch (Ops.size()) {
11284 case 0: return getNode(Opcode, DL, VT);
11285 case 1: return getNode(Opcode, DL, VT, Ops[0].get());
11286 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1]);
11287 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2]);
11288 default: break;
11289 }
11290
11291 // Copy from an SDUse array into an SDValue array for use with
11292 // the regular getNode logic.
11294 return getNode(Opcode, DL, VT, NewOps);
11295}
11296
11297SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11299 SDNodeFlags Flags;
11300 if (Inserter)
11301 Flags = Inserter->getFlags();
11302 return getNode(Opcode, DL, VT, Ops, Flags);
11303}
11304
11305SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
11306 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11307 unsigned NumOps = Ops.size();
11308 switch (NumOps) {
11309 case 0: return getNode(Opcode, DL, VT);
11310 case 1: return getNode(Opcode, DL, VT, Ops[0], Flags);
11311 case 2: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Flags);
11312 case 3: return getNode(Opcode, DL, VT, Ops[0], Ops[1], Ops[2], Flags);
11313 default: break;
11314 }
11315
11316#ifndef NDEBUG
11317 for (const auto &Op : Ops)
11318 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11319 "Operand is DELETED_NODE!");
11320#endif
11321
11322 switch (Opcode) {
11323 default: break;
11324 case ISD::BUILD_VECTOR:
11325 // Attempt to simplify BUILD_VECTOR.
11326 if (SDValue V = FoldBUILD_VECTOR(DL, VT, Ops, *this))
11327 return V;
11328 break;
11330 if (SDValue V = foldCONCAT_VECTORS(DL, VT, Ops, *this))
11331 return V;
11332 break;
11333 case ISD::SELECT_CC:
11334 assert(NumOps == 5 && "SELECT_CC takes 5 operands!");
11335 assert(Ops[0].getValueType() == Ops[1].getValueType() &&
11336 "LHS and RHS of condition must have same type!");
11337 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11338 "True and False arms of SelectCC must have same type!");
11339 assert(Ops[2].getValueType() == VT &&
11340 "select_cc node must be of same type as true and false value!");
11341 assert((!Ops[0].getValueType().isVector() ||
11342 Ops[0].getValueType().getVectorElementCount() ==
11343 VT.getVectorElementCount()) &&
11344 "Expected select_cc with vector result to have the same sized "
11345 "comparison type!");
11346 break;
11347 case ISD::BR_CC:
11348 assert(NumOps == 5 && "BR_CC takes 5 operands!");
11349 assert(Ops[2].getValueType() == Ops[3].getValueType() &&
11350 "LHS/RHS of comparison should match types!");
11351 break;
11352 case ISD::VP_ADD:
11353 case ISD::VP_SUB:
11354 // If it is VP_ADD/VP_SUB mask operation then turn it to VP_XOR
11355 if (VT.getScalarType() == MVT::i1)
11356 Opcode = ISD::VP_XOR;
11357 break;
11358 case ISD::VP_MUL:
11359 // If it is VP_MUL mask operation then turn it to VP_AND
11360 if (VT.getScalarType() == MVT::i1)
11361 Opcode = ISD::VP_AND;
11362 break;
11363 case ISD::VP_REDUCE_MUL:
11364 // If it is VP_REDUCE_MUL mask operation then turn it to VP_REDUCE_AND
11365 if (VT == MVT::i1)
11366 Opcode = ISD::VP_REDUCE_AND;
11367 break;
11368 case ISD::VP_REDUCE_ADD:
11369 // If it is VP_REDUCE_ADD mask operation then turn it to VP_REDUCE_XOR
11370 if (VT == MVT::i1)
11371 Opcode = ISD::VP_REDUCE_XOR;
11372 break;
11373 case ISD::VP_REDUCE_SMAX:
11374 case ISD::VP_REDUCE_UMIN:
11375 // If it is VP_REDUCE_SMAX/VP_REDUCE_UMIN mask operation then turn it to
11376 // VP_REDUCE_AND.
11377 if (VT == MVT::i1)
11378 Opcode = ISD::VP_REDUCE_AND;
11379 break;
11380 case ISD::VP_REDUCE_SMIN:
11381 case ISD::VP_REDUCE_UMAX:
11382 // If it is VP_REDUCE_SMIN/VP_REDUCE_UMAX mask operation then turn it to
11383 // VP_REDUCE_OR.
11384 if (VT == MVT::i1)
11385 Opcode = ISD::VP_REDUCE_OR;
11386 break;
11387 }
11388
11389 // Memoize nodes.
11390 SDNode *N;
11391 SDVTList VTs = getVTList(VT);
11392
11393 if (VT != MVT::Glue) {
11395 AddNodeIDNode(ID, Opcode, VTs, Ops);
11396 void *IP = nullptr;
11397
11398 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11399 E->intersectFlagsWith(Flags);
11400 return SDValue(E, 0);
11401 }
11402
11403 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11404 createOperands(N, Ops);
11405
11406 CSEMap.InsertNode(N, IP);
11407 } else {
11408 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
11409 createOperands(N, Ops);
11410 }
11411
11412 N->setFlags(Flags);
11413 InsertNode(N);
11414 SDValue V(N, 0);
11415 NewSDValueDbgMsg(V, "Creating new node: ", this);
11416 return V;
11417}
11418
11419SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11420 ArrayRef<EVT> ResultTys, ArrayRef<SDValue> Ops) {
11421 SDNodeFlags Flags;
11422 if (Inserter)
11423 Flags = Inserter->getFlags();
11424 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11425}
11426
11427SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11429 const SDNodeFlags Flags) {
11430 return getNode(Opcode, DL, getVTList(ResultTys), Ops, Flags);
11431}
11432
11433SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11435 SDNodeFlags Flags;
11436 if (Inserter)
11437 Flags = Inserter->getFlags();
11438 return getNode(Opcode, DL, VTList, Ops, Flags);
11439}
11440
11441SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11442 ArrayRef<SDValue> Ops, const SDNodeFlags Flags) {
11443 if (VTList.NumVTs == 1)
11444 return getNode(Opcode, DL, VTList.VTs[0], Ops, Flags);
11445
11446#ifndef NDEBUG
11447 for (const auto &Op : Ops)
11448 assert(Op.getOpcode() != ISD::DELETED_NODE &&
11449 "Operand is DELETED_NODE!");
11450#endif
11451
11452 switch (Opcode) {
11453 case ISD::SADDO:
11454 case ISD::UADDO:
11455 case ISD::SSUBO:
11456 case ISD::USUBO: {
11457 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11458 "Invalid add/sub overflow op!");
11459 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11460 Ops[0].getValueType() == Ops[1].getValueType() &&
11461 Ops[0].getValueType() == VTList.VTs[0] &&
11462 "Binary operator types must match!");
11463 SDValue N1 = Ops[0], N2 = Ops[1];
11464 canonicalizeCommutativeBinop(Opcode, N1, N2);
11465
11466 // (X +- 0) -> X with zero-overflow.
11467 ConstantSDNode *N2CV = isConstOrConstSplat(N2, /*AllowUndefs*/ false,
11468 /*AllowTruncation*/ true);
11469 if (N2CV && N2CV->isZero()) {
11470 SDValue ZeroOverFlow = getConstant(0, DL, VTList.VTs[1]);
11471 return getNode(ISD::MERGE_VALUES, DL, VTList, {N1, ZeroOverFlow}, Flags);
11472 }
11473
11474 if (VTList.VTs[0].getScalarType() == MVT::i1 &&
11475 VTList.VTs[1].getScalarType() == MVT::i1) {
11476 SDValue F1 = getFreeze(N1);
11477 SDValue F2 = getFreeze(N2);
11478 // {vXi1,vXi1} (u/s)addo(vXi1 x, vXi1y) -> {xor(x,y),and(x,y)}
11479 if (Opcode == ISD::UADDO || Opcode == ISD::SADDO)
11480 return getNode(ISD::MERGE_VALUES, DL, VTList,
11481 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11482 getNode(ISD::AND, DL, VTList.VTs[1], F1, F2)},
11483 Flags);
11484 // {vXi1,vXi1} (u/s)subo(vXi1 x, vXi1y) -> {xor(x,y),and(~x,y)}
11485 if (Opcode == ISD::USUBO || Opcode == ISD::SSUBO) {
11486 SDValue NotF1 = getNOT(DL, F1, VTList.VTs[0]);
11487 return getNode(ISD::MERGE_VALUES, DL, VTList,
11488 {getNode(ISD::XOR, DL, VTList.VTs[0], F1, F2),
11489 getNode(ISD::AND, DL, VTList.VTs[1], NotF1, F2)},
11490 Flags);
11491 }
11492 }
11493 break;
11494 }
11495 case ISD::SADDO_CARRY:
11496 case ISD::UADDO_CARRY:
11497 case ISD::SSUBO_CARRY:
11498 case ISD::USUBO_CARRY:
11499 assert(VTList.NumVTs == 2 && Ops.size() == 3 &&
11500 "Invalid add/sub overflow op!");
11501 assert(VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() &&
11502 Ops[0].getValueType() == Ops[1].getValueType() &&
11503 Ops[0].getValueType() == VTList.VTs[0] &&
11504 Ops[2].getValueType() == VTList.VTs[1] &&
11505 "Binary operator types must match!");
11506 break;
11507 case ISD::SMUL_LOHI:
11508 case ISD::UMUL_LOHI: {
11509 assert(VTList.NumVTs == 2 && Ops.size() == 2 && "Invalid mul lo/hi op!");
11510 assert(VTList.VTs[0].isInteger() && VTList.VTs[0] == VTList.VTs[1] &&
11511 VTList.VTs[0] == Ops[0].getValueType() &&
11512 VTList.VTs[0] == Ops[1].getValueType() &&
11513 "Binary operator types must match!");
11514 // Constant fold.
11517 if (LHS && RHS) {
11518 unsigned Width = VTList.VTs[0].getScalarSizeInBits();
11519 unsigned OutWidth = Width * 2;
11520 APInt Val = LHS->getAPIntValue();
11521 APInt Mul = RHS->getAPIntValue();
11522 if (Opcode == ISD::SMUL_LOHI) {
11523 Val = Val.sext(OutWidth);
11524 Mul = Mul.sext(OutWidth);
11525 } else {
11526 Val = Val.zext(OutWidth);
11527 Mul = Mul.zext(OutWidth);
11528 }
11529 Val *= Mul;
11530
11531 SDValue Hi =
11532 getConstant(Val.extractBits(Width, Width), DL, VTList.VTs[0]);
11533 SDValue Lo = getConstant(Val.trunc(Width), DL, VTList.VTs[0]);
11534 return getNode(ISD::MERGE_VALUES, DL, VTList, {Lo, Hi}, Flags);
11535 }
11536 break;
11537 }
11538 case ISD::FFREXP: {
11539 assert(VTList.NumVTs == 2 && Ops.size() == 1 && "Invalid ffrexp op!");
11540 assert(VTList.VTs[0].isFloatingPoint() && VTList.VTs[1].isInteger() &&
11541 VTList.VTs[0] == Ops[0].getValueType() && "frexp type mismatch");
11542
11544 int FrexpExp;
11545 APFloat FrexpMant =
11546 frexp(C->getValueAPF(), FrexpExp, APFloat::rmNearestTiesToEven);
11547 SDValue Result0 = getConstantFP(FrexpMant, DL, VTList.VTs[0]);
11548 SDValue Result1 = getSignedConstant(FrexpMant.isFinite() ? FrexpExp : 0,
11549 DL, VTList.VTs[1]);
11550 return getNode(ISD::MERGE_VALUES, DL, VTList, {Result0, Result1}, Flags);
11551 }
11552
11553 break;
11554 }
11556 assert(VTList.NumVTs == 2 && Ops.size() == 2 &&
11557 "Invalid STRICT_FP_EXTEND!");
11558 assert(VTList.VTs[0].isFloatingPoint() &&
11559 Ops[1].getValueType().isFloatingPoint() && "Invalid FP cast!");
11560 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11561 "STRICT_FP_EXTEND result type should be vector iff the operand "
11562 "type is vector!");
11563 assert((!VTList.VTs[0].isVector() ||
11564 VTList.VTs[0].getVectorElementCount() ==
11565 Ops[1].getValueType().getVectorElementCount()) &&
11566 "Vector element count mismatch!");
11567 assert(Ops[1].getValueType().bitsLT(VTList.VTs[0]) &&
11568 "Invalid fpext node, dst <= src!");
11569 break;
11571 assert(VTList.NumVTs == 2 && Ops.size() == 3 && "Invalid STRICT_FP_ROUND!");
11572 assert(VTList.VTs[0].isVector() == Ops[1].getValueType().isVector() &&
11573 "STRICT_FP_ROUND result type should be vector iff the operand "
11574 "type is vector!");
11575 assert((!VTList.VTs[0].isVector() ||
11576 VTList.VTs[0].getVectorElementCount() ==
11577 Ops[1].getValueType().getVectorElementCount()) &&
11578 "Vector element count mismatch!");
11579 assert(VTList.VTs[0].isFloatingPoint() &&
11580 Ops[1].getValueType().isFloatingPoint() &&
11581 VTList.VTs[0].bitsLT(Ops[1].getValueType()) &&
11582 Ops[2].getOpcode() == ISD::TargetConstant &&
11583 (Ops[2]->getAsZExtVal() == 0 || Ops[2]->getAsZExtVal() == 1) &&
11584 "Invalid STRICT_FP_ROUND!");
11585 break;
11586 }
11587
11588 // Memoize the node unless it returns a glue result.
11589 SDNode *N;
11590 if (VTList.VTs[VTList.NumVTs-1] != MVT::Glue) {
11592 AddNodeIDNode(ID, Opcode, VTList, Ops);
11593 void *IP = nullptr;
11594 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
11595 E->intersectFlagsWith(Flags);
11596 return SDValue(E, 0);
11597 }
11598
11599 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11600 createOperands(N, Ops);
11601 CSEMap.InsertNode(N, IP);
11602 } else {
11603 N = newSDNode<SDNode>(Opcode, DL.getIROrder(), DL.getDebugLoc(), VTList);
11604 createOperands(N, Ops);
11605 }
11606
11607 N->setFlags(Flags);
11608 InsertNode(N);
11609 SDValue V(N, 0);
11610 NewSDValueDbgMsg(V, "Creating new node: ", this);
11611 return V;
11612}
11613
11614SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL,
11615 SDVTList VTList) {
11616 return getNode(Opcode, DL, VTList, ArrayRef<SDValue>());
11617}
11618
11619SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11620 SDValue N1) {
11621 SDValue Ops[] = { N1 };
11622 return getNode(Opcode, DL, VTList, Ops);
11623}
11624
11625SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11626 SDValue N1, SDValue N2) {
11627 SDValue Ops[] = { N1, N2 };
11628 return getNode(Opcode, DL, VTList, Ops);
11629}
11630
11631SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11632 SDValue N1, SDValue N2, SDValue N3) {
11633 SDValue Ops[] = { N1, N2, N3 };
11634 return getNode(Opcode, DL, VTList, Ops);
11635}
11636
11637SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11638 SDValue N1, SDValue N2, SDValue N3, SDValue N4) {
11639 SDValue Ops[] = { N1, N2, N3, N4 };
11640 return getNode(Opcode, DL, VTList, Ops);
11641}
11642
11643SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, SDVTList VTList,
11644 SDValue N1, SDValue N2, SDValue N3, SDValue N4,
11645 SDValue N5) {
11646 SDValue Ops[] = { N1, N2, N3, N4, N5 };
11647 return getNode(Opcode, DL, VTList, Ops);
11648}
11649
11651 if (!VT.isExtended())
11652 return makeVTList(SDNode::getValueTypeList(VT.getSimpleVT()), 1);
11653
11654 return makeVTList(&(*EVTs.insert(VT).first), 1);
11655}
11656
11659 ID.AddInteger(2U);
11660 ID.AddInteger(VT1.getRawBits());
11661 ID.AddInteger(VT2.getRawBits());
11662
11663 void *IP = nullptr;
11664 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11665 if (!Result) {
11666 EVT *Array = Allocator.Allocate<EVT>(2);
11667 Array[0] = VT1;
11668 Array[1] = VT2;
11669 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 2);
11670 VTListMap.InsertNode(Result, IP);
11671 }
11672 return Result->getSDVTList();
11673}
11674
11677 ID.AddInteger(3U);
11678 ID.AddInteger(VT1.getRawBits());
11679 ID.AddInteger(VT2.getRawBits());
11680 ID.AddInteger(VT3.getRawBits());
11681
11682 void *IP = nullptr;
11683 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11684 if (!Result) {
11685 EVT *Array = Allocator.Allocate<EVT>(3);
11686 Array[0] = VT1;
11687 Array[1] = VT2;
11688 Array[2] = VT3;
11689 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 3);
11690 VTListMap.InsertNode(Result, IP);
11691 }
11692 return Result->getSDVTList();
11693}
11694
11697 ID.AddInteger(4U);
11698 ID.AddInteger(VT1.getRawBits());
11699 ID.AddInteger(VT2.getRawBits());
11700 ID.AddInteger(VT3.getRawBits());
11701 ID.AddInteger(VT4.getRawBits());
11702
11703 void *IP = nullptr;
11704 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11705 if (!Result) {
11706 EVT *Array = Allocator.Allocate<EVT>(4);
11707 Array[0] = VT1;
11708 Array[1] = VT2;
11709 Array[2] = VT3;
11710 Array[3] = VT4;
11711 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, 4);
11712 VTListMap.InsertNode(Result, IP);
11713 }
11714 return Result->getSDVTList();
11715}
11716
11718 unsigned NumVTs = VTs.size();
11720 ID.AddInteger(NumVTs);
11721 for (unsigned index = 0; index < NumVTs; index++) {
11722 ID.AddInteger(VTs[index].getRawBits());
11723 }
11724
11725 void *IP = nullptr;
11726 SDVTListNode *Result = VTListMap.FindNodeOrInsertPos(ID, IP);
11727 if (!Result) {
11728 EVT *Array = Allocator.Allocate<EVT>(NumVTs);
11729 llvm::copy(VTs, Array);
11730 Result = new (Allocator) SDVTListNode(ID.Intern(Allocator), Array, NumVTs);
11731 VTListMap.InsertNode(Result, IP);
11732 }
11733 return Result->getSDVTList();
11734}
11735
11736
11737/// UpdateNodeOperands - *Mutate* the specified node in-place to have the
11738/// specified operands. If the resultant node already exists in the DAG,
11739/// this does not modify the specified node, instead it returns the node that
11740/// already exists. If the resultant node does not exist in the DAG, the
11741/// input node is returned. As a degenerate case, if you specify the same
11742/// input operands as the node already has, the input node is returned.
11744 assert(N->getNumOperands() == 1 && "Update with wrong number of operands");
11745
11746 // Check to see if there is no change.
11747 if (Op == N->getOperand(0)) return N;
11748
11749 // See if the modified node already exists.
11750 void *InsertPos = nullptr;
11751 if (SDNode *Existing = FindModifiedNodeSlot(N, Op, InsertPos))
11752 return Existing;
11753
11754 // Nope it doesn't. Remove the node from its current place in the maps.
11755 if (InsertPos)
11756 if (!RemoveNodeFromCSEMaps(N))
11757 InsertPos = nullptr;
11758
11759 // Now we update the operands.
11760 N->OperandList[0].set(Op);
11761
11763 // If this gets put into a CSE map, add it.
11764 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
11765 return N;
11766}
11767
11769 assert(N->getNumOperands() == 2 && "Update with wrong number of operands");
11770
11771 // Check to see if there is no change.
11772 if (Op1 == N->getOperand(0) && Op2 == N->getOperand(1))
11773 return N; // No operands changed, just return the input node.
11774
11775 // See if the modified node already exists.
11776 void *InsertPos = nullptr;
11777 if (SDNode *Existing = FindModifiedNodeSlot(N, Op1, Op2, InsertPos))
11778 return Existing;
11779
11780 // Nope it doesn't. Remove the node from its current place in the maps.
11781 if (InsertPos)
11782 if (!RemoveNodeFromCSEMaps(N))
11783 InsertPos = nullptr;
11784
11785 // Now we update the operands.
11786 if (N->OperandList[0] != Op1)
11787 N->OperandList[0].set(Op1);
11788 if (N->OperandList[1] != Op2)
11789 N->OperandList[1].set(Op2);
11790
11792 // If this gets put into a CSE map, add it.
11793 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
11794 return N;
11795}
11796
11799 SDValue Ops[] = { Op1, Op2, Op3 };
11800 return UpdateNodeOperands(N, Ops);
11801}
11802
11805 SDValue Op3, SDValue Op4) {
11806 SDValue Ops[] = { Op1, Op2, Op3, Op4 };
11807 return UpdateNodeOperands(N, Ops);
11808}
11809
11812 SDValue Op3, SDValue Op4, SDValue Op5) {
11813 SDValue Ops[] = { Op1, Op2, Op3, Op4, Op5 };
11814 return UpdateNodeOperands(N, Ops);
11815}
11816
11819 unsigned NumOps = Ops.size();
11820 assert(N->getNumOperands() == NumOps &&
11821 "Update with wrong number of operands");
11822
11823 // If no operands changed just return the input node.
11824 if (std::equal(Ops.begin(), Ops.end(), N->op_begin()))
11825 return N;
11826
11827 // See if the modified node already exists.
11828 void *InsertPos = nullptr;
11829 if (SDNode *Existing = FindModifiedNodeSlot(N, Ops, InsertPos))
11830 return Existing;
11831
11832 // Nope it doesn't. Remove the node from its current place in the maps.
11833 if (InsertPos)
11834 if (!RemoveNodeFromCSEMaps(N))
11835 InsertPos = nullptr;
11836
11837 // Now we update the operands.
11838 for (unsigned i = 0; i != NumOps; ++i)
11839 if (N->OperandList[i] != Ops[i])
11840 N->OperandList[i].set(Ops[i]);
11841
11843 // If this gets put into a CSE map, add it.
11844 if (InsertPos) CSEMap.InsertNode(N, InsertPos);
11845 return N;
11846}
11847
11848/// DropOperands - Release the operands and set this node to have
11849/// zero operands.
11851 // Unlike the code in MorphNodeTo that does this, we don't need to
11852 // watch for dead nodes here.
11853 for (op_iterator I = op_begin(), E = op_end(); I != E; ) {
11854 SDUse &Use = *I++;
11855 Use.set(SDValue());
11856 }
11857}
11858
11860 ArrayRef<MachineMemOperand *> NewMemRefs) {
11861 if (NewMemRefs.empty()) {
11862 N->clearMemRefs();
11863 return;
11864 }
11865
11866 // Check if we can avoid allocating by storing a single reference directly.
11867 if (NewMemRefs.size() == 1) {
11868 N->MemRefs = NewMemRefs[0];
11869 N->NumMemRefs = 1;
11870 return;
11871 }
11872
11873 MachineMemOperand **MemRefsBuffer =
11874 Allocator.template Allocate<MachineMemOperand *>(NewMemRefs.size());
11875 llvm::copy(NewMemRefs, MemRefsBuffer);
11876 N->MemRefs = MemRefsBuffer;
11877 N->NumMemRefs = static_cast<int>(NewMemRefs.size());
11878}
11879
11880/// SelectNodeTo - These are wrappers around MorphNodeTo that accept a
11881/// machine opcode.
11882///
11884 EVT VT) {
11885 SDVTList VTs = getVTList(VT);
11886 return SelectNodeTo(N, MachineOpc, VTs, {});
11887}
11888
11890 EVT VT, SDValue Op1) {
11891 SDVTList VTs = getVTList(VT);
11892 SDValue Ops[] = { Op1 };
11893 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11894}
11895
11897 EVT VT, SDValue Op1,
11898 SDValue Op2) {
11899 SDVTList VTs = getVTList(VT);
11900 SDValue Ops[] = { Op1, Op2 };
11901 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11902}
11903
11905 EVT VT, SDValue Op1,
11906 SDValue Op2, SDValue Op3) {
11907 SDVTList VTs = getVTList(VT);
11908 SDValue Ops[] = { Op1, Op2, Op3 };
11909 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11910}
11911
11914 SDVTList VTs = getVTList(VT);
11915 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11916}
11917
11919 EVT VT1, EVT VT2, ArrayRef<SDValue> Ops) {
11920 SDVTList VTs = getVTList(VT1, VT2);
11921 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11922}
11923
11925 EVT VT1, EVT VT2) {
11926 SDVTList VTs = getVTList(VT1, VT2);
11927 return SelectNodeTo(N, MachineOpc, VTs, {});
11928}
11929
11931 EVT VT1, EVT VT2, EVT VT3,
11933 SDVTList VTs = getVTList(VT1, VT2, VT3);
11934 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11935}
11936
11938 EVT VT1, EVT VT2,
11939 SDValue Op1, SDValue Op2) {
11940 SDVTList VTs = getVTList(VT1, VT2);
11941 SDValue Ops[] = { Op1, Op2 };
11942 return SelectNodeTo(N, MachineOpc, VTs, Ops);
11943}
11944
11947 SDNode *New = MorphNodeTo(N, ~MachineOpc, VTs, Ops);
11948 // Reset the NodeID to -1.
11949 New->setNodeId(-1);
11950 if (New != N) {
11951 ReplaceAllUsesWith(N, New);
11953 }
11954 return New;
11955}
11956
11957/// UpdateSDLocOnMergeSDNode - If the opt level is -O0 then it throws away
11958/// the line number information on the merged node since it is not possible to
11959/// preserve the information that operation is associated with multiple lines.
11960/// This will make the debugger working better at -O0, were there is a higher
11961/// probability having other instructions associated with that line.
11962///
11963/// For IROrder, we keep the smaller of the two
11964SDNode *SelectionDAG::UpdateSDLocOnMergeSDNode(SDNode *N, const SDLoc &OLoc) {
11965 DebugLoc NLoc = N->getDebugLoc();
11966 if (NLoc && OptLevel == CodeGenOptLevel::None && OLoc.getDebugLoc() != NLoc) {
11967 N->setDebugLoc(DebugLoc());
11968 }
11969 unsigned Order = std::min(N->getIROrder(), OLoc.getIROrder());
11970 N->setIROrder(Order);
11971 return N;
11972}
11973
11974/// MorphNodeTo - This *mutates* the specified node to have the specified
11975/// return type, opcode, and operands.
11976///
11977/// Note that MorphNodeTo returns the resultant node. If there is already a
11978/// node of the specified opcode and operands, it returns that node instead of
11979/// the current one. Note that the SDLoc need not be the same.
11980///
11981/// Using MorphNodeTo is faster than creating a new node and swapping it in
11982/// with ReplaceAllUsesWith both because it often avoids allocating a new
11983/// node, and because it doesn't require CSE recalculation for any of
11984/// the node's users.
11985///
11986/// However, note that MorphNodeTo recursively deletes dead nodes from the DAG.
11987/// As a consequence it isn't appropriate to use from within the DAG combiner or
11988/// the legalizer which maintain worklists that would need to be updated when
11989/// deleting things.
11992 // If an identical node already exists, use it.
11993 void *IP = nullptr;
11994 if (VTs.VTs[VTs.NumVTs-1] != MVT::Glue) {
11996 AddNodeIDNode(ID, Opc, VTs, Ops);
11997 if (SDNode *ON = FindNodeOrInsertPos(ID, SDLoc(N), IP))
11998 return UpdateSDLocOnMergeSDNode(ON, SDLoc(N));
11999 }
12000
12001 if (!RemoveNodeFromCSEMaps(N))
12002 IP = nullptr;
12003
12004 // Start the morphing.
12005 N->NodeType = Opc;
12006 N->ValueList = VTs.VTs;
12007 N->NumValues = VTs.NumVTs;
12008
12009 // Clear the operands list, updating used nodes to remove this from their
12010 // use list. Keep track of any operands that become dead as a result.
12011 SmallPtrSet<SDNode*, 16> DeadNodeSet;
12012 for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ) {
12013 SDUse &Use = *I++;
12014 SDNode *Used = Use.getNode();
12015 Use.set(SDValue());
12016 if (Used->use_empty())
12017 DeadNodeSet.insert(Used);
12018 }
12019
12020 // For MachineNode, initialize the memory references information.
12022 MN->clearMemRefs();
12023
12024 // Swap for an appropriately sized array from the recycler.
12025 removeOperands(N);
12026 createOperands(N, Ops);
12027
12028 // Delete any nodes that are still dead after adding the uses for the
12029 // new operands.
12030 if (!DeadNodeSet.empty()) {
12031 SmallVector<SDNode *, 16> DeadNodes;
12032 for (SDNode *N : DeadNodeSet)
12033 if (N->use_empty())
12034 DeadNodes.push_back(N);
12035 RemoveDeadNodes(DeadNodes);
12036 }
12037
12038 if (IP)
12039 CSEMap.InsertNode(N, IP); // Memoize the new node.
12040 return N;
12041}
12042
12044 unsigned OrigOpc = Node->getOpcode();
12045 unsigned NewOpc;
12046 switch (OrigOpc) {
12047 default:
12048 llvm_unreachable("mutateStrictFPToFP called with unexpected opcode!");
12049#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12050 case ISD::STRICT_##DAGN: NewOpc = ISD::DAGN; break;
12051#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
12052 case ISD::STRICT_##DAGN: NewOpc = ISD::SETCC; break;
12053#include "llvm/IR/ConstrainedOps.def"
12054 }
12055
12056 assert(Node->getNumValues() == 2 && "Unexpected number of results!");
12057
12058 // We're taking this node out of the chain, so we need to re-link things.
12059 SDValue InputChain = Node->getOperand(0);
12060 SDValue OutputChain = SDValue(Node, 1);
12061 ReplaceAllUsesOfValueWith(OutputChain, InputChain);
12062
12064 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
12065 Ops.push_back(Node->getOperand(i));
12066
12067 SDVTList VTs = getVTList(Node->getValueType(0));
12068 SDNode *Res = MorphNodeTo(Node, NewOpc, VTs, Ops);
12069
12070 // MorphNodeTo can operate in two ways: if an existing node with the
12071 // specified operands exists, it can just return it. Otherwise, it
12072 // updates the node in place to have the requested operands.
12073 if (Res == Node) {
12074 // If we updated the node in place, reset the node ID. To the isel,
12075 // this should be just like a newly allocated machine node.
12076 Res->setNodeId(-1);
12077 } else {
12080 }
12081
12082 return Res;
12083}
12084
12085/// getMachineNode - These are used for target selectors to create a new node
12086/// with specified return type(s), MachineInstr opcode, and operands.
12087///
12088/// Note that getMachineNode returns the resultant node. If there is already a
12089/// node of the specified opcode and operands, it returns that node instead of
12090/// the current one.
12092 EVT VT) {
12093 SDVTList VTs = getVTList(VT);
12094 return getMachineNode(Opcode, dl, VTs, {});
12095}
12096
12098 EVT VT, SDValue Op1) {
12099 SDVTList VTs = getVTList(VT);
12100 SDValue Ops[] = { Op1 };
12101 return getMachineNode(Opcode, dl, VTs, Ops);
12102}
12103
12105 EVT VT, SDValue Op1, SDValue Op2) {
12106 SDVTList VTs = getVTList(VT);
12107 SDValue Ops[] = { Op1, Op2 };
12108 return getMachineNode(Opcode, dl, VTs, Ops);
12109}
12110
12112 EVT VT, SDValue Op1, SDValue Op2,
12113 SDValue Op3) {
12114 SDVTList VTs = getVTList(VT);
12115 SDValue Ops[] = { Op1, Op2, Op3 };
12116 return getMachineNode(Opcode, dl, VTs, Ops);
12117}
12118
12121 SDVTList VTs = getVTList(VT);
12122 return getMachineNode(Opcode, dl, VTs, Ops);
12123}
12124
12126 EVT VT1, EVT VT2, SDValue Op1,
12127 SDValue Op2) {
12128 SDVTList VTs = getVTList(VT1, VT2);
12129 SDValue Ops[] = { Op1, Op2 };
12130 return getMachineNode(Opcode, dl, VTs, Ops);
12131}
12132
12134 EVT VT1, EVT VT2, SDValue Op1,
12135 SDValue Op2, SDValue Op3) {
12136 SDVTList VTs = getVTList(VT1, VT2);
12137 SDValue Ops[] = { Op1, Op2, Op3 };
12138 return getMachineNode(Opcode, dl, VTs, Ops);
12139}
12140
12142 EVT VT1, EVT VT2,
12144 SDVTList VTs = getVTList(VT1, VT2);
12145 return getMachineNode(Opcode, dl, VTs, Ops);
12146}
12147
12149 EVT VT1, EVT VT2, EVT VT3,
12150 SDValue Op1, SDValue Op2) {
12151 SDVTList VTs = getVTList(VT1, VT2, VT3);
12152 SDValue Ops[] = { Op1, Op2 };
12153 return getMachineNode(Opcode, dl, VTs, Ops);
12154}
12155
12157 EVT VT1, EVT VT2, EVT VT3,
12158 SDValue Op1, SDValue Op2,
12159 SDValue Op3) {
12160 SDVTList VTs = getVTList(VT1, VT2, VT3);
12161 SDValue Ops[] = { Op1, Op2, Op3 };
12162 return getMachineNode(Opcode, dl, VTs, Ops);
12163}
12164
12166 EVT VT1, EVT VT2, EVT VT3,
12168 SDVTList VTs = getVTList(VT1, VT2, VT3);
12169 return getMachineNode(Opcode, dl, VTs, Ops);
12170}
12171
12173 ArrayRef<EVT> ResultTys,
12175 SDVTList VTs = getVTList(ResultTys);
12176 return getMachineNode(Opcode, dl, VTs, Ops);
12177}
12178
12180 SDVTList VTs,
12182 bool DoCSE = VTs.VTs[VTs.NumVTs-1] != MVT::Glue;
12184 void *IP = nullptr;
12185
12186 if (DoCSE) {
12188 AddNodeIDNode(ID, ~Opcode, VTs, Ops);
12189 IP = nullptr;
12190 if (SDNode *E = FindNodeOrInsertPos(ID, DL, IP)) {
12191 return cast<MachineSDNode>(UpdateSDLocOnMergeSDNode(E, DL));
12192 }
12193 }
12194
12195 // Allocate a new MachineSDNode.
12196 N = newSDNode<MachineSDNode>(~Opcode, DL.getIROrder(), DL.getDebugLoc(), VTs);
12197 createOperands(N, Ops);
12198
12199 if (DoCSE)
12200 CSEMap.InsertNode(N, IP);
12201
12202 InsertNode(N);
12203 NewSDValueDbgMsg(SDValue(N, 0), "Creating new machine node: ", this);
12204 return N;
12205}
12206
12207/// getTargetExtractSubreg - A convenience function for creating
12208/// TargetOpcode::EXTRACT_SUBREG nodes.
12210 SDValue Operand) {
12211 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12212 SDNode *Subreg = getMachineNode(TargetOpcode::EXTRACT_SUBREG, DL,
12213 VT, Operand, SRIdxVal);
12214 return SDValue(Subreg, 0);
12215}
12216
12217/// getTargetInsertSubreg - A convenience function for creating
12218/// TargetOpcode::INSERT_SUBREG nodes.
12220 SDValue Operand, SDValue Subreg) {
12221 SDValue SRIdxVal = getTargetConstant(SRIdx, DL, MVT::i32);
12222 SDNode *Result = getMachineNode(TargetOpcode::INSERT_SUBREG, DL,
12223 VT, Operand, Subreg, SRIdxVal);
12224 return SDValue(Result, 0);
12225}
12226
12227/// getNodeIfExists - Get the specified node if it's already available, or
12228/// else return NULL.
12231 bool AllowCommute) {
12232 SDNodeFlags Flags;
12233 if (Inserter)
12234 Flags = Inserter->getFlags();
12235 return getNodeIfExists(Opcode, VTList, Ops, Flags, AllowCommute);
12236}
12237
12240 const SDNodeFlags Flags,
12241 bool AllowCommute) {
12242 if (VTList.VTs[VTList.NumVTs - 1] == MVT::Glue)
12243 return nullptr;
12244
12245 auto Lookup = [&](ArrayRef<SDValue> LookupOps) -> SDNode * {
12247 AddNodeIDNode(ID, Opcode, VTList, LookupOps);
12248 void *IP = nullptr;
12249 if (SDNode *E = FindNodeOrInsertPos(ID, IP)) {
12250 E->intersectFlagsWith(Flags);
12251 return E;
12252 }
12253 return nullptr;
12254 };
12255
12256 if (SDNode *Existing = Lookup(Ops))
12257 return Existing;
12258
12259 if (AllowCommute && TLI->isCommutativeBinOp(Opcode))
12260 return Lookup({Ops[1], Ops[0]});
12261
12262 return nullptr;
12263}
12264
12265/// doesNodeExist - Check if a node exists without modifying its flags.
12266bool SelectionDAG::doesNodeExist(unsigned Opcode, SDVTList VTList,
12268 if (VTList.VTs[VTList.NumVTs - 1] != MVT::Glue) {
12270 AddNodeIDNode(ID, Opcode, VTList, Ops);
12271 void *IP = nullptr;
12272 if (FindNodeOrInsertPos(ID, SDLoc(), IP))
12273 return true;
12274 }
12275 return false;
12276}
12277
12278/// getDbgValue - Creates a SDDbgValue node.
12279///
12280/// SDNode
12282 SDNode *N, unsigned R, bool IsIndirect,
12283 const DebugLoc &DL, unsigned O) {
12284 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12285 "Expected inlined-at fields to agree");
12286 return new (DbgInfo->getAlloc())
12287 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromNode(N, R),
12288 {}, IsIndirect, DL, O,
12289 /*IsVariadic=*/false);
12290}
12291
12292/// Constant
12294 DIExpression *Expr,
12295 const Value *C,
12296 const DebugLoc &DL, unsigned O) {
12297 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12298 "Expected inlined-at fields to agree");
12299 return new (DbgInfo->getAlloc())
12300 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromConst(C), {},
12301 /*IsIndirect=*/false, DL, O,
12302 /*IsVariadic=*/false);
12303}
12304
12305/// FrameIndex
12307 DIExpression *Expr, unsigned FI,
12308 bool IsIndirect,
12309 const DebugLoc &DL,
12310 unsigned O) {
12311 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12312 "Expected inlined-at fields to agree");
12313 return getFrameIndexDbgValue(Var, Expr, FI, {}, IsIndirect, DL, O);
12314}
12315
12316/// FrameIndex with dependencies
12318 DIExpression *Expr, unsigned FI,
12319 ArrayRef<SDNode *> Dependencies,
12320 bool IsIndirect,
12321 const DebugLoc &DL,
12322 unsigned O) {
12323 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12324 "Expected inlined-at fields to agree");
12325 return new (DbgInfo->getAlloc())
12326 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromFrameIdx(FI),
12327 Dependencies, IsIndirect, DL, O,
12328 /*IsVariadic=*/false);
12329}
12330
12331/// VReg
12333 Register VReg, bool IsIndirect,
12334 const DebugLoc &DL, unsigned O) {
12335 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12336 "Expected inlined-at fields to agree");
12337 return new (DbgInfo->getAlloc())
12338 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, SDDbgOperand::fromVReg(VReg),
12339 {}, IsIndirect, DL, O,
12340 /*IsVariadic=*/false);
12341}
12342
12345 ArrayRef<SDNode *> Dependencies,
12346 bool IsIndirect, const DebugLoc &DL,
12347 unsigned O, bool IsVariadic) {
12348 assert(cast<DILocalVariable>(Var)->isValidLocationForIntrinsic(DL) &&
12349 "Expected inlined-at fields to agree");
12350 return new (DbgInfo->getAlloc())
12351 SDDbgValue(DbgInfo->getAlloc(), Var, Expr, Locs, Dependencies, IsIndirect,
12352 DL, O, IsVariadic);
12353}
12354
12356 unsigned OffsetInBits, unsigned SizeInBits,
12357 bool InvalidateDbg) {
12358 SDNode *FromNode = From.getNode();
12359 SDNode *ToNode = To.getNode();
12360 assert(FromNode && ToNode && "Can't modify dbg values");
12361
12362 // PR35338
12363 // TODO: assert(From != To && "Redundant dbg value transfer");
12364 // TODO: assert(FromNode != ToNode && "Intranode dbg value transfer");
12365 if (From == To || FromNode == ToNode)
12366 return;
12367
12368 if (!FromNode->getHasDebugValue())
12369 return;
12370
12371 SDDbgOperand FromLocOp =
12372 SDDbgOperand::fromNode(From.getNode(), From.getResNo());
12374
12376 for (SDDbgValue *Dbg : GetDbgValues(FromNode)) {
12377 if (Dbg->isInvalidated())
12378 continue;
12379
12380 // TODO: assert(!Dbg->isInvalidated() && "Transfer of invalid dbg value");
12381
12382 // Create a new location ops vector that is equal to the old vector, but
12383 // with each instance of FromLocOp replaced with ToLocOp.
12384 bool Changed = false;
12385 auto NewLocOps = Dbg->copyLocationOps();
12386 std::replace_if(
12387 NewLocOps.begin(), NewLocOps.end(),
12388 [&Changed, FromLocOp](const SDDbgOperand &Op) {
12389 bool Match = Op == FromLocOp;
12390 Changed |= Match;
12391 return Match;
12392 },
12393 ToLocOp);
12394 // Ignore this SDDbgValue if we didn't find a matching location.
12395 if (!Changed)
12396 continue;
12397
12398 DIVariable *Var = Dbg->getVariable();
12399 auto *Expr = Dbg->getExpression();
12400 // If a fragment is requested, update the expression.
12401 if (SizeInBits) {
12402 // When splitting a larger (e.g., sign-extended) value whose
12403 // lower bits are described with an SDDbgValue, do not attempt
12404 // to transfer the SDDbgValue to the upper bits.
12405 if (auto FI = Expr->getFragmentInfo())
12406 if (OffsetInBits + SizeInBits > FI->SizeInBits)
12407 continue;
12408 auto Fragment = DIExpression::createFragmentExpression(Expr, OffsetInBits,
12409 SizeInBits);
12410 if (!Fragment)
12411 continue;
12412 Expr = *Fragment;
12413 }
12414
12415 auto AdditionalDependencies = Dbg->getAdditionalDependencies();
12416 // Clone the SDDbgValue and move it to To.
12417 SDDbgValue *Clone = getDbgValueList(
12418 Var, Expr, NewLocOps, AdditionalDependencies, Dbg->isIndirect(),
12419 Dbg->getDebugLoc(), std::max(ToNode->getIROrder(), Dbg->getOrder()),
12420 Dbg->isVariadic());
12421 ClonedDVs.push_back(Clone);
12422
12423 if (InvalidateDbg) {
12424 // Invalidate value and indicate the SDDbgValue should not be emitted.
12425 Dbg->setIsInvalidated();
12426 Dbg->setIsEmitted();
12427 }
12428 }
12429
12430 for (SDDbgValue *Dbg : ClonedDVs) {
12431 assert(is_contained(Dbg->getSDNodes(), ToNode) &&
12432 "Transferred DbgValues should depend on the new SDNode");
12433 AddDbgValue(Dbg, false);
12434 }
12435}
12436
12438 if (!N.getHasDebugValue())
12439 return;
12440
12441 auto GetLocationOperand = [](SDNode *Node, unsigned ResNo) {
12442 if (auto *FISDN = dyn_cast<FrameIndexSDNode>(Node))
12443 return SDDbgOperand::fromFrameIdx(FISDN->getIndex());
12444 return SDDbgOperand::fromNode(Node, ResNo);
12445 };
12446
12448 for (auto *DV : GetDbgValues(&N)) {
12449 if (DV->isInvalidated())
12450 continue;
12451 switch (N.getOpcode()) {
12452 default:
12453 break;
12454 case ISD::ADD: {
12455 SDValue N0 = N.getOperand(0);
12456 SDValue N1 = N.getOperand(1);
12457 if (!isa<ConstantSDNode>(N0)) {
12458 bool RHSConstant = isa<ConstantSDNode>(N1);
12460 if (RHSConstant)
12461 Offset = N.getConstantOperandVal(1);
12462 // We are not allowed to turn indirect debug values variadic, so
12463 // don't salvage those.
12464 if (!RHSConstant && DV->isIndirect())
12465 continue;
12466
12467 // Rewrite an ADD constant node into a DIExpression. Since we are
12468 // performing arithmetic to compute the variable's *value* in the
12469 // DIExpression, we need to mark the expression with a
12470 // DW_OP_stack_value.
12471 auto *DIExpr = DV->getExpression();
12472 auto NewLocOps = DV->copyLocationOps();
12473 bool Changed = false;
12474 size_t OrigLocOpsSize = NewLocOps.size();
12475 for (size_t i = 0; i < OrigLocOpsSize; ++i) {
12476 // We're not given a ResNo to compare against because the whole
12477 // node is going away. We know that any ISD::ADD only has one
12478 // result, so we can assume any node match is using the result.
12479 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12480 NewLocOps[i].getSDNode() != &N)
12481 continue;
12482 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12483 if (RHSConstant) {
12486 DIExpr = DIExpression::appendOpsToArg(DIExpr, ExprOps, i, true);
12487 } else {
12488 // Convert to a variadic expression (if not already).
12489 // convertToVariadicExpression() returns a const pointer, so we use
12490 // a temporary const variable here.
12491 const auto *TmpDIExpr =
12495 ExprOps.push_back(NewLocOps.size());
12496 ExprOps.push_back(dwarf::DW_OP_plus);
12497 SDDbgOperand RHS =
12499 NewLocOps.push_back(RHS);
12500 DIExpr = DIExpression::appendOpsToArg(TmpDIExpr, ExprOps, i, true);
12501 }
12502 Changed = true;
12503 }
12504 (void)Changed;
12505 assert(Changed && "Salvage target doesn't use N");
12506
12507 bool IsVariadic =
12508 DV->isVariadic() || OrigLocOpsSize != NewLocOps.size();
12509
12510 auto AdditionalDependencies = DV->getAdditionalDependencies();
12511 SDDbgValue *Clone = getDbgValueList(
12512 DV->getVariable(), DIExpr, NewLocOps, AdditionalDependencies,
12513 DV->isIndirect(), DV->getDebugLoc(), DV->getOrder(), IsVariadic);
12514 ClonedDVs.push_back(Clone);
12515 DV->setIsInvalidated();
12516 DV->setIsEmitted();
12517 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting";
12518 N0.getNode()->dumprFull(this);
12519 dbgs() << " into " << *DIExpr << '\n');
12520 }
12521 break;
12522 }
12523 case ISD::TRUNCATE: {
12524 SDValue N0 = N.getOperand(0);
12525 TypeSize FromSize = N0.getValueSizeInBits();
12526 TypeSize ToSize = N.getValueSizeInBits(0);
12527
12528 DIExpression *DbgExpression = DV->getExpression();
12529 auto ExtOps = DIExpression::getExtOps(FromSize, ToSize, false);
12530 auto NewLocOps = DV->copyLocationOps();
12531 bool Changed = false;
12532 for (size_t i = 0; i < NewLocOps.size(); ++i) {
12533 if (NewLocOps[i].getKind() != SDDbgOperand::SDNODE ||
12534 NewLocOps[i].getSDNode() != &N)
12535 continue;
12536
12537 NewLocOps[i] = GetLocationOperand(N0.getNode(), N0.getResNo());
12538 DbgExpression = DIExpression::appendOpsToArg(DbgExpression, ExtOps, i);
12539 Changed = true;
12540 }
12541 assert(Changed && "Salvage target doesn't use N");
12542 (void)Changed;
12543
12544 SDDbgValue *Clone =
12545 getDbgValueList(DV->getVariable(), DbgExpression, NewLocOps,
12546 DV->getAdditionalDependencies(), DV->isIndirect(),
12547 DV->getDebugLoc(), DV->getOrder(), DV->isVariadic());
12548
12549 ClonedDVs.push_back(Clone);
12550 DV->setIsInvalidated();
12551 DV->setIsEmitted();
12552 LLVM_DEBUG(dbgs() << "SALVAGE: Rewriting"; N0.getNode()->dumprFull(this);
12553 dbgs() << " into " << *DbgExpression << '\n');
12554 break;
12555 }
12556 }
12557 }
12558
12559 for (SDDbgValue *Dbg : ClonedDVs) {
12560 assert((!Dbg->getSDNodes().empty() ||
12561 llvm::any_of(Dbg->getLocationOps(),
12562 [&](const SDDbgOperand &Op) {
12563 return Op.getKind() == SDDbgOperand::FRAMEIX;
12564 })) &&
12565 "Salvaged DbgValue should depend on a new SDNode");
12566 AddDbgValue(Dbg, false);
12567 }
12568}
12569
12570/// Creates a SDDbgLabel node.
12572 const DebugLoc &DL, unsigned O) {
12573 assert(cast<DILabel>(Label)->isValidLocationForIntrinsic(DL) &&
12574 "Expected inlined-at fields to agree");
12575 return new (DbgInfo->getAlloc()) SDDbgLabel(Label, DL, O);
12576}
12577
12578namespace {
12579
12580/// RAUWUpdateListener - Helper for ReplaceAllUsesWith - When the node
12581/// pointed to by a use iterator is deleted, increment the use iterator
12582/// so that it doesn't dangle.
12583///
12584class RAUWUpdateListener : public SelectionDAG::DAGUpdateListener {
12587
12588 void NodeDeleted(SDNode *N, SDNode *E) override {
12589 // Increment the iterator as needed.
12590 while (UI != UE && N == UI->getUser())
12591 ++UI;
12592 }
12593
12594public:
12595 RAUWUpdateListener(SelectionDAG &d,
12598 : SelectionDAG::DAGUpdateListener(d), UI(ui), UE(ue) {}
12599};
12600
12601} // end anonymous namespace
12602
12603/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12604/// This can cause recursive merging of nodes in the DAG.
12605///
12606/// This version assumes From has a single result value.
12607///
12609 SDNode *From = FromN.getNode();
12610 assert(From->getNumValues() == 1 && FromN.getResNo() == 0 &&
12611 "Cannot replace with this method!");
12612 assert(From != To.getNode() && "Cannot replace uses of with self");
12613
12614 // Preserve Debug Values
12615 transferDbgValues(FromN, To);
12616 // Preserve extra info.
12617 copyExtraInfo(From, To.getNode());
12618
12619 // Iterate over all the existing uses of From. New uses will be added
12620 // to the beginning of the use list, which we avoid visiting.
12621 // This specifically avoids visiting uses of From that arise while the
12622 // replacement is happening, because any such uses would be the result
12623 // of CSE: If an existing node looks like From after one of its operands
12624 // is replaced by To, we don't want to replace of all its users with To
12625 // too. See PR3018 for more info.
12626 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12627 RAUWUpdateListener Listener(*this, UI, UE);
12628 while (UI != UE) {
12629 SDNode *User = UI->getUser();
12630
12631 // This node is about to morph, remove its old self from the CSE maps.
12632 RemoveNodeFromCSEMaps(User);
12633
12634 // A user can appear in a use list multiple times, and when this
12635 // happens the uses are usually next to each other in the list.
12636 // To help reduce the number of CSE recomputations, process all
12637 // the uses of this user that we can find this way.
12638 do {
12639 SDUse &Use = *UI;
12640 ++UI;
12641 Use.set(To);
12642 if (To->isDivergent() != From->isDivergent())
12644 } while (UI != UE && UI->getUser() == User);
12645 // Now that we have modified User, add it back to the CSE maps. If it
12646 // already exists there, recursively merge the results together.
12647 AddModifiedNodeToCSEMaps(User);
12648 }
12649
12650 // If we just RAUW'd the root, take note.
12651 if (FromN == getRoot())
12652 setRoot(To);
12653}
12654
12655/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12656/// This can cause recursive merging of nodes in the DAG.
12657///
12658/// This version assumes that for each value of From, there is a
12659/// corresponding value in To in the same position with the same type.
12660///
12662#ifndef NDEBUG
12663 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
12664 assert((!From->hasAnyUseOfValue(i) ||
12665 From->getValueType(i) == To->getValueType(i)) &&
12666 "Cannot use this version of ReplaceAllUsesWith!");
12667#endif
12668
12669 // Handle the trivial case.
12670 if (From == To)
12671 return;
12672
12673 // Preserve Debug Info. Only do this if there's a use.
12674 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
12675 if (From->hasAnyUseOfValue(i)) {
12676 assert((i < To->getNumValues()) && "Invalid To location");
12677 transferDbgValues(SDValue(From, i), SDValue(To, i));
12678 }
12679 // Preserve extra info.
12680 copyExtraInfo(From, To);
12681
12682 // Iterate over just the existing users of From. See the comments in
12683 // the ReplaceAllUsesWith above.
12684 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12685 RAUWUpdateListener Listener(*this, UI, UE);
12686 while (UI != UE) {
12687 SDNode *User = UI->getUser();
12688
12689 // This node is about to morph, remove its old self from the CSE maps.
12690 RemoveNodeFromCSEMaps(User);
12691
12692 // A user can appear in a use list multiple times, and when this
12693 // happens the uses are usually next to each other in the list.
12694 // To help reduce the number of CSE recomputations, process all
12695 // the uses of this user that we can find this way.
12696 do {
12697 SDUse &Use = *UI;
12698 ++UI;
12699 Use.setNode(To);
12700 if (To->isDivergent() != From->isDivergent())
12702 } while (UI != UE && UI->getUser() == User);
12703
12704 // Now that we have modified User, add it back to the CSE maps. If it
12705 // already exists there, recursively merge the results together.
12706 AddModifiedNodeToCSEMaps(User);
12707 }
12708
12709 // If we just RAUW'd the root, take note.
12710 if (From == getRoot().getNode())
12711 setRoot(SDValue(To, getRoot().getResNo()));
12712}
12713
12714/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
12715/// This can cause recursive merging of nodes in the DAG.
12716///
12717/// This version can replace From with any result values. To must match the
12718/// number and types of values returned by From.
12720 if (From->getNumValues() == 1) // Handle the simple case efficiently.
12721 return ReplaceAllUsesWith(SDValue(From, 0), To[0]);
12722
12723 for (unsigned i = 0, e = From->getNumValues(); i != e; ++i) {
12724 // Preserve Debug Info.
12725 transferDbgValues(SDValue(From, i), To[i]);
12726 // Preserve extra info.
12727 copyExtraInfo(From, To[i].getNode());
12728 }
12729
12730 // Iterate over just the existing users of From. See the comments in
12731 // the ReplaceAllUsesWith above.
12732 SDNode::use_iterator UI = From->use_begin(), UE = From->use_end();
12733 RAUWUpdateListener Listener(*this, UI, UE);
12734 while (UI != UE) {
12735 SDNode *User = UI->getUser();
12736
12737 // This node is about to morph, remove its old self from the CSE maps.
12738 RemoveNodeFromCSEMaps(User);
12739
12740 // A user can appear in a use list multiple times, and when this happens the
12741 // uses are usually next to each other in the list. To help reduce the
12742 // number of CSE and divergence recomputations, process all the uses of this
12743 // user that we can find this way.
12744 bool To_IsDivergent = false;
12745 do {
12746 SDUse &Use = *UI;
12747 const SDValue &ToOp = To[Use.getResNo()];
12748 ++UI;
12749 Use.set(ToOp);
12750 if (ToOp.getValueType() != MVT::Other)
12751 To_IsDivergent |= ToOp->isDivergent();
12752 } while (UI != UE && UI->getUser() == User);
12753
12754 if (To_IsDivergent != From->isDivergent())
12756
12757 // Now that we have modified User, add it back to the CSE maps. If it
12758 // already exists there, recursively merge the results together.
12759 AddModifiedNodeToCSEMaps(User);
12760 }
12761
12762 // If we just RAUW'd the root, take note.
12763 if (From == getRoot().getNode())
12764 setRoot(SDValue(To[getRoot().getResNo()]));
12765}
12766
12767/// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
12768/// uses of other values produced by From.getNode() alone. The Deleted
12769/// vector is handled the same way as for ReplaceAllUsesWith.
12771 // Handle the really simple, really trivial case efficiently.
12772 if (From == To) return;
12773
12774 // Handle the simple, trivial, case efficiently.
12775 if (From.getNode()->getNumValues() == 1) {
12776 ReplaceAllUsesWith(From, To);
12777 return;
12778 }
12779
12780 // Preserve Debug Info.
12781 transferDbgValues(From, To);
12782 copyExtraInfo(From.getNode(), To.getNode());
12783
12784 // Iterate over just the existing users of From. See the comments in
12785 // the ReplaceAllUsesWith above.
12786 SDNode::use_iterator UI = From.getNode()->use_begin(),
12787 UE = From.getNode()->use_end();
12788 RAUWUpdateListener Listener(*this, UI, UE);
12789 while (UI != UE) {
12790 SDNode *User = UI->getUser();
12791 bool UserRemovedFromCSEMaps = false;
12792
12793 // A user can appear in a use list multiple times, and when this
12794 // happens the uses are usually next to each other in the list.
12795 // To help reduce the number of CSE recomputations, process all
12796 // the uses of this user that we can find this way.
12797 do {
12798 SDUse &Use = *UI;
12799
12800 // Skip uses of different values from the same node.
12801 if (Use.getResNo() != From.getResNo()) {
12802 ++UI;
12803 continue;
12804 }
12805
12806 // If this node hasn't been modified yet, it's still in the CSE maps,
12807 // so remove its old self from the CSE maps.
12808 if (!UserRemovedFromCSEMaps) {
12809 RemoveNodeFromCSEMaps(User);
12810 UserRemovedFromCSEMaps = true;
12811 }
12812
12813 ++UI;
12814 Use.set(To);
12815 if (To->isDivergent() != From->isDivergent())
12817 } while (UI != UE && UI->getUser() == User);
12818 // We are iterating over all uses of the From node, so if a use
12819 // doesn't use the specific value, no changes are made.
12820 if (!UserRemovedFromCSEMaps)
12821 continue;
12822
12823 // Now that we have modified User, add it back to the CSE maps. If it
12824 // already exists there, recursively merge the results together.
12825 AddModifiedNodeToCSEMaps(User);
12826 }
12827
12828 // If we just RAUW'd the root, take note.
12829 if (From == getRoot())
12830 setRoot(To);
12831}
12832
12833namespace {
12834
12835/// UseMemo - This class is used by SelectionDAG::ReplaceAllUsesOfValuesWith
12836/// to record information about a use.
12837struct UseMemo {
12838 SDNode *User;
12839 unsigned Index;
12840 SDUse *Use;
12841};
12842
12843/// operator< - Sort Memos by User.
12844bool operator<(const UseMemo &L, const UseMemo &R) {
12845 return (intptr_t)L.User < (intptr_t)R.User;
12846}
12847
12848/// RAUOVWUpdateListener - Helper for ReplaceAllUsesOfValuesWith - When the node
12849/// pointed to by a UseMemo is deleted, set the User to nullptr to indicate that
12850/// the node already has been taken care of recursively.
12851class RAUOVWUpdateListener : public SelectionDAG::DAGUpdateListener {
12852 SmallVectorImpl<UseMemo> &Uses;
12853
12854 void NodeDeleted(SDNode *N, SDNode *E) override {
12855 for (UseMemo &Memo : Uses)
12856 if (Memo.User == N)
12857 Memo.User = nullptr;
12858 }
12859
12860public:
12861 RAUOVWUpdateListener(SelectionDAG &d, SmallVectorImpl<UseMemo> &uses)
12862 : SelectionDAG::DAGUpdateListener(d), Uses(uses) {}
12863};
12864
12865} // end anonymous namespace
12866
12867/// Return true if a glue output should propagate divergence information.
12869 switch (Node->getOpcode()) {
12870 case ISD::CopyFromReg:
12871 case ISD::CopyToReg:
12872 return false;
12873 default:
12874 return true;
12875 }
12876
12877 llvm_unreachable("covered opcode switch");
12878}
12879
12881 if (TLI->isSDNodeAlwaysUniform(N)) {
12882 assert(!TLI->isSDNodeSourceOfDivergence(N, FLI, UA) &&
12883 "Conflicting divergence information!");
12884 return false;
12885 }
12886 if (TLI->isSDNodeSourceOfDivergence(N, FLI, UA))
12887 return true;
12888 for (const auto &Op : N->ops()) {
12889 EVT VT = Op.getValueType();
12890
12891 // Skip Chain. It does not carry divergence.
12892 if (VT != MVT::Other && Op.getNode()->isDivergent() &&
12893 (VT != MVT::Glue || gluePropagatesDivergence(Op.getNode())))
12894 return true;
12895 }
12896 return false;
12897}
12898
12900 SmallVector<SDNode *, 16> Worklist(1, N);
12901 do {
12902 N = Worklist.pop_back_val();
12903 bool IsDivergent = calculateDivergence(N);
12904 if (N->SDNodeBits.IsDivergent != IsDivergent) {
12905 N->SDNodeBits.IsDivergent = IsDivergent;
12906 llvm::append_range(Worklist, N->users());
12907 }
12908 } while (!Worklist.empty());
12909}
12910
12911void SelectionDAG::CreateTopologicalOrder(std::vector<SDNode *> &Order) {
12913 Order.reserve(AllNodes.size());
12914 for (auto &N : allnodes()) {
12915 unsigned NOps = N.getNumOperands();
12916 Degree[&N] = NOps;
12917 if (0 == NOps)
12918 Order.push_back(&N);
12919 }
12920 for (size_t I = 0; I != Order.size(); ++I) {
12921 SDNode *N = Order[I];
12922 for (auto *U : N->users()) {
12923 unsigned &UnsortedOps = Degree[U];
12924 if (0 == --UnsortedOps)
12925 Order.push_back(U);
12926 }
12927 }
12928}
12929
12930#if !defined(NDEBUG) && LLVM_ENABLE_ABI_BREAKING_CHECKS
12931void SelectionDAG::VerifyDAGDivergence() {
12932 std::vector<SDNode *> TopoOrder;
12933 CreateTopologicalOrder(TopoOrder);
12934 for (auto *N : TopoOrder) {
12935 assert(calculateDivergence(N) == N->isDivergent() &&
12936 "Divergence bit inconsistency detected");
12937 }
12938}
12939#endif
12940
12941/// ReplaceAllUsesOfValuesWith - Replace any uses of From with To, leaving
12942/// uses of other values produced by From.getNode() alone. The same value
12943/// may appear in both the From and To list. The Deleted vector is
12944/// handled the same way as for ReplaceAllUsesWith.
12946 const SDValue *To,
12947 unsigned Num){
12948 // Handle the simple, trivial case efficiently.
12949 if (Num == 1)
12950 return ReplaceAllUsesOfValueWith(*From, *To);
12951
12952 transferDbgValues(*From, *To);
12953 copyExtraInfo(From->getNode(), To->getNode());
12954
12955 // Read up all the uses and make records of them. This helps
12956 // processing new uses that are introduced during the
12957 // replacement process.
12959 for (unsigned i = 0; i != Num; ++i) {
12960 unsigned FromResNo = From[i].getResNo();
12961 SDNode *FromNode = From[i].getNode();
12962 for (SDUse &Use : FromNode->uses()) {
12963 if (Use.getResNo() == FromResNo) {
12964 UseMemo Memo = {Use.getUser(), i, &Use};
12965 Uses.push_back(Memo);
12966 }
12967 }
12968 }
12969
12970 // Sort the uses, so that all the uses from a given User are together.
12972 RAUOVWUpdateListener Listener(*this, Uses);
12973
12974 for (unsigned UseIndex = 0, UseIndexEnd = Uses.size();
12975 UseIndex != UseIndexEnd; ) {
12976 // We know that this user uses some value of From. If it is the right
12977 // value, update it.
12978 SDNode *User = Uses[UseIndex].User;
12979 // If the node has been deleted by recursive CSE updates when updating
12980 // another node, then just skip this entry.
12981 if (User == nullptr) {
12982 ++UseIndex;
12983 continue;
12984 }
12985
12986 // This node is about to morph, remove its old self from the CSE maps.
12987 RemoveNodeFromCSEMaps(User);
12988
12989 // The Uses array is sorted, so all the uses for a given User
12990 // are next to each other in the list.
12991 // To help reduce the number of CSE recomputations, process all
12992 // the uses of this user that we can find this way.
12993 do {
12994 unsigned i = Uses[UseIndex].Index;
12995 SDUse &Use = *Uses[UseIndex].Use;
12996 ++UseIndex;
12997
12998 Use.set(To[i]);
12999 } while (UseIndex != UseIndexEnd && Uses[UseIndex].User == User);
13000
13001 // Now that we have modified User, add it back to the CSE maps. If it
13002 // already exists there, recursively merge the results together.
13003 AddModifiedNodeToCSEMaps(User);
13004 }
13005}
13006
13007/// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
13008/// based on their topological order. It returns the maximum id and a vector
13009/// of the SDNodes* in assigned order by reference.
13011 unsigned DAGSize = 0;
13012
13013 // SortedPos tracks the progress of the algorithm. Nodes before it are
13014 // sorted, nodes after it are unsorted. When the algorithm completes
13015 // it is at the end of the list.
13016 allnodes_iterator SortedPos = allnodes_begin();
13017
13018 // Visit all the nodes. Move nodes with no operands to the front of
13019 // the list immediately. Annotate nodes that do have operands with their
13020 // operand count. Before we do this, the Node Id fields of the nodes
13021 // may contain arbitrary values. After, the Node Id fields for nodes
13022 // before SortedPos will contain the topological sort index, and the
13023 // Node Id fields for nodes At SortedPos and after will contain the
13024 // count of outstanding operands.
13026 checkForCycles(&N, this);
13027 unsigned Degree = N.getNumOperands();
13028 if (Degree == 0) {
13029 // A node with no uses, add it to the result array immediately.
13030 N.setNodeId(DAGSize++);
13031 allnodes_iterator Q(&N);
13032 if (Q != SortedPos)
13033 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(Q));
13034 assert(SortedPos != AllNodes.end() && "Overran node list");
13035 ++SortedPos;
13036 } else {
13037 // Temporarily use the Node Id as scratch space for the degree count.
13038 N.setNodeId(Degree);
13039 }
13040 }
13041
13042 // Visit all the nodes. As we iterate, move nodes into sorted order,
13043 // such that by the time the end is reached all nodes will be sorted.
13044 for (SDNode &Node : allnodes()) {
13045 SDNode *N = &Node;
13046 checkForCycles(N, this);
13047 // N is in sorted position, so all its uses have one less operand
13048 // that needs to be sorted.
13049 for (SDNode *P : N->users()) {
13050 unsigned Degree = P->getNodeId();
13051 assert(Degree != 0 && "Invalid node degree");
13052 --Degree;
13053 if (Degree == 0) {
13054 // All of P's operands are sorted, so P may sorted now.
13055 P->setNodeId(DAGSize++);
13056 if (P->getIterator() != SortedPos)
13057 SortedPos = AllNodes.insert(SortedPos, AllNodes.remove(P));
13058 assert(SortedPos != AllNodes.end() && "Overran node list");
13059 ++SortedPos;
13060 } else {
13061 // Update P's outstanding operand count.
13062 P->setNodeId(Degree);
13063 }
13064 }
13065 if (Node.getIterator() == SortedPos) {
13066#ifndef NDEBUG
13068 SDNode *S = &*++I;
13069 dbgs() << "Overran sorted position:\n";
13070 S->dumprFull(this); dbgs() << "\n";
13071 dbgs() << "Checking if this is due to cycles\n";
13072 checkForCycles(this, true);
13073#endif
13074 llvm_unreachable(nullptr);
13075 }
13076 }
13077
13078 assert(SortedPos == AllNodes.end() &&
13079 "Topological sort incomplete!");
13080 assert(AllNodes.front().getOpcode() == ISD::EntryToken &&
13081 "First node in topological sort is not the entry token!");
13082 assert(AllNodes.front().getNodeId() == 0 &&
13083 "First node in topological sort has non-zero id!");
13084 assert(AllNodes.front().getNumOperands() == 0 &&
13085 "First node in topological sort has operands!");
13086 assert(AllNodes.back().getNodeId() == (int)DAGSize-1 &&
13087 "Last node in topologic sort has unexpected id!");
13088 assert(AllNodes.back().use_empty() &&
13089 "Last node in topologic sort has users!");
13090 assert(DAGSize == allnodes_size() && "Node count mismatch!");
13091 return DAGSize;
13092}
13093
13095 SmallVectorImpl<const SDNode *> &SortedNodes) const {
13096 SortedNodes.clear();
13097 // Node -> remaining number of outstanding operands.
13098 DenseMap<const SDNode *, unsigned> RemainingOperands;
13099
13100 // Put nodes without any operands into SortedNodes first.
13101 for (const SDNode &N : allnodes()) {
13102 checkForCycles(&N, this);
13103 unsigned NumOperands = N.getNumOperands();
13104 if (NumOperands == 0)
13105 SortedNodes.push_back(&N);
13106 else
13107 // Record their total number of outstanding operands.
13108 RemainingOperands[&N] = NumOperands;
13109 }
13110
13111 // A node is pushed into SortedNodes when all of its operands (predecessors in
13112 // the graph) are also in SortedNodes.
13113 for (unsigned i = 0U; i < SortedNodes.size(); ++i) {
13114 const SDNode *N = SortedNodes[i];
13115 for (const SDNode *U : N->users()) {
13116 // HandleSDNode is never part of a DAG and therefore has no entry in
13117 // RemainingOperands.
13118 if (U->getOpcode() == ISD::HANDLENODE)
13119 continue;
13120 unsigned &NumRemOperands = RemainingOperands[U];
13121 assert(NumRemOperands && "Invalid number of remaining operands");
13122 --NumRemOperands;
13123 if (!NumRemOperands)
13124 SortedNodes.push_back(U);
13125 }
13126 }
13127
13128 assert(SortedNodes.size() == AllNodes.size() && "Node count mismatch");
13129 assert(SortedNodes.front()->getOpcode() == ISD::EntryToken &&
13130 "First node in topological sort is not the entry token");
13131 assert(SortedNodes.front()->getNumOperands() == 0 &&
13132 "First node in topological sort has operands");
13133}
13134
13135/// AddDbgValue - Add a dbg_value SDNode. If SD is non-null that means the
13136/// value is produced by SD.
13137void SelectionDAG::AddDbgValue(SDDbgValue *DB, bool isParameter) {
13138 for (SDNode *SD : DB->getSDNodes()) {
13139 if (!SD)
13140 continue;
13141 assert(DbgInfo->getSDDbgValues(SD).empty() || SD->getHasDebugValue());
13142 SD->setHasDebugValue(true);
13143 }
13144 DbgInfo->add(DB, isParameter);
13145}
13146
13147void SelectionDAG::AddDbgLabel(SDDbgLabel *DB) { DbgInfo->add(DB); }
13148
13150 SDValue NewMemOpChain) {
13151 assert(isa<MemSDNode>(NewMemOpChain) && "Expected a memop node");
13152 assert(NewMemOpChain.getValueType() == MVT::Other && "Expected a token VT");
13153 // The new memory operation must have the same position as the old load in
13154 // terms of memory dependency. Create a TokenFactor for the old load and new
13155 // memory operation and update uses of the old load's output chain to use that
13156 // TokenFactor.
13157 if (OldChain == NewMemOpChain || OldChain.use_empty())
13158 return NewMemOpChain;
13159
13160 SDValue TokenFactor = getNode(ISD::TokenFactor, SDLoc(OldChain), MVT::Other,
13161 OldChain, NewMemOpChain);
13162 ReplaceAllUsesOfValueWith(OldChain, TokenFactor);
13163 UpdateNodeOperands(TokenFactor.getNode(), OldChain, NewMemOpChain);
13164 return TokenFactor;
13165}
13166
13168 SDValue NewMemOp) {
13169 assert(isa<MemSDNode>(NewMemOp.getNode()) && "Expected a memop node");
13170 SDValue OldChain = SDValue(OldLoad, 1);
13171 SDValue NewMemOpChain = NewMemOp.getValue(1);
13172 return makeEquivalentMemoryOrdering(OldChain, NewMemOpChain);
13173}
13174
13176 Function **OutFunction) {
13177 assert(isa<ExternalSymbolSDNode>(Op) && "Node should be an ExternalSymbol");
13178
13179 auto *Symbol = cast<ExternalSymbolSDNode>(Op)->getSymbol();
13180 auto *Module = MF->getFunction().getParent();
13181 auto *Function = Module->getFunction(Symbol);
13182
13183 if (OutFunction != nullptr)
13184 *OutFunction = Function;
13185
13186 if (Function != nullptr) {
13187 auto PtrTy = TLI->getPointerTy(getDataLayout(), Function->getAddressSpace());
13188 return getGlobalAddress(Function, SDLoc(Op), PtrTy);
13189 }
13190
13191 std::string ErrorStr;
13192 raw_string_ostream ErrorFormatter(ErrorStr);
13193 ErrorFormatter << "Undefined external symbol ";
13194 ErrorFormatter << '"' << Symbol << '"';
13195 report_fatal_error(Twine(ErrorStr));
13196}
13197
13198//===----------------------------------------------------------------------===//
13199// SDNode Class
13200//===----------------------------------------------------------------------===//
13201
13204 return Const != nullptr && Const->isZero();
13205}
13206
13208 return V.isUndef() || isNullConstant(V);
13209}
13210
13213 return Const != nullptr && Const->isZero() && !Const->isNegative();
13214}
13215
13218 return Const != nullptr && Const->isAllOnes();
13219}
13220
13223 return Const != nullptr && Const->isOne();
13224}
13225
13228 return Const != nullptr && Const->isMinSignedValue();
13229}
13230
13231bool llvm::isNeutralConstant(unsigned Opcode, SDNodeFlags Flags, SDValue V,
13232 unsigned OperandNo) {
13233 // NOTE: The cases should match with IR's ConstantExpr::getBinOpIdentity().
13234 // TODO: Target-specific opcodes could be added.
13235 if (auto *ConstV = isConstOrConstSplat(V, /*AllowUndefs*/ false,
13236 /*AllowTruncation*/ true)) {
13237 APInt Const = ConstV->getAPIntValue().trunc(V.getScalarValueSizeInBits());
13238 switch (Opcode) {
13239 case ISD::ADD:
13240 case ISD::OR:
13241 case ISD::XOR:
13242 case ISD::UMAX:
13243 return Const.isZero();
13244 case ISD::MUL:
13245 return Const.isOne();
13246 case ISD::AND:
13247 case ISD::UMIN:
13248 return Const.isAllOnes();
13249 case ISD::SMAX:
13250 return Const.isMinSignedValue();
13251 case ISD::SMIN:
13252 return Const.isMaxSignedValue();
13253 case ISD::SUB:
13254 case ISD::SHL:
13255 case ISD::SRA:
13256 case ISD::SRL:
13257 return OperandNo == 1 && Const.isZero();
13258 case ISD::UDIV:
13259 case ISD::SDIV:
13260 return OperandNo == 1 && Const.isOne();
13261 }
13262 } else if (auto *ConstFP = isConstOrConstSplatFP(V)) {
13263 switch (Opcode) {
13264 case ISD::FADD:
13265 return ConstFP->isZero() &&
13266 (Flags.hasNoSignedZeros() || ConstFP->isNegative());
13267 case ISD::FSUB:
13268 return OperandNo == 1 && ConstFP->isZero() &&
13269 (Flags.hasNoSignedZeros() || !ConstFP->isNegative());
13270 case ISD::FMUL:
13271 return ConstFP->isExactlyValue(1.0);
13272 case ISD::FDIV:
13273 return OperandNo == 1 && ConstFP->isExactlyValue(1.0);
13274 case ISD::FMINNUM:
13275 case ISD::FMAXNUM: {
13276 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
13277 EVT VT = V.getValueType();
13278 const fltSemantics &Semantics = VT.getFltSemantics();
13279 APFloat NeutralAF = !Flags.hasNoNaNs()
13280 ? APFloat::getQNaN(Semantics)
13281 : !Flags.hasNoInfs()
13282 ? APFloat::getInf(Semantics)
13283 : APFloat::getLargest(Semantics);
13284 if (Opcode == ISD::FMAXNUM)
13285 NeutralAF.changeSign();
13286
13287 return ConstFP->isExactlyValue(NeutralAF);
13288 }
13289 }
13290 }
13291 return false;
13292}
13293
13295 while (V.getOpcode() == ISD::BITCAST)
13296 V = V.getOperand(0);
13297 return V;
13298}
13299
13301 while (V.getOpcode() == ISD::BITCAST && V.getOperand(0).hasOneUse())
13302 V = V.getOperand(0);
13303 return V;
13304}
13305
13307 while (V.getOpcode() == ISD::EXTRACT_SUBVECTOR)
13308 V = V.getOperand(0);
13309 return V;
13310}
13311
13313 while (V.getOpcode() == ISD::INSERT_VECTOR_ELT) {
13314 SDValue InVec = V.getOperand(0);
13315 SDValue EltNo = V.getOperand(2);
13316 EVT VT = InVec.getValueType();
13317 auto *IndexC = dyn_cast<ConstantSDNode>(EltNo);
13318 if (IndexC && VT.isFixedLengthVector() &&
13319 IndexC->getAPIntValue().ult(VT.getVectorNumElements()) &&
13320 !DemandedElts[IndexC->getZExtValue()]) {
13321 V = InVec;
13322 continue;
13323 }
13324 break;
13325 }
13326 return V;
13327}
13328
13330 while (V.getOpcode() == ISD::TRUNCATE)
13331 V = V.getOperand(0);
13332 return V;
13333}
13334
13335bool llvm::isBitwiseNot(SDValue V, bool AllowUndefs) {
13336 if (V.getOpcode() != ISD::XOR)
13337 return false;
13338 V = peekThroughBitcasts(V.getOperand(1));
13339 unsigned NumBits = V.getScalarValueSizeInBits();
13340 ConstantSDNode *C =
13341 isConstOrConstSplat(V, AllowUndefs, /*AllowTruncation*/ true);
13342 return C && (C->getAPIntValue().countr_one() >= NumBits);
13343}
13344
13346 bool AllowTruncation) {
13347 EVT VT = N.getValueType();
13348 APInt DemandedElts = VT.isFixedLengthVector()
13350 : APInt(1, 1);
13351 return isConstOrConstSplat(N, DemandedElts, AllowUndefs, AllowTruncation);
13352}
13353
13355 bool AllowUndefs,
13356 bool AllowTruncation) {
13358 return CN;
13359
13360 // SplatVectors can truncate their operands. Ignore that case here unless
13361 // AllowTruncation is set.
13362 if (N->getOpcode() == ISD::SPLAT_VECTOR) {
13363 EVT VecEltVT = N->getValueType(0).getVectorElementType();
13364 if (auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(0))) {
13365 EVT CVT = CN->getValueType(0);
13366 assert(CVT.bitsGE(VecEltVT) && "Illegal splat_vector element extension");
13367 if (AllowTruncation || CVT == VecEltVT)
13368 return CN;
13369 }
13370 }
13371
13373 BitVector UndefElements;
13374 ConstantSDNode *CN = BV->getConstantSplatNode(DemandedElts, &UndefElements);
13375
13376 // BuildVectors can truncate their operands. Ignore that case here unless
13377 // AllowTruncation is set.
13378 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13379 if (CN && (UndefElements.none() || AllowUndefs)) {
13380 EVT CVT = CN->getValueType(0);
13381 EVT NSVT = N.getValueType().getScalarType();
13382 assert(CVT.bitsGE(NSVT) && "Illegal build vector element extension");
13383 if (AllowTruncation || (CVT == NSVT))
13384 return CN;
13385 }
13386 }
13387
13388 return nullptr;
13389}
13390
13392 EVT VT = N.getValueType();
13393 APInt DemandedElts = VT.isFixedLengthVector()
13395 : APInt(1, 1);
13396 return isConstOrConstSplatFP(N, DemandedElts, AllowUndefs);
13397}
13398
13400 const APInt &DemandedElts,
13401 bool AllowUndefs) {
13403 return CN;
13404
13406 BitVector UndefElements;
13407 ConstantFPSDNode *CN =
13408 BV->getConstantFPSplatNode(DemandedElts, &UndefElements);
13409 // TODO: Look into whether we should allow UndefElements in non-DemandedElts
13410 if (CN && (UndefElements.none() || AllowUndefs))
13411 return CN;
13412 }
13413
13414 if (N.getOpcode() == ISD::SPLAT_VECTOR)
13415 if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N.getOperand(0)))
13416 return CN;
13417
13418 return nullptr;
13419}
13420
13421bool llvm::isNullOrNullSplat(SDValue N, bool AllowUndefs) {
13422 // TODO: may want to use peekThroughBitcast() here.
13423 ConstantSDNode *C =
13424 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation=*/true);
13425 return C && C->isZero();
13426}
13427
13428bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) {
13429 ConstantSDNode *C =
13430 isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true);
13431 return C && C->isOne();
13432}
13433
13434bool llvm::isOneOrOneSplatFP(SDValue N, bool AllowUndefs) {
13435 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13436 return C && C->isExactlyValue(1.0);
13437}
13438
13439bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) {
13441 unsigned BitWidth = N.getScalarValueSizeInBits();
13442 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13443 return C && C->isAllOnes() && C->getValueSizeInBits(0) == BitWidth;
13444}
13445
13446bool llvm::isOnesOrOnesSplat(SDValue N, bool AllowUndefs) {
13447 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs);
13448 return C && APInt::isSameValue(C->getAPIntValue(),
13449 APInt(C->getAPIntValue().getBitWidth(), 1));
13450}
13451
13452bool llvm::isZeroOrZeroSplat(SDValue N, bool AllowUndefs) {
13454 ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs, true);
13455 return C && C->isZero();
13456}
13457
13458bool llvm::isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs) {
13459 ConstantFPSDNode *C = isConstOrConstSplatFP(N, AllowUndefs);
13460 return C && C->isZero();
13461}
13462
13466
13468 unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt,
13470 : SDNode(Opc, Order, dl, VTs), MemoryVT(memvt), MemRefs(memrefs) {
13471 bool IsVolatile = false;
13472 bool IsNonTemporal = false;
13473 bool IsDereferenceable = true;
13474 bool IsInvariant = true;
13475 for (const MachineMemOperand *MMO : memoperands()) {
13476 IsVolatile |= MMO->isVolatile();
13477 IsNonTemporal |= MMO->isNonTemporal();
13478 IsDereferenceable &= MMO->isDereferenceable();
13479 IsInvariant &= MMO->isInvariant();
13480 }
13481 MemSDNodeBits.IsVolatile = IsVolatile;
13482 MemSDNodeBits.IsNonTemporal = IsNonTemporal;
13483 MemSDNodeBits.IsDereferenceable = IsDereferenceable;
13484 MemSDNodeBits.IsInvariant = IsInvariant;
13485
13486 // For the single-MMO case, we check here that the size of the memory operand
13487 // fits within the size of the MMO. This is because the MMO might indicate
13488 // only a possible address range instead of specifying the affected memory
13489 // addresses precisely.
13492 getMemOperand()->getSize().getValue())) &&
13493 "Size mismatch!");
13494}
13495
13496/// Profile - Gather unique data for the node.
13497///
13499 AddNodeIDNode(ID, this);
13500}
13501
13502namespace {
13503
13504 struct EVTArray {
13505 std::vector<EVT> VTs;
13506
13507 EVTArray() {
13508 VTs.reserve(MVT::VALUETYPE_SIZE);
13509 for (unsigned i = 0; i < MVT::VALUETYPE_SIZE; ++i)
13510 VTs.push_back(MVT((MVT::SimpleValueType)i));
13511 }
13512 };
13513
13514} // end anonymous namespace
13515
13516/// getValueTypeList - Return a pointer to the specified value type.
13517///
13518const EVT *SDNode::getValueTypeList(MVT VT) {
13519 static EVTArray SimpleVTArray;
13520
13521 assert(VT < MVT::VALUETYPE_SIZE && "Value type out of range!");
13522 return &SimpleVTArray.VTs[VT.SimpleTy];
13523}
13524
13525/// hasAnyUseOfValue - Return true if there are any use of the indicated
13526/// value. This method ignores uses of other values defined by this operation.
13527bool SDNode::hasAnyUseOfValue(unsigned Value) const {
13528 assert(Value < getNumValues() && "Bad value!");
13529
13530 for (SDUse &U : uses())
13531 if (U.getResNo() == Value)
13532 return true;
13533
13534 return false;
13535}
13536
13537/// isOnlyUserOf - Return true if this node is the only use of N.
13538bool SDNode::isOnlyUserOf(const SDNode *N) const {
13539 bool Seen = false;
13540 for (const SDNode *User : N->users()) {
13541 if (User == this)
13542 Seen = true;
13543 else
13544 return false;
13545 }
13546
13547 return Seen;
13548}
13549
13550/// Return true if the only users of N are contained in Nodes.
13552 bool Seen = false;
13553 for (const SDNode *User : N->users()) {
13554 if (llvm::is_contained(Nodes, User))
13555 Seen = true;
13556 else
13557 return false;
13558 }
13559
13560 return Seen;
13561}
13562
13563/// Return true if the referenced return value is an operand of N.
13564bool SDValue::isOperandOf(const SDNode *N) const {
13565 return is_contained(N->op_values(), *this);
13566}
13567
13568bool SDNode::isOperandOf(const SDNode *N) const {
13569 return any_of(N->op_values(),
13570 [this](SDValue Op) { return this == Op.getNode(); });
13571}
13572
13573/// reachesChainWithoutSideEffects - Return true if this operand (which must
13574/// be a chain) reaches the specified operand without crossing any
13575/// side-effecting instructions on any chain path. In practice, this looks
13576/// through token factors and non-volatile loads. In order to remain efficient,
13577/// this only looks a couple of nodes in, it does not do an exhaustive search.
13578///
13579/// Note that we only need to examine chains when we're searching for
13580/// side-effects; SelectionDAG requires that all side-effects are represented
13581/// by chains, even if another operand would force a specific ordering. This
13582/// constraint is necessary to allow transformations like splitting loads.
13584 unsigned Depth) const {
13585 if (*this == Dest) return true;
13586
13587 // Don't search too deeply, we just want to be able to see through
13588 // TokenFactor's etc.
13589 if (Depth == 0) return false;
13590
13591 // If this is a token factor, all inputs to the TF happen in parallel.
13592 if (getOpcode() == ISD::TokenFactor) {
13593 // First, try a shallow search.
13594 if (is_contained((*this)->ops(), Dest)) {
13595 // We found the chain we want as an operand of this TokenFactor.
13596 // Essentially, we reach the chain without side-effects if we could
13597 // serialize the TokenFactor into a simple chain of operations with
13598 // Dest as the last operation. This is automatically true if the
13599 // chain has one use: there are no other ordering constraints.
13600 // If the chain has more than one use, we give up: some other
13601 // use of Dest might force a side-effect between Dest and the current
13602 // node.
13603 if (Dest.hasOneUse())
13604 return true;
13605 }
13606 // Next, try a deep search: check whether every operand of the TokenFactor
13607 // reaches Dest.
13608 return llvm::all_of((*this)->ops(), [=](SDValue Op) {
13609 return Op.reachesChainWithoutSideEffects(Dest, Depth - 1);
13610 });
13611 }
13612
13613 // Loads don't have side effects, look through them.
13614 if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
13615 if (Ld->isUnordered())
13616 return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
13617 }
13618 return false;
13619}
13620
13621bool SDNode::hasPredecessor(const SDNode *N) const {
13624 Worklist.push_back(this);
13625 return hasPredecessorHelper(N, Visited, Worklist);
13626}
13627
13629 this->Flags &= Flags;
13630}
13631
13632SDValue
13634 ArrayRef<ISD::NodeType> CandidateBinOps,
13635 bool AllowPartials) {
13636 // The pattern must end in an extract from index 0.
13637 if (Extract->getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
13638 !isNullConstant(Extract->getOperand(1)))
13639 return SDValue();
13640
13641 // Match against one of the candidate binary ops.
13642 SDValue Op = Extract->getOperand(0);
13643 if (llvm::none_of(CandidateBinOps, [Op](ISD::NodeType BinOp) {
13644 return Op.getOpcode() == unsigned(BinOp);
13645 }))
13646 return SDValue();
13647
13648 // Floating-point reductions may require relaxed constraints on the final step
13649 // of the reduction because they may reorder intermediate operations.
13650 unsigned CandidateBinOp = Op.getOpcode();
13651 if (Op.getValueType().isFloatingPoint()) {
13652 SDNodeFlags Flags = Op->getFlags();
13653 switch (CandidateBinOp) {
13654 case ISD::FADD:
13655 if (!Flags.hasNoSignedZeros() || !Flags.hasAllowReassociation())
13656 return SDValue();
13657 break;
13658 default:
13659 llvm_unreachable("Unhandled FP opcode for binop reduction");
13660 }
13661 }
13662
13663 // Matching failed - attempt to see if we did enough stages that a partial
13664 // reduction from a subvector is possible.
13665 auto PartialReduction = [&](SDValue Op, unsigned NumSubElts) {
13666 if (!AllowPartials || !Op)
13667 return SDValue();
13668 EVT OpVT = Op.getValueType();
13669 EVT OpSVT = OpVT.getScalarType();
13670 EVT SubVT = EVT::getVectorVT(*getContext(), OpSVT, NumSubElts);
13671 if (!TLI->isExtractSubvectorCheap(SubVT, OpVT, 0))
13672 return SDValue();
13673 BinOp = (ISD::NodeType)CandidateBinOp;
13674 return getExtractSubvector(SDLoc(Op), SubVT, Op, 0);
13675 };
13676
13677 // At each stage, we're looking for something that looks like:
13678 // %s = shufflevector <8 x i32> %op, <8 x i32> undef,
13679 // <8 x i32> <i32 2, i32 3, i32 undef, i32 undef,
13680 // i32 undef, i32 undef, i32 undef, i32 undef>
13681 // %a = binop <8 x i32> %op, %s
13682 // Where the mask changes according to the stage. E.g. for a 3-stage pyramid,
13683 // we expect something like:
13684 // <4,5,6,7,u,u,u,u>
13685 // <2,3,u,u,u,u,u,u>
13686 // <1,u,u,u,u,u,u,u>
13687 // While a partial reduction match would be:
13688 // <2,3,u,u,u,u,u,u>
13689 // <1,u,u,u,u,u,u,u>
13690 unsigned Stages = Log2_32(Op.getValueType().getVectorNumElements());
13691 SDValue PrevOp;
13692 for (unsigned i = 0; i < Stages; ++i) {
13693 unsigned MaskEnd = (1 << i);
13694
13695 if (Op.getOpcode() != CandidateBinOp)
13696 return PartialReduction(PrevOp, MaskEnd);
13697
13698 SDValue Op0 = Op.getOperand(0);
13699 SDValue Op1 = Op.getOperand(1);
13700
13702 if (Shuffle) {
13703 Op = Op1;
13704 } else {
13705 Shuffle = dyn_cast<ShuffleVectorSDNode>(Op1);
13706 Op = Op0;
13707 }
13708
13709 // The first operand of the shuffle should be the same as the other operand
13710 // of the binop.
13711 if (!Shuffle || Shuffle->getOperand(0) != Op)
13712 return PartialReduction(PrevOp, MaskEnd);
13713
13714 // Verify the shuffle has the expected (at this stage of the pyramid) mask.
13715 for (int Index = 0; Index < (int)MaskEnd; ++Index)
13716 if (Shuffle->getMaskElt(Index) != (int)(MaskEnd + Index))
13717 return PartialReduction(PrevOp, MaskEnd);
13718
13719 PrevOp = Op;
13720 }
13721
13722 // Handle subvector reductions, which tend to appear after the shuffle
13723 // reduction stages.
13724 while (Op.getOpcode() == CandidateBinOp) {
13725 unsigned NumElts = Op.getValueType().getVectorNumElements();
13726 SDValue Op0 = Op.getOperand(0);
13727 SDValue Op1 = Op.getOperand(1);
13728 if (Op0.getOpcode() != ISD::EXTRACT_SUBVECTOR ||
13730 Op0.getOperand(0) != Op1.getOperand(0))
13731 break;
13732 SDValue Src = Op0.getOperand(0);
13733 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
13734 if (NumSrcElts != (2 * NumElts))
13735 break;
13736 if (!(Op0.getConstantOperandAPInt(1) == 0 &&
13737 Op1.getConstantOperandAPInt(1) == NumElts) &&
13738 !(Op1.getConstantOperandAPInt(1) == 0 &&
13739 Op0.getConstantOperandAPInt(1) == NumElts))
13740 break;
13741 Op = Src;
13742 }
13743
13744 BinOp = (ISD::NodeType)CandidateBinOp;
13745 return Op;
13746}
13747
13749 EVT VT = N->getValueType(0);
13750 EVT EltVT = VT.getVectorElementType();
13751 unsigned NE = VT.getVectorNumElements();
13752
13753 SDLoc dl(N);
13754
13755 // If ResNE is 0, fully unroll the vector op.
13756 if (ResNE == 0)
13757 ResNE = NE;
13758 else if (NE > ResNE)
13759 NE = ResNE;
13760
13761 if (N->getNumValues() == 2) {
13762 SmallVector<SDValue, 8> Scalars0, Scalars1;
13763 SmallVector<SDValue, 4> Operands(N->getNumOperands());
13764 EVT VT1 = N->getValueType(1);
13765 EVT EltVT1 = VT1.getVectorElementType();
13766
13767 unsigned i;
13768 for (i = 0; i != NE; ++i) {
13769 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
13770 SDValue Operand = N->getOperand(j);
13771 EVT OperandVT = Operand.getValueType();
13772
13773 // A vector operand; extract a single element.
13774 EVT OperandEltVT = OperandVT.getVectorElementType();
13775 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
13776 }
13777
13778 SDValue EltOp = getNode(N->getOpcode(), dl, {EltVT, EltVT1}, Operands);
13779 Scalars0.push_back(EltOp);
13780 Scalars1.push_back(EltOp.getValue(1));
13781 }
13782
13783 for (; i < ResNE; ++i) {
13784 Scalars0.push_back(getUNDEF(EltVT));
13785 Scalars1.push_back(getUNDEF(EltVT1));
13786 }
13787
13788 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
13789 EVT VecVT1 = EVT::getVectorVT(*getContext(), EltVT1, ResNE);
13790 SDValue Vec0 = getBuildVector(VecVT, dl, Scalars0);
13791 SDValue Vec1 = getBuildVector(VecVT1, dl, Scalars1);
13792 return getMergeValues({Vec0, Vec1}, dl);
13793 }
13794
13795 assert(N->getNumValues() == 1 &&
13796 "Can't unroll a vector with multiple results!");
13797
13799 SmallVector<SDValue, 4> Operands(N->getNumOperands());
13800
13801 unsigned i;
13802 for (i= 0; i != NE; ++i) {
13803 for (unsigned j = 0, e = N->getNumOperands(); j != e; ++j) {
13804 SDValue Operand = N->getOperand(j);
13805 EVT OperandVT = Operand.getValueType();
13806 if (OperandVT.isVector()) {
13807 // A vector operand; extract a single element.
13808 EVT OperandEltVT = OperandVT.getVectorElementType();
13809 Operands[j] = getExtractVectorElt(dl, OperandEltVT, Operand, i);
13810 } else {
13811 // A scalar operand; just use it as is.
13812 Operands[j] = Operand;
13813 }
13814 }
13815
13816 switch (N->getOpcode()) {
13817 default: {
13818 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands,
13819 N->getFlags()));
13820 break;
13821 }
13822 case ISD::VSELECT:
13823 Scalars.push_back(getNode(ISD::SELECT, dl, EltVT, Operands));
13824 break;
13825 case ISD::SHL:
13826 case ISD::SRA:
13827 case ISD::SRL:
13828 case ISD::ROTL:
13829 case ISD::ROTR:
13830 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT, Operands[0],
13831 getShiftAmountOperand(Operands[0].getValueType(),
13832 Operands[1])));
13833 break;
13835 EVT ExtVT = cast<VTSDNode>(Operands[1])->getVT().getVectorElementType();
13836 Scalars.push_back(getNode(N->getOpcode(), dl, EltVT,
13837 Operands[0],
13838 getValueType(ExtVT)));
13839 break;
13840 }
13841 case ISD::ADDRSPACECAST: {
13842 const auto *ASC = cast<AddrSpaceCastSDNode>(N);
13843 Scalars.push_back(getAddrSpaceCast(dl, EltVT, Operands[0],
13844 ASC->getSrcAddressSpace(),
13845 ASC->getDestAddressSpace()));
13846 break;
13847 }
13848 }
13849 }
13850
13851 for (; i < ResNE; ++i)
13852 Scalars.push_back(getUNDEF(EltVT));
13853
13854 EVT VecVT = EVT::getVectorVT(*getContext(), EltVT, ResNE);
13855 return getBuildVector(VecVT, dl, Scalars);
13856}
13857
13858std::pair<SDValue, SDValue> SelectionDAG::UnrollVectorOverflowOp(
13859 SDNode *N, unsigned ResNE) {
13860 unsigned Opcode = N->getOpcode();
13861 assert((Opcode == ISD::UADDO || Opcode == ISD::SADDO ||
13862 Opcode == ISD::USUBO || Opcode == ISD::SSUBO ||
13863 Opcode == ISD::UMULO || Opcode == ISD::SMULO) &&
13864 "Expected an overflow opcode");
13865
13866 EVT ResVT = N->getValueType(0);
13867 EVT OvVT = N->getValueType(1);
13868 EVT ResEltVT = ResVT.getVectorElementType();
13869 EVT OvEltVT = OvVT.getVectorElementType();
13870 SDLoc dl(N);
13871
13872 // If ResNE is 0, fully unroll the vector op.
13873 unsigned NE = ResVT.getVectorNumElements();
13874 if (ResNE == 0)
13875 ResNE = NE;
13876 else if (NE > ResNE)
13877 NE = ResNE;
13878
13879 SmallVector<SDValue, 8> LHSScalars;
13880 SmallVector<SDValue, 8> RHSScalars;
13881 ExtractVectorElements(N->getOperand(0), LHSScalars, 0, NE);
13882 ExtractVectorElements(N->getOperand(1), RHSScalars, 0, NE);
13883
13884 EVT SVT = TLI->getSetCCResultType(getDataLayout(), *getContext(), ResEltVT);
13885 SDVTList VTs = getVTList(ResEltVT, SVT);
13886 SmallVector<SDValue, 8> ResScalars;
13887 SmallVector<SDValue, 8> OvScalars;
13888 for (unsigned i = 0; i < NE; ++i) {
13889 SDValue Res = getNode(Opcode, dl, VTs, LHSScalars[i], RHSScalars[i]);
13890 SDValue Ov =
13891 getSelect(dl, OvEltVT, Res.getValue(1),
13892 getBoolConstant(true, dl, OvEltVT, ResVT),
13893 getConstant(0, dl, OvEltVT));
13894
13895 ResScalars.push_back(Res);
13896 OvScalars.push_back(Ov);
13897 }
13898
13899 ResScalars.append(ResNE - NE, getUNDEF(ResEltVT));
13900 OvScalars.append(ResNE - NE, getUNDEF(OvEltVT));
13901
13902 EVT NewResVT = EVT::getVectorVT(*getContext(), ResEltVT, ResNE);
13903 EVT NewOvVT = EVT::getVectorVT(*getContext(), OvEltVT, ResNE);
13904 return std::make_pair(getBuildVector(NewResVT, dl, ResScalars),
13905 getBuildVector(NewOvVT, dl, OvScalars));
13906}
13907
13910 unsigned Bytes,
13911 int Dist) const {
13912 if (LD->isVolatile() || Base->isVolatile())
13913 return false;
13914 // TODO: probably too restrictive for atomics, revisit
13915 if (!LD->isSimple())
13916 return false;
13917 if (LD->isIndexed() || Base->isIndexed())
13918 return false;
13919 if (LD->getChain() != Base->getChain())
13920 return false;
13921 EVT VT = LD->getMemoryVT();
13922 if (VT.getSizeInBits() / 8 != Bytes)
13923 return false;
13924
13925 auto BaseLocDecomp = BaseIndexOffset::match(Base, *this);
13926 auto LocDecomp = BaseIndexOffset::match(LD, *this);
13927
13928 int64_t Offset = 0;
13929 if (BaseLocDecomp.equalBaseIndex(LocDecomp, *this, Offset))
13930 return (Dist * (int64_t)Bytes == Offset);
13931 return false;
13932}
13933
13934/// InferPtrAlignment - Infer alignment of a load / store address. Return
13935/// std::nullopt if it cannot be inferred.
13937 // If this is a GlobalAddress + cst, return the alignment.
13938 const GlobalValue *GV = nullptr;
13939 int64_t GVOffset = 0;
13940 if (TLI->isGAPlusOffset(Ptr.getNode(), GV, GVOffset)) {
13941 unsigned PtrWidth = getDataLayout().getPointerTypeSizeInBits(GV->getType());
13942 KnownBits Known(PtrWidth);
13944 unsigned AlignBits = Known.countMinTrailingZeros();
13945 if (AlignBits)
13946 return commonAlignment(Align(1ull << std::min(31U, AlignBits)), GVOffset);
13947 }
13948
13949 // If this is a direct reference to a stack slot, use information about the
13950 // stack slot's alignment.
13951 int FrameIdx = INT_MIN;
13952 int64_t FrameOffset = 0;
13954 FrameIdx = FI->getIndex();
13955 } else if (isBaseWithConstantOffset(Ptr) &&
13957 // Handle FI+Cst
13958 FrameIdx = cast<FrameIndexSDNode>(Ptr.getOperand(0))->getIndex();
13959 FrameOffset = Ptr.getConstantOperandVal(1);
13960 }
13961
13962 if (FrameIdx != INT_MIN) {
13964 return commonAlignment(MFI.getObjectAlign(FrameIdx), FrameOffset);
13965 }
13966
13967 return std::nullopt;
13968}
13969
13970/// Split the scalar node with EXTRACT_ELEMENT using the provided
13971/// VTs and return the low/high part.
13972std::pair<SDValue, SDValue> SelectionDAG::SplitScalar(const SDValue &N,
13973 const SDLoc &DL,
13974 const EVT &LoVT,
13975 const EVT &HiVT) {
13976 assert(!LoVT.isVector() && !HiVT.isVector() && !N.getValueType().isVector() &&
13977 "Split node must be a scalar type");
13978 SDValue Lo =
13980 SDValue Hi =
13982 return std::make_pair(Lo, Hi);
13983}
13984
13985/// GetSplitDestVTs - Compute the VTs needed for the low/hi parts of a type
13986/// which is split (or expanded) into two not necessarily identical pieces.
13987std::pair<EVT, EVT> SelectionDAG::GetSplitDestVTs(const EVT &VT) const {
13988 // Currently all types are split in half.
13989 EVT LoVT, HiVT;
13990 if (!VT.isVector())
13991 LoVT = HiVT = TLI->getTypeToTransformTo(*getContext(), VT);
13992 else
13993 LoVT = HiVT = VT.getHalfNumVectorElementsVT(*getContext());
13994
13995 return std::make_pair(LoVT, HiVT);
13996}
13997
13998/// GetDependentSplitDestVTs - Compute the VTs needed for the low/hi parts of a
13999/// type, dependent on an enveloping VT that has been split into two identical
14000/// pieces. Sets the HiIsEmpty flag when hi type has zero storage size.
14001std::pair<EVT, EVT>
14003 bool *HiIsEmpty) const {
14004 EVT EltTp = VT.getVectorElementType();
14005 // Examples:
14006 // custom VL=8 with enveloping VL=8/8 yields 8/0 (hi empty)
14007 // custom VL=9 with enveloping VL=8/8 yields 8/1
14008 // custom VL=10 with enveloping VL=8/8 yields 8/2
14009 // etc.
14010 ElementCount VTNumElts = VT.getVectorElementCount();
14011 ElementCount EnvNumElts = EnvVT.getVectorElementCount();
14012 assert(VTNumElts.isScalable() == EnvNumElts.isScalable() &&
14013 "Mixing fixed width and scalable vectors when enveloping a type");
14014 EVT LoVT, HiVT;
14015 if (VTNumElts.getKnownMinValue() > EnvNumElts.getKnownMinValue()) {
14016 LoVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14017 HiVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts - EnvNumElts);
14018 *HiIsEmpty = false;
14019 } else {
14020 // Flag that hi type has zero storage size, but return split envelop type
14021 // (this would be easier if vector types with zero elements were allowed).
14022 LoVT = EVT::getVectorVT(*getContext(), EltTp, VTNumElts);
14023 HiVT = EVT::getVectorVT(*getContext(), EltTp, EnvNumElts);
14024 *HiIsEmpty = true;
14025 }
14026 return std::make_pair(LoVT, HiVT);
14027}
14028
14029/// SplitVector - Split the vector with EXTRACT_SUBVECTOR and return the
14030/// low/high part.
14031std::pair<SDValue, SDValue>
14032SelectionDAG::SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT,
14033 const EVT &HiVT) {
14034 assert(LoVT.isScalableVector() == HiVT.isScalableVector() &&
14035 LoVT.isScalableVector() == N.getValueType().isScalableVector() &&
14036 "Splitting vector with an invalid mixture of fixed and scalable "
14037 "vector types");
14039 N.getValueType().getVectorMinNumElements() &&
14040 "More vector elements requested than available!");
14041 SDValue Lo, Hi;
14042 Lo = getExtractSubvector(DL, LoVT, N, 0);
14043 // For scalable vectors it is safe to use LoVT.getVectorMinNumElements()
14044 // (rather than having to use ElementCount), because EXTRACT_SUBVECTOR scales
14045 // IDX with the runtime scaling factor of the result vector type. For
14046 // fixed-width result vectors, that runtime scaling factor is 1.
14049 return std::make_pair(Lo, Hi);
14050}
14051
14052std::pair<SDValue, SDValue> SelectionDAG::SplitEVL(SDValue N, EVT VecVT,
14053 const SDLoc &DL) {
14054 // Split the vector length parameter.
14055 // %evl -> umin(%evl, %halfnumelts) and usubsat(%evl - %halfnumelts).
14056 EVT VT = N.getValueType();
14058 "Expecting the mask to be an evenly-sized vector");
14059 SDValue HalfNumElts = getElementCount(
14061 SDValue Lo = getNode(ISD::UMIN, DL, VT, N, HalfNumElts);
14062 SDValue Hi = getNode(ISD::USUBSAT, DL, VT, N, HalfNumElts);
14063 return std::make_pair(Lo, Hi);
14064}
14065
14066/// Widen the vector up to the next power of two using INSERT_SUBVECTOR.
14068 EVT VT = N.getValueType();
14071 return getInsertSubvector(DL, getUNDEF(WideVT), N, 0);
14072}
14073
14076 unsigned Start, unsigned Count,
14077 EVT EltVT) {
14078 EVT VT = Op.getValueType();
14079 if (Count == 0)
14081 if (EltVT == EVT())
14082 EltVT = VT.getVectorElementType();
14083 SDLoc SL(Op);
14084 for (unsigned i = Start, e = Start + Count; i != e; ++i) {
14085 Args.push_back(getExtractVectorElt(SL, EltVT, Op, i));
14086 }
14087}
14088
14089// getAddressSpace - Return the address space this GlobalAddress belongs to.
14091 return getGlobal()->getType()->getAddressSpace();
14092}
14093
14096 return Val.MachineCPVal->getType();
14097 return Val.ConstVal->getType();
14098}
14099
14100bool BuildVectorSDNode::isConstantSplat(APInt &SplatValue, APInt &SplatUndef,
14101 unsigned &SplatBitSize,
14102 bool &HasAnyUndefs,
14103 unsigned MinSplatBits,
14104 bool IsBigEndian) const {
14105 EVT VT = getValueType(0);
14106 assert(VT.isVector() && "Expected a vector type");
14107 unsigned VecWidth = VT.getSizeInBits();
14108 if (MinSplatBits > VecWidth)
14109 return false;
14110
14111 // FIXME: The widths are based on this node's type, but build vectors can
14112 // truncate their operands.
14113 SplatValue = APInt(VecWidth, 0);
14114 SplatUndef = APInt(VecWidth, 0);
14115
14116 // Get the bits. Bits with undefined values (when the corresponding element
14117 // of the vector is an ISD::UNDEF value) are set in SplatUndef and cleared
14118 // in SplatValue. If any of the values are not constant, give up and return
14119 // false.
14120 unsigned int NumOps = getNumOperands();
14121 assert(NumOps > 0 && "isConstantSplat has 0-size build vector");
14122 unsigned EltWidth = VT.getScalarSizeInBits();
14123
14124 for (unsigned j = 0; j < NumOps; ++j) {
14125 unsigned i = IsBigEndian ? NumOps - 1 - j : j;
14126 SDValue OpVal = getOperand(i);
14127 unsigned BitPos = j * EltWidth;
14128
14129 if (OpVal.isUndef())
14130 SplatUndef.setBits(BitPos, BitPos + EltWidth);
14131 else if (auto *CN = dyn_cast<ConstantSDNode>(OpVal))
14132 SplatValue.insertBits(CN->getAPIntValue().zextOrTrunc(EltWidth), BitPos);
14133 else if (auto *CN = dyn_cast<ConstantFPSDNode>(OpVal))
14134 SplatValue.insertBits(CN->getValueAPF().bitcastToAPInt(), BitPos);
14135 else
14136 return false;
14137 }
14138
14139 // The build_vector is all constants or undefs. Find the smallest element
14140 // size that splats the vector.
14141 HasAnyUndefs = (SplatUndef != 0);
14142
14143 // FIXME: This does not work for vectors with elements less than 8 bits.
14144 while (VecWidth > 8) {
14145 // If we can't split in half, stop here.
14146 if (VecWidth & 1)
14147 break;
14148
14149 unsigned HalfSize = VecWidth / 2;
14150 APInt HighValue = SplatValue.extractBits(HalfSize, HalfSize);
14151 APInt LowValue = SplatValue.extractBits(HalfSize, 0);
14152 APInt HighUndef = SplatUndef.extractBits(HalfSize, HalfSize);
14153 APInt LowUndef = SplatUndef.extractBits(HalfSize, 0);
14154
14155 // If the two halves do not match (ignoring undef bits), stop here.
14156 if ((HighValue & ~LowUndef) != (LowValue & ~HighUndef) ||
14157 MinSplatBits > HalfSize)
14158 break;
14159
14160 SplatValue = HighValue | LowValue;
14161 SplatUndef = HighUndef & LowUndef;
14162
14163 VecWidth = HalfSize;
14164 }
14165
14166 // FIXME: The loop above only tries to split in halves. But if the input
14167 // vector for example is <3 x i16> it wouldn't be able to detect a
14168 // SplatBitSize of 16. No idea if that is a design flaw currently limiting
14169 // optimizations. I guess that back in the days when this helper was created
14170 // vectors normally was power-of-2 sized.
14171
14172 SplatBitSize = VecWidth;
14173 return true;
14174}
14175
14177 BitVector *UndefElements) const {
14178 unsigned NumOps = getNumOperands();
14179 if (UndefElements) {
14180 UndefElements->clear();
14181 UndefElements->resize(NumOps);
14182 }
14183 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14184 if (!DemandedElts)
14185 return SDValue();
14186 SDValue Splatted;
14187 for (unsigned i = 0; i != NumOps; ++i) {
14188 if (!DemandedElts[i])
14189 continue;
14190 SDValue Op = getOperand(i);
14191 if (Op.isUndef()) {
14192 if (UndefElements)
14193 (*UndefElements)[i] = true;
14194 } else if (!Splatted) {
14195 Splatted = Op;
14196 } else if (Splatted != Op) {
14197 return SDValue();
14198 }
14199 }
14200
14201 if (!Splatted) {
14202 unsigned FirstDemandedIdx = DemandedElts.countr_zero();
14203 assert(getOperand(FirstDemandedIdx).isUndef() &&
14204 "Can only have a splat without a constant for all undefs.");
14205 return getOperand(FirstDemandedIdx);
14206 }
14207
14208 return Splatted;
14209}
14210
14212 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14213 return getSplatValue(DemandedElts, UndefElements);
14214}
14215
14217 SmallVectorImpl<SDValue> &Sequence,
14218 BitVector *UndefElements) const {
14219 unsigned NumOps = getNumOperands();
14220 Sequence.clear();
14221 if (UndefElements) {
14222 UndefElements->clear();
14223 UndefElements->resize(NumOps);
14224 }
14225 assert(NumOps == DemandedElts.getBitWidth() && "Unexpected vector size");
14226 if (!DemandedElts || NumOps < 2 || !isPowerOf2_32(NumOps))
14227 return false;
14228
14229 // Set the undefs even if we don't find a sequence (like getSplatValue).
14230 if (UndefElements)
14231 for (unsigned I = 0; I != NumOps; ++I)
14232 if (DemandedElts[I] && getOperand(I).isUndef())
14233 (*UndefElements)[I] = true;
14234
14235 // Iteratively widen the sequence length looking for repetitions.
14236 for (unsigned SeqLen = 1; SeqLen < NumOps; SeqLen *= 2) {
14237 Sequence.append(SeqLen, SDValue());
14238 for (unsigned I = 0; I != NumOps; ++I) {
14239 if (!DemandedElts[I])
14240 continue;
14241 SDValue &SeqOp = Sequence[I % SeqLen];
14243 if (Op.isUndef()) {
14244 if (!SeqOp)
14245 SeqOp = Op;
14246 continue;
14247 }
14248 if (SeqOp && !SeqOp.isUndef() && SeqOp != Op) {
14249 Sequence.clear();
14250 break;
14251 }
14252 SeqOp = Op;
14253 }
14254 if (!Sequence.empty())
14255 return true;
14256 }
14257
14258 assert(Sequence.empty() && "Failed to empty non-repeating sequence pattern");
14259 return false;
14260}
14261
14263 BitVector *UndefElements) const {
14264 APInt DemandedElts = APInt::getAllOnes(getNumOperands());
14265 return getRepeatedSequence(DemandedElts, Sequence, UndefElements);
14266}
14267
14270 BitVector *UndefElements) const {
14272 getSplatValue(DemandedElts, UndefElements));
14273}
14274
14277 return dyn_cast_or_null<ConstantSDNode>(getSplatValue(UndefElements));
14278}
14279
14282 BitVector *UndefElements) const {
14284 getSplatValue(DemandedElts, UndefElements));
14285}
14286
14291
14292int32_t
14294 uint32_t BitWidth) const {
14295 if (ConstantFPSDNode *CN =
14297 bool IsExact;
14298 APSInt IntVal(BitWidth);
14299 const APFloat &APF = CN->getValueAPF();
14300 if (APF.convertToInteger(IntVal, APFloat::rmTowardZero, &IsExact) !=
14301 APFloat::opOK ||
14302 !IsExact)
14303 return -1;
14304
14305 return IntVal.exactLogBase2();
14306 }
14307 return -1;
14308}
14309
14311 bool IsLittleEndian, unsigned DstEltSizeInBits,
14312 SmallVectorImpl<APInt> &RawBitElements, BitVector &UndefElements) const {
14313 // Early-out if this contains anything but Undef/Constant/ConstantFP.
14314 if (!isConstant())
14315 return false;
14316
14317 unsigned NumSrcOps = getNumOperands();
14318 unsigned SrcEltSizeInBits = getValueType(0).getScalarSizeInBits();
14319 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14320 "Invalid bitcast scale");
14321
14322 // Extract raw src bits.
14323 SmallVector<APInt> SrcBitElements(NumSrcOps,
14324 APInt::getZero(SrcEltSizeInBits));
14325 BitVector SrcUndeElements(NumSrcOps, false);
14326
14327 for (unsigned I = 0; I != NumSrcOps; ++I) {
14329 if (Op.isUndef()) {
14330 SrcUndeElements.set(I);
14331 continue;
14332 }
14333 auto *CInt = dyn_cast<ConstantSDNode>(Op);
14334 auto *CFP = dyn_cast<ConstantFPSDNode>(Op);
14335 assert((CInt || CFP) && "Unknown constant");
14336 SrcBitElements[I] = CInt ? CInt->getAPIntValue().trunc(SrcEltSizeInBits)
14337 : CFP->getValueAPF().bitcastToAPInt();
14338 }
14339
14340 // Recast to dst width.
14341 recastRawBits(IsLittleEndian, DstEltSizeInBits, RawBitElements,
14342 SrcBitElements, UndefElements, SrcUndeElements);
14343 return true;
14344}
14345
14346void BuildVectorSDNode::recastRawBits(bool IsLittleEndian,
14347 unsigned DstEltSizeInBits,
14348 SmallVectorImpl<APInt> &DstBitElements,
14349 ArrayRef<APInt> SrcBitElements,
14350 BitVector &DstUndefElements,
14351 const BitVector &SrcUndefElements) {
14352 unsigned NumSrcOps = SrcBitElements.size();
14353 unsigned SrcEltSizeInBits = SrcBitElements[0].getBitWidth();
14354 assert(((NumSrcOps * SrcEltSizeInBits) % DstEltSizeInBits) == 0 &&
14355 "Invalid bitcast scale");
14356 assert(NumSrcOps == SrcUndefElements.size() &&
14357 "Vector size mismatch");
14358
14359 unsigned NumDstOps = (NumSrcOps * SrcEltSizeInBits) / DstEltSizeInBits;
14360 DstUndefElements.clear();
14361 DstUndefElements.resize(NumDstOps, false);
14362 DstBitElements.assign(NumDstOps, APInt::getZero(DstEltSizeInBits));
14363
14364 // Concatenate src elements constant bits together into dst element.
14365 if (SrcEltSizeInBits <= DstEltSizeInBits) {
14366 unsigned Scale = DstEltSizeInBits / SrcEltSizeInBits;
14367 for (unsigned I = 0; I != NumDstOps; ++I) {
14368 DstUndefElements.set(I);
14369 APInt &DstBits = DstBitElements[I];
14370 for (unsigned J = 0; J != Scale; ++J) {
14371 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14372 if (SrcUndefElements[Idx])
14373 continue;
14374 DstUndefElements.reset(I);
14375 const APInt &SrcBits = SrcBitElements[Idx];
14376 assert(SrcBits.getBitWidth() == SrcEltSizeInBits &&
14377 "Illegal constant bitwidths");
14378 DstBits.insertBits(SrcBits, J * SrcEltSizeInBits);
14379 }
14380 }
14381 return;
14382 }
14383
14384 // Split src element constant bits into dst elements.
14385 unsigned Scale = SrcEltSizeInBits / DstEltSizeInBits;
14386 for (unsigned I = 0; I != NumSrcOps; ++I) {
14387 if (SrcUndefElements[I]) {
14388 DstUndefElements.set(I * Scale, (I + 1) * Scale);
14389 continue;
14390 }
14391 const APInt &SrcBits = SrcBitElements[I];
14392 for (unsigned J = 0; J != Scale; ++J) {
14393 unsigned Idx = (I * Scale) + (IsLittleEndian ? J : (Scale - J - 1));
14394 APInt &DstBits = DstBitElements[Idx];
14395 DstBits = SrcBits.extractBits(DstEltSizeInBits, J * DstEltSizeInBits);
14396 }
14397 }
14398}
14399
14401 for (const SDValue &Op : op_values()) {
14402 unsigned Opc = Op.getOpcode();
14403 if (!Op.isUndef() && Opc != ISD::Constant && Opc != ISD::ConstantFP)
14404 return false;
14405 }
14406 return true;
14407}
14408
14409std::optional<std::pair<APInt, APInt>>
14411 unsigned NumOps = getNumOperands();
14412 if (NumOps < 2)
14413 return std::nullopt;
14414
14415 unsigned EltSize = getValueType(0).getScalarSizeInBits();
14416 APInt Start, Stride;
14417 int FirstIdx = -1, SecondIdx = -1;
14418
14419 // Find the first two non-undef constant elements to determine Start and
14420 // Stride, then verify all remaining elements match the sequence.
14421 for (unsigned I = 0; I < NumOps; ++I) {
14423 if (Op->isUndef())
14424 continue;
14425 if (!isa<ConstantSDNode>(Op))
14426 return std::nullopt;
14427
14428 APInt Val = getConstantOperandAPInt(I).trunc(EltSize);
14429 if (FirstIdx < 0) {
14430 FirstIdx = I;
14431 Start = Val;
14432 } else if (SecondIdx < 0) {
14433 SecondIdx = I;
14434 // Compute stride using modular arithmetic. Simple division would handle
14435 // common strides (1, 2, -1, etc.), but modular inverse maximizes matches.
14436 // Example: <0, poison, poison, 0xFF> has stride 0x55 since 3*0x55 = 0xFF
14437 // Note that modular arithmetic is agnostic to signed/unsigned.
14438 unsigned IdxDiff = I - FirstIdx;
14439 APInt ValDiff = Val - Start;
14440
14441 // Step 1: Factor out common powers of 2 from IdxDiff and ValDiff.
14442 unsigned CommonPow2Bits = llvm::countr_zero(IdxDiff);
14443 if (ValDiff.countr_zero() < CommonPow2Bits)
14444 return std::nullopt; // ValDiff not divisible by 2^CommonPow2Bits
14445 IdxDiff >>= CommonPow2Bits;
14446 ValDiff.lshrInPlace(CommonPow2Bits);
14447
14448 // Step 2: IdxDiff is now odd, so its inverse mod 2^EltSize exists.
14449 // TODO: There are 2^CommonPow2Bits valid strides; currently we only try
14450 // one, but we could try all candidates to handle more cases.
14451 Stride = ValDiff * APInt(EltSize, IdxDiff).multiplicativeInverse();
14452 if (Stride.isZero())
14453 return std::nullopt;
14454
14455 // Step 3: Adjust Start based on the first defined element's index.
14456 Start -= Stride * FirstIdx;
14457 } else {
14458 // Verify this element matches the sequence.
14459 if (Val != Start + Stride * I)
14460 return std::nullopt;
14461 }
14462 }
14463
14464 // Need at least two defined elements.
14465 if (SecondIdx < 0)
14466 return std::nullopt;
14467
14468 return std::make_pair(Start, Stride);
14469}
14470
14472 // Find the first non-undef value in the shuffle mask.
14473 unsigned i, e;
14474 for (i = 0, e = Mask.size(); i != e && Mask[i] < 0; ++i)
14475 /* search */;
14476
14477 // If all elements are undefined, this shuffle can be considered a splat
14478 // (although it should eventually get simplified away completely).
14479 if (i == e)
14480 return true;
14481
14482 // Make sure all remaining elements are either undef or the same as the first
14483 // non-undef value.
14484 for (int Idx = Mask[i]; i != e; ++i)
14485 if (Mask[i] >= 0 && Mask[i] != Idx)
14486 return false;
14487 return true;
14488}
14489
14490// Returns true if it is a constant integer BuildVector or constant integer,
14491// possibly hidden by a bitcast.
14493 SDValue N, bool AllowOpaques) const {
14495
14496 if (auto *C = dyn_cast<ConstantSDNode>(N))
14497 return AllowOpaques || !C->isOpaque();
14498
14500 return true;
14501
14502 // Treat a GlobalAddress supporting constant offset folding as a
14503 // constant integer.
14504 if (auto *GA = dyn_cast<GlobalAddressSDNode>(N))
14505 if (GA->getOpcode() == ISD::GlobalAddress &&
14506 TLI->isOffsetFoldingLegal(GA))
14507 return true;
14508
14509 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14510 isa<ConstantSDNode>(N.getOperand(0)))
14511 return true;
14512 return false;
14513}
14514
14515// Returns true if it is a constant float BuildVector or constant float.
14518 return true;
14519
14521 return true;
14522
14523 if ((N.getOpcode() == ISD::SPLAT_VECTOR) &&
14524 isa<ConstantFPSDNode>(N.getOperand(0)))
14525 return true;
14526
14527 return false;
14528}
14529
14530std::optional<bool> SelectionDAG::isBoolConstant(SDValue N) const {
14531 ConstantSDNode *Const =
14532 isConstOrConstSplat(N, false, /*AllowTruncation=*/true);
14533 if (!Const)
14534 return std::nullopt;
14535
14536 EVT VT = N->getValueType(0);
14537 const APInt CVal = Const->getAPIntValue().trunc(VT.getScalarSizeInBits());
14538 switch (TLI->getBooleanContents(N.getValueType())) {
14540 if (CVal.isOne())
14541 return true;
14542 if (CVal.isZero())
14543 return false;
14544 return std::nullopt;
14546 if (CVal.isAllOnes())
14547 return true;
14548 if (CVal.isZero())
14549 return false;
14550 return std::nullopt;
14552 return CVal[0];
14553 }
14554 llvm_unreachable("Unknown BooleanContent enum");
14555}
14556
14557void SelectionDAG::createOperands(SDNode *Node, ArrayRef<SDValue> Vals) {
14558 assert(!Node->OperandList && "Node already has operands");
14560 "too many operands to fit into SDNode");
14561 SDUse *Ops = OperandRecycler.allocate(
14562 ArrayRecycler<SDUse>::Capacity::get(Vals.size()), OperandAllocator);
14563
14564 bool IsDivergent = false;
14565 for (unsigned I = 0; I != Vals.size(); ++I) {
14566 Ops[I].setUser(Node);
14567 Ops[I].setInitial(Vals[I]);
14568 EVT VT = Ops[I].getValueType();
14569
14570 // Skip Chain. It does not carry divergence.
14571 if (VT != MVT::Other &&
14572 (VT != MVT::Glue || gluePropagatesDivergence(Ops[I].getNode())) &&
14573 Ops[I].getNode()->isDivergent()) {
14574 IsDivergent = true;
14575 }
14576 }
14577 Node->NumOperands = Vals.size();
14578 Node->OperandList = Ops;
14579 if (!TLI->isSDNodeAlwaysUniform(Node)) {
14580 IsDivergent |= TLI->isSDNodeSourceOfDivergence(Node, FLI, UA);
14581 Node->SDNodeBits.IsDivergent = IsDivergent;
14582 }
14583 checkForCycles(Node);
14584}
14585
14588 size_t Limit = SDNode::getMaxNumOperands();
14589 while (Vals.size() > Limit) {
14590 unsigned SliceIdx = Vals.size() - Limit;
14591 auto ExtractedTFs = ArrayRef<SDValue>(Vals).slice(SliceIdx, Limit);
14592 SDValue NewTF = getNode(ISD::TokenFactor, DL, MVT::Other, ExtractedTFs);
14593 Vals.erase(Vals.begin() + SliceIdx, Vals.end());
14594 Vals.emplace_back(NewTF);
14595 }
14596 return getNode(ISD::TokenFactor, DL, MVT::Other, Vals);
14597}
14598
14600 EVT VT, SDNodeFlags Flags) {
14601 switch (Opcode) {
14602 default:
14603 return SDValue();
14604 case ISD::ADD:
14605 case ISD::OR:
14606 case ISD::XOR:
14607 case ISD::UMAX:
14608 return getConstant(0, DL, VT);
14609 case ISD::MUL:
14610 return getConstant(1, DL, VT);
14611 case ISD::AND:
14612 case ISD::UMIN:
14613 return getAllOnesConstant(DL, VT);
14614 case ISD::SMAX:
14616 case ISD::SMIN:
14618 case ISD::FADD:
14619 // If flags allow, prefer positive zero since it's generally cheaper
14620 // to materialize on most targets.
14621 return getConstantFP(Flags.hasNoSignedZeros() ? 0.0 : -0.0, DL, VT);
14622 case ISD::FMUL:
14623 return getConstantFP(1.0, DL, VT);
14624 case ISD::FMINNUM:
14625 case ISD::FMAXNUM: {
14626 // Neutral element for fminnum is NaN, Inf or FLT_MAX, depending on FMF.
14627 const fltSemantics &Semantics = VT.getFltSemantics();
14628 APFloat NeutralAF = !Flags.hasNoNaNs() ? APFloat::getQNaN(Semantics) :
14629 !Flags.hasNoInfs() ? APFloat::getInf(Semantics) :
14630 APFloat::getLargest(Semantics);
14631 if (Opcode == ISD::FMAXNUM)
14632 NeutralAF.changeSign();
14633
14634 return getConstantFP(NeutralAF, DL, VT);
14635 }
14636 case ISD::FMINIMUM:
14637 case ISD::FMAXIMUM: {
14638 // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
14639 const fltSemantics &Semantics = VT.getFltSemantics();
14640 APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
14641 : APFloat::getLargest(Semantics);
14642 if (Opcode == ISD::FMAXIMUM)
14643 NeutralAF.changeSign();
14644
14645 return getConstantFP(NeutralAF, DL, VT);
14646 }
14647
14648 }
14649}
14650
14651/// Helper used to make a call to a library function that has one argument of
14652/// pointer type.
14653///
14654/// Such functions include 'fegetmode', 'fesetenv' and some others, which are
14655/// used to get or set floating-point state. They have one argument of pointer
14656/// type, which points to the memory region containing bits of the
14657/// floating-point state. The value returned by such function is ignored in the
14658/// created call.
14659///
14660/// \param LibFunc Reference to library function (value of RTLIB::Libcall).
14661/// \param Ptr Pointer used to save/load state.
14662/// \param InChain Ingoing token chain.
14663/// \returns Outgoing chain token.
14665 SDValue InChain,
14666 const SDLoc &DLoc) {
14667 assert(InChain.getValueType() == MVT::Other && "Expected token chain");
14669 Args.emplace_back(Ptr, Ptr.getValueType().getTypeForEVT(*getContext()));
14670 RTLIB::LibcallImpl LibcallImpl =
14671 Libcalls->getLibcallImpl(static_cast<RTLIB::Libcall>(LibFunc));
14672 if (LibcallImpl == RTLIB::Unsupported)
14673 reportFatalUsageError("emitting call to unsupported libcall");
14674
14675 SDValue Callee =
14676 getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
14678 CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
14679 Libcalls->getLibcallImplCallingConv(LibcallImpl),
14680 Type::getVoidTy(*getContext()), Callee, std::move(Args));
14681 return TLI->LowerCallTo(CLI).second;
14682}
14683
14685 assert(From && To && "Invalid SDNode; empty source SDValue?");
14686 auto I = SDEI.find(From);
14687 if (I == SDEI.end())
14688 return;
14689
14690 // Use of operator[] on the DenseMap may cause an insertion, which invalidates
14691 // the iterator, hence the need to make a copy to prevent a use-after-free.
14692 NodeExtraInfo NEI = I->second;
14693 if (LLVM_LIKELY(!NEI.PCSections)) {
14694 // No deep copy required for the types of extra info set.
14695 //
14696 // FIXME: Investigate if other types of extra info also need deep copy. This
14697 // depends on the types of nodes they can be attached to: if some extra info
14698 // is only ever attached to nodes where a replacement To node is always the
14699 // node where later use and propagation of the extra info has the intended
14700 // semantics, no deep copy is required.
14701 SDEI[To] = std::move(NEI);
14702 return;
14703 }
14704
14705 const SDNode *EntrySDN = getEntryNode().getNode();
14706
14707 // We need to copy NodeExtraInfo to all _new_ nodes that are being introduced
14708 // through the replacement of From with To. Otherwise, replacements of a node
14709 // (From) with more complex nodes (To and its operands) may result in lost
14710 // extra info where the root node (To) is insignificant in further propagating
14711 // and using extra info when further lowering to MIR.
14712 //
14713 // In the first step pre-populate the visited set with the nodes reachable
14714 // from the old From node. This avoids copying NodeExtraInfo to parts of the
14715 // DAG that is not new and should be left untouched.
14716 SmallVector<const SDNode *> Leafs{From}; // Leafs reachable with VisitFrom.
14717 DenseSet<const SDNode *> FromReach; // The set of nodes reachable from From.
14718 auto VisitFrom = [&](auto &&Self, const SDNode *N, int MaxDepth) {
14719 if (MaxDepth == 0) {
14720 // Remember this node in case we need to increase MaxDepth and continue
14721 // populating FromReach from this node.
14722 Leafs.emplace_back(N);
14723 return;
14724 }
14725 if (!FromReach.insert(N).second)
14726 return;
14727 for (const SDValue &Op : N->op_values())
14728 Self(Self, Op.getNode(), MaxDepth - 1);
14729 };
14730
14731 // Copy extra info to To and all its transitive operands (that are new).
14733 auto DeepCopyTo = [&](auto &&Self, const SDNode *N) {
14734 if (FromReach.contains(N))
14735 return true;
14736 if (!Visited.insert(N).second)
14737 return true;
14738 if (EntrySDN == N)
14739 return false;
14740 for (const SDValue &Op : N->op_values()) {
14741 if (N == To && Op.getNode() == EntrySDN) {
14742 // Special case: New node's operand is the entry node; just need to
14743 // copy extra info to new node.
14744 break;
14745 }
14746 if (!Self(Self, Op.getNode()))
14747 return false;
14748 }
14749 // Copy only if entry node was not reached.
14750 SDEI[N] = std::move(NEI);
14751 return true;
14752 };
14753
14754 // We first try with a lower MaxDepth, assuming that the path to common
14755 // operands between From and To is relatively short. This significantly
14756 // improves performance in the common case. The initial MaxDepth is big
14757 // enough to avoid retry in the common case; the last MaxDepth is large
14758 // enough to avoid having to use the fallback below (and protects from
14759 // potential stack exhaustion from recursion).
14760 for (int PrevDepth = 0, MaxDepth = 16; MaxDepth <= 1024;
14761 PrevDepth = MaxDepth, MaxDepth *= 2, Visited.clear()) {
14762 // StartFrom is the previous (or initial) set of leafs reachable at the
14763 // previous maximum depth.
14765 std::swap(StartFrom, Leafs);
14766 for (const SDNode *N : StartFrom)
14767 VisitFrom(VisitFrom, N, MaxDepth - PrevDepth);
14768 if (LLVM_LIKELY(DeepCopyTo(DeepCopyTo, To)))
14769 return;
14770 // This should happen very rarely (reached the entry node).
14771 LLVM_DEBUG(dbgs() << __func__ << ": MaxDepth=" << MaxDepth << " too low\n");
14772 assert(!Leafs.empty());
14773 }
14774
14775 // This should not happen - but if it did, that means the subgraph reachable
14776 // from From has depth greater or equal to maximum MaxDepth, and VisitFrom()
14777 // could not visit all reachable common operands. Consequently, we were able
14778 // to reach the entry node.
14779 errs() << "warning: incomplete propagation of SelectionDAG::NodeExtraInfo\n";
14780 assert(false && "From subgraph too complex - increase max. MaxDepth?");
14781 // Best-effort fallback if assertions disabled.
14782 SDEI[To] = std::move(NEI);
14783}
14784
14785#ifndef NDEBUG
14786static void checkForCyclesHelper(const SDNode *N,
14789 const llvm::SelectionDAG *DAG) {
14790 // If this node has already been checked, don't check it again.
14791 if (Checked.count(N))
14792 return;
14793
14794 // If a node has already been visited on this depth-first walk, reject it as
14795 // a cycle.
14796 if (!Visited.insert(N).second) {
14797 errs() << "Detected cycle in SelectionDAG\n";
14798 dbgs() << "Offending node:\n";
14799 N->dumprFull(DAG); dbgs() << "\n";
14800 abort();
14801 }
14802
14803 for (const SDValue &Op : N->op_values())
14804 checkForCyclesHelper(Op.getNode(), Visited, Checked, DAG);
14805
14806 Checked.insert(N);
14807 Visited.erase(N);
14808}
14809#endif
14810
14812 const llvm::SelectionDAG *DAG,
14813 bool force) {
14814#ifndef NDEBUG
14815 bool check = force;
14816#ifdef EXPENSIVE_CHECKS
14817 check = true;
14818#endif // EXPENSIVE_CHECKS
14819 if (check) {
14820 assert(N && "Checking nonexistent SDNode");
14823 checkForCyclesHelper(N, visited, checked, DAG);
14824 }
14825#endif // !NDEBUG
14826}
14827
14828void llvm::checkForCycles(const llvm::SelectionDAG *DAG, bool force) {
14829 checkForCycles(DAG->getRoot().getNode(), DAG, force);
14830}
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:849
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
#define __asan_unpoison_memory_region(p, size)
Definition Compiler.h:592
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:335
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
iv users
Definition IVUsers.cpp:48
std::pair< Instruction::BinaryOps, Value * > OffsetOp
Find all possible pairs (BinOp, RHS) that BinOp V, RHS can be simplified.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static Register getMemsetValue(Register Val, LLT Ty, MachineIRBuilder &MIB)
static bool shouldLowerMemFuncForSize(const MachineFunction &MF)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
static Align getPrefTypeAlign(EVT VT, SelectionDAG &DAG)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
#define T
static MCRegister getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
PowerPC Reduce CR logical Operation
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
Contains matchers for matching SelectionDAG nodes and values.
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
This file contains some templates that are useful if you are working with the STL at all.
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow)
static SDValue getMemcpyLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo, BatchAAResults *BatchAA)
static SDValue getFixedOrScalableQuantity(SelectionDAG &DAG, const SDLoc &DL, EVT VT, Ty Quantity)
static std::pair< SDValue, SDValue > getRuntimeCallSDValueHelper(SDValue Chain, const SDLoc &dl, TargetLowering::ArgListTy &&Args, const CallInst *CI, RTLIB::Libcall Call, SelectionDAG *DAG, const TargetLowering *TLI)
static SDValue getMemsetStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo)
Lower the call to 'memset' intrinsic function into a series of store operations.
static std::optional< APInt > FoldValueWithUndef(unsigned Opcode, const APInt &C1, bool IsUndef1, const APInt &C2, bool IsUndef2)
static SDValue FoldSTEP_VECTOR(const SDLoc &DL, EVT VT, SDValue Step, SelectionDAG &DAG)
static void AddNodeIDNode(FoldingSetNodeID &ID, unsigned OpC, SDVTList VTList, ArrayRef< SDValue > OpList)
static SDValue getMemsetStringVal(EVT VT, const SDLoc &dl, SelectionDAG &DAG, const TargetLowering &TLI, const ConstantDataArraySlice &Slice)
getMemsetStringVal - Similar to getMemsetValue.
static cl::opt< bool > EnableMemCpyDAGOpt("enable-memcpy-dag-opt", cl::Hidden, cl::init(true), cl::desc("Gang up loads and stores generated by inlining of memcpy"))
static bool haveNoCommonBitsSetCommutative(SDValue A, SDValue B)
static void AddNodeIDValueTypes(FoldingSetNodeID &ID, SDVTList VTList)
AddNodeIDValueTypes - Value type lists are intern'd so we can represent them solely with their pointe...
static void commuteShuffle(SDValue &N1, SDValue &N2, MutableArrayRef< int > M)
Swaps the values of N1 and N2.
static bool isMemSrcFromConstant(SDValue Src, ConstantDataArraySlice &Slice)
Returns true if memcpy source is constant data.
static SDValue getMemmoveLoadsAndStores(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, uint64_t Size, Align Alignment, bool isVol, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo)
static void AddNodeIDOpcode(FoldingSetNodeID &ID, unsigned OpC)
AddNodeIDOpcode - Add the node opcode to the NodeID data.
static ISD::CondCode getSetCCInverseImpl(ISD::CondCode Op, bool isIntegerLike)
static bool doNotCSE(SDNode *N)
doNotCSE - Return true if CSE should not be performed for this node.
static cl::opt< int > MaxLdStGlue("ldstmemcpy-glue-max", cl::desc("Number limit for gluing ld/st of memcpy."), cl::Hidden, cl::init(0))
static void AddNodeIDOperands(FoldingSetNodeID &ID, ArrayRef< SDValue > Ops)
AddNodeIDOperands - Various routines for adding operands to the NodeID data.
static SDValue foldCONCAT_VECTORS(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
Try to simplify vector concatenation to an input value, undef, or build vector.
static MachinePointerInfo InferPointerInfo(const MachinePointerInfo &Info, SelectionDAG &DAG, SDValue Ptr, int64_t Offset=0)
InferPointerInfo - If the specified ptr/offset is a frame index, infer a MachinePointerInfo record fr...
static bool isInTailCallPositionWrapper(const CallInst *CI, const SelectionDAG *SelDAG, bool AllowReturnsFirstArg)
static void AddNodeIDCustom(FoldingSetNodeID &ID, const SDNode *N)
If this is an SDNode with special info, add this info to the NodeID data.
static bool gluePropagatesDivergence(const SDNode *Node)
Return true if a glue output should propagate divergence information.
static void NewSDValueDbgMsg(SDValue V, StringRef Msg, SelectionDAG *G)
static SDVTList makeVTList(const EVT *VTs, unsigned NumVTs)
makeVTList - Return an instance of the SDVTList struct initialized with the specified members.
static void checkForCyclesHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallPtrSetImpl< const SDNode * > &Checked, const llvm::SelectionDAG *DAG)
static void chainLoadsAndStoresForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SmallVector< SDValue, 32 > &OutChains, unsigned From, unsigned To, SmallVector< SDValue, 16 > &OutLoadChains, SmallVector< SDValue, 16 > &OutStoreChains)
static int isSignedOp(ISD::CondCode Opcode)
For an integer comparison, return 1 if the comparison is a signed operation and 2 if the result is an...
static std::optional< APInt > FoldValue(unsigned Opcode, const APInt &C1, const APInt &C2)
static SDValue FoldBUILD_VECTOR(const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SelectionDAG &DAG)
static void checkAddrSpaceIsValidForLibcall(const TargetLowering *TLI, unsigned AS)
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This file describes how to lower LLVM code to machine code.
static void removeOperands(MachineInstr &MI, unsigned i)
static std::optional< unsigned > getOpcode(ArrayRef< VPValue * > Values)
Returns the opcode of Values or ~0 if they do not all agree.
Definition VPlanSLP.cpp:247
static OverflowResult mapOverflowResult(ConstantRange::OverflowResult OR)
Convert ConstantRange OverflowResult into ValueTracking OverflowResult.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static unsigned getSize(unsigned Kind)
static const fltSemantics & IEEEsingle()
Definition APFloat.h:296
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:334
static constexpr roundingMode rmTowardZero
Definition APFloat.h:348
static const fltSemantics & BFloat()
Definition APFloat.h:295
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
static const fltSemantics & IEEEdouble()
Definition APFloat.h:297
static constexpr roundingMode rmTowardNegative
Definition APFloat.h:347
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:344
static constexpr roundingMode rmTowardPositive
Definition APFloat.h:346
static const fltSemantics & IEEEhalf()
Definition APFloat.h:294
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:360
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition APFloat.h:1175
opStatus divide(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1263
void copySign(const APFloat &RHS)
Definition APFloat.h:1357
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5976
opStatus subtract(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1245
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
Definition APFloat.h:1499
opStatus add(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1236
bool isFinite() const
Definition APFloat.h:1521
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1402
opStatus multiply(const APFloat &RHS, roundingMode RM)
Definition APFloat.h:1254
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
Definition APFloat.h:1290
bool isZero() const
Definition APFloat.h:1512
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1193
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Definition APFloat.h:1387
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1153
opStatus mod(const APFloat &RHS)
Definition APFloat.h:1281
bool isPosZero() const
Definition APFloat.h:1527
bool isNegZero() const
Definition APFloat.h:1528
void changeSign()
Definition APFloat.h:1352
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1164
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1982
LLVM_ABI APInt usub_sat(const APInt &RHS) const
Definition APInt.cpp:2066
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1584
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:1421
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1023
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1555
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1406
unsigned popcount() const
Count the number of bits set.
Definition APInt.h:1685
void setBitsFrom(unsigned loBit)
Set the top bits starting from loBit.
Definition APInt.h:1400
LLVM_ABI APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
Definition APInt.cpp:639
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1044
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1527
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:936
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1345
APInt abs() const
Get the absolute value.
Definition APInt.h:1810
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
Definition APInt.cpp:2037
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:1677
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
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:1655
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1411
LLVM_ABI APInt rotr(unsigned rotateAmt) const
Rotate right by rotateAmt.
Definition APInt.cpp:1165
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:768
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:1654
unsigned getNumSignBits() const
Computes the number of leading bits of this APInt that are equal to its sign bit.
Definition APInt.h:1643
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1613
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:651
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
Definition APInt.cpp:2097
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
Definition APInt.cpp:2111
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1052
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:1152
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:397
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1450
unsigned logBase2() const
Definition APInt.h:1776
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2047
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1285
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition APInt.cpp:1747
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:996
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1382
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:746
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:1432
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:1403
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:482
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition APInt.h:1244
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
Definition APInt.cpp:2056
An arbitrary precision integer that knows its signedness.
Definition APSInt.h:24
unsigned getSrcAddressSpace() const
unsigned getDestAddressSpace() const
static Capacity get(size_t N)
Get the capacity of an array that can hold at least N elements.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
This is an SDNode representing atomic operations.
static LLVM_ABI BaseIndexOffset match(const SDNode *N, const SelectionDAG &DAG)
Parses tree in N for base, index, offset addresses.
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
BitVector & reset()
Definition BitVector.h:411
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition BitVector.h:360
void clear()
clear - Removes all bits from the bitvector.
Definition BitVector.h:354
BitVector & set()
Definition BitVector.h:370
bool none() const
none - Returns true if none of the bits are set.
Definition BitVector.h:207
size_type size() const
size - Returns the number of bits in this bitvector.
Definition BitVector.h:178
const BlockAddress * getBlockAddress() const
The address of a basic block.
Definition Constants.h:1065
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool getConstantRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &RawBitElements, BitVector &UndefElements) const
Extract the raw bit data from a build vector of Undef, Constant or ConstantFP node elements.
static LLVM_ABI void recastRawBits(bool IsLittleEndian, unsigned DstEltSizeInBits, SmallVectorImpl< APInt > &DstBitElements, ArrayRef< APInt > SrcBitElements, BitVector &DstUndefElements, const BitVector &SrcUndefElements)
Recast bit data SrcBitElements to DstEltSizeInBits wide elements.
LLVM_ABI bool getRepeatedSequence(const APInt &DemandedElts, SmallVectorImpl< SDValue > &Sequence, BitVector *UndefElements=nullptr) const
Find the shortest repeating sequence of values in the build vector.
LLVM_ABI ConstantFPSDNode * getConstantFPSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant FP or null if this is not a constant FP splat.
LLVM_ABI SDValue getSplatValue(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted value or a null value if this is not a splat.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
LLVM_ABI int32_t getConstantFPSplatPow2ToLog2Int(BitVector *UndefElements, uint32_t BitWidth) const
If this is a constant FP splat and the splatted constant FP is an exact power or 2,...
LLVM_ABI std::optional< std::pair< APInt, APInt > > isArithmeticSequence() const
If this BuildVector is constant and represents an arithmetic sequence "<a, a+n, a+2n,...
LLVM_ABI bool isConstant() const
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
static LLVM_ABI bool isValueValidForType(EVT VT, const APFloat &Val)
const APFloat & getValueAPF() const
bool isExactlyValue(double V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValue() const
Definition Constants.h:464
This is the shared class of boolean and integer constants.
Definition Constants.h:87
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
MachineConstantPoolValue * getMachineCPVal() const
const Constant * getConstVal() const
LLVM_ABI Type * getType() const
This class represents a range of values.
LLVM_ABI ConstantRange multiply(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
uint64_t getZExtValue() const
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
static LLVM_ABI ExtOps getExtOps(unsigned FromSize, unsigned ToSize, bool Signed)
Returns the ops for a zero- or sign-extension in a DIExpression.
static LLVM_ABI void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
static LLVM_ABI const DIExpression * convertToVariadicExpression(const DIExpression *Expr)
If Expr is a non-variadic expression (i.e.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Base class for variables.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:215
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI unsigned getPointerTypeSizeInBits(Type *) const
The pointer representation size in bits for this type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
A debug info location.
Definition DebugLoc.h:123
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
const char * getSymbol() const
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Definition FoldingSet.h:209
Data structure describing the variable locations in a function.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:711
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
LLVM_ABI unsigned getAddressSpace() const
const GlobalValue * getGlobal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
This class is used to form a handle around another node that is persistent and is updated across invo...
const SDValue & getValue() const
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
LLVM_ABI CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall.
LLVM_ABI RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This SDNode is used for LIFETIME_START/LIFETIME_END values.
This class is used to represent ISD::LOAD nodes.
static LocationSize precise(uint64_t Value)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1080
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1444
Machine Value Type.
SimpleValueType SimpleTy
static MVT getIntegerVT(unsigned BitWidth)
Abstract base class for all machine specific constantpool value subclasses.
virtual void addSelectionDAGCSEId(FoldingSetNodeID &ID)=0
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
A description of a memory reference used in the backend.
const MDNode * getRanges() const
Return the range tag for the memory reference.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
This class contains meta information specific to a module.
An SDNode that represents everything that will be needed to construct a MachineInstr.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
This SDNode is used for target intrinsics that touch memory and need an associated MachineMemOperand.
size_t getNumMemOperands() const
Return the number of memory operands.
LLVM_ABI MemSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT memvt, PointerUnion< MachineMemOperand *, MachineMemOperand ** > memrefs)
Constructor that supports single or multiple MMOs.
PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs
Memory reference information.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
ArrayRef< MachineMemOperand * > memoperands() const
Return the memory operands for this node.
unsigned getRawSubclassData() const
Return the SubclassData value, without HasDebugValue.
EVT getMemoryVT() const
Return the type of the in-memory value.
Representation for a specific memory location.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
The optimization diagnostic interface.
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
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 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 SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI void updateDivergence(SDNode *N)
LLVM_ABI SDValue getSplatValue(SDValue V, bool LegalTypes=false)
If V is a splat vector, return its scalar source operand by extracting that element from the source v...
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getNeutralElement(unsigned Opcode, const SDLoc &DL, EVT VT, SDNodeFlags Flags)
Get the (commutative) neutral element for the given opcode, if it exists.
LLVM_ABI SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Value, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo)
LLVM_ABI SDValue getAtomicLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT MemVT, EVT VT, SDValue Chain, SDValue Ptr, MachineMemOperand *MMO)
LLVM_ABI SDNode * getNodeIfExists(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops, const SDNodeFlags Flags, bool AllowCommute=false)
Get the specified node if it's already available, or else return NULL.
LLVM_ABI SDValue getPseudoProbeNode(const SDLoc &Dl, SDValue Chain, uint64_t Guid, uint64_t Index, uint32_t Attr)
Creates a PseudoProbeSDNode with function GUID Guid and the index of the block Index it is probing,...
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDNode * SelectNodeTo(SDNode *N, unsigned MachineOpc, EVT VT)
These are used for target selectors to mutate the specified node to have the specified return type,...
LLVM_ABI void init(MachineFunction &NewMF, OptimizationRemarkEmitter &NewORE, Pass *PassPtr, const TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallsInfo, UniformityInfo *UA, ProfileSummaryInfo *PSIin, BlockFrequencyInfo *BFIin, MachineModuleInfo &MMI, FunctionVarLocs const *FnVarLocs)
Prepare this SelectionDAG to process code in the given MachineFunction.
LLVM_ABI SelectionDAG(const TargetMachine &TM, CodeGenOptLevel)
LLVM_ABI SDValue getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, MachinePointerInfo DstPtrInfo, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getBitcastedSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getStridedLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI SDValue getSymbolFunctionGlobalAddress(SDValue Op, Function **TargetFunction=nullptr)
Return a GlobalAddress of the function from the current module with name matching the given ExternalS...
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
OverflowKind
Used to represent the possible overflow behavior of an operation.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
LLVM_ABI bool haveNoCommonBitsSet(SDValue A, SDValue B) const
Return true if A and B have no common bits set.
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
LLVM_ABI bool cannotBeOrderedNegativeFP(SDValue Op) const
Test whether the given float value is known to be positive.
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI bool calculateDivergence(SDNode *N)
LLVM_ABI std::pair< SDValue, SDValue > getStrcmp(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getGetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getAssertAlign(const SDLoc &DL, SDValue V, Align A)
Return an AssertAlignSDNode.
LLVM_ABI SDNode * mutateStrictFPToFP(SDNode *Node)
Mutate the specified strict FP node to its non-strict equivalent, unlinking the node from its chain a...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool canIgnoreSignBitOfZero(const SDUse &Use) const
Check if a use of a float value is insensitive to signed zeros.
LLVM_ABI bool SignBitIsZeroFP(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero, for a floating-point value.
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getBitcastedZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
LLVM_ABI SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
LLVM_ABI SDValue getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, bool AlwaysInline, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI Align getEVTAlign(EVT MemoryVT) const
Compute the default alignment value for the given type.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
LLVM_ABI SDValue getVPZExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be an integer vector, to the vector-type VT,...
const TargetLowering & getTargetLoweringInfo() const
LLVM_ABI bool isEqualTo(SDValue A, SDValue B) const
Test whether two SDValues are known to compare equal.
static constexpr unsigned MaxRecursionDepth
LLVM_ABI SDValue getStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
bool isGuaranteedNotToBePoison(SDValue Op, unsigned Depth=0) const
Return true if this function can prove that Op is never poison.
LLVM_ABI SDValue expandVACopy(SDNode *Node)
Expand the specified ISD::VACOPY node as the Legalize pass would.
LLVM_ABI SDValue getIndexedMaskedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI APInt computeVectorKnownZeroElements(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
For each demanded element of a vector, see if it is known to be zero.
LLVM_ABI void AddDbgValue(SDDbgValue *DB, bool isParameter)
Add a dbg_value SDNode.
bool NewNodesMustHaveLegalTypes
When true, additional steps are taken to ensure that getConstant() and similar functions return DAG n...
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
LLVM_ABI void salvageDebugInfo(SDNode &N)
To be invoked on an SDNode that is slated to be erased.
LLVM_ABI SDNode * MorphNodeTo(SDNode *N, unsigned Opc, SDVTList VTs, ArrayRef< SDValue > Ops)
This mutates the specified node to have the specified return type, opcode, and operands.
LLVM_ABI std::pair< SDValue, SDValue > UnrollVectorOverflowOp(SDNode *N, unsigned ResNE=0)
Like UnrollVectorOp(), but for the [US](ADD|SUB|MUL)O family of opcodes.
allnodes_const_iterator allnodes_begin() const
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
LLVM_ABI SDValue getGatherVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getBitcastedAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by first bitcasting (from potentia...
LLVM_ABI bool isSplatValue(SDValue V, const APInt &DemandedElts, APInt &UndefElts, unsigned Depth=0) const
Test whether V has a splatted value for all the demanded elements.
LLVM_ABI void DeleteNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
LLVM_ABI SDDbgValue * getDbgValueList(DIVariable *Var, DIExpression *Expr, ArrayRef< SDDbgOperand > Locs, ArrayRef< SDNode * > Dependencies, bool IsIndirect, const DebugLoc &DL, unsigned O, bool IsVariadic)
Creates a SDDbgValue node from a list of locations.
LLVM_ABI std::pair< SDValue, SDValue > getStrcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, const CallInst *CI)
Lower a strcpy operation into a target library call and return the resulting chain and call result as...
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
LLVM_ABI SDValue simplifySelect(SDValue Cond, SDValue TVal, SDValue FVal)
Try to simplify a select/vselect into 1 of its operands or a constant.
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
LLVM_ABI bool isConstantFPBuildVectorOrConstantFP(SDValue N) const
Test whether the given value is a constant FP or similar node.
const DataLayout & getDataLayout() const
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.
const SelectionDAGTargetInfo & getSelectionDAGInfo() const
LLVM_ABI bool areNonVolatileConsecutiveLoads(LoadSDNode *LD, LoadSDNode *Base, unsigned Bytes, int Dist) const
Return true if loads are next to each other and can be merged.
LLVM_ABI SDValue getMaskedHistogram(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDDbgLabel * getDbgLabel(DILabel *Label, const DebugLoc &DL, unsigned O)
Creates a SDDbgLabel node.
LLVM_ABI SDValue getStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI OverflowKind computeOverflowForUnsignedMul(SDValue N0, SDValue N1) const
Determine if the result of the unsigned mul of 2 nodes can overflow.
LLVM_ABI void copyExtraInfo(SDNode *From, SDNode *To)
Copy extra info associated with one node to another.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
LLVM_ABI SDValue getLoadFFVP(EVT VT, const SDLoc &DL, SDValue Chain, SDValue Ptr, SDValue Mask, SDValue EVL, MachineMemOperand *MMO)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getMDNode(const MDNode *MD)
Return an MDNodeSDNode which holds an MDNode.
LLVM_ABI void clear()
Clear state and free memory necessary to make this SelectionDAG ready to process a new block.
LLVM_ABI std::pair< SDValue, SDValue > getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, const CallInst *CI)
Lower a memcmp operation into a target library call and return the resulting chain and call result as...
LLVM_ABI void ReplaceAllUsesWith(SDValue From, SDValue To)
Modify anything using 'From' to use 'To' instead.
LLVM_ABI SDValue getCommutedVectorShuffle(const ShuffleVectorSDNode &SV)
Returns an ISD::VECTOR_SHUFFLE node semantically equivalent to the shuffle node in input but with swa...
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue makeStateFunctionCall(unsigned LibFunc, SDValue Ptr, SDValue InChain, const SDLoc &DLoc)
Helper used to make a call to a library function that has one argument of pointer type.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, bool PoisonOnly=false, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getIndexedLoadVP(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getSrcValue(const Value *v)
Construct a node to track a Value* through the backend.
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI OverflowKind computeOverflowForSignedMul(SDValue N0, SDValue N1) const
Determine if the result of the signed mul of 2 nodes can overflow.
LLVM_ABI MaybeAlign InferPtrAlign(SDValue Ptr) const
Infer alignment of a load / store address.
LLVM_ABI void dump() const
Dump the textual format of this DAG.
LLVM_ABI bool MaskedValueIsAllOnes(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if '(Op & Mask) == Mask'.
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNodes()
This method deletes all unreachable nodes in the SelectionDAG.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
LLVM_ABI void AddDbgLabel(SDDbgLabel *DB)
Add a dbg_label SDNode.
bool isConstantValueOfAnyType(SDValue N) const
LLVM_ABI SDValue getTargetExtractSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand)
A convenience function for creating TargetInstrInfo::EXTRACT_SUBREG nodes.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB)
LLVM_ABI SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
LLVM_ABI SDDbgValue * getVRegDbgValue(DIVariable *Var, DIExpression *Expr, Register VReg, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a VReg SDDbgValue node.
LLVM_ABI SDValue getEHLabel(const SDLoc &dl, SDValue Root, MCSymbol *Label)
LLVM_ABI SDValue getIndexedStoreVP(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue getIndexedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI std::optional< unsigned > getValidMinimumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue getSetFPEnv(SDValue Chain, const SDLoc &dl, SDValue Ptr, EVT MemVT, MachineMemOperand *MMO)
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
LLVM_ABI std::pair< SDValue, SDValue > getStrictFPExtendOrRound(SDValue Op, SDValue Chain, const SDLoc &DL, EVT VT)
Convert Op, which must be a STRICT operation of float type, to the float type VT, by either extending...
LLVM_ABI std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
LLVM_ABI SDValue getPtrExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either truncating it or perform...
LLVM_ABI SDValue getVPLogicalNOT(const SDLoc &DL, SDValue Val, SDValue Mask, SDValue EVL, EVT VT)
Create a vector-predicated logical NOT operation as (VP_XOR Val, BooleanOne, Mask,...
LLVM_ABI SDValue getMaskFromElementCount(const SDLoc &DL, EVT VT, ElementCount Len)
Return a vector with the first 'Len' lanes set to true and remaining lanes set to false.
LLVM_ABI SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
iterator_range< allnodes_iterator > allnodes()
LLVM_ABI SDValue getBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI SDValue WidenVector(const SDValue &N, const SDLoc &DL)
Widen the vector up to the next power of two using INSERT_SUBVECTOR.
LLVM_ABI bool isKnownNeverZeroFloat(SDValue Op) const
Test whether the given floating point SDValue is known to never be positive or negative zero.
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDDbgValue * getConstantDbgValue(DIVariable *Var, DIExpression *Expr, const Value *C, const DebugLoc &DL, unsigned O)
Creates a constant SDDbgValue node.
LLVM_ABI SDValue getScatterVP(SDVTList VTs, EVT VT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getLifetimeNode(bool IsStart, const SDLoc &dl, SDValue Chain, int FrameIndex)
Creates a LifetimeSDNode that starts (IsStart==true) or ends (IsStart==false) the lifetime of the Fra...
ArrayRef< SDDbgValue * > GetDbgValues(const SDNode *SD) const
Get the debug values which reference the given SDNode.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI OverflowKind computeOverflowForSignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the signed addition of 2 nodes can overflow.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI unsigned AssignTopologicalOrder()
Topological-sort the AllNodes list and a assign a unique node id for each node in the DAG based on th...
ilist< SDNode >::size_type allnodes_size() const
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
LLVM_ABI SDValue FoldConstantBuildVector(BuildVectorSDNode *BV, const SDLoc &DL, EVT DstEltVT)
Fold BUILD_VECTOR of constants/undefs to the destination type BUILD_VECTOR of constants/undefs elemen...
LLVM_ABI SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Type *SizeTy, unsigned ElemSz, bool isTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo)
LLVM_ABI SDValue getIndexedMaskedStore(SDValue OrigStore, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI bool MaskedVectorIsZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Return true if 'Op' is known to be zero in DemandedElts.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
LLVM_ABI SDDbgValue * getFrameIndexDbgValue(DIVariable *Var, DIExpression *Expr, unsigned FI, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a FrameIndex SDDbgValue node.
LLVM_ABI SDValue getExtStridedLoadVP(ISD::LoadExtType ExtType, const SDLoc &DL, EVT VT, SDValue Chain, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT MemVT, MachineMemOperand *MMO, bool IsExpanding=false)
LLVM_ABI SDValue getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVol, const CallInst *CI, std::optional< bool > OverrideTailCall, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo, const AAMDNodes &AAInfo=AAMDNodes(), BatchAAResults *BatchAA=nullptr)
LLVM_ABI SDValue getJumpTable(int JTI, EVT VT, bool isTarget=false, unsigned TargetFlags=0)
LLVM_ABI bool isBaseWithConstantOffset(SDValue Op) const
Return true if the specified operand is an ISD::ADD with a ConstantSDNode on the right-hand side,...
LLVM_ABI SDValue getVPPtrExtOrTrunc(const SDLoc &DL, EVT VT, SDValue Op, SDValue Mask, SDValue EVL)
Convert a vector-predicated Op, which must be of integer type, to the vector-type integer type VT,...
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void getTopologicallyOrderedNodes(SmallVectorImpl< const SDNode * > &SortedNodes) const
Get all the nodes in their topological order without modifying any states.
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
LLVM_ABI std::pair< SDValue, SDValue > getStrstr(SDValue Chain, const SDLoc &dl, SDValue S0, SDValue S1, const CallInst *CI)
Lower a strstr operation into a target library call and return the resulting chain and call result as...
LLVM_ABI SDValue getPtrExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to extend the Op as a pointer value assuming it was the smaller SrcTy ...
LLVM_ABI bool canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts, bool PoisonOnly=false, bool ConsiderFlags=true, unsigned Depth=0) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
LLVM_ABI OverflowKind computeOverflowForUnsignedAdd(SDValue N0, SDValue N1) const
Determine if the result of the unsigned addition of 2 nodes can overflow.
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
SDValue getSplatBuildVector(EVT VT, const SDLoc &DL, SDValue Op)
Return a splat ISD::BUILD_VECTOR node, consisting of Op splatted to all elements.
LLVM_ABI SDValue getFrameIndex(int FI, EVT VT, bool isTarget=false)
LLVM_ABI SDValue getTruncStridedStoreVP(SDValue Chain, const SDLoc &DL, SDValue Val, SDValue Ptr, SDValue Stride, SDValue Mask, SDValue EVL, EVT SVT, MachineMemOperand *MMO, bool IsCompressing=false)
LLVM_ABI void canonicalizeCommutativeBinop(unsigned Opcode, SDValue &N1, SDValue &N2) const
Swap N1 and N2 if Opcode is a commutative binary opcode and the canonical form expects the opposite o...
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getRegisterMask(const uint32_t *RegMask)
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
LLVM_ABI bool isKnownToBeAPowerOfTwoFP(SDValue Val, unsigned Depth=0) const
Test if the given fp value is known to be an integer power-of-2, either positive or negative.
LLVM_ABI OverflowKind computeOverflowForSignedSub(SDValue N0, SDValue N1) const
Determine if the result of the signed sub of 2 nodes can overflow.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI SDValue simplifyFPBinop(unsigned Opcode, SDValue X, SDValue Y, SDNodeFlags Flags)
Try to simplify a floating-point binary operation into 1 of its operands or a constant.
const SDValue & setRoot(SDValue N)
Set the current root tag of the SelectionDAG.
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue getDeactivationSymbol(const GlobalValue *GV)
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT, unsigned TargetFlags=0)
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT)
LLVM_ABI bool isUndef(unsigned Opcode, ArrayRef< SDValue > Ops)
Return true if the result of this operation is always undefined.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
LLVM_ABI SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
LLVM_ABI std::pair< EVT, EVT > GetDependentSplitDestVTs(const EVT &VT, const EVT &EnvVT, bool *HiIsEmpty) const
Compute the VTs needed for the low/hi parts of a type, dependent on an enveloping VT that has been sp...
LLVM_ABI SDValue foldConstantFPMath(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops)
Fold floating-point operations when all operands are constants and/or undefined.
LLVM_ABI std::optional< ConstantRange > getValidShiftAmountRange(SDValue V, const APInt &DemandedElts, unsigned Depth) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue FoldSymbolOffset(unsigned Opcode, EVT VT, const GlobalAddressSDNode *GA, const SDNode *N2)
LLVM_ABI SDValue getIndexedLoad(SDValue OrigLoad, const SDLoc &dl, SDValue Base, SDValue Offset, ISD::MemIndexedMode AM)
LLVM_ABI SDValue getTargetInsertSubreg(int SRIdx, const SDLoc &DL, EVT VT, SDValue Operand, SDValue Subreg)
A convenience function for creating TargetInstrInfo::INSERT_SUBREG nodes.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
LLVM_ABI SDDbgValue * getDbgValue(DIVariable *Var, DIExpression *Expr, SDNode *N, unsigned R, bool IsIndirect, const DebugLoc &DL, unsigned O)
Creates a SDDbgValue node.
LLVM_ABI SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue matchBinOpReduction(SDNode *Extract, ISD::NodeType &BinOp, ArrayRef< ISD::NodeType > CandidateBinOps, bool AllowPartials=false)
Match a binop + shuffle pyramid that represents a horizontal reduction over the elements of a vector ...
LLVM_ABI bool isADDLike(SDValue Op, bool NoWrap=false) const
Return true if the specified operand is an ISD::OR or ISD::XOR node that can be treated as an ISD::AD...
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
LLVM_ABI SDValue simplifyShift(SDValue X, SDValue Y)
Try to simplify a shift into 1 of its operands or a constant.
LLVM_ABI void transferDbgValues(SDValue From, SDValue To, unsigned OffsetInBits=0, unsigned SizeInBits=0, bool InvalidateDbg=true)
Transfer debug values from one node to another, while optionally generating fragment expressions for ...
LLVM_ABI SDValue getLogicalNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a logical NOT operation as (XOR Val, BooleanOne).
LLVM_ABI SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
ilist< SDNode >::iterator allnodes_iterator
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
int getMaskElt(unsigned Idx) const
ArrayRef< int > getMask() const
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
static LLVM_ABI bool isSplatMask(ArrayRef< int > Mask)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
bool erase(PtrType Ptr)
Remove pointer from the set.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:137
Information about stack frame layout on the target.
virtual TargetStackID::Value getStackIDForScalableVectors() const
Returns the StackID that scalable vectors should be associated with.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
Completely target-dependent object reference.
unsigned getTargetFlags() const
Provides information about what library functions are available for the current target.
virtual bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const
Return true if it is beneficial to convert a load of a constant to just the constant itself.
const TargetMachine & getTargetMachine() const
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
virtual bool 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:639
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:290
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:313
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:286
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:311
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:201
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:236
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
LLVM_ABI void set(Value *Val)
Definition Value.h:907
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:256
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:175
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
Definition TypeSize.h:269
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr bool isKnownEven() const
A return value of true indicates we know at compile time that the number of elements (vscale * Min) i...
Definition TypeSize.h:176
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:237
A raw_ostream that writes to an std::string.
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt clmulr(const APInt &LHS, const APInt &RHS)
Perform a reversed carry-less multiply.
Definition APInt.cpp:3212
LLVM_ABI APInt mulhu(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on zero-extended operands.
Definition APInt.cpp:3142
LLVM_ABI APInt avgCeilU(const APInt &C1, const APInt &C2)
Compute the ceil of the unsigned average of C1 and C2.
Definition APInt.cpp:3129
LLVM_ABI APInt avgFloorU(const APInt &C1, const APInt &C2)
Compute the floor of the unsigned average of C1 and C2.
Definition APInt.cpp:3119
LLVM_ABI APInt fshr(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift right.
Definition APInt.cpp:3193
LLVM_ABI APInt mulhs(const APInt &C1, const APInt &C2)
Performs (2*N)-bit multiplication on sign-extended operands.
Definition APInt.cpp:3134
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:3202
APInt abds(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be signed.
Definition APInt.h:2283
LLVM_ABI APInt fshl(const APInt &Hi, const APInt &Lo, const APInt &Shift)
Perform a funnel shift left.
Definition APInt.cpp:3184
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:3020
LLVM_ABI APInt clmulh(const APInt &LHS, const APInt &RHS)
Perform a carry-less multiply, and return high-bits.
Definition APInt.cpp:3217
APInt abdu(const APInt &A, const APInt &B)
Determine the absolute difference of two APInts considered to be unsigned.
Definition APInt.h:2288
LLVM_ABI APInt avgFloorS(const APInt &C1, const APInt &C2)
Compute the floor of the signed average of C1 and C2.
Definition APInt.cpp:3114
LLVM_ABI APInt avgCeilS(const APInt &C1, const APInt &C2)
Compute the ceil of the signed average of C1 and C2.
Definition APInt.cpp:3124
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
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, bool isIntegerLike)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
ISD namespace - This namespace contains an enum which represents all of the SelectionDAG node types a...
Definition ISDOpcodes.h:24
LLVM_ABI CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical AND between different comparisons of identical values: ((X op1 Y) & (X...
LLVM_ABI bool isConstantSplatVectorAllOnes(const SDNode *N, bool BuildVectorOnly=false)
Return true if the specified node is a BUILD_VECTOR or SPLAT_VECTOR where all of the elements are ~0 ...
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:819
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ TargetConstantPool
Definition ISDOpcodes.h:189
@ MDNODE_SDNODE
MDNODE_SDNODE - This is a node that holdes an MDNode*, which is used to reference metadata in the IR.
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
Definition ISDOpcodes.h:511
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ POISON
POISON - A poison node.
Definition ISDOpcodes.h:236
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:538
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:600
@ JUMP_TABLE_DEBUG_INFO
JUMP_TABLE_DEBUG_INFO - Jumptable debug info.
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:779
@ TargetBlockAddress
Definition ISDOpcodes.h:191
@ DEACTIVATION_SYMBOL
Untyped node storing deactivation symbol reference (DeactivationSymbolSDNode).
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:522
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ ATOMIC_LOAD_USUB_COND
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ GlobalAddress
Definition ISDOpcodes.h:88
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:910
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ GlobalTLSAddress
Definition ISDOpcodes.h:89
@ SRCVALUE
SRCVALUE - This is a node type that holds a Value* that is used to make reference to a value in the L...
@ EH_LABEL
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
@ ATOMIC_LOAD_USUB_SAT
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:715
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:665
@ TargetExternalSymbol
Definition ISDOpcodes.h:190
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ TargetJumpTable
Definition ISDOpcodes.h:188
@ TargetIndex
TargetIndex - Like a constant pool entry, but with completely target-dependent semantics.
Definition ISDOpcodes.h:198
@ PARTIAL_REDUCE_FMLA
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:873
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:827
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
Definition ISDOpcodes.h:691
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ AssertAlign
AssertAlign - These nodes record if a register contains a value that has a known alignment and the tr...
Definition ISDOpcodes.h:69
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ TargetGlobalAddress
TargetGlobalAddress - Like GlobalAddress, but the DAG does no folding or anything else with this node...
Definition ISDOpcodes.h:185
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:792
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:704
@ ATOMIC_LOAD_FMAXIMUM
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ AssertNoFPClass
AssertNoFPClass - These nodes record if a register contains a float value that is known to be not som...
Definition ISDOpcodes.h:78
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:649
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EntryToken
EntryToken - This is the marker used to indicate the start of a region.
Definition ISDOpcodes.h:48
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ CopyToReg
CopyToReg - This node has three operands: a chain, a register number to set to this value,...
Definition ISDOpcodes.h:224
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ TargetConstantFP
Definition ISDOpcodes.h:180
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:811
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ ATOMIC_LOAD_FMINIMUM
@ TargetFrameIndex
Definition ISDOpcodes.h:187
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:899
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:888
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ LIFETIME_START
This corresponds to the llvm.lifetime.
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:805
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ HANDLENODE
HANDLENODE node - Used as a handle for various purposes.
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ ATOMIC_LOAD_UDEC_WRAP
@ STRICT_FP_ROUND
X = STRICT_FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision ...
Definition ISDOpcodes.h:500
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:505
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ PSEUDO_PROBE
Pseudo probe for AutoFDO, as a place holder in a basic block to improve the sample counts quality.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:710
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
Definition ISDOpcodes.h:681
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ ExternalSymbol
Definition ISDOpcodes.h:93
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:921
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition ISDOpcodes.h:997
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ VECREDUCE_SEQ_FMUL
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:833
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
@ ATOMIC_LOAD_UINC_WRAP
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:871
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:722
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:875
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ TargetGlobalTLSAddress
Definition ISDOpcodes.h:186
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:556
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
bool matchUnaryFpPredicate(SDValue Op, std::function< bool(ConstantFPSDNode *)> Match, bool AllowUndefs=false)
Hook for matching ConstantFPSDNode predicate.
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 bool isVectorShrinkable(const SDNode *N, unsigned NewEltSize, bool Signed)
Returns true if the specified node is a vector where all elements can be truncated to the specified e...
LLVM_ABI bool isVPBinaryOp(unsigned Opcode)
Whether this is a vector-predicated binary operation opcode.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
LLVM_ABI std::optional< unsigned > getBaseOpcodeForVP(unsigned Opcode, bool hasFPExcept)
Translate this VP Opcode to its corresponding non-VP Opcode.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
LLVM_ABI std::optional< unsigned > getVPMaskIdx(unsigned Opcode)
The operand position of the vector mask.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI std::optional< unsigned > getVPExplicitVectorLengthIdx(unsigned Opcode)
The operand position of the explicit vector length parameter.
bool isEXTLoad(const SDNode *N)
Returns true if the specified node is a EXTLOAD.
LLVM_ABI bool allOperandsUndef(const SDNode *N)
Return true if the node has at least one operand and all operands of the specified node are ISD::UNDE...
LLVM_ABI bool isFreezeUndef(const SDNode *N)
Return true if the specified node is FREEZE(UNDEF).
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI std::optional< unsigned > getVPForBaseOpcode(unsigned Opcode)
Translate this non-VP Opcode to its corresponding VP Opcode.
MemIndexType
MemIndexType enum - This enum defines how to interpret MGATHER/SCATTER's index parameter when calcula...
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool matchUnaryPredicateImpl(SDValue Op, std::function< bool(ConstNodeType *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Attempt to match a unary predicate against a scalar/splat constant or every element of a constant BUI...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
LLVM_ABI NodeType getInverseMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns ISD::(U|S)MAX and ISD::(U|S)MIN,...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI bool isVPReduction(unsigned Opcode)
Whether this is a vector-predicated reduction opcode.
bool matchUnaryPredicate(SDValue Op, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LLVM_ABI bool isBuildVectorOfConstantFPSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantFPSDNode or undef.
bool isSEXTLoad(const SDNode *N)
Returns true if the specified node is a SEXTLOAD.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI bool isBuildVectorAllOnes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are ~0 or undef.
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
LLVM_ABI bool isVPOpcode(unsigned Opcode)
Whether this is a vector-predicated Opcode.
LLVM_ABI CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, EVT Type)
Return the result of a logical OR between different comparisons of identical values: ((X op1 Y) | (X ...
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
deferredval_ty< 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()...
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
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.
Definition Types.h:26
GenericUniformityInfo< SSAContext > UniformityInfo
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
@ Offset
Definition DWP.cpp:532
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred)
getICmpCondCode - Return the ISD condition code corresponding to the given LLVM IR integer condition ...
Definition Analysis.cpp:237
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI SDValue peekThroughExtractSubvectors(SDValue V)
Return the non-extracted vector source operand of V if it exists.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
MaybeAlign getAlign(const CallInst &I, unsigned Index)
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1607
LLVM_ABI SDValue getBitwiseNotOperand(SDValue V, SDValue Mask, bool AllowUndefs)
If V is a bitwise not, returns the inverted operand.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition bit.h:293
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:303
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1710
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:634
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1589
LLVM_ABI bool isMinSignedConstant(SDValue V)
Returns true if V is a constant min signed integer value.
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
Definition APFloat.h:1622
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1665
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:331
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
LLVM_ABI SDValue peekThroughInsertVectorElt(SDValue V, const APInt &DemandedElts)
Recursively peek through INSERT_VECTOR_ELT nodes, returning the source vector operand of V,...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void checkForCycles(const SelectionDAG *DAG, bool force=false)
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1696
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI SDValue peekThroughTruncates(SDValue V)
Return the non-truncated source operand of V if it exists.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
LLVM_ABI SDValue peekThroughOneUseBitcasts(SDValue V)
Return the non-bitcasted and one-use source operand of V if it exists.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Other
Any other memory.
Definition ModRef.h:68
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1646
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
LLVM_ABI bool isNullConstantOrUndef(SDValue V)
Returns true if V is a constant integer zero or an UNDEF node.
bool isInTailCallPosition(const CallBase &Call, const TargetMachine &TM, bool ReturnsFirstArg=false)
Test if the given instruction is in a position to be optimized with a tail-call.
Definition Analysis.cpp:539
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
constexpr unsigned BitWidth
bool funcReturnsFirstArgOfCall(const CallInst &CI)
Returns true if the parent of CI returns CI's first argument after calling CI.
Definition Analysis.cpp:719
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:572
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
LLVM_ABI bool isZeroOrZeroSplatFP(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant (+/-)0.0 floating-point value or a splatted vector thereof (wi...
LLVM_ABI void computeKnownBitsFromRangeMetadata(const MDNode &Ranges, KnownBits &Known)
Compute known bits from the range metadata.
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1683
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1723
LLVM_ABI bool isOnesOrOnesSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
LLVM_ABI bool isNeutralConstant(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo)
Returns true if V is a neutral element of Opc with Flags.
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:373
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:763
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition Metadata.h:783
MDNode * TBAA
The tag for type-based alias analysis.
Definition Metadata.h:780
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
Represents offset+length into a ConstantDataArray.
uint64_t Length
Length of the slice.
uint64_t Offset
Slice starts at this Offset.
void move(uint64_t Delta)
Moves the Offset and adjusts Length accordingly.
const ConstantDataArray * Array
ConstantDataArray pointer.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:403
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
intptr_t getRawBits() const
Definition ValueTypes.h:528
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:292
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:308
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:358
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:381
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:367
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:393
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:324
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isFixedLengthVector() const
Definition ValueTypes.h:189
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:331
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
Definition ValueTypes.h:300
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:264
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:182
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:336
bool isExtended() const
Test if the given EVT is extended (as opposed to being simple).
Definition ValueTypes.h:150
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:344
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:316
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:469
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:317
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:271
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:108
bool isZero() const
Returns true if value is all zero.
Definition KnownBits.h:80
void makeNonNegative()
Make this value non-negative.
Definition KnownBits.h:127
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:258
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:66
unsigned countMaxTrailingZeros() const
Returns the maximum number of trailing zero bits possible.
Definition KnownBits.h:290
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:122
void setAllConflict()
Make all bits known to be both zero and one.
Definition KnownBits.h:99
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:167
KnownBits byteSwap() const
Definition KnownBits.h:538
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:305
void setAllZero()
Make all bits known to be zero and discard any previous information.
Definition KnownBits.h:86
KnownBits reverseBits() const
Definition KnownBits.h:542
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:249
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:178
void resetAll()
Resets the known state of all bits.
Definition KnownBits.h:74
KnownBits unionWith(const KnownBits &RHS) const
Returns KnownBits information that is known to be true for either this or RHS or both.
Definition KnownBits.h:337
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:111
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:241
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:327
KnownBits sext(unsigned BitWidth) const
Return known bits for a sign extension of the value we're tracking.
Definition KnownBits.h:186
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:202
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:148
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).
static LLVM_ABI KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition KnownBits.cpp:61
bool isStrictlyPositive() const
Returns true if this value is known to be positive.
Definition KnownBits.h:114
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:342
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:105
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
unsigned countMaxLeadingZeros() const
Returns the maximum number of leading zero bits possible.
Definition KnownBits.h:296
void insertBits(const KnownBits &SubBits, unsigned BitPosition)
Insert the bits from a smaller known bits starting at bitPosition.
Definition KnownBits.h:235
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:173
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.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI bool isDereferenceable(unsigned Size, LLVMContext &C, const DataLayout &DL) const
Return true if memory region [V, V+Offset+Size) is known to be dereferenceable.
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
static MemOp Set(uint64_t Size, bool DstAlignCanChange, Align DstAlign, bool IsZeroMemset, bool IsVolatile)
static MemOp Copy(uint64_t Size, bool DstAlignCanChange, Align DstAlign, Align SrcAlign, bool IsVolatile, bool MemcpyStrSrc=false)
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
unsigned int NumVTs
Clients of various APIs that cause global effects on the DAG can optionally implement this interface.
virtual void NodeDeleted(SDNode *N, SDNode *E)
The node N that was deleted and, if E is not null, an equivalent node E that replaced it.
virtual void NodeInserted(SDNode *N)
The node N that was inserted.
virtual void NodeUpdated(SDNode *N)
The node N that was updated.
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setTailCall(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)