LLVM 23.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, AllocMarker); }
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, AllocMarker); }
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, AllocMarker); }
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, AllocMarker); }
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) {
182 return User::operator delete(Ptr, AllocMarker);
183 }
184
185 /// Transparently provide more efficient getOperand methods.
187
188 static bool classof(const ConstantExpr *CE) {
189 return CE->getOpcode() == Instruction::ShuffleVector;
190 }
191 static bool classof(const Value *V) {
193 }
194};
195
196/// GetElementPtrConstantExpr - This class is private to Constants.cpp, and is
197/// used behind the scenes to implement getelementptr constant exprs.
198class GetElementPtrConstantExpr : public ConstantExpr {
199 Type *SrcElementTy;
200 Type *ResElementTy;
201 std::optional<ConstantRange> InRange;
202
203 GetElementPtrConstantExpr(Type *SrcElementTy, Constant *C,
204 ArrayRef<Constant *> IdxList, Type *DestTy,
205 std::optional<ConstantRange> InRange,
207
208public:
209 static GetElementPtrConstantExpr *
210 Create(Type *SrcElementTy, Constant *C, ArrayRef<Constant *> IdxList,
211 Type *DestTy, unsigned Flags, std::optional<ConstantRange> InRange) {
212 IntrusiveOperandsAllocMarker AllocMarker{unsigned(IdxList.size() + 1)};
213 GetElementPtrConstantExpr *Result = new (AllocMarker)
214 GetElementPtrConstantExpr(SrcElementTy, C, IdxList, DestTy,
215 std::move(InRange), AllocMarker);
216 Result->SubclassOptionalData = Flags;
217 return Result;
218 }
219
220 Type *getSourceElementType() const;
221 Type *getResultElementType() const;
222 std::optional<ConstantRange> getInRange() const;
223
224 /// Transparently provide more efficient getOperand methods.
226
227 static bool classof(const ConstantExpr *CE) {
228 return CE->getOpcode() == Instruction::GetElementPtr;
229 }
230 static bool classof(const Value *V) {
232 }
233};
234
235template <>
237 : public FixedNumOperandTraits<CastConstantExpr, 1> {};
239
240template <>
242 : public FixedNumOperandTraits<BinaryConstantExpr, 2> {};
244
245template <>
247 : public FixedNumOperandTraits<ExtractElementConstantExpr, 2> {};
249
250template <>
252 : public FixedNumOperandTraits<InsertElementConstantExpr, 3> {};
254
255template <>
257 : public FixedNumOperandTraits<ShuffleVectorConstantExpr, 2> {};
259
260template <>
262 : public VariadicOperandTraits<GetElementPtrConstantExpr> {};
263
265
266template <class ConstantClass> struct ConstantAggrKeyType;
267struct InlineAsmKeyType;
270
271template <class ConstantClass> struct ConstantInfo;
272template <> struct ConstantInfo<ConstantExpr> {
275};
276template <> struct ConstantInfo<InlineAsm> {
279};
296
297template <class ConstantClass> struct ConstantAggrKeyType {
299
301
304
305 ConstantAggrKeyType(const ConstantClass *C,
307 assert(Storage.empty() && "Expected empty storage");
308 Storage.reserve(C->getNumOperands());
309 for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I)
310 Storage.push_back(C->getOperand(I));
311 Operands = Storage;
312 }
313
314 bool operator==(const ConstantAggrKeyType &X) const {
315 return Operands == X.Operands;
316 }
317
318 bool operator==(const ConstantClass *C) const {
319 if (Operands.size() != C->getNumOperands())
320 return false;
321 for (unsigned I = 0, E = Operands.size(); I != E; ++I)
322 if (Operands[I] != C->getOperand(I))
323 return false;
324 return true;
325 }
326
327 unsigned getHash() const { return hash_combine_range(Operands); }
328
330
331 ConstantClass *create(TypeClass *Ty) const {
333 return new (AllocMarker) ConstantClass(Ty, Operands, AllocMarker);
334 }
335};
336
345
352
354 : AsmString(Asm->getAsmString()), Constraints(Asm->getConstraintString()),
355 FTy(Asm->getFunctionType()), HasSideEffects(Asm->hasSideEffects()),
356 IsAlignStack(Asm->isAlignStack()), AsmDialect(Asm->getDialect()),
357 CanThrow(Asm->canThrow()) {}
358
359 bool operator==(const InlineAsmKeyType &X) const {
360 return HasSideEffects == X.HasSideEffects &&
361 IsAlignStack == X.IsAlignStack && AsmDialect == X.AsmDialect &&
362 AsmString == X.AsmString && Constraints == X.Constraints &&
363 FTy == X.FTy && CanThrow == X.CanThrow;
364 }
365
366 bool operator==(const InlineAsm *Asm) const {
367 return HasSideEffects == Asm->hasSideEffects() &&
368 IsAlignStack == Asm->isAlignStack() &&
369 AsmDialect == Asm->getDialect() &&
370 AsmString == Asm->getAsmString() &&
371 Constraints == Asm->getConstraintString() &&
372 FTy == Asm->getFunctionType() && CanThrow == Asm->canThrow();
373 }
374
379
381
383 assert(PointerType::getUnqual(FTy->getContext()) == Ty);
384 return new InlineAsm(FTy, std::string(AsmString), std::string(Constraints),
386 }
387};
388
390private:
391 uint8_t Opcode;
392 uint8_t SubclassOptionalData;
394 ArrayRef<int> ShuffleMask;
395 Type *ExplicitTy;
396 std::optional<ConstantRange> InRange;
397
398 static ArrayRef<int> getShuffleMaskIfValid(const ConstantExpr *CE) {
399 if (CE->getOpcode() == Instruction::ShuffleVector)
400 return CE->getShuffleMask();
401 return {};
402 }
403
404 static Type *getSourceElementTypeIfValid(const ConstantExpr *CE) {
405 if (auto *GEPCE = dyn_cast<GetElementPtrConstantExpr>(CE))
406 return GEPCE->getSourceElementType();
407 return nullptr;
408 }
409
410 static std::optional<ConstantRange>
411 getInRangeIfValid(const ConstantExpr *CE) {
412 if (auto *GEPCE = dyn_cast<GetElementPtrConstantExpr>(CE))
413 return GEPCE->getInRange();
414 return std::nullopt;
415 }
416
417public:
419 unsigned short SubclassOptionalData = 0,
420 ArrayRef<int> ShuffleMask = {},
421 Type *ExplicitTy = nullptr,
422 std::optional<ConstantRange> InRange = std::nullopt)
423 : Opcode(Opcode), SubclassOptionalData(SubclassOptionalData), Ops(Ops),
424 ShuffleMask(ShuffleMask), ExplicitTy(ExplicitTy),
425 InRange(std::move(InRange)) {}
426
428 : Opcode(CE->getOpcode()),
429 SubclassOptionalData(CE->getRawSubclassOptionalData()), Ops(Operands),
430 ShuffleMask(getShuffleMaskIfValid(CE)),
431 ExplicitTy(getSourceElementTypeIfValid(CE)),
432 InRange(getInRangeIfValid(CE)) {}
433
436 : Opcode(CE->getOpcode()),
437 SubclassOptionalData(CE->getRawSubclassOptionalData()),
438 ShuffleMask(getShuffleMaskIfValid(CE)),
439 ExplicitTy(getSourceElementTypeIfValid(CE)),
440 InRange(getInRangeIfValid(CE)) {
441 assert(Storage.empty() && "Expected empty storage");
442 for (unsigned I = 0, E = CE->getNumOperands(); I != E; ++I)
443 Storage.push_back(CE->getOperand(I));
444 Ops = Storage;
445 }
446
447 static bool rangesEqual(const std::optional<ConstantRange> &A,
448 const std::optional<ConstantRange> &B) {
449 if (!A.has_value() || !B.has_value())
450 return A.has_value() == B.has_value();
451 return A->getBitWidth() == B->getBitWidth() && A == B;
452 }
453
454 bool operator==(const ConstantExprKeyType &X) const {
455 return Opcode == X.Opcode &&
456 SubclassOptionalData == X.SubclassOptionalData && Ops == X.Ops &&
457 ShuffleMask == X.ShuffleMask && ExplicitTy == X.ExplicitTy &&
458 rangesEqual(InRange, X.InRange);
459 }
460
461 bool operator==(const ConstantExpr *CE) const {
462 if (Opcode != CE->getOpcode())
463 return false;
464 if (SubclassOptionalData != CE->getRawSubclassOptionalData())
465 return false;
466 if (Ops.size() != CE->getNumOperands())
467 return false;
468 for (unsigned I = 0, E = Ops.size(); I != E; ++I)
469 if (Ops[I] != CE->getOperand(I))
470 return false;
471 if (ShuffleMask != getShuffleMaskIfValid(CE))
472 return false;
473 if (ExplicitTy != getSourceElementTypeIfValid(CE))
474 return false;
475 if (!rangesEqual(InRange, getInRangeIfValid(CE)))
476 return false;
477 return true;
478 }
479
480 unsigned getHash() const {
481 return hash_combine(Opcode, SubclassOptionalData, hash_combine_range(Ops),
482 hash_combine_range(ShuffleMask), ExplicitTy);
483 }
484
486
488 switch (Opcode) {
489 default:
490 if (Instruction::isCast(Opcode))
491 return new CastConstantExpr(Opcode, Ops[0], Ty);
492 if (Instruction::isBinaryOp(Opcode))
493 return new BinaryConstantExpr(Opcode, Ops[0], Ops[1],
494 SubclassOptionalData);
495 llvm_unreachable("Invalid ConstantExpr!");
496 case Instruction::ExtractElement:
497 return new ExtractElementConstantExpr(Ops[0], Ops[1]);
498 case Instruction::InsertElement:
499 return new InsertElementConstantExpr(Ops[0], Ops[1], Ops[2]);
500 case Instruction::ShuffleVector:
501 return new ShuffleVectorConstantExpr(Ops[0], Ops[1], ShuffleMask);
502 case Instruction::GetElementPtr:
504 ExplicitTy, Ops[0], Ops.slice(1), Ty, SubclassOptionalData, InRange);
505 }
506 }
507};
508
511
513
516
519 assert(Storage.empty() && "Expected empty storage");
520 for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I)
521 Storage.push_back(cast<Constant>(C->getOperand(I)));
522 Operands = Storage;
523 }
524
526 return Operands == X.Operands;
527 }
528
529 bool operator==(const ConstantPtrAuth *C) const {
530 if (Operands.size() != C->getNumOperands())
531 return false;
532 for (unsigned I = 0, E = Operands.size(); I != E; ++I)
533 if (Operands[I] != C->getOperand(I))
534 return false;
535 return true;
536 }
537
538 unsigned getHash() const { return hash_combine_range(Operands); }
539
541
547};
548
549// Free memory for a given constant. Assumes the constant has already been
550// removed from all relevant maps.
551void deleteConstant(Constant *C);
552
553template <class ConstantClass> class ConstantUniqueMap {
554public:
557 using LookupKey = std::pair<TypeClass *, ValType>;
558
559 /// Key and hash together, so that we compute the hash only once and reuse it.
560 using LookupKeyHashed = std::pair<unsigned, LookupKey>;
561
562private:
563 struct MapInfo {
564 using ConstantClassInfo = DenseMapInfo<ConstantClass *>;
565
566 static inline ConstantClass *getEmptyKey() {
567 return ConstantClassInfo::getEmptyKey();
568 }
569
570 static inline ConstantClass *getTombstoneKey() {
571 return ConstantClassInfo::getTombstoneKey();
572 }
573
574 static unsigned getHashValue(const ConstantClass *CP) {
576 return getHashValue(LookupKey(CP->getType(), ValType(CP, Storage)));
577 }
578
579 static bool isEqual(const ConstantClass *LHS, const ConstantClass *RHS) {
580 return LHS == RHS;
581 }
582
583 static unsigned getHashValue(const LookupKey &Val) {
584 return hash_combine(Val.first, Val.second.getHash());
585 }
586
587 static unsigned getHashValue(const LookupKeyHashed &Val) {
588 return Val.first;
589 }
590
591 static bool isEqual(const LookupKey &LHS, const ConstantClass *RHS) {
592 if (RHS == getEmptyKey() || RHS == getTombstoneKey())
593 return false;
594 if (LHS.first != RHS->getType())
595 return false;
596 return LHS.second == RHS;
597 }
598
599 static bool isEqual(const LookupKeyHashed &LHS, const ConstantClass *RHS) {
600 return isEqual(LHS.second, RHS);
601 }
602 };
603
604public:
606
607private:
608 MapTy Map;
609
610public:
611 typename MapTy::iterator begin() { return Map.begin(); }
612 typename MapTy::iterator end() { return Map.end(); }
613
615 for (auto &I : Map)
617 }
618
619private:
620 ConstantClass *create(TypeClass *Ty, ValType V, LookupKeyHashed &HashKey) {
621 ConstantClass *Result = V.create(Ty);
622
623 assert(Result->getType() == Ty && "Type specified is not correct!");
624 Map.insert_as(Result, HashKey);
625
626 return Result;
627 }
628
629public:
630 /// Return the specified constant from the map, creating it if necessary.
631 ConstantClass *getOrCreate(TypeClass *Ty, ValType V) {
632 LookupKey Key(Ty, V);
633 /// Hash once, and reuse it for the lookup and the insertion if needed.
634 LookupKeyHashed Lookup(MapInfo::getHashValue(Key), Key);
635
636 ConstantClass *Result = nullptr;
637
638 auto I = Map.find_as(Lookup);
639 if (I == Map.end())
640 Result = create(Ty, V, Lookup);
641 else
642 Result = *I;
643 assert(Result && "Unexpected nullptr");
644
645 return Result;
646 }
647
648 /// Remove this constant from the map
649 void remove(ConstantClass *CP) {
650 typename MapTy::iterator I = Map.find(CP);
651 assert(I != Map.end() && "Constant not found in constant table!");
652 assert(*I == CP && "Didn't find correct element?");
653 Map.erase(I);
654 }
655
657 ConstantClass *CP, Value *From,
658 Constant *To, unsigned NumUpdated = 0,
659 unsigned OperandNo = ~0u) {
660 LookupKey Key(CP->getType(), ValType(Operands, CP));
661 /// Hash once, and reuse it for the lookup and the insertion if needed.
662 LookupKeyHashed Lookup(MapInfo::getHashValue(Key), Key);
663
664 auto ItMap = Map.find_as(Lookup);
665 if (ItMap != Map.end())
666 return *ItMap;
667
668 // Update to the new value. Optimize for the case when we have a single
669 // operand that we're changing, but handle bulk updates efficiently.
670 remove(CP);
671 if (NumUpdated == 1) {
672 assert(OperandNo < CP->getNumOperands() && "Invalid index");
673 assert(CP->getOperand(OperandNo) != To && "I didn't contain From!");
674 CP->setOperand(OperandNo, To);
675 } else {
676 for (unsigned I = 0, E = CP->getNumOperands(); I != E; ++I)
677 if (CP->getOperand(I) == From)
678 CP->setOperand(I, To);
679 }
680 Map.insert_as(CP, Lookup);
681 return nullptr;
682 }
683
684 void dump() const {
685 LLVM_DEBUG(dbgs() << "Constant.cpp: ConstantUniqueMap\n");
686 }
687};
688
690 for (auto &I : Map)
691 delete I;
692}
693
694} // end namespace llvm
695
696#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:438
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1130
ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
Definition Constants.h:1138
friend class Constant
Definition Constants.h:1132
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:1037
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:522
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.
Definition Types.h:26
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:1667
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:1915
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:870
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...