LLVM 23.0.0git
Constants.h
Go to the documentation of this file.
1//===-- llvm/Constants.h - Constant class subclass definitions --*- 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/// @file
10/// This file contains the declarations for the subclasses of Constant,
11/// which represent the different flavors of constant values that live in LLVM.
12/// Note that Constants are immutable (once created they never change) and are
13/// fully shared by structural equivalence. This means that two structurally
14/// equivalent constants will always have the same address. Constants are
15/// created on demand as needed and never deleted: thus clients don't have to
16/// worry about the lifetime of the objects.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_IR_CONSTANTS_H
21#define LLVM_IR_CONSTANTS_H
22
23#include "llvm/ADT/APFloat.h"
24#include "llvm/ADT/APInt.h"
25#include "llvm/ADT/ArrayRef.h"
26#include "llvm/ADT/STLExtras.h"
27#include "llvm/ADT/StringRef.h"
28#include "llvm/IR/Constant.h"
32#include "llvm/IR/Intrinsics.h"
34#include "llvm/IR/User.h"
35#include "llvm/IR/Value.h"
39#include <cassert>
40#include <cstddef>
41#include <cstdint>
42#include <optional>
43
44namespace llvm {
45
46template <class ConstantClass> struct ConstantAggrKeyType;
47
48/// Base class for constants with no operands.
49///
50/// These constants have no operands; they represent their data directly.
51/// Since they can be in use by unrelated modules (and are never based on
52/// GlobalValues), it never makes sense to RAUW them.
53///
54/// These do not have use lists. It is illegal to inspect the uses. These behave
55/// as if they have no uses (i.e. use_empty() is always true).
56class ConstantData : public Constant {
57 constexpr static IntrusiveOperandsAllocMarker AllocMarker{0};
58
59 friend class Constant;
60
61 Value *handleOperandChangeImpl(Value *From, Value *To) {
62 llvm_unreachable("Constant data does not have operands!");
63 }
64
65protected:
66 explicit ConstantData(Type *Ty, ValueTy VT) : Constant(Ty, VT, AllocMarker) {}
67
68 void *operator new(size_t S) { return ::operator new(S); }
69
70public:
71 void operator delete(void *Ptr) { ::operator delete(Ptr); }
72
73 ConstantData(const ConstantData &) = delete;
74
75 /// Methods to support type inquiry through isa, cast, and dyn_cast.
76 static bool classof(const Value *V) {
77 static_assert(Value::ConstantDataFirstVal == 0,
78 "V->getValueID() >= Value::ConstantDataFirstVal");
79 return V->getValueID() <= ConstantDataLastVal;
80 }
81};
82
83//===----------------------------------------------------------------------===//
84/// This is the shared class of boolean and integer constants. This class
85/// represents both boolean and integral constants.
86/// Class for constant integers.
87class ConstantInt final : public ConstantData {
88 friend class Constant;
89 friend class ConstantVector;
90
91 APInt Val;
92
93 ConstantInt(Type *Ty, const APInt &V);
94
95 void destroyConstantImpl();
96
97 /// Return a ConstantInt with the specified value and an implied Type. The
98 /// type is the vector type whose integer element type corresponds to the bit
99 /// width of the value.
100 static ConstantInt *get(LLVMContext &Context, ElementCount EC,
101 const APInt &V);
102
103public:
104 ConstantInt(const ConstantInt &) = delete;
105
106 LLVM_ABI static ConstantInt *getTrue(LLVMContext &Context);
107 LLVM_ABI static ConstantInt *getFalse(LLVMContext &Context);
108 LLVM_ABI static ConstantInt *getBool(LLVMContext &Context, bool V);
109 LLVM_ABI static Constant *getTrue(Type *Ty);
110 LLVM_ABI static Constant *getFalse(Type *Ty);
111 LLVM_ABI static Constant *getBool(Type *Ty, bool V);
112
113 /// If Ty is a vector type, return a Constant with a splat of the given
114 /// value. Otherwise return a ConstantInt for the given value.
115 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
116 LLVM_ABI static Constant *get(Type *Ty, uint64_t V, bool IsSigned = false,
117 bool ImplicitTrunc = false);
118
119 /// Return a ConstantInt with the specified integer value for the specified
120 /// type. If the type is wider than 64 bits, the value will be zero-extended
121 /// to fit the type, unless IsSigned is true, in which case the value will
122 /// be interpreted as a 64-bit signed integer and sign-extended to fit
123 /// the type.
124 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
125 LLVM_ABI static ConstantInt *get(IntegerType *Ty, uint64_t V,
126 bool IsSigned = false,
127 bool ImplicitTrunc = false);
128
129 /// Return a ConstantInt with the specified value for the specified type. The
130 /// value V will be canonicalized to an unsigned APInt. Accessing it with
131 /// either getSExtValue() or getZExtValue() will yield a correctly sized and
132 /// signed value for the type Ty.
133 /// Get a ConstantInt for a specific signed value.
134 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
135 static ConstantInt *getSigned(IntegerType *Ty, int64_t V,
136 bool ImplicitTrunc = false) {
137 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
138 }
139 static Constant *getSigned(Type *Ty, int64_t V, bool ImplicitTrunc = false) {
140 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
141 }
142
143 /// Return a ConstantInt with the specified value and an implied Type. The
144 /// type is the integer type that corresponds to the bit width of the value.
145 LLVM_ABI static ConstantInt *get(LLVMContext &Context, const APInt &V);
146
147 /// Return a ConstantInt constructed from the string strStart with the given
148 /// radix.
150 uint8_t Radix);
151
152 /// If Ty is a vector type, return a Constant with a splat of the given
153 /// value. Otherwise return a ConstantInt for the given value.
154 LLVM_ABI static Constant *get(Type *Ty, const APInt &V);
155
156 /// Return the constant as an APInt value reference. This allows clients to
157 /// obtain a full-precision copy of the value.
158 /// Return the constant's value.
159 inline const APInt &getValue() const { return Val; }
160
161 /// getBitWidth - Return the scalar bitwidth of this constant.
162 unsigned getBitWidth() const { return Val.getBitWidth(); }
163
164 /// Return the constant as a 64-bit unsigned integer value after it
165 /// has been zero extended as appropriate for the type of this constant. Note
166 /// that this method can assert if the value does not fit in 64 bits.
167 /// Return the zero extended value.
168 inline uint64_t getZExtValue() const { return Val.getZExtValue(); }
169
170 /// Return the constant as a 64-bit integer value after it has been sign
171 /// extended as appropriate for the type of this constant. Note that
172 /// this method can assert if the value does not fit in 64 bits.
173 /// Return the sign extended value.
174 inline int64_t getSExtValue() const { return Val.getSExtValue(); }
175
176 /// Return the constant as an llvm::MaybeAlign.
177 /// Note that this method can assert if the value does not fit in 64 bits or
178 /// is not a power of two.
180 return MaybeAlign(getZExtValue());
181 }
182
183 /// Return the constant as an llvm::Align, interpreting `0` as `Align(1)`.
184 /// Note that this method can assert if the value does not fit in 64 bits or
185 /// is not a power of two.
186 inline Align getAlignValue() const {
188 }
189
190 /// A helper method that can be used to determine if the constant contained
191 /// within is equal to a constant. This only works for very small values,
192 /// because this is all that can be represented with all types.
193 /// Determine if this constant's value is same as an unsigned char.
194 bool equalsInt(uint64_t V) const { return Val == V; }
195
196 /// Variant of the getType() method to always return an IntegerType, which
197 /// reduces the amount of casting needed in parts of the compiler.
198 inline IntegerType *getIntegerType() const {
200 }
201
202 /// This static method returns true if the type Ty is big enough to
203 /// represent the value V. This can be used to avoid having the get method
204 /// assert when V is larger than Ty can represent. Note that there are two
205 /// versions of this method, one for unsigned and one for signed integers.
206 /// Although ConstantInt canonicalizes everything to an unsigned integer,
207 /// the signed version avoids callers having to convert a signed quantity
208 /// to the appropriate unsigned type before calling the method.
209 /// @returns true if V is a valid value for type Ty
210 /// Determine if the value is in range for the given type.
211 LLVM_ABI static bool isValueValidForType(Type *Ty, uint64_t V);
212 LLVM_ABI static bool isValueValidForType(Type *Ty, int64_t V);
213
214 bool isNegative() const { return Val.isNegative(); }
215
216 /// This is just a convenience method to make client code smaller for a
217 /// common code. It also correctly performs the comparison without the
218 /// potential for an assertion from getZExtValue().
219 bool isZero() const { return isNullValue(); }
220
221 /// This is just a convenience method to make client code smaller for a
222 /// common case. It also correctly performs the comparison without the
223 /// potential for an assertion from getZExtValue().
224 /// Determine if the value is one.
225 bool isOne() const { return Val.isOne(); }
226
227 /// This function will return true iff every bit in this constant is set
228 /// to true.
229 /// @returns true iff this constant's bits are all set to true.
230 /// Determine if the value is all ones.
231 bool isMinusOne() const { return Val.isAllOnes(); }
232
233 /// This function will return true iff this constant represents the largest
234 /// value that may be represented by the constant's type.
235 /// @returns true iff this is the largest value that may be represented
236 /// by this type.
237 /// Determine if the value is maximal.
238 bool isMaxValue(bool IsSigned) const {
239 if (IsSigned)
240 return Val.isMaxSignedValue();
241 else
242 return Val.isMaxValue();
243 }
244
245 /// This function will return true iff this constant represents the smallest
246 /// value that may be represented by this constant's type.
247 /// @returns true if this is the smallest value that may be represented by
248 /// this type.
249 /// Determine if the value is minimal.
250 bool isMinValue(bool IsSigned) const {
251 if (IsSigned)
252 return Val.isMinSignedValue();
253 else
254 return Val.isMinValue();
255 }
256
257 /// This function will return true iff this constant represents a value with
258 /// active bits bigger than 64 bits or a value greater than the given uint64_t
259 /// value.
260 /// @returns true iff this constant is greater or equal to the given number.
261 /// Determine if the value is greater or equal to the given number.
262 bool uge(uint64_t Num) const { return Val.uge(Num); }
263
264 /// getLimitedValue - If the value is smaller than the specified limit,
265 /// return it, otherwise return the limit value. This causes the value
266 /// to saturate to the limit.
267 /// @returns the min of the value of the constant and the specified value
268 /// Get the constant's value with a saturation limit
269 uint64_t getLimitedValue(uint64_t Limit = ~0ULL) const {
270 return Val.getLimitedValue(Limit);
271 }
272
273 /// Methods to support type inquiry through isa, cast, and dyn_cast.
274 static bool classof(const Value *V) {
275 return V->getValueID() == ConstantIntVal;
276 }
277};
278
279//===----------------------------------------------------------------------===//
280/// Class for constant bytes.
281class ConstantByte final : public ConstantData {
282 friend class Constant;
283 friend class ConstantVector;
284
285 APInt Val;
286
287 ConstantByte(Type *Ty, const APInt &V);
288
289 void destroyConstantImpl();
290
291 /// Return a ConstantByte with the specified value and an implied Type. The
292 /// type is the vector type whose byte element type corresponds to the bit
293 /// width of the value.
294 static ConstantByte *get(LLVMContext &Context, ElementCount EC,
295 const APInt &V);
296
297public:
298 ConstantByte(const ConstantByte &) = delete;
299
300 /// If Ty is a vector type, return a Constant with a splat of the given
301 /// value. Otherwise return a ConstantByte for the given value.
302 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
303 LLVM_ABI static Constant *get(Type *Ty, uint64_t V, bool isSigned = false,
304 bool ImplicitTrunc = false);
305
306 /// Return a ConstantByte with the specified byte value for the specified
307 /// type. If the type is wider than 64 bits, the value will be zero-extended
308 /// to fit the type, unless IsSigned is true, in which case the value will
309 /// be interpreted as a 64-bit signed byte and sign-extended to fit
310 /// the type.
311 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
312 LLVM_ABI static ConstantByte *get(ByteType *Ty, uint64_t V,
313 bool isSigned = false,
314 bool ImplicitTrunc = false);
315
316 /// Return a ConstantByte with the specified value for the specified type. The
317 /// value V will be canonicalized to an unsigned APInt. Accessing it with
318 /// either getSExtValue() or getZExtValue() will yield a correctly sized and
319 /// signed value for the type Ty.
320 /// Get a ConstantByte for a specific signed value.
321 /// \param ImplicitTrunc Whether to allow implicit truncation of the value.
322 static ConstantByte *getSigned(ByteType *Ty, int64_t V,
323 bool ImplicitTrunc = false) {
324 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
325 }
326 static Constant *getSigned(Type *Ty, int64_t V, bool ImplicitTrunc = false) {
327 return get(Ty, V, /*IsSigned=*/true, ImplicitTrunc);
328 }
329
330 /// Return a ConstantByte with the specified value and an implied Type. The
331 /// type is the byte type that corresponds to the bit width of the value.
332 LLVM_ABI static ConstantByte *get(LLVMContext &Context, const APInt &V);
333
334 /// Return a ConstantByte constructed from the string strStart with the given
335 /// radix.
336 LLVM_ABI static ConstantByte *get(ByteType *Ty, StringRef Str, uint8_t Radix);
337
338 /// If Ty is a vector type, return a Constant with a splat of the given
339 /// value. Otherwise return a ConstantByte for the given value.
340 LLVM_ABI static Constant *get(Type *Ty, const APInt &V);
341
342 /// Return the constant as an APInt value reference. This allows clients to
343 /// obtain a full-precision copy of the value.
344 /// Return the constant's value.
345 inline const APInt &getValue() const { return Val; }
346
347 /// getBitWidth - Return the scalar bitwidth of this constant.
348 unsigned getBitWidth() const { return Val.getBitWidth(); }
349
350 /// Return the constant as a 64-bit byte value after it
351 /// has been zero extended as appropriate for the type of this constant. Note
352 /// that this method can assert if the value does not fit in 64 bits.
353 /// Return the zero extended value.
354 inline uint64_t getZExtValue() const { return Val.getZExtValue(); }
355
356 /// Return the constant as a 64-bit byte value after it has been sign
357 /// extended as appropriate for the type of this constant. Note that
358 /// this method can assert if the value does not fit in 64 bits.
359 /// Return the sign extended value.
360 inline int64_t getSExtValue() const { return Val.getSExtValue(); }
361
362 /// Variant of the getType() method to always return a ByteType, which
363 /// reduces the amount of casting needed in parts of the compiler.
364 inline ByteType *getByteType() const {
366 }
367
368 bool isNegative() const { return Val.isNegative(); }
369
370 /// This is just a convenience method to make client code smaller for a
371 /// common code. It also correctly performs the comparison without the
372 /// potential for an assertion from getZExtValue().
373 bool isZero() const { return Val.isZero(); }
374
375 /// This is just a convenience method to make client code smaller for a
376 /// common case. It also correctly performs the comparison without the
377 /// potential for an assertion from getZExtValue().
378 /// Determine if the value is one.
379 bool isOne() const { return Val.isOne(); }
380
381 /// This function will return true iff every bit in this constant is set
382 /// to true.
383 /// @returns true iff this constant's bits are all set to true.
384 /// Determine if the value is all ones.
385 bool isMinusOne() const { return Val.isAllOnes(); }
386
387 /// This function will return true iff this constant represents the largest
388 /// value that may be represented by the constant's type.
389 /// @returns true iff this is the largest value that may be represented
390 /// by this type.
391 /// Determine if the value is maximal.
392 bool isMaxValue(bool IsSigned) const {
393 if (IsSigned)
394 return Val.isMaxSignedValue();
395 else
396 return Val.isMaxValue();
397 }
398
399 /// This function will return true iff this constant represents the smallest
400 /// value that may be represented by this constant's type.
401 /// @returns true if this is the smallest value that may be represented by
402 /// this type.
403 /// Determine if the value is minimal.
404 bool isMinValue(bool IsSigned) const {
405 if (IsSigned)
406 return Val.isMinSignedValue();
407 else
408 return Val.isMinValue();
409 }
410
411 /// Methods to support type inquiry through isa, cast, and dyn_cast.
412 static bool classof(const Value *V) {
413 return V->getValueID() == ConstantByteVal;
414 }
415};
416
417//===----------------------------------------------------------------------===//
418/// ConstantFP - Floating Point Values [float, double]
419///
420class ConstantFP final : public ConstantData {
421 friend class Constant;
422 friend class ConstantVector;
423
424 APFloat Val;
425
426 ConstantFP(Type *Ty, const APFloat &V);
427
428 void destroyConstantImpl();
429
430 /// Return a ConstantFP with the specified value and an implied Type. The
431 /// type is the vector type whose element type has the same floating point
432 /// semantics as the value.
433 static ConstantFP *get(LLVMContext &Context, ElementCount EC,
434 const APFloat &V);
435
436public:
437 ConstantFP(const ConstantFP &) = delete;
438
439 /// This returns a ConstantFP, or a vector containing a splat of a ConstantFP,
440 /// for the specified value in the specified type. This should only be used
441 /// for simple constant values like 2.0/1.0 etc, that are known-valid both as
442 /// host double and as the target format.
443 LLVM_ABI static ConstantFP *get(Type *Ty, double V);
444
445 /// If Ty is a vector type, return a Constant with a splat of the given
446 /// value. Otherwise return a ConstantFP for the given value.
447 LLVM_ABI static ConstantFP *get(Type *Ty, const APFloat &V);
448
449 LLVM_ABI static ConstantFP *get(Type *Ty, StringRef Str);
450 LLVM_ABI static ConstantFP *get(LLVMContext &Context, const APFloat &V);
451 LLVM_ABI static ConstantFP *getNaN(Type *Ty, bool Negative = false,
452 uint64_t Payload = 0);
453 LLVM_ABI static ConstantFP *getQNaN(Type *Ty, bool Negative = false,
454 APInt *Payload = nullptr);
455 LLVM_ABI static ConstantFP *getSNaN(Type *Ty, bool Negative = false,
456 APInt *Payload = nullptr);
457 LLVM_ABI static ConstantFP *getZero(Type *Ty, bool Negative = false);
458 static ConstantFP *getNegativeZero(Type *Ty) { return getZero(Ty, true); }
459 LLVM_ABI static ConstantFP *getInfinity(Type *Ty, bool Negative = false);
460
461 /// Return true if Ty is big enough to represent V.
462 LLVM_ABI static bool isValueValidForType(Type *Ty, const APFloat &V);
463 inline const APFloat &getValueAPF() const { return Val; }
464 inline const APFloat &getValue() const { return Val; }
465
466 /// Return true if the value is positive or negative zero.
467 bool isZero() const { return Val.isZero(); }
468
469 /// Return true if the value is positive zero.
470 bool isPosZero() const { return Val.isPosZero(); }
471
472 /// Return true if the value is negative zero.
473 bool isNegZero() const { return Val.isNegZero(); }
474
475 /// Return true if the sign bit is set.
476 bool isNegative() const { return Val.isNegative(); }
477
478 /// Return true if the value is infinity
479 bool isInfinity() const { return Val.isInfinity(); }
480
481 /// Return true if the value is a NaN.
482 bool isNaN() const { return Val.isNaN(); }
483
484 /// Returns true if this value is exactly +1.0.
485 bool isOne() const { return Val.isOne(); }
486
487 /// Returns true if this value is exactly -1.0.
488 bool isMinusOne() const { return Val.isMinusOne(); }
489
490 /// We don't rely on operator== working on double values, as it returns true
491 /// for things that are clearly not equal, like -0.0 and 0.0.
492 /// As such, this method can be used to do an exact bit-for-bit comparison of
493 /// two floating point values. The version with a double operand is retained
494 /// because it's so convenient to write isExactlyValue(2.0), but please use
495 /// it only for simple constants.
496 LLVM_ABI bool isExactlyValue(const APFloat &V) const;
497
498 bool isExactlyValue(double V) const {
499 bool ignored;
500 APFloat FV(V);
501 FV.convert(Val.getSemantics(), APFloat::rmNearestTiesToEven, &ignored);
502 return isExactlyValue(FV);
503 }
504
505 /// Methods for support type inquiry through isa, cast, and dyn_cast:
506 static bool classof(const Value *V) {
507 return V->getValueID() == ConstantFPVal;
508 }
509};
510
511//===----------------------------------------------------------------------===//
512/// All zero aggregate value
513///
514class ConstantAggregateZero final : public ConstantData {
515 friend class Constant;
516
517 explicit ConstantAggregateZero(Type *Ty)
518 : ConstantData(Ty, ConstantAggregateZeroVal) {
520 }
521
522 void destroyConstantImpl();
523
524public:
525 ConstantAggregateZero(const ConstantAggregateZero &) = delete;
526
527 LLVM_ABI static ConstantAggregateZero *get(Type *Ty);
528
529 /// If this CAZ has array or vector type, return a zero with the right element
530 /// type.
532
533 /// If this CAZ has struct type, return a zero with the right element type for
534 /// the specified element.
535 LLVM_ABI Constant *getStructElement(unsigned Elt) const;
536
537 /// Return a zero of the right value for the specified GEP index if we can,
538 /// otherwise return null (e.g. if C is a ConstantExpr).
540
541 /// Return a zero of the right value for the specified GEP index.
542 LLVM_ABI Constant *getElementValue(unsigned Idx) const;
543
544 /// Return the number of elements in the array, vector, or struct.
546
547 /// Methods for support type inquiry through isa, cast, and dyn_cast:
548 ///
549 static bool classof(const Value *V) {
550 return V->getValueID() == ConstantAggregateZeroVal;
551 }
552};
553
554/// Base class for aggregate constants (with operands).
555///
556/// These constants are aggregates of other constants, which are stored as
557/// operands.
558///
559/// Subclasses are \a ConstantStruct, \a ConstantArray, and \a
560/// ConstantVector.
561///
562/// \note Some subclasses of \a ConstantData are semantically aggregates --
563/// such as \a ConstantDataArray -- but are not subclasses of this because they
564/// use operands.
566protected:
569
570public:
571 /// Transparently provide more efficient getOperand methods.
573
574 /// Methods for support type inquiry through isa, cast, and dyn_cast:
575 static bool classof(const Value *V) {
576 return V->getValueID() >= ConstantAggregateFirstVal &&
577 V->getValueID() <= ConstantAggregateLastVal;
578 }
579};
580
581template <>
583 : public VariadicOperandTraits<ConstantAggregate> {};
584
586
587//===----------------------------------------------------------------------===//
588/// ConstantArray - Constant Array Declarations
589///
590class ConstantArray final : public ConstantAggregate {
591 friend struct ConstantAggrKeyType<ConstantArray>;
592 friend class Constant;
593
594 ConstantArray(ArrayType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
595
596 void destroyConstantImpl();
597 Value *handleOperandChangeImpl(Value *From, Value *To);
598
599public:
600 // ConstantArray accessors
602
603private:
604 static Constant *getImpl(ArrayType *T, ArrayRef<Constant *> V);
605
606public:
607 /// Specialize the getType() method to always return an ArrayType,
608 /// which reduces the amount of casting needed in parts of the compiler.
609 inline ArrayType *getType() const {
611 }
612
613 /// Methods for support type inquiry through isa, cast, and dyn_cast:
614 static bool classof(const Value *V) {
615 return V->getValueID() == ConstantArrayVal;
616 }
617};
618
619//===----------------------------------------------------------------------===//
620// Constant Struct Declarations
621//
622class ConstantStruct final : public ConstantAggregate {
623 friend struct ConstantAggrKeyType<ConstantStruct>;
624 friend class Constant;
625
626 ConstantStruct(StructType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
627
628 void destroyConstantImpl();
629 Value *handleOperandChangeImpl(Value *From, Value *To);
630
631public:
632 // ConstantStruct accessors
634
635 template <typename... Csts>
636 static std::enable_if_t<are_base_of<Constant, Csts...>::value, Constant *>
637 get(StructType *T, Csts *...Vs) {
638 return get(T, ArrayRef<Constant *>({Vs...}));
639 }
640
641 /// Return an anonymous struct that has the specified elements.
642 /// If the struct is possibly empty, then you must specify a context.
643 static Constant *getAnon(ArrayRef<Constant *> V, bool Packed = false) {
644 return get(getTypeForElements(V, Packed), V);
645 }
647 bool Packed = false) {
648 return get(getTypeForElements(Ctx, V, Packed), V);
649 }
650
651 /// Return an anonymous struct type to use for a constant with the specified
652 /// set of elements. The list must not be empty.
654 bool Packed = false);
655 /// This version of the method allows an empty list.
658 bool Packed = false);
659
660 /// Specialization - reduce amount of casting.
661 inline StructType *getType() const {
663 }
664
665 /// Methods for support type inquiry through isa, cast, and dyn_cast:
666 static bool classof(const Value *V) {
667 return V->getValueID() == ConstantStructVal;
668 }
669};
670
671//===----------------------------------------------------------------------===//
672/// Constant Vector Declarations
673///
674class ConstantVector final : public ConstantAggregate {
675 friend struct ConstantAggrKeyType<ConstantVector>;
676 friend class Constant;
677
678 ConstantVector(VectorType *T, ArrayRef<Constant *> Val, AllocInfo AllocInfo);
679
680 void destroyConstantImpl();
681 Value *handleOperandChangeImpl(Value *From, Value *To);
682
683public:
684 // ConstantVector accessors
686
687private:
688 static Constant *getImpl(ArrayRef<Constant *> V);
689
690public:
691 /// Return a ConstantVector with the specified constant in each element.
692 /// Note that this might not return an instance of ConstantVector
694
695 /// Specialize the getType() method to always return a FixedVectorType,
696 /// which reduces the amount of casting needed in parts of the compiler.
697 inline FixedVectorType *getType() const {
699 }
700
701 /// If all elements of the vector constant have the same value, return that
702 /// value. Otherwise, return nullptr. Ignore poison elements by setting
703 /// AllowPoison to true.
704 LLVM_ABI Constant *getSplatValue(bool AllowPoison = false) const;
705
706 /// Methods for support type inquiry through isa, cast, and dyn_cast:
707 static bool classof(const Value *V) {
708 return V->getValueID() == ConstantVectorVal;
709 }
710};
711
712//===----------------------------------------------------------------------===//
713/// A constant pointer value that points to null. This represents both scalar
714/// pointer nulls and vector splats of pointer nulls.
715///
716class ConstantPointerNull final : public ConstantData {
717 friend class Constant;
718
719 explicit ConstantPointerNull(Type *T)
720 : ConstantData(T, Value::ConstantPointerNullVal) {
722 }
723
724 void destroyConstantImpl();
725
726public:
727 ConstantPointerNull(const ConstantPointerNull &) = delete;
728
729 /// Static factory methods - Return objects of the specified value. If Ty is a
730 /// vector type, return a ConstantPointerNull with a splat of null pointer
731 /// values. Otherwise return a ConstantPointerNull for the given pointer type.
732 LLVM_ABI static ConstantPointerNull *get(PointerType *T);
733 LLVM_ABI static ConstantPointerNull *get(Type *T);
734
735 /// Return the scalar pointer type for this null value.
737 return cast<PointerType>(Value::getType()->getScalarType());
738 }
739
740 /// Methods for support type inquiry through isa, cast, and dyn_cast:
741 static bool classof(const Value *V) {
742 return V->getValueID() == ConstantPointerNullVal;
743 }
744};
745
746//===----------------------------------------------------------------------===//
747/// ConstantDataSequential - A vector or array constant whose element type is a
748/// simple 1/2/4/8-byte integer/byte or half/bfloat/float/double, and whose
749/// elements are just simple data values (i.e. ConstantInt/ConstantByte/
750/// ConstantFP). This Constant node has no operands because it stores all of
751/// the elements of the constant as densely packed data, instead of as Value*'s.
752///
753/// This is the common base class of ConstantDataArray and ConstantDataVector.
754///
756 friend class LLVMContextImpl;
757 friend class Constant;
758
759 /// A pointer to the bytes underlying this constant (which is owned by the
760 /// uniquing StringMap).
761 const char *DataElements;
762
763 /// This forms a link list of ConstantDataSequential nodes that have
764 /// the same value but different type. For example, 0,0,0,1 could be a 4
765 /// element array of i8, or a 1-element array of i32. They'll both end up in
766 /// the same StringMap bucket, linked up.
767 std::unique_ptr<ConstantDataSequential> Next;
768
769 void destroyConstantImpl();
770
771protected:
772 explicit ConstantDataSequential(Type *ty, ValueTy VT, const char *Data)
773 : ConstantData(ty, VT), DataElements(Data) {}
774
775 LLVM_ABI static Constant *getImpl(StringRef Bytes, Type *Ty);
776
777public:
779
780 /// Return true if a ConstantDataSequential can be formed with a vector or
781 /// array of the specified element type.
782 /// ConstantDataArray only works with normal float and int types that are
783 /// stored densely in memory, not with things like i42 or x86_f80.
784 LLVM_ABI static bool isElementTypeCompatible(Type *Ty);
785
786 /// If this is a sequential container of integers (of any size), return the
787 /// specified element in the low bits of a uint64_t.
789
790 /// If this is a sequential container of integers (of any size), return the
791 /// specified element as an APInt.
793
794 /// If this is a sequential container of floating point type, return the
795 /// specified element as an APFloat.
797
798 /// If this is an sequential container of floats, return the specified element
799 /// as a float.
800 LLVM_ABI float getElementAsFloat(uint64_t i) const;
801
802 /// If this is an sequential container of doubles, return the specified
803 /// element as a double.
804 LLVM_ABI double getElementAsDouble(uint64_t i) const;
805
806 /// Return a Constant for a specified index's element.
807 /// Note that this has to compute a new constant to return, so it isn't as
808 /// efficient as getElementAsInteger/Float/Double.
810
811 /// Return the element type of the array/vector.
813
814 /// Return the number of elements in the array or vector.
816
817 /// Return the size (in bytes) of each element in the array/vector.
818 /// The size of the elements is known to be a multiple of one byte.
820
821 /// This method returns true if this is an array of \p CharSize integers or
822 /// bytes.
823 LLVM_ABI bool isString(unsigned CharSize = 8) const;
824
825 /// This method returns true if the array "isString", ends with a null byte,
826 /// and does not contains any other null bytes.
827 LLVM_ABI bool isCString() const;
828
829 /// If this array is isString(), then this method returns the array as a
830 /// StringRef. Otherwise, it asserts out.
832 assert(isString() && "Not a string");
833 return getRawDataValues();
834 }
835
836 /// If this array is isCString(), then this method returns the array (without
837 /// the trailing null byte) as a StringRef. Otherwise, it asserts out.
839 assert(isCString() && "Isn't a C string");
840 StringRef Str = getAsString();
841 return Str.drop_back();
842 }
843
844 /// Return the raw, underlying, bytes of this data. Note that this is an
845 /// extremely tricky thing to work with, as it exposes the host endianness of
846 /// the data elements.
848
849 /// Methods for support type inquiry through isa, cast, and dyn_cast:
850 static bool classof(const Value *V) {
851 return V->getValueID() == ConstantDataArrayVal ||
852 V->getValueID() == ConstantDataVectorVal;
853 }
854
855private:
856 const char *getElementPointer(uint64_t Elt) const;
857};
858
859//===----------------------------------------------------------------------===//
860/// An array constant whose element type is a simple 1/2/4/8-byte integer, bytes
861/// or float/double, and whose elements are just simple data values
862/// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it
863/// stores all of the elements of the constant as densely packed data, instead
864/// of as Value*'s.
865class ConstantDataArray final : public ConstantDataSequential {
867
868 explicit ConstantDataArray(Type *ty, const char *Data)
869 : ConstantDataSequential(ty, ConstantDataArrayVal, Data) {}
870
871public:
872 ConstantDataArray(const ConstantDataArray &) = delete;
873
874 /// get() constructor - Return a constant with array type with an element
875 /// count and element type matching the ArrayRef passed in. Note that this
876 /// can return a ConstantAggregateZero object.
877 template <typename ElementTy>
878 static Constant *get(LLVMContext &Context, ArrayRef<ElementTy> Elts) {
879 const char *Data = reinterpret_cast<const char *>(Elts.data());
880 return getRaw(StringRef(Data, Elts.size() * sizeof(ElementTy)), Elts.size(),
882 }
883
884 /// get() constructor - ArrayTy needs to be compatible with
885 /// ArrayRef<ElementTy>. Calls get(LLVMContext, ArrayRef<ElementTy>).
886 template <typename ArrayTy>
887 static Constant *get(LLVMContext &Context, ArrayTy &Elts) {
888 return ConstantDataArray::get(Context, ArrayRef(Elts));
889 }
890
891 /// getRaw() constructor - Return a constant with array type with an element
892 /// count and element type matching the NumElements and ElementTy parameters
893 /// passed in. Note that this can return a ConstantAggregateZero object.
894 /// ElementTy must be one of i8/i16/i32/i64/b8/b16/b32/b64/half/bfloat/float/
895 /// double. Data is the buffer containing the elements. Be careful to make
896 /// sure Data uses the right endianness, the buffer will be used as-is.
897 static Constant *getRaw(StringRef Data, uint64_t NumElements,
898 Type *ElementTy) {
899 Type *Ty = ArrayType::get(ElementTy, NumElements);
900 return getImpl(Data, Ty);
901 }
902
903 /// getFP() constructors - Return a constant of array type with a float
904 /// element type taken from argument `ElementType', and count taken from
905 /// argument `Elts'. The amount of bits of the contained type must match the
906 /// number of bits of the type contained in the passed in ArrayRef.
907 /// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
908 /// that this can return a ConstantAggregateZero object.
909 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint16_t> Elts);
910 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint32_t> Elts);
911 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint64_t> Elts);
912
913 /// getByte() constructors - Return a constant of array type with a byte
914 /// element type taken from argument `ElementType', and count taken from
915 /// argument `Elts'. The amount of bits of the contained type must match the
916 /// number of bits of the type contained in the passed in ArrayRef.
917 /// Note that this can return a ConstantAggregateZero object.
918 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint8_t> Elts);
919 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint16_t> Elts);
920 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint32_t> Elts);
921 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint64_t> Elts);
922
923 /// This method constructs a CDS and initializes it with a text string.
924 /// The default behavior (AddNull==true) causes a null terminator to
925 /// be placed at the end of the array (increasing the length of the string by
926 /// one more than the StringRef would normally indicate. Pass AddNull=false
927 /// to disable this behavior.
928 LLVM_ABI static Constant *getString(LLVMContext &Context,
929 StringRef Initializer,
930 bool AddNull = true,
931 bool ByteString = false);
932
933 /// Specialize the getType() method to always return an ArrayType,
934 /// which reduces the amount of casting needed in parts of the compiler.
935 inline ArrayType *getType() const {
937 }
938
939 /// Methods for support type inquiry through isa, cast, and dyn_cast:
940 static bool classof(const Value *V) {
941 return V->getValueID() == ConstantDataArrayVal;
942 }
943};
944
945//===----------------------------------------------------------------------===//
946/// A vector constant whose element type is a simple 1/2/4/8-byte integer or
947/// float/double, and whose elements are just simple data values
948/// (i.e. ConstantInt/ConstantFP). This Constant node has no operands because it
949/// stores all of the elements of the constant as densely packed data, instead
950/// of as Value*'s.
951class ConstantDataVector final : public ConstantDataSequential {
953
954 explicit ConstantDataVector(Type *ty, const char *Data)
955 : ConstantDataSequential(ty, ConstantDataVectorVal, Data),
956 IsSplatSet(false) {}
957 // Cache whether or not the constant is a splat.
958 mutable bool IsSplatSet : 1;
959 mutable bool IsSplat : 1;
960 bool isSplatData() const;
961
962public:
963 ConstantDataVector(const ConstantDataVector &) = delete;
964
965 /// get() constructors - Return a constant with vector type with an element
966 /// count and element type matching the ArrayRef passed in. Note that this
967 /// can return a ConstantAggregateZero object.
968 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint8_t> Elts);
969 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint16_t> Elts);
970 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint32_t> Elts);
971 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<uint64_t> Elts);
972 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<float> Elts);
973 LLVM_ABI static Constant *get(LLVMContext &Context, ArrayRef<double> Elts);
974
975 /// getRaw() constructor - Return a constant with vector type with an element
976 /// count and element type matching the NumElements and ElementTy parameters
977 /// passed in. Note that this can return a ConstantAggregateZero object.
978 /// ElementTy must be one of i8/i16/i32/i64/b8/b16/b32/b64/half/bfloat/float/
979 /// double. Data is the buffer containing the elements. Be careful to make
980 /// sure Data uses the right endianness, the buffer will be used as-is.
981 static Constant *getRaw(StringRef Data, uint64_t NumElements,
982 Type *ElementTy) {
983 Type *Ty = VectorType::get(ElementTy, ElementCount::getFixed(NumElements));
984 return getImpl(Data, Ty);
985 }
986
987 /// getByte() constructors - Return a constant of vector type with a byte
988 /// element type taken from argument `ElementType', and count taken from
989 /// argument `Elts'. The amount of bits of the contained type must match the
990 /// number of bits of the type contained in the passed in ArrayRef.
991 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint8_t> Elts);
992 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint16_t> Elts);
993 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint32_t> Elts);
994 LLVM_ABI static Constant *getByte(Type *ElementType, ArrayRef<uint64_t> Elts);
995
996 /// getFP() constructors - Return a constant of vector type with a float
997 /// element type taken from argument `ElementType', and count taken from
998 /// argument `Elts'. The amount of bits of the contained type must match the
999 /// number of bits of the type contained in the passed in ArrayRef.
1000 /// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
1001 /// that this can return a ConstantAggregateZero object.
1002 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint16_t> Elts);
1003 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint32_t> Elts);
1004 LLVM_ABI static Constant *getFP(Type *ElementType, ArrayRef<uint64_t> Elts);
1005
1006 /// Return a ConstantVector with the specified constant in each element.
1007 /// The specified constant has to be a of a compatible type (i8/i16/
1008 /// i32/i64/b8/b16/b32/b64/half/bfloat/float/double) and must be a ConstantFP,
1009 /// ConstantByte or ConstantInt.
1010 LLVM_ABI static Constant *getSplat(unsigned NumElts, Constant *Elt);
1011
1012 /// Returns true if this is a splat constant, meaning that all elements have
1013 /// the same value.
1014 LLVM_ABI bool isSplat() const;
1015
1016 /// If this is a splat constant, meaning that all of the elements have the
1017 /// same value, return that value. Otherwise return NULL.
1019
1020 /// Specialize the getType() method to always return a FixedVectorType,
1021 /// which reduces the amount of casting needed in parts of the compiler.
1022 inline FixedVectorType *getType() const {
1024 }
1025
1026 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1027 static bool classof(const Value *V) {
1028 return V->getValueID() == ConstantDataVectorVal;
1029 }
1030};
1031
1032//===----------------------------------------------------------------------===//
1033/// A constant token which is empty
1034///
1035class ConstantTokenNone final : public ConstantData {
1036 friend class Constant;
1037
1038 explicit ConstantTokenNone(LLVMContext &Context)
1039 : ConstantData(Type::getTokenTy(Context), ConstantTokenNoneVal) {
1041 }
1042
1043 void destroyConstantImpl();
1044
1045public:
1046 ConstantTokenNone(const ConstantTokenNone &) = delete;
1047
1048 /// Return the ConstantTokenNone.
1049 LLVM_ABI static ConstantTokenNone *get(LLVMContext &Context);
1050
1051 /// Methods to support type inquiry through isa, cast, and dyn_cast.
1052 static bool classof(const Value *V) {
1053 return V->getValueID() == ConstantTokenNoneVal;
1054 }
1055};
1056
1057/// A constant target extension type default initializer
1058class ConstantTargetNone final : public ConstantData {
1059 friend class Constant;
1060
1061 explicit ConstantTargetNone(TargetExtType *T)
1062 : ConstantData(T, Value::ConstantTargetNoneVal) {
1064 }
1065
1066 void destroyConstantImpl();
1067
1068public:
1069 ConstantTargetNone(const ConstantTargetNone &) = delete;
1070
1071 /// Static factory methods - Return objects of the specified value.
1072 LLVM_ABI static ConstantTargetNone *get(TargetExtType *T);
1073
1074 /// Specialize the getType() method to always return an TargetExtType,
1075 /// which reduces the amount of casting needed in parts of the compiler.
1076 inline TargetExtType *getType() const {
1078 }
1079
1080 /// Methods for support type inquiry through isa, cast, and dyn_cast.
1081 static bool classof(const Value *V) {
1082 return V->getValueID() == ConstantTargetNoneVal;
1083 }
1084};
1085
1086/// The address of a basic block.
1087///
1088class BlockAddress final : public Constant {
1089 friend class Constant;
1090
1091 constexpr static IntrusiveOperandsAllocMarker AllocMarker{0};
1092
1094
1095 BlockAddress(Type *Ty, BasicBlock *BB);
1096
1097 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1098
1099 void destroyConstantImpl();
1100 Value *handleOperandChangeImpl(Value *From, Value *To);
1101
1102public:
1103 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
1104
1105 /// Return a BlockAddress for the specified function and basic block.
1107
1108 /// Return a BlockAddress for the specified basic block. The basic
1109 /// block must be embedded into a function.
1110 LLVM_ABI static BlockAddress *get(BasicBlock *BB);
1111
1112 /// Return a BlockAddress for the specified basic block, which may not be
1113 /// part of a function. The specified type must match the type of the function
1114 /// the block will be inserted into.
1115 LLVM_ABI static BlockAddress *get(Type *Ty, BasicBlock *BB);
1116
1117 /// Lookup an existing \c BlockAddress constant for the given BasicBlock.
1118 ///
1119 /// \returns 0 if \c !BB->hasAddressTaken(), otherwise the \c BlockAddress.
1120 LLVM_ABI static BlockAddress *lookup(const BasicBlock *BB);
1121
1122 /// Transparently provide more efficient getOperand methods.
1124
1125 BasicBlock *getBasicBlock() const { return Block; }
1127
1128 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1129 static bool classof(const Value *V) {
1130 return V->getValueID() == BlockAddressVal;
1131 }
1132};
1133
1134template <>
1136 : public FixedNumOperandTraits<BlockAddress, 0> {};
1137
1139
1140/// Wrapper for a function that represents a value that
1141/// functionally represents the original function. This can be a function,
1142/// global alias to a function, or an ifunc.
1143class DSOLocalEquivalent final : public Constant {
1144 friend class Constant;
1145
1146 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1147
1149
1150 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1151
1152 void destroyConstantImpl();
1153 Value *handleOperandChangeImpl(Value *From, Value *To);
1154
1155public:
1156 void operator delete(void *Ptr) { User::operator delete(Ptr, AllocMarker); }
1157
1158 /// Return a DSOLocalEquivalent for the specified global value.
1160
1161 /// Transparently provide more efficient getOperand methods.
1163
1165 return cast<GlobalValue>(Op<0>().get());
1166 }
1167
1168 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1169 static bool classof(const Value *V) {
1170 return V->getValueID() == DSOLocalEquivalentVal;
1171 }
1172};
1173
1174template <>
1176 : public FixedNumOperandTraits<DSOLocalEquivalent, 1> {};
1177
1179
1180/// Wrapper for a value that won't be replaced with a CFI jump table
1181/// pointer in LowerTypeTestsModule.
1182class NoCFIValue final : public Constant {
1183 friend class Constant;
1184
1185 constexpr static IntrusiveOperandsAllocMarker AllocMarker{1};
1186
1188
1189 void *operator new(size_t S) { return User::operator new(S, AllocMarker); }
1190
1191 void destroyConstantImpl();
1192 Value *handleOperandChangeImpl(Value *From, Value *To);
1193
1194public:
1195 /// Return a NoCFIValue for the specified function.
1196 LLVM_ABI static NoCFIValue *get(GlobalValue *GV);
1197
1198 /// Transparently provide more efficient getOperand methods.
1200
1202 return cast<GlobalValue>(Op<0>().get());
1203 }
1204
1205 /// NoCFIValue is always a pointer.
1208 }
1209
1210 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1211 static bool classof(const Value *V) {
1212 return V->getValueID() == NoCFIValueVal;
1213 }
1214};
1215
1216template <>
1217struct OperandTraits<NoCFIValue> : public FixedNumOperandTraits<NoCFIValue, 1> {
1218};
1219
1221
1222/// A signed pointer, in the ptrauth sense.
1223class ConstantPtrAuth final : public Constant {
1225 friend class Constant;
1226
1227 constexpr static IntrusiveOperandsAllocMarker AllocMarker{5};
1228
1230 Constant *AddrDisc, Constant *DeactivationSymbol);
1231
1232 void *operator new(size_t s) { return User::operator new(s, AllocMarker); }
1233
1234 void destroyConstantImpl();
1235 Value *handleOperandChangeImpl(Value *From, Value *To);
1236
1237public:
1238 /// Return a pointer signed with the specified parameters.
1239 LLVM_ABI static ConstantPtrAuth *get(Constant *Ptr, ConstantInt *Key,
1240 ConstantInt *Disc, Constant *AddrDisc,
1241 Constant *DeactivationSymbol);
1242
1243 /// Produce a new ptrauth expression signing the given value using
1244 /// the same schema as is stored in one.
1245 LLVM_ABI ConstantPtrAuth *getWithSameSchema(Constant *Pointer) const;
1246
1247 /// Transparently provide more efficient getOperand methods.
1249
1250 /// The pointer that is signed in this ptrauth signed pointer.
1251 Constant *getPointer() const { return cast<Constant>(Op<0>().get()); }
1252
1253 /// The Key ID, an i32 constant.
1255
1256 /// The integer discriminator, an i64 constant, or 0.
1258 return cast<ConstantInt>(Op<2>().get());
1259 }
1260
1261 /// The address discriminator if any, or the null constant.
1262 /// If present, this must be a value equivalent to the storage location of
1263 /// the only global-initializer user of the ptrauth signed pointer.
1265 return cast<Constant>(Op<3>().get());
1266 }
1267
1268 /// Whether there is any non-null address discriminator.
1272
1274 return cast<Constant>(Op<4>().get());
1275 }
1276
1277 /// A constant value for the address discriminator which has special
1278 /// significance to ctors/dtors lowering. Regular address discrimination can't
1279 /// be applied for them since uses of llvm.global_{c|d}tors are disallowed
1280 /// (see Verifier::visitGlobalVariable) and we can't emit getelementptr
1281 /// expressions referencing these special arrays.
1283
1284 /// Whether the address uses a special address discriminator.
1285 /// These discriminators can't be used in real pointer-auth values; they
1286 /// can only be used in "prototype" values that indicate how some real
1287 /// schema is supposed to be produced.
1288 LLVM_ABI bool hasSpecialAddressDiscriminator(uint64_t Value) const;
1289
1290 /// Check whether an authentication operation with key \p Key and (possibly
1291 /// blended) discriminator \p Discriminator is known to be compatible with
1292 /// this ptrauth signed pointer.
1293 LLVM_ABI bool isKnownCompatibleWith(const Value *Key,
1294 const Value *Discriminator,
1295 const DataLayout &DL) const;
1296
1297 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1298 static bool classof(const Value *V) {
1299 return V->getValueID() == ConstantPtrAuthVal;
1300 }
1301};
1302
1303template <>
1305 : public FixedNumOperandTraits<ConstantPtrAuth, 5> {};
1306
1308
1309//===----------------------------------------------------------------------===//
1310/// A constant value that is initialized with an expression using
1311/// other constant values.
1312///
1313/// This class uses the standard Instruction opcodes to define the various
1314/// constant expressions. The Opcode field for the ConstantExpr class is
1315/// maintained in the Value::SubclassData field.
1316class ConstantExpr : public Constant {
1317 friend struct ConstantExprKeyType;
1318 friend class Constant;
1319
1320 void destroyConstantImpl();
1321 Value *handleOperandChangeImpl(Value *From, Value *To);
1322
1323protected:
1324 ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
1325 : Constant(ty, ConstantExprVal, AllocInfo) {
1326 // Operation type (an Instruction opcode) is stored as the SubclassData.
1327 setValueSubclassData(Opcode);
1328 }
1329
1330 ~ConstantExpr() = default;
1331
1332public:
1333 // Static methods to construct a ConstantExpr of different kinds. Note that
1334 // these methods may return a object that is not an instance of the
1335 // ConstantExpr class, because they will attempt to fold the constant
1336 // expression into something simpler if possible.
1337
1338 /// getAlignOf constant expr - computes the alignment of a type in a target
1339 /// independent way (Note: the return type is an i64).
1340 LLVM_ABI static Constant *getAlignOf(Type *Ty);
1341
1342 /// getSizeOf constant expr - computes the (alloc) size of a type (in
1343 /// address-units, not bits) in a target independent way (Note: the return
1344 /// type is an i64).
1345 ///
1346 LLVM_ABI static Constant *getSizeOf(Type *Ty);
1347
1348 LLVM_ABI static Constant *getNeg(Constant *C, bool HasNSW = false);
1349 LLVM_ABI static Constant *getNot(Constant *C);
1350 LLVM_ABI static Constant *getAdd(Constant *C1, Constant *C2,
1351 bool HasNUW = false, bool HasNSW = false);
1352 LLVM_ABI static Constant *getSub(Constant *C1, Constant *C2,
1353 bool HasNUW = false, bool HasNSW = false);
1354 LLVM_ABI static Constant *getXor(Constant *C1, Constant *C2);
1355 LLVM_ABI static Constant *getTrunc(Constant *C, Type *Ty,
1356 bool OnlyIfReduced = false);
1358 bool OnlyIfReduced = false);
1360 bool OnlyIfReduced = false);
1362 bool OnlyIfReduced = false);
1363 LLVM_ABI static Constant *getBitCast(Constant *C, Type *Ty,
1364 bool OnlyIfReduced = false);
1366 bool OnlyIfReduced = false);
1367
1368 static Constant *getNSWNeg(Constant *C) { return getNeg(C, /*HasNSW=*/true); }
1369
1371 return getAdd(C1, C2, false, true);
1372 }
1373
1375 return getAdd(C1, C2, true, false);
1376 }
1377
1379 return getSub(C1, C2, false, true);
1380 }
1381
1383 return getSub(C1, C2, true, false);
1384 }
1385
1386 /// If C is a scalar/fixed width vector of known powers of 2, then this
1387 /// function returns a new scalar/fixed width vector obtained from logBase2
1388 /// of C. Undef vector elements are set to zero.
1389 /// Return a null pointer otherwise.
1390 LLVM_ABI static Constant *getExactLogBase2(Constant *C);
1391
1392 /// Return the identity constant for a binary opcode.
1393 /// If the binop is not commutative, callers can acquire the operand 1
1394 /// identity constant by setting AllowRHSConstant to true. For example, any
1395 /// shift has a zero identity constant for operand 1: X shift 0 = X. If this
1396 /// is a fadd/fsub operation and we don't care about signed zeros, then
1397 /// setting NSZ to true returns the identity +0.0 instead of -0.0. Return
1398 /// nullptr if the operator does not have an identity constant.
1399 LLVM_ABI static Constant *getBinOpIdentity(unsigned Opcode, Type *Ty,
1400 bool AllowRHSConstant = false,
1401 bool NSZ = false);
1402
1403 LLVM_ABI static Constant *getIntrinsicIdentity(Intrinsic::ID, Type *Ty);
1404
1405 /// Return the identity constant for a binary or intrinsic Instruction.
1406 /// The identity constant C is defined as X op C = X and C op X = X where C
1407 /// and X are the first two operands, and the operation is commutative.
1408 LLVM_ABI static Constant *getIdentity(Instruction *I, Type *Ty,
1409 bool AllowRHSConstant = false,
1410 bool NSZ = false);
1411
1412 /// Return the absorbing element for the given binary
1413 /// operation, i.e. a constant C such that X op C = C and C op X = C for
1414 /// every X. For example, this returns zero for integer multiplication.
1415 /// If AllowLHSConstant is true, the LHS operand is a constant C that must be
1416 /// defined as C op X = C. It returns null if the operator doesn't have
1417 /// an absorbing element.
1418 LLVM_ABI static Constant *getBinOpAbsorber(unsigned Opcode, Type *Ty,
1419 bool AllowLHSConstant = false);
1420
1421 /// Transparently provide more efficient getOperand methods.
1423
1424 /// Convenience function for getting a Cast operation.
1425 ///
1426 /// \param ops The opcode for the conversion
1427 /// \param C The constant to be converted
1428 /// \param Ty The type to which the constant is converted
1429 /// \param OnlyIfReduced see \a getWithOperands() docs.
1430 LLVM_ABI static Constant *getCast(unsigned ops, Constant *C, Type *Ty,
1431 bool OnlyIfReduced = false);
1432
1433 // Create a Trunc or BitCast cast constant expression
1434 LLVM_ABI static Constant *
1435 getTruncOrBitCast(Constant *C, ///< The constant to trunc or bitcast
1436 Type *Ty ///< The type to trunc or bitcast C to
1437 );
1438
1439 /// Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant
1440 /// expression.
1441 LLVM_ABI static Constant *
1442 getPointerCast(Constant *C, ///< The pointer value to be casted (operand 0)
1443 Type *Ty ///< The type to which cast should be made
1444 );
1445
1446 /// Create a BitCast or AddrSpaceCast for a pointer type depending on
1447 /// the address space.
1449 Constant *C, ///< The constant to addrspacecast or bitcast
1450 Type *Ty ///< The type to bitcast or addrspacecast C to
1451 );
1452
1453 /// Return true if this is a convert constant expression
1454 LLVM_ABI bool isCast() const;
1455
1456 /// get - Return a binary or shift operator constant expression,
1457 /// folding if possible.
1458 ///
1459 /// \param OnlyIfReducedTy see \a getWithOperands() docs.
1460 LLVM_ABI static Constant *get(unsigned Opcode, Constant *C1, Constant *C2,
1461 unsigned Flags = 0,
1462 Type *OnlyIfReducedTy = nullptr);
1463
1464 /// Getelementptr form. Value* is only accepted for convenience;
1465 /// all elements must be Constants.
1466 ///
1467 /// \param InRange the inrange range if present or std::nullopt.
1468 /// \param OnlyIfReducedTy see \a getWithOperands() docs.
1469 static Constant *
1472 std::optional<ConstantRange> InRange = std::nullopt,
1473 Type *OnlyIfReducedTy = nullptr) {
1474 return getGetElementPtr(
1475 Ty, C, ArrayRef((Value *const *)IdxList.data(), IdxList.size()), NW,
1476 InRange, OnlyIfReducedTy);
1477 }
1478 static Constant *
1481 std::optional<ConstantRange> InRange = std::nullopt,
1482 Type *OnlyIfReducedTy = nullptr) {
1483 // This form of the function only exists to avoid ambiguous overload
1484 // warnings about whether to convert Idx to ArrayRef<Constant *> or
1485 // ArrayRef<Value *>.
1486 return getGetElementPtr(Ty, C, cast<Value>(Idx), NW, InRange,
1487 OnlyIfReducedTy);
1488 }
1489 LLVM_ABI static Constant *
1490 getGetElementPtr(Type *Ty, Constant *C, ArrayRef<Value *> IdxList,
1492 std::optional<ConstantRange> InRange = std::nullopt,
1493 Type *OnlyIfReducedTy = nullptr);
1494
1495 /// Create a getelementptr i8, ptr, offset constant expression.
1496 static Constant *
1499 std::optional<ConstantRange> InRange = std::nullopt,
1500 Type *OnlyIfReduced = nullptr) {
1501 return getGetElementPtr(Type::getInt8Ty(Ptr->getContext()), Ptr, Offset, NW,
1502 InRange, OnlyIfReduced);
1503 }
1504
1505 /// Create an "inbounds" getelementptr. See the documentation for the
1506 /// "inbounds" flag in LangRef.html for details.
1508 ArrayRef<Constant *> IdxList) {
1509 return getGetElementPtr(Ty, C, IdxList, GEPNoWrapFlags::inBounds());
1510 }
1512 Constant *Idx) {
1513 // This form of the function only exists to avoid ambiguous overload
1514 // warnings about whether to convert Idx to ArrayRef<Constant *> or
1515 // ArrayRef<Value *>.
1516 return getGetElementPtr(Ty, C, Idx, GEPNoWrapFlags::inBounds());
1517 }
1519 ArrayRef<Value *> IdxList) {
1520 return getGetElementPtr(Ty, C, IdxList, GEPNoWrapFlags::inBounds());
1521 }
1522
1523 /// Create a getelementptr inbounds i8, ptr, offset constant expression.
1527
1528 LLVM_ABI static Constant *getExtractElement(Constant *Vec, Constant *Idx,
1529 Type *OnlyIfReducedTy = nullptr);
1530 LLVM_ABI static Constant *getInsertElement(Constant *Vec, Constant *Elt,
1531 Constant *Idx,
1532 Type *OnlyIfReducedTy = nullptr);
1533 LLVM_ABI static Constant *getShuffleVector(Constant *V1, Constant *V2,
1534 ArrayRef<int> Mask,
1535 Type *OnlyIfReducedTy = nullptr);
1536
1537 /// Return the opcode at the root of this constant expression
1538 unsigned getOpcode() const { return getSubclassDataFromValue(); }
1539
1540 /// Assert that this is a shufflevector and return the mask. See class
1541 /// ShuffleVectorInst for a description of the mask representation.
1542 LLVM_ABI ArrayRef<int> getShuffleMask() const;
1543
1544 /// Assert that this is a shufflevector and return the mask.
1545 ///
1546 /// TODO: This is a temporary hack until we update the bitcode format for
1547 /// shufflevector.
1548 LLVM_ABI Constant *getShuffleMaskForBitcode() const;
1549
1550 /// Return a string representation for an opcode.
1551 LLVM_ABI const char *getOpcodeName() const;
1552
1553 /// This returns the current constant expression with the operands replaced
1554 /// with the specified values. The specified array must have the same number
1555 /// of operands as our current one.
1559
1560 /// Get the current expression with the operands replaced.
1561 ///
1562 /// Return the current constant expression with the operands replaced with \c
1563 /// Ops and the type with \c Ty. The new operands must have the same number
1564 /// as the current ones.
1565 ///
1566 /// If \c OnlyIfReduced is \c true, nullptr will be returned unless something
1567 /// gets constant-folded, the type changes, or the expression is otherwise
1568 /// canonicalized. This parameter should almost always be \c false.
1569 LLVM_ABI Constant *getWithOperands(ArrayRef<Constant *> Ops, Type *Ty,
1570 bool OnlyIfReduced = false,
1571 Type *SrcTy = nullptr) const;
1572
1573 /// Returns an Instruction which implements the same operation as this
1574 /// ConstantExpr. It is not inserted into any basic block.
1575 ///
1576 /// A better approach to this could be to have a constructor for Instruction
1577 /// which would take a ConstantExpr parameter, but that would have spread
1578 /// implementation details of ConstantExpr outside of Constants.cpp, which
1579 /// would make it harder to remove ConstantExprs altogether.
1580 LLVM_ABI Instruction *getAsInstruction() const;
1581
1582 /// Whether creating a constant expression for this binary operator is
1583 /// desirable.
1584 LLVM_ABI static bool isDesirableBinOp(unsigned Opcode);
1585
1586 /// Whether creating a constant expression for this binary operator is
1587 /// supported.
1588 LLVM_ABI static bool isSupportedBinOp(unsigned Opcode);
1589
1590 /// Whether creating a constant expression for this cast is desirable.
1591 LLVM_ABI static bool isDesirableCastOp(unsigned Opcode);
1592
1593 /// Whether creating a constant expression for this cast is supported.
1594 LLVM_ABI static bool isSupportedCastOp(unsigned Opcode);
1595
1596 /// Whether creating a constant expression for this getelementptr type is
1597 /// supported.
1598 static bool isSupportedGetElementPtr(const Type *SrcElemTy) {
1599 return !SrcElemTy->isScalableTy();
1600 }
1601
1602 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1603 static bool classof(const Value *V) {
1604 return V->getValueID() == ConstantExprVal;
1605 }
1606
1607private:
1608 // Shadow Value::setValueSubclassData with a private forwarding method so that
1609 // subclasses cannot accidentally use it.
1610 void setValueSubclassData(unsigned short D) {
1612 }
1613};
1614
1615template <>
1617 : public VariadicOperandTraits<ConstantExpr> {};
1618
1620
1621//===----------------------------------------------------------------------===//
1622/// 'undef' values are things that do not have specified contents.
1623/// These are used for a variety of purposes, including global variable
1624/// initializers and operands to instructions. 'undef' values can occur with
1625/// any first-class type.
1626///
1627/// Undef values aren't exactly constants; if they have multiple uses, they
1628/// can appear to have different bit patterns at each use. See
1629/// LangRef.html#undefvalues for details.
1630///
1631class UndefValue : public ConstantData {
1632 friend class Constant;
1633
1634 explicit UndefValue(Type *T) : ConstantData(T, UndefValueVal) {}
1635
1636 void destroyConstantImpl();
1637
1638protected:
1639 explicit UndefValue(Type *T, ValueTy vty) : ConstantData(T, vty) {}
1640
1641public:
1642 UndefValue(const UndefValue &) = delete;
1643
1644 /// Static factory methods - Return an 'undef' object of the specified type.
1645 LLVM_ABI static UndefValue *get(Type *T);
1646
1647 /// If this Undef has array or vector type, return a undef with the right
1648 /// element type.
1649 LLVM_ABI UndefValue *getSequentialElement() const;
1650
1651 /// If this undef has struct type, return a undef with the right element type
1652 /// for the specified element.
1653 LLVM_ABI UndefValue *getStructElement(unsigned Elt) const;
1654
1655 /// Return an undef of the right value for the specified GEP index if we can,
1656 /// otherwise return null (e.g. if C is a ConstantExpr).
1657 LLVM_ABI UndefValue *getElementValue(Constant *C) const;
1658
1659 /// Return an undef of the right value for the specified GEP index.
1660 LLVM_ABI UndefValue *getElementValue(unsigned Idx) const;
1661
1662 /// Return the number of elements in the array, vector, or struct.
1663 LLVM_ABI unsigned getNumElements() const;
1664
1665 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1666 static bool classof(const Value *V) {
1667 return V->getValueID() == UndefValueVal ||
1668 V->getValueID() == PoisonValueVal;
1669 }
1670};
1671
1672//===----------------------------------------------------------------------===//
1673/// In order to facilitate speculative execution, many instructions do not
1674/// invoke immediate undefined behavior when provided with illegal operands,
1675/// and return a poison value instead.
1676///
1677/// see LangRef.html#poisonvalues for details.
1678///
1679class PoisonValue final : public UndefValue {
1680 friend class Constant;
1681
1682 explicit PoisonValue(Type *T) : UndefValue(T, PoisonValueVal) {}
1683
1684 void destroyConstantImpl();
1685
1686public:
1687 PoisonValue(const PoisonValue &) = delete;
1688
1689 /// Static factory methods - Return an 'poison' object of the specified type.
1690 LLVM_ABI static PoisonValue *get(Type *T);
1691
1692 /// If this poison has array or vector type, return a poison with the right
1693 /// element type.
1694 LLVM_ABI PoisonValue *getSequentialElement() const;
1695
1696 /// If this poison has struct type, return a poison with the right element
1697 /// type for the specified element.
1698 LLVM_ABI PoisonValue *getStructElement(unsigned Elt) const;
1699
1700 /// Return an poison of the right value for the specified GEP index if we can,
1701 /// otherwise return null (e.g. if C is a ConstantExpr).
1702 LLVM_ABI PoisonValue *getElementValue(Constant *C) const;
1703
1704 /// Return an poison of the right value for the specified GEP index.
1705 LLVM_ABI PoisonValue *getElementValue(unsigned Idx) const;
1706
1707 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1708 static bool classof(const Value *V) {
1709 return V->getValueID() == PoisonValueVal;
1710 }
1711};
1712
1713} // end namespace llvm
1714
1715#endif // LLVM_IR_CONSTANTS_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_ABI
Definition Compiler.h:215
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
static bool isSigned(unsigned Opcode)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
#define T
#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS)
Macro for generating out-of-class operand accessor definitions.
static unsigned getNumElements(Type *Ty)
This file contains some templates that are useful if you are working with the STL at all.
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
xray Insert XRay ops
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:345
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:5901
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
const T * data() const
Definition ArrayRef.h:138
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
The address of a basic block.
Definition Constants.h:1088
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
friend class Constant
Definition Constants.h:1089
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1129
Function * getFunction() const
Definition Constants.h:1126
BasicBlock * getBasicBlock() const
Definition Constants.h:1125
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Class to represent byte types.
LLVM_ABI ElementCount getElementCount() const
Return the number of elements in the array, vector, or struct.
ConstantAggregateZero(const ConstantAggregateZero &)=delete
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:549
LLVM_ABI Constant * getSequentialElement() const
If this CAZ has array or vector type, return a zero with the right element type.
LLVM_ABI Constant * getElementValue(Constant *C) const
Return a zero of the right value for the specified GEP index if we can, otherwise return null (e....
LLVM_ABI Constant * getStructElement(unsigned Elt) const
If this CAZ has struct type, return a zero with the right element type for the specified element.
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
Base class for aggregate constants (with operands).
Definition Constants.h:565
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant)
Transparently provide more efficient getOperand methods.
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:575
LLVM_ABI ConstantAggregate(Type *T, ValueTy VT, ArrayRef< Constant * > V, AllocInfo AllocInfo)
friend class Constant
Definition Constants.h:592
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:614
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:609
Class for constant bytes.
Definition Constants.h:281
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:412
bool isNegative() const
Definition Constants.h:368
friend class ConstantVector
Definition Constants.h:283
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:385
int64_t getSExtValue() const
Return the constant as a 64-bit byte value after it has been sign extended as appropriate for the typ...
Definition Constants.h:360
ConstantByte(const ConstantByte &)=delete
friend class Constant
Definition Constants.h:282
uint64_t getZExtValue() const
Return the constant as a 64-bit byte value after it has been zero extended as appropriate for the typ...
Definition Constants.h:354
ByteType * getByteType() const
Variant of the getType() method to always return a ByteType, which reduces the amount of casting need...
Definition Constants.h:364
static ConstantByte * getSigned(ByteType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantByte with the specified value for the specified type.
Definition Constants.h:322
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:373
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:379
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:345
static Constant * getSigned(Type *Ty, int64_t V, bool ImplicitTrunc=false)
Definition Constants.h:326
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:348
bool isMinValue(bool IsSigned) const
This function will return true iff this constant represents the smallest value that may be represente...
Definition Constants.h:404
bool isMaxValue(bool IsSigned) const
This function will return true iff this constant represents the largest value that may be represented...
Definition Constants.h:392
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:940
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:878
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of array type with a float element type taken from argument ...
friend class ConstantDataSequential
Definition Constants.h:866
static Constant * get(LLVMContext &Context, ArrayTy &Elts)
get() constructor - ArrayTy needs to be compatible with ArrayRef<ElementTy>.
Definition Constants.h:887
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
ConstantDataArray(const ConstantDataArray &)=delete
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with array type with an element count and element type match...
Definition Constants.h:897
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:935
static LLVM_ABI Constant * getByte(Type *ElementType, ArrayRef< uint8_t > Elts)
getByte() constructors - Return a constant of array type with a byte element type taken from argument...
LLVM_ABI APFloat getElementAsAPFloat(uint64_t i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition Constants.h:831
LLVM_ABI Constant * getElementAsConstant(uint64_t i) const
Return a Constant for a specified index's element.
LLVM_ABI uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
ConstantDataSequential(const ConstantDataSequential &)=delete
LLVM_ABI float getElementAsFloat(uint64_t i) const
If this is an sequential container of floats, return the specified element as a float.
LLVM_ABI bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers or bytes.
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
StringRef getAsCString() const
If this array is isCString(), then this method returns the array (without the trailing null byte) as ...
Definition Constants.h:838
LLVM_ABI APInt getElementAsAPInt(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element as an APInt...
static LLVM_ABI Constant * getImpl(StringRef Bytes, Type *Ty)
This is the underlying implementation of all of the ConstantDataSequential::get methods.
LLVM_ABI double getElementAsDouble(uint64_t i) const
If this is an sequential container of doubles, return the specified element as a double.
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
LLVM_ABI bool isCString() const
This method returns true if the array "isString", ends with a null byte, and does not contains any ot...
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:850
LLVM_ABI StringRef getRawDataValues() const
Return the raw, underlying, bytes of this data.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
ConstantDataSequential(Type *ty, ValueTy VT, const char *Data)
Definition Constants.h:772
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
Definition Constants.h:981
LLVM_ABI Constant * getSplatValue() const
If this is a splat constant, meaning that all of the elements have the same value,...
static LLVM_ABI Constant * getSplat(unsigned NumElts, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1027
LLVM_ABI bool isSplat() const
Returns true if this is a splat constant, meaning that all elements have the same value.
friend class ConstantDataSequential
Definition Constants.h:952
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition Constants.h:1022
ConstantDataVector(const ConstantDataVector &)=delete
static LLVM_ABI Constant * get(LLVMContext &Context, ArrayRef< uint8_t > Elts)
get() constructors - Return a constant with vector type with an element count and element type matchi...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of vector type with a float element type taken from argument...
static LLVM_ABI Constant * getByte(Type *ElementType, ArrayRef< uint8_t > Elts)
getByte() constructors - Return a constant of vector type with a byte element type taken from argumen...
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:76
friend class Constant
Definition Constants.h:59
ConstantData(const ConstantData &)=delete
ConstantData(Type *Ty, ValueTy VT)
Definition Constants.h:66
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantExpr(Type *ty, unsigned Opcode, AllocInfo AllocInfo)
Definition Constants.h:1324
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1603
static LLVM_ABI Constant * getAlignOf(Type *Ty)
getAlignOf constant expr - computes the alignment of a type in a target independent way (Note: the re...
static Constant * getNUWSub(Constant *C1, Constant *C2)
Definition Constants.h:1382
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList)
Create an "inbounds" getelementptr.
Definition Constants.h:1507
friend struct ConstantExprKeyType
Definition Constants.h:1317
static LLVM_ABI Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static LLVM_ABI Constant * getTruncOrBitCast(Constant *C, Type *Ty)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
LLVM_ABI bool isCast() const
Return true if this is a convert constant expression.
static Constant * getNSWAdd(Constant *C1, Constant *C2)
Definition Constants.h:1370
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant)
Transparently provide more efficient getOperand methods.
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
friend class Constant
Definition Constants.h:1318
static Constant * getPtrAdd(Constant *Ptr, Constant *Offset, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReduced=nullptr)
Create a getelementptr i8, ptr, offset constant expression.
Definition Constants.h:1497
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getInBoundsPtrAdd(Constant *Ptr, Constant *Offset)
Create a getelementptr inbounds i8, ptr, offset constant expression.
Definition Constants.h:1524
static LLVM_ABI Constant * getPtrToAddr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getSizeOf(Type *Ty)
getSizeOf constant expr - computes the (alloc) size of a type (in address-units, not bits) in a targe...
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
Definition Constants.h:1598
static Constant * getGetElementPtr(Type *Ty, Constant *C, Constant *Idx, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Definition Constants.h:1479
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Value * > IdxList)
Definition Constants.h:1518
static Constant * getNSWNeg(Constant *C)
Definition Constants.h:1368
static Constant * getNSWSub(Constant *C1, Constant *C2)
Definition Constants.h:1378
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, Constant *Idx)
Definition Constants.h:1511
static Constant * getNUWAdd(Constant *C1, Constant *C2)
Definition Constants.h:1374
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
~ConstantExpr()=default
unsigned getOpcode() const
Return the opcode at the root of this constant expression.
Definition Constants.h:1538
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
Definition Constants.h:1470
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Constant * getWithOperands(ArrayRef< Constant * > Ops) const
This returns the current constant expression with the operands replaced with the specified values.
Definition Constants.h:1556
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
ConstantFP(const ConstantFP &)=delete
const APFloat & getValue() const
Definition Constants.h:464
friend class ConstantVector
Definition Constants.h:422
bool isMinusOne() const
Returns true if this value is exactly -1.0.
Definition Constants.h:488
const APFloat & getValueAPF() const
Definition Constants.h:463
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:506
bool isInfinity() const
Return true if the value is infinity.
Definition Constants.h:479
friend class Constant
Definition Constants.h:421
bool isNegative() const
Return true if the sign bit is set.
Definition Constants.h:476
bool isExactlyValue(double V) const
Definition Constants.h:498
static ConstantFP * getNegativeZero(Type *Ty)
Definition Constants.h:458
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI ConstantFP * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
static LLVM_ABI ConstantFP * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
bool isNaN() const
Return true if the value is a NaN.
Definition Constants.h:482
LLVM_ABI bool isExactlyValue(const APFloat &V) const
We don't rely on operator== working on double values, as it returns true for things that are clearly ...
bool isPosZero() const
Return true if the value is positive zero.
Definition Constants.h:470
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI ConstantFP * getSNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
bool isNegZero() const
Return true if the value is negative zero.
Definition Constants.h:473
bool isOne() const
Returns true if this value is exactly +1.0.
Definition Constants.h:485
bool isZero() const
Return true if the value is positive or negative zero.
Definition Constants.h:467
static LLVM_ABI ConstantFP * getInfinity(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
friend class ConstantVector
Definition Constants.h:89
bool isOne() const
This is just a convenience method to make client code smaller for a common case.
Definition Constants.h:225
bool isNegative() const
Definition Constants.h:214
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:269
IntegerType * getIntegerType() const
Variant of the getType() method to always return an IntegerType, which reduces the amount of casting ...
Definition Constants.h:198
static LLVM_ABI bool isValueValidForType(Type *Ty, uint64_t V)
This static method returns true if the type Ty is big enough to represent the value V.
friend class Constant
Definition Constants.h:88
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:274
static Constant * getSigned(Type *Ty, int64_t V, bool ImplicitTrunc=false)
Definition Constants.h:139
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
ConstantInt(const ConstantInt &)=delete
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
MaybeAlign getMaybeAlignValue() const
Return the constant as an llvm::MaybeAlign.
Definition Constants.h:179
bool isMinValue(bool IsSigned) const
This function will return true iff this constant represents the smallest value that may be represente...
Definition Constants.h:250
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
int64_t getSExtValue() const
Return the constant as a 64-bit integer value after it has been sign extended as appropriate for the ...
Definition Constants.h:174
bool isMaxValue(bool IsSigned) const
This function will return true iff this constant represents the largest value that may be represented...
Definition Constants.h:238
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition Constants.h:162
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
Align getAlignValue() const
Return the constant as an llvm::Align, interpreting 0 as Align(1).
Definition Constants.h:186
bool equalsInt(uint64_t V) const
A helper method that can be used to determine if the constant contained within is equal to a constant...
Definition Constants.h:194
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
bool uge(uint64_t Num) const
This function will return true iff this constant represents a value with active bits bigger than 64 b...
Definition Constants.h:262
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:741
PointerType * getPointerType() const
Return the scalar pointer type for this null value.
Definition Constants.h:736
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
ConstantPointerNull(const ConstantPointerNull &)=delete
A signed pointer, in the ptrauth sense.
Definition Constants.h:1223
Constant * getAddrDiscriminator() const
The address discriminator if any, or the null constant.
Definition Constants.h:1264
friend struct ConstantPtrAuthKeyType
Definition Constants.h:1224
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant)
Transparently provide more efficient getOperand methods.
Constant * getPointer() const
The pointer that is signed in this ptrauth signed pointer.
Definition Constants.h:1251
friend class Constant
Definition Constants.h:1225
ConstantInt * getKey() const
The Key ID, an i32 constant.
Definition Constants.h:1254
Constant * getDeactivationSymbol() const
Definition Constants.h:1273
bool hasAddressDiscriminator() const
Whether there is any non-null address discriminator.
Definition Constants.h:1269
ConstantInt * getDiscriminator() const
The integer discriminator, an i64 constant, or 0.
Definition Constants.h:1257
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1298
static Constant * getAnon(LLVMContext &Ctx, ArrayRef< Constant * > V, bool Packed=false)
Definition Constants.h:646
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:666
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
friend class Constant
Definition Constants.h:624
static LLVM_ABI StructType * getTypeForElements(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct type to use for a constant with the specified set of elements.
static std::enable_if_t< are_base_of< Constant, Csts... >::value, Constant * > get(StructType *T, Csts *...Vs)
Definition Constants.h:637
StructType * getType() const
Specialization - reduce amount of casting.
Definition Constants.h:661
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
Definition Constants.h:643
static LLVM_ABI ConstantTargetNone * get(TargetExtType *T)
Static factory methods - Return objects of the specified value.
TargetExtType * getType() const
Specialize the getType() method to always return an TargetExtType, which reduces the amount of castin...
Definition Constants.h:1076
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:1081
ConstantTargetNone(const ConstantTargetNone &)=delete
ConstantTokenNone(const ConstantTokenNone &)=delete
static LLVM_ABI ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
static bool classof(const Value *V)
Methods to support type inquiry through isa, cast, and dyn_cast.
Definition Constants.h:1052
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:707
friend class Constant
Definition Constants.h:676
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition Constants.h:697
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
Constant(Type *ty, ValueTy vty, AllocInfo AllocInfo)
Definition Constant.h:54
Wrapper for a function that represents a value that functionally represents the original function.
Definition Constants.h:1143
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1169
GlobalValue * getGlobalValue() const
Definition Constants.h:1164
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
Class to represent fixed width SIMD vectors.
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags none()
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
Definition Constants.h:1182
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1211
friend class Constant
Definition Constants.h:1183
PointerType * getType() const
NoCFIValue is always a pointer.
Definition Constants.h:1206
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value)
Transparently provide more efficient getOperand methods.
GlobalValue * getGlobalValue() const
Definition Constants.h:1201
Class to represent pointers.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
PoisonValue(const PoisonValue &)=delete
friend class Constant
Definition Constants.h:1680
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1708
LLVM_ABI PoisonValue * getStructElement(unsigned Elt) const
If this poison has struct type, return a poison with the right element type for the specified element...
LLVM_ABI PoisonValue * getSequentialElement() const
If this poison has array or vector type, return a poison with the right element type.
LLVM_ABI PoisonValue * getElementValue(Constant *C) const
Return an poison of the right value for the specified GEP index if we can, otherwise return null (e....
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Class to represent struct types.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
Definition Type.cpp:61
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:307
static Type * getScalarTy(LLVMContext &C)
Definition Type.h:489
LLVM_ABI UndefValue * getElementValue(Constant *C) const
Return an undef of the right value for the specified GEP index if we can, otherwise return null (e....
LLVM_ABI UndefValue * getStructElement(unsigned Elt) const
If this undef has struct type, return a undef with the right element type for the specified element.
UndefValue(const UndefValue &)=delete
friend class Constant
Definition Constants.h:1632
static bool classof(const Value *V)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition Constants.h:1666
UndefValue(Type *T, ValueTy vty)
Definition Constants.h:1639
LLVM_ABI UndefValue * getSequentialElement() const
If this Undef has array or vector type, return a undef with the right element type.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
unsigned short getSubclassDataFromValue() const
Definition Value.h:858
unsigned char SubclassOptionalData
Hold arbitary subclass data.
Definition Value.h:85
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
void setValueSubclassData(unsigned short D)
Definition Value.h:859
ValueTy
Concrete subclass of this.
Definition Value.h:524
Base class of all SIMD vector types.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
#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.
@ Offset
Definition DWP.cpp:573
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
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
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
std::conjunction< std::is_base_of< T, Ts >... > are_base_of
traits class for checking whether type T is a base class for all the given types in the variadic list...
Definition STLExtras.h:114
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
FixedNumOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:130
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...