LLVM 22.0.0git
ConstantsContext.h
Go to the documentation of this file.
1//===-- ConstantsContext.h - Constants-related Context Interals -*- C++ -*-===//
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 file defines various helper methods and classes used by
10// LLVMContextImpl for creating and managing constants.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_IR_CONSTANTSCONTEXT_H
15#define LLVM_LIB_IR_CONSTANTSCONTEXT_H
16
17#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/DenseSet.h"
20#include "llvm/ADT/Hashing.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/Constant.h"
24#include "llvm/IR/Constants.h"
27#include "llvm/IR/InlineAsm.h"
28#include "llvm/IR/Instruction.h"
32#include "llvm/Support/Debug.h"
35#include <cassert>
36#include <cstddef>
37#include <cstdint>
38#include <utility>
39
40#define DEBUG_TYPE "ir"
41
42namespace llvm {
43
44/// CastConstantExpr - This class is private to Constants.cpp, and is used
45/// behind the scenes to implement cast constant exprs.
46class CastConstantExpr final : public ConstantExpr {
47 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
48
49public:
50 CastConstantExpr(unsigned Opcode, Constant *C, Type *Ty)
51 : ConstantExpr(Ty, Opcode, AllocMarker) {
52 Op<0>() = C;
53 }
54
55 // allocate space for exactly one operand
56 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
57 void operator delete(void *Ptr) { User::operator delete(Ptr); }
58
60
61 static bool classof(const ConstantExpr *CE) {
62 return Instruction::isCast(CE->getOpcode());
63 }
64 static bool classof(const Value *V) {
66 }
67};
68
69/// BinaryConstantExpr - This class is private to Constants.cpp, and is used
70/// behind the scenes to implement binary constant exprs.
71class BinaryConstantExpr final : public ConstantExpr {
72 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
73
74public:
75 BinaryConstantExpr(unsigned Opcode, Constant *C1, Constant *C2,
76 unsigned Flags)
77 : ConstantExpr(C1->getType(), Opcode, AllocMarker) {
78 Op<0>() = C1;
79 Op<1>() = C2;
81 }
82
83 // allocate space for exactly two operands
84 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
85 void operator delete(void *Ptr) { User::operator delete(Ptr); }
86
87 /// Transparently provide more efficient getOperand methods.
89
90 static bool classof(const ConstantExpr *CE) {
91 return Instruction::isBinaryOp(CE->getOpcode());
92 }
93 static bool classof(const Value *V) {
95 }
96};
97
98/// ExtractElementConstantExpr - This class is private to
99/// Constants.cpp, and is used behind the scenes to implement
100/// extractelement constant exprs.
102 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
103
104public:
106 : ConstantExpr(cast<VectorType>(C1->getType())->getElementType(),
107 Instruction::ExtractElement, AllocMarker) {
108 Op<0>() = C1;
109 Op<1>() = C2;
110 }
111
112 // allocate space for exactly two operands
113 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
114 void operator delete(void *Ptr) { User::operator delete(Ptr); }
115
116 /// Transparently provide more efficient getOperand methods.
118
119 static bool classof(const ConstantExpr *CE) {
120 return CE->getOpcode() == Instruction::ExtractElement;
121 }
122 static bool classof(const Value *V) {
124 }
125};
126
127/// InsertElementConstantExpr - This class is private to
128/// Constants.cpp, and is used behind the scenes to implement
129/// insertelement constant exprs.
131 constexpr static IntrusiveOperandsAllocMarker AllocMarker{3};
132
133public:
135 : ConstantExpr(C1->getType(), Instruction::InsertElement, AllocMarker) {
136 Op<0>() = C1;
137 Op<1>() = C2;
138 Op<2>() = C3;
139 }
140
141 // allocate space for exactly three operands
142 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
143 void operator delete(void *Ptr) { User::operator delete(Ptr); }
144
145 /// Transparently provide more efficient getOperand methods.
147
148 static bool classof(const ConstantExpr *CE) {
149 return CE->getOpcode() == Instruction::InsertElement;
150 }
151 static bool classof(const Value *V) {
153 }
154};
155
156/// ShuffleVectorConstantExpr - This class is private to
157/// Constants.cpp, and is used behind the scenes to implement
158/// shufflevector constant exprs.
160 constexpr static IntrusiveOperandsAllocMarker AllocMarker{2};
161
162public:
165 cast<VectorType>(C1->getType())->getElementType(),
166 Mask.size(), isa<ScalableVectorType>(C1->getType())),
167 Instruction::ShuffleVector, AllocMarker) {
169 "Invalid shuffle vector instruction operands!");
170 Op<0>() = C1;
171 Op<1>() = C2;
172 ShuffleMask.assign(Mask.begin(), Mask.end());
175 }
176
179
180 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
181 void operator delete(void *Ptr) { return User::operator delete(Ptr); }
182
183 /// Transparently provide more efficient getOperand methods.
185
186 static bool classof(const ConstantExpr *CE) {
187 return CE->getOpcode() == Instruction::ShuffleVector;
188 }
189 static bool classof(const Value *V) {
191 }
192};
193
194/// GetElementPtrConstantExpr - This class is private to Constants.cpp, and is
195/// used behind the scenes to implement getelementptr constant exprs.
196class GetElementPtrConstantExpr : public ConstantExpr {
197 Type *SrcElementTy;
198 Type *ResElementTy;
199 std::optional<ConstantRange> InRange;
200
201 GetElementPtrConstantExpr(Type *SrcElementTy, Constant *C,
202 ArrayRef<Constant *> IdxList, Type *DestTy,
203 std::optional<ConstantRange> InRange,
205
206public:
207 static GetElementPtrConstantExpr *
208 Create(Type *SrcElementTy, Constant *C, ArrayRef<Constant *> IdxList,
209 Type *DestTy, unsigned Flags, std::optional<ConstantRange> InRange) {
210 IntrusiveOperandsAllocMarker AllocMarker{unsigned(IdxList.size() + 1)};
211 GetElementPtrConstantExpr *Result = new (AllocMarker)
212 GetElementPtrConstantExpr(SrcElementTy, C, IdxList, DestTy,
213 std::move(InRange), AllocMarker);
214 Result->SubclassOptionalData = Flags;
215 return Result;
216 }
217
218 Type *getSourceElementType() const;
219 Type *getResultElementType() const;
220 std::optional<ConstantRange> getInRange() const;
221
222 /// Transparently provide more efficient getOperand methods.
224
225 static bool classof(const ConstantExpr *CE) {
226 return CE->getOpcode() == Instruction::GetElementPtr;
227 }
228 static bool classof(const Value *V) {
230 }
231};
232
233template <>
235 : public FixedNumOperandTraits<CastConstantExpr, 1> {};
237
238template <>
240 : public FixedNumOperandTraits<BinaryConstantExpr, 2> {};
242
243template <>
245 : public FixedNumOperandTraits<ExtractElementConstantExpr, 2> {};
247
248template <>
250 : public FixedNumOperandTraits<InsertElementConstantExpr, 3> {};
252
253template <>
255 : public FixedNumOperandTraits<ShuffleVectorConstantExpr, 2> {};
257
258template <>
260 : public VariadicOperandTraits<GetElementPtrConstantExpr> {};
261
263
264template <class ConstantClass> struct ConstantAggrKeyType;
265struct InlineAsmKeyType;
268
269template <class ConstantClass> struct ConstantInfo;
270template <> struct ConstantInfo<ConstantExpr> {
273};
274template <> struct ConstantInfo<InlineAsm> {
277};
294
295template <class ConstantClass> struct ConstantAggrKeyType {
297
299
302
303 ConstantAggrKeyType(const ConstantClass *C,
305 assert(Storage.empty() && "Expected empty storage");
306 Storage.reserve(C->getNumOperands());
307 for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I)
308 Storage.push_back(C->getOperand(I));
309 Operands = Storage;
310 }
311
312 bool operator==(const ConstantAggrKeyType &X) const {
313 return Operands == X.Operands;
314 }
315
316 bool operator==(const ConstantClass *C) const {
317 if (Operands.size() != C->getNumOperands())
318 return false;
319 for (unsigned I = 0, E = Operands.size(); I != E; ++I)
320 if (Operands[I] != C->getOperand(I))
321 return false;
322 return true;
323 }
324
325 unsigned getHash() const { return hash_combine_range(Operands); }
326
328
329 ConstantClass *create(TypeClass *Ty) const {
331 return new (AllocMarker) ConstantClass(Ty, Operands, AllocMarker);
332 }
333};
334
343
350
352 : AsmString(Asm->getAsmString()), Constraints(Asm->getConstraintString()),
353 FTy(Asm->getFunctionType()), HasSideEffects(Asm->hasSideEffects()),
354 IsAlignStack(Asm->isAlignStack()), AsmDialect(Asm->getDialect()),
355 CanThrow(Asm->canThrow()) {}
356
357 bool operator==(const InlineAsmKeyType &X) const {
358 return HasSideEffects == X.HasSideEffects &&
359 IsAlignStack == X.IsAlignStack && AsmDialect == X.AsmDialect &&
360 AsmString == X.AsmString && Constraints == X.Constraints &&
361 FTy == X.FTy && CanThrow == X.CanThrow;
362 }
363
364 bool operator==(const InlineAsm *Asm) const {
365 return HasSideEffects == Asm->hasSideEffects() &&
366 IsAlignStack == Asm->isAlignStack() &&
367 AsmDialect == Asm->getDialect() &&
368 AsmString == Asm->getAsmString() &&
369 Constraints == Asm->getConstraintString() &&
370 FTy == Asm->getFunctionType() && CanThrow == Asm->canThrow();
371 }
372
377
379
381 assert(PointerType::getUnqual(FTy->getContext()) == Ty);
382 return new InlineAsm(FTy, std::string(AsmString), std::string(Constraints),
384 }
385};
386
388private:
389 uint8_t Opcode;
390 uint8_t SubclassOptionalData;
392 ArrayRef<int> ShuffleMask;
393 Type *ExplicitTy;
394 std::optional<ConstantRange> InRange;
395
396 static ArrayRef<int> getShuffleMaskIfValid(const ConstantExpr *CE) {
397 if (CE->getOpcode() == Instruction::ShuffleVector)
398 return CE->getShuffleMask();
399 return {};
400 }
401
402 static Type *getSourceElementTypeIfValid(const ConstantExpr *CE) {
403 if (auto *GEPCE = dyn_cast<GetElementPtrConstantExpr>(CE))
404 return GEPCE->getSourceElementType();
405 return nullptr;
406 }
407
408 static std::optional<ConstantRange>
409 getInRangeIfValid(const ConstantExpr *CE) {
410 if (auto *GEPCE = dyn_cast<GetElementPtrConstantExpr>(CE))
411 return GEPCE->getInRange();
412 return std::nullopt;
413 }
414
415public:
417 unsigned short SubclassOptionalData = 0,
418 ArrayRef<int> ShuffleMask = {},
419 Type *ExplicitTy = nullptr,
420 std::optional<ConstantRange> InRange = std::nullopt)
421 : Opcode(Opcode), SubclassOptionalData(SubclassOptionalData), Ops(Ops),
422 ShuffleMask(ShuffleMask), ExplicitTy(ExplicitTy),
423 InRange(std::move(InRange)) {}
424
426 : Opcode(CE->getOpcode()),
427 SubclassOptionalData(CE->getRawSubclassOptionalData()), Ops(Operands),
428 ShuffleMask(getShuffleMaskIfValid(CE)),
429 ExplicitTy(getSourceElementTypeIfValid(CE)),
430 InRange(getInRangeIfValid(CE)) {}
431
434 : Opcode(CE->getOpcode()),
435 SubclassOptionalData(CE->getRawSubclassOptionalData()),
436 ShuffleMask(getShuffleMaskIfValid(CE)),
437 ExplicitTy(getSourceElementTypeIfValid(CE)),
438 InRange(getInRangeIfValid(CE)) {
439 assert(Storage.empty() && "Expected empty storage");
440 for (unsigned I = 0, E = CE->getNumOperands(); I != E; ++I)
441 Storage.push_back(CE->getOperand(I));
442 Ops = Storage;
443 }
444
445 static bool rangesEqual(const std::optional<ConstantRange> &A,
446 const std::optional<ConstantRange> &B) {
447 if (!A.has_value() || !B.has_value())
448 return A.has_value() == B.has_value();
449 return A->getBitWidth() == B->getBitWidth() && A == B;
450 }
451
452 bool operator==(const ConstantExprKeyType &X) const {
453 return Opcode == X.Opcode &&
454 SubclassOptionalData == X.SubclassOptionalData && Ops == X.Ops &&
455 ShuffleMask == X.ShuffleMask && ExplicitTy == X.ExplicitTy &&
456 rangesEqual(InRange, X.InRange);
457 }
458
459 bool operator==(const ConstantExpr *CE) const {
460 if (Opcode != CE->getOpcode())
461 return false;
462 if (SubclassOptionalData != CE->getRawSubclassOptionalData())
463 return false;
464 if (Ops.size() != CE->getNumOperands())
465 return false;
466 for (unsigned I = 0, E = Ops.size(); I != E; ++I)
467 if (Ops[I] != CE->getOperand(I))
468 return false;
469 if (ShuffleMask != getShuffleMaskIfValid(CE))
470 return false;
471 if (ExplicitTy != getSourceElementTypeIfValid(CE))
472 return false;
473 if (!rangesEqual(InRange, getInRangeIfValid(CE)))
474 return false;
475 return true;
476 }
477
478 unsigned getHash() const {
479 return hash_combine(Opcode, SubclassOptionalData, hash_combine_range(Ops),
480 hash_combine_range(ShuffleMask), ExplicitTy);
481 }
482
484
486 switch (Opcode) {
487 default:
488 if (Instruction::isCast(Opcode))
489 return new CastConstantExpr(Opcode, Ops[0], Ty);
490 if (Instruction::isBinaryOp(Opcode))
491 return new BinaryConstantExpr(Opcode, Ops[0], Ops[1],
492 SubclassOptionalData);
493 llvm_unreachable("Invalid ConstantExpr!");
494 case Instruction::ExtractElement:
495 return new ExtractElementConstantExpr(Ops[0], Ops[1]);
496 case Instruction::InsertElement:
497 return new InsertElementConstantExpr(Ops[0], Ops[1], Ops[2]);
498 case Instruction::ShuffleVector:
499 return new ShuffleVectorConstantExpr(Ops[0], Ops[1], ShuffleMask);
500 case Instruction::GetElementPtr:
502 ExplicitTy, Ops[0], Ops.slice(1), Ty, SubclassOptionalData, InRange);
503 }
504 }
505};
506
509
511
514
517 assert(Storage.empty() && "Expected empty storage");
518 for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I)
519 Storage.push_back(cast<Constant>(C->getOperand(I)));
520 Operands = Storage;
521 }
522
524 return Operands == X.Operands;
525 }
526
527 bool operator==(const ConstantPtrAuth *C) const {
528 if (Operands.size() != C->getNumOperands())
529 return false;
530 for (unsigned I = 0, E = Operands.size(); I != E; ++I)
531 if (Operands[I] != C->getOperand(I))
532 return false;
533 return true;
534 }
535
536 unsigned getHash() const { return hash_combine_range(Operands); }
537
539
545};
546
547// Free memory for a given constant. Assumes the constant has already been
548// removed from all relevant maps.
549void deleteConstant(Constant *C);
550
551template <class ConstantClass> class ConstantUniqueMap {
552public:
555 using LookupKey = std::pair<TypeClass *, ValType>;
556
557 /// Key and hash together, so that we compute the hash only once and reuse it.
558 using LookupKeyHashed = std::pair<unsigned, LookupKey>;
559
560private:
561 struct MapInfo {
562 using ConstantClassInfo = DenseMapInfo<ConstantClass *>;
563
564 static inline ConstantClass *getEmptyKey() {
565 return ConstantClassInfo::getEmptyKey();
566 }
567
568 static inline ConstantClass *getTombstoneKey() {
569 return ConstantClassInfo::getTombstoneKey();
570 }
571
572 static unsigned getHashValue(const ConstantClass *CP) {
574 return getHashValue(LookupKey(CP->getType(), ValType(CP, Storage)));
575 }
576
577 static bool isEqual(const ConstantClass *LHS, const ConstantClass *RHS) {
578 return LHS == RHS;
579 }
580
581 static unsigned getHashValue(const LookupKey &Val) {
582 return hash_combine(Val.first, Val.second.getHash());
583 }
584
585 static unsigned getHashValue(const LookupKeyHashed &Val) {
586 return Val.first;
587 }
588
589 static bool isEqual(const LookupKey &LHS, const ConstantClass *RHS) {
590 if (RHS == getEmptyKey() || RHS == getTombstoneKey())
591 return false;
592 if (LHS.first != RHS->getType())
593 return false;
594 return LHS.second == RHS;
595 }
596
597 static bool isEqual(const LookupKeyHashed &LHS, const ConstantClass *RHS) {
598 return isEqual(LHS.second, RHS);
599 }
600 };
601
602public:
604
605private:
606 MapTy Map;
607
608public:
609 typename MapTy::iterator begin() { return Map.begin(); }
610 typename MapTy::iterator end() { return Map.end(); }
611
613 for (auto &I : Map)
615 }
616
617private:
618 ConstantClass *create(TypeClass *Ty, ValType V, LookupKeyHashed &HashKey) {
619 ConstantClass *Result = V.create(Ty);
620
621 assert(Result->getType() == Ty && "Type specified is not correct!");
622 Map.insert_as(Result, HashKey);
623
624 return Result;
625 }
626
627public:
628 /// Return the specified constant from the map, creating it if necessary.
629 ConstantClass *getOrCreate(TypeClass *Ty, ValType V) {
630 LookupKey Key(Ty, V);
631 /// Hash once, and reuse it for the lookup and the insertion if needed.
632 LookupKeyHashed Lookup(MapInfo::getHashValue(Key), Key);
633
634 ConstantClass *Result = nullptr;
635
636 auto I = Map.find_as(Lookup);
637 if (I == Map.end())
638 Result = create(Ty, V, Lookup);
639 else
640 Result = *I;
641 assert(Result && "Unexpected nullptr");
642
643 return Result;
644 }
645
646 /// Remove this constant from the map
647 void remove(ConstantClass *CP) {
648 typename MapTy::iterator I = Map.find(CP);
649 assert(I != Map.end() && "Constant not found in constant table!");
650 assert(*I == CP && "Didn't find correct element?");
651 Map.erase(I);
652 }
653
655 ConstantClass *CP, Value *From,
656 Constant *To, unsigned NumUpdated = 0,
657 unsigned OperandNo = ~0u) {
658 LookupKey Key(CP->getType(), ValType(Operands, CP));
659 /// Hash once, and reuse it for the lookup and the insertion if needed.
660 LookupKeyHashed Lookup(MapInfo::getHashValue(Key), Key);
661
662 auto ItMap = Map.find_as(Lookup);
663 if (ItMap != Map.end())
664 return *ItMap;
665
666 // Update to the new value. Optimize for the case when we have a single
667 // operand that we're changing, but handle bulk updates efficiently.
668 remove(CP);
669 if (NumUpdated == 1) {
670 assert(OperandNo < CP->getNumOperands() && "Invalid index");
671 assert(CP->getOperand(OperandNo) != To && "I didn't contain From!");
672 CP->setOperand(OperandNo, To);
673 } else {
674 for (unsigned I = 0, E = CP->getNumOperands(); I != E; ++I)
675 if (CP->getOperand(I) == From)
676 CP->setOperand(I, To);
677 }
678 Map.insert_as(CP, Lookup);
679 return nullptr;
680 }
681
682 void dump() const {
683 LLVM_DEBUG(dbgs() << "Constant.cpp: ConstantUniqueMap\n");
684 }
685};
686
688 for (auto &I : Map)
689 delete I;
690}
691
692} // end namespace llvm
693
694#endif // LLVM_LIB_IR_CONSTANTSCONTEXT_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseSet and SmallDenseSet classes.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define I(x, y, z)
Definition MD5.cpp:57
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
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 bool canThrow(const Value *V)
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
Value * RHS
Value * LHS
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
Class to represent array types.
BinaryConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to impleme...
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static bool classof(const ConstantExpr *CE)
static bool classof(const Value *V)
BinaryConstantExpr(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags)
CastConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to implement...
static bool classof(const Value *V)
static bool classof(const ConstantExpr *CE)
CastConstantExpr(unsigned Opcode, Constant *C, Type *Ty)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
ConstantArray - Constant Array Declarations.
Definition Constants.h:433
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1125
ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
Definition Constants.h:1133
friend class Constant
Definition Constants.h:1127
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
A signed pointer, in the ptrauth sense.
Definition Constants.h:1032
typename ConstantInfo< ConstantClass >::ValType ValType
typename ConstantInfo< ConstantClass >::TypeClass TypeClass
ConstantClass * getOrCreate(TypeClass *Ty, ValType V)
Return the specified constant from the map, creating it if necessary.
std::pair< unsigned, LookupKey > LookupKeyHashed
Key and hash together, so that we compute the hash only once and reuse it.
void remove(ConstantClass *CP)
Remove this constant from the map.
ConstantClass * replaceOperandsInPlace(ArrayRef< Constant * > Operands, ConstantClass *CP, Value *From, Constant *To, unsigned NumUpdated=0, unsigned OperandNo=~0u)
DenseSet< ConstantClass *, MapInfo > MapTy
std::pair< TypeClass *, ValType > LookupKey
Constant Vector Declarations.
Definition Constants.h:517
This is an important base class in LLVM.
Definition Constant.h:43
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
ExtractElementConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to...
ExtractElementConstantExpr(Constant *C1, Constant *C2)
static bool classof(const ConstantExpr *CE)
static bool classof(const Value *V)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
Class to represent function types.
GetElementPtrConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
std::optional< ConstantRange > getInRange() const
static bool classof(const ConstantExpr *CE)
static bool classof(const Value *V)
static GetElementPtrConstantExpr * Create(Type *SrcElementTy, Constant *C, ArrayRef< Constant * > IdxList, Type *DestTy, unsigned Flags, std::optional< ConstantRange > InRange)
InsertElementConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
static bool classof(const ConstantExpr *CE)
InsertElementConstantExpr(Constant *C1, Constant *C2, Constant *C3)
static bool classof(const Value *V)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
bool isCast() const
bool isBinaryOp() const
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...
Class to represent scalable SIMD vectors.
ShuffleVectorConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
SmallVector< int, 4 > ShuffleMask
static bool classof(const ConstantExpr *CE)
ShuffleVectorConstantExpr(Constant *C1, Constant *C2, ArrayRef< int > Mask)
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static bool classof(const Value *V)
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
static LLVM_ABI Constant * convertShuffleMaskForBitcode(ArrayRef< int > Mask, Type *ResultTy)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Class to represent struct types.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
unsigned char SubclassOptionalData
Hold subclass data that can be dropped.
Definition Value.h:85
Base class of all SIMD vector types.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1655
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
void deleteConstant(Constant *C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
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_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
DWARFExpression::Operation Op
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1867
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition Hashing.h:592
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition Hashing.h:466
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:867
bool operator==(const ConstantClass *C) const
ConstantAggrKeyType(ArrayRef< Constant * > Operands)
ConstantAggrKeyType(ArrayRef< Constant * > Operands, const ConstantClass *)
typename ConstantInfo< ConstantArray >::TypeClass TypeClass
ConstantClass * create(TypeClass *Ty) const
ConstantAggrKeyType(const ConstantClass *C, SmallVectorImpl< Constant * > &Storage)
bool operator==(const ConstantAggrKeyType &X) const
ConstantExprKeyType(unsigned Opcode, ArrayRef< Constant * > Ops, unsigned short SubclassOptionalData=0, ArrayRef< int > ShuffleMask={}, Type *ExplicitTy=nullptr, std::optional< ConstantRange > InRange=std::nullopt)
ConstantExprKeyType(const ConstantExpr *CE, SmallVectorImpl< Constant * > &Storage)
ConstantInfo< ConstantExpr >::TypeClass TypeClass
static bool rangesEqual(const std::optional< ConstantRange > &A, const std::optional< ConstantRange > &B)
ConstantExpr * create(TypeClass *Ty) const
bool operator==(const ConstantExprKeyType &X) const
bool operator==(const ConstantExpr *CE) const
ConstantExprKeyType(ArrayRef< Constant * > Operands, const ConstantExpr *CE)
ConstantAggrKeyType< ConstantArray > ValType
ConstantAggrKeyType< ConstantStruct > ValType
ConstantAggrKeyType< ConstantVector > ValType
bool operator==(const ConstantPtrAuthKeyType &X) const
ArrayRef< Constant * > Operands
ConstantPtrAuthKeyType(ArrayRef< Constant * > Operands, const ConstantPtrAuth *)
ConstantPtrAuthKeyType(const ConstantPtrAuth *C, SmallVectorImpl< Constant * > &Storage)
ConstantPtrAuthKeyType(ArrayRef< Constant * > Operands)
bool operator==(const ConstantPtrAuth *C) const
ConstantPtrAuth * create(TypeClass *Ty) const
ConstantInfo< ConstantPtrAuth >::TypeClass TypeClass
An information struct used to provide DenseMap with the various necessary components for a given valu...
FixedNumOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
bool operator==(const InlineAsmKeyType &X) const
ConstantInfo< InlineAsm >::TypeClass TypeClass
InlineAsm * create(TypeClass *Ty) const
bool operator==(const InlineAsm *Asm) const
InlineAsmKeyType(const InlineAsm *Asm, SmallVectorImpl< Constant * > &)
InlineAsmKeyType(StringRef AsmString, StringRef Constraints, FunctionType *FTy, bool HasSideEffects, bool IsAlignStack, InlineAsm::AsmDialect AsmDialect, bool canThrow)
InlineAsm::AsmDialect AsmDialect
Compile-time customization of User operands.
Definition User.h:42
Information about how a User object was allocated, to be passed into the User constructor.
Definition User.h:79
Indicates this User has operands co-allocated.
Definition User.h:60
VariadicOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...