LLVM 20.0.0git
Constants.cpp
Go to the documentation of this file.
1//===-- Constants.cpp - Implement Constant nodes --------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the Constant* classes.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/IR/Constants.h"
14#include "LLVMContextImpl.h"
15#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/StringMap.h"
18#include "llvm/IR/BasicBlock.h"
21#include "llvm/IR/Function.h"
23#include "llvm/IR/GlobalAlias.h"
24#include "llvm/IR/GlobalIFunc.h"
25#include "llvm/IR/GlobalValue.h"
28#include "llvm/IR/Operator.h"
33#include <algorithm>
34
35using namespace llvm;
36using namespace PatternMatch;
37
38// As set of temporary options to help migrate how splats are represented.
40 "use-constant-int-for-fixed-length-splat", cl::init(false), cl::Hidden,
41 cl::desc("Use ConstantInt's native fixed-length vector splat support."));
43 "use-constant-fp-for-fixed-length-splat", cl::init(false), cl::Hidden,
44 cl::desc("Use ConstantFP's native fixed-length vector splat support."));
46 "use-constant-int-for-scalable-splat", cl::init(false), cl::Hidden,
47 cl::desc("Use ConstantInt's native scalable vector splat support."));
49 "use-constant-fp-for-scalable-splat", cl::init(false), cl::Hidden,
50 cl::desc("Use ConstantFP's native scalable vector splat support."));
51
52//===----------------------------------------------------------------------===//
53// Constant Class
54//===----------------------------------------------------------------------===//
55
57 // Floating point values have an explicit -0.0 value.
58 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
59 return CFP->isZero() && CFP->isNegative();
60
61 // Equivalent for a vector of -0.0's.
62 if (getType()->isVectorTy())
63 if (const auto *SplatCFP = dyn_cast_or_null<ConstantFP>(getSplatValue()))
64 return SplatCFP->isNegativeZeroValue();
65
66 // We've already handled true FP case; any other FP vectors can't represent -0.0.
67 if (getType()->isFPOrFPVectorTy())
68 return false;
69
70 // Otherwise, just use +0.0.
71 return isNullValue();
72}
73
74// Return true iff this constant is positive zero (floating point), negative
75// zero (floating point), or a null value.
77 // Floating point values have an explicit -0.0 value.
78 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
79 return CFP->isZero();
80
81 // Check for constant splat vectors of 1 values.
82 if (getType()->isVectorTy())
83 if (const auto *SplatCFP = dyn_cast_or_null<ConstantFP>(getSplatValue()))
84 return SplatCFP->isZero();
85
86 // Otherwise, just use +0.0.
87 return isNullValue();
88}
89
91 // 0 is null.
92 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
93 return CI->isZero();
94
95 // +0.0 is null.
96 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
97 // ppc_fp128 determine isZero using high order double only
98 // Should check the bitwise value to make sure all bits are zero.
99 return CFP->isExactlyValue(+0.0);
100
101 // constant zero is zero for aggregates, cpnull is null for pointers, none for
102 // tokens.
103 return isa<ConstantAggregateZero>(this) || isa<ConstantPointerNull>(this) ||
104 isa<ConstantTokenNone>(this) || isa<ConstantTargetNone>(this);
105}
106
108 // Check for -1 integers
109 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
110 return CI->isMinusOne();
111
112 // Check for FP which are bitcasted from -1 integers
113 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
114 return CFP->getValueAPF().bitcastToAPInt().isAllOnes();
115
116 // Check for constant splat vectors of 1 values.
117 if (getType()->isVectorTy())
118 if (const auto *SplatVal = getSplatValue())
119 return SplatVal->isAllOnesValue();
120
121 return false;
122}
123
125 // Check for 1 integers
126 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
127 return CI->isOne();
128
129 // Check for FP which are bitcasted from 1 integers
130 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
131 return CFP->getValueAPF().bitcastToAPInt().isOne();
132
133 // Check for constant splat vectors of 1 values.
134 if (getType()->isVectorTy())
135 if (const auto *SplatVal = getSplatValue())
136 return SplatVal->isOneValue();
137
138 return false;
139}
140
142 // Check for 1 integers
143 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
144 return !CI->isOneValue();
145
146 // Check for FP which are bitcasted from 1 integers
147 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
148 return !CFP->getValueAPF().bitcastToAPInt().isOne();
149
150 // Check that vectors don't contain 1
151 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
152 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
154 if (!Elt || !Elt->isNotOneValue())
155 return false;
156 }
157 return true;
158 }
159
160 // Check for splats that don't contain 1
161 if (getType()->isVectorTy())
162 if (const auto *SplatVal = getSplatValue())
163 return SplatVal->isNotOneValue();
164
165 // It *may* contain 1, we can't tell.
166 return false;
167}
168
170 // Check for INT_MIN integers
171 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
172 return CI->isMinValue(/*isSigned=*/true);
173
174 // Check for FP which are bitcasted from INT_MIN integers
175 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
176 return CFP->getValueAPF().bitcastToAPInt().isMinSignedValue();
177
178 // Check for splats of INT_MIN values.
179 if (getType()->isVectorTy())
180 if (const auto *SplatVal = getSplatValue())
181 return SplatVal->isMinSignedValue();
182
183 return false;
184}
185
187 // Check for INT_MIN integers
188 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
189 return !CI->isMinValue(/*isSigned=*/true);
190
191 // Check for FP which are bitcasted from INT_MIN integers
192 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
193 return !CFP->getValueAPF().bitcastToAPInt().isMinSignedValue();
194
195 // Check that vectors don't contain INT_MIN
196 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
197 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
199 if (!Elt || !Elt->isNotMinSignedValue())
200 return false;
201 }
202 return true;
203 }
204
205 // Check for splats that aren't INT_MIN
206 if (getType()->isVectorTy())
207 if (const auto *SplatVal = getSplatValue())
208 return SplatVal->isNotMinSignedValue();
209
210 // It *may* contain INT_MIN, we can't tell.
211 return false;
212}
213
215 if (auto *CFP = dyn_cast<ConstantFP>(this))
216 return CFP->getValueAPF().isFiniteNonZero();
217
218 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
219 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
220 auto *CFP = dyn_cast_or_null<ConstantFP>(getAggregateElement(I));
221 if (!CFP || !CFP->getValueAPF().isFiniteNonZero())
222 return false;
223 }
224 return true;
225 }
226
227 if (getType()->isVectorTy())
228 if (const auto *SplatCFP = dyn_cast_or_null<ConstantFP>(getSplatValue()))
229 return SplatCFP->isFiniteNonZeroFP();
230
231 // It *may* contain finite non-zero, we can't tell.
232 return false;
233}
234
236 if (auto *CFP = dyn_cast<ConstantFP>(this))
237 return CFP->getValueAPF().isNormal();
238
239 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
240 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
241 auto *CFP = dyn_cast_or_null<ConstantFP>(getAggregateElement(I));
242 if (!CFP || !CFP->getValueAPF().isNormal())
243 return false;
244 }
245 return true;
246 }
247
248 if (getType()->isVectorTy())
249 if (const auto *SplatCFP = dyn_cast_or_null<ConstantFP>(getSplatValue()))
250 return SplatCFP->isNormalFP();
251
252 // It *may* contain a normal fp value, we can't tell.
253 return false;
254}
255
257 if (auto *CFP = dyn_cast<ConstantFP>(this))
258 return CFP->getValueAPF().getExactInverse(nullptr);
259
260 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
261 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
262 auto *CFP = dyn_cast_or_null<ConstantFP>(getAggregateElement(I));
263 if (!CFP || !CFP->getValueAPF().getExactInverse(nullptr))
264 return false;
265 }
266 return true;
267 }
268
269 if (getType()->isVectorTy())
270 if (const auto *SplatCFP = dyn_cast_or_null<ConstantFP>(getSplatValue()))
271 return SplatCFP->hasExactInverseFP();
272
273 // It *may* have an exact inverse fp value, we can't tell.
274 return false;
275}
276
277bool Constant::isNaN() const {
278 if (auto *CFP = dyn_cast<ConstantFP>(this))
279 return CFP->isNaN();
280
281 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
282 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
283 auto *CFP = dyn_cast_or_null<ConstantFP>(getAggregateElement(I));
284 if (!CFP || !CFP->isNaN())
285 return false;
286 }
287 return true;
288 }
289
290 if (getType()->isVectorTy())
291 if (const auto *SplatCFP = dyn_cast_or_null<ConstantFP>(getSplatValue()))
292 return SplatCFP->isNaN();
293
294 // It *may* be NaN, we can't tell.
295 return false;
296}
297
299 // Are they fully identical?
300 if (this == Y)
301 return true;
302
303 // The input value must be a vector constant with the same type.
304 auto *VTy = dyn_cast<VectorType>(getType());
305 if (!isa<Constant>(Y) || !VTy || VTy != Y->getType())
306 return false;
307
308 // TODO: Compare pointer constants?
309 if (!(VTy->getElementType()->isIntegerTy() ||
310 VTy->getElementType()->isFloatingPointTy()))
311 return false;
312
313 // They may still be identical element-wise (if they have `undef`s).
314 // Bitcast to integer to allow exact bitwise comparison for all types.
315 Type *IntTy = VectorType::getInteger(VTy);
316 Constant *C0 = ConstantExpr::getBitCast(const_cast<Constant *>(this), IntTy);
317 Constant *C1 = ConstantExpr::getBitCast(cast<Constant>(Y), IntTy);
319 return CmpEq && (isa<PoisonValue>(CmpEq) || match(CmpEq, m_One()));
320}
321
322static bool
324 function_ref<bool(const Constant *)> HasFn) {
325 if (auto *VTy = dyn_cast<VectorType>(C->getType())) {
326 if (HasFn(C))
327 return true;
328 if (isa<ConstantAggregateZero>(C))
329 return false;
330 if (isa<ScalableVectorType>(C->getType()))
331 return false;
332
333 for (unsigned i = 0, e = cast<FixedVectorType>(VTy)->getNumElements();
334 i != e; ++i) {
335 if (Constant *Elem = C->getAggregateElement(i))
336 if (HasFn(Elem))
337 return true;
338 }
339 }
340
341 return false;
342}
343
346 this, [&](const auto *C) { return isa<UndefValue>(C); });
347}
348
351 this, [&](const auto *C) { return isa<PoisonValue>(C); });
352}
353
355 return containsUndefinedElement(this, [&](const auto *C) {
356 return isa<UndefValue>(C) && !isa<PoisonValue>(C);
357 });
358}
359
361 if (isa<ConstantInt>(this) || isa<ConstantFP>(this))
362 return false;
363
364 if (auto *VTy = dyn_cast<FixedVectorType>(getType())) {
365 for (unsigned i = 0, e = VTy->getNumElements(); i != e; ++i)
366 if (isa<ConstantExpr>(getAggregateElement(i)))
367 return true;
368 }
369 return false;
370}
371
372/// Constructor to create a '0' constant of arbitrary type.
374 switch (Ty->getTypeID()) {
376 return ConstantInt::get(Ty, 0);
377 case Type::HalfTyID:
378 case Type::BFloatTyID:
379 case Type::FloatTyID:
380 case Type::DoubleTyID:
382 case Type::FP128TyID:
384 return ConstantFP::get(Ty->getContext(),
387 return ConstantPointerNull::get(cast<PointerType>(Ty));
388 case Type::StructTyID:
389 case Type::ArrayTyID:
393 case Type::TokenTyID:
396 return ConstantTargetNone::get(cast<TargetExtType>(Ty));
397 default:
398 // Function, Label, or Opaque type?
399 llvm_unreachable("Cannot create a null constant of that type!");
400 }
401}
402
404 Type *ScalarTy = Ty->getScalarType();
405
406 // Create the base integer constant.
407 Constant *C = ConstantInt::get(Ty->getContext(), V);
408
409 // Convert an integer to a pointer, if necessary.
410 if (PointerType *PTy = dyn_cast<PointerType>(ScalarTy))
412
413 // Broadcast a scalar to a vector, if necessary.
414 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
415 C = ConstantVector::getSplat(VTy->getElementCount(), C);
416
417 return C;
418}
419
421 if (IntegerType *ITy = dyn_cast<IntegerType>(Ty))
422 return ConstantInt::get(Ty->getContext(),
423 APInt::getAllOnes(ITy->getBitWidth()));
424
425 if (Ty->isFloatingPointTy()) {
427 return ConstantFP::get(Ty->getContext(), FL);
428 }
429
430 VectorType *VTy = cast<VectorType>(Ty);
433}
434
436 assert((getType()->isAggregateType() || getType()->isVectorTy()) &&
437 "Must be an aggregate/vector constant");
438
439 if (const auto *CC = dyn_cast<ConstantAggregate>(this))
440 return Elt < CC->getNumOperands() ? CC->getOperand(Elt) : nullptr;
441
442 if (const auto *CAZ = dyn_cast<ConstantAggregateZero>(this))
443 return Elt < CAZ->getElementCount().getKnownMinValue()
444 ? CAZ->getElementValue(Elt)
445 : nullptr;
446
447 if (const auto *CI = dyn_cast<ConstantInt>(this))
448 return Elt < cast<VectorType>(getType())
449 ->getElementCount()
450 .getKnownMinValue()
451 ? ConstantInt::get(getContext(), CI->getValue())
452 : nullptr;
453
454 if (const auto *CFP = dyn_cast<ConstantFP>(this))
455 return Elt < cast<VectorType>(getType())
456 ->getElementCount()
457 .getKnownMinValue()
458 ? ConstantFP::get(getContext(), CFP->getValue())
459 : nullptr;
460
461 // FIXME: getNumElements() will fail for non-fixed vector types.
462 if (isa<ScalableVectorType>(getType()))
463 return nullptr;
464
465 if (const auto *PV = dyn_cast<PoisonValue>(this))
466 return Elt < PV->getNumElements() ? PV->getElementValue(Elt) : nullptr;
467
468 if (const auto *UV = dyn_cast<UndefValue>(this))
469 return Elt < UV->getNumElements() ? UV->getElementValue(Elt) : nullptr;
470
471 if (const auto *CDS = dyn_cast<ConstantDataSequential>(this))
472 return Elt < CDS->getNumElements() ? CDS->getElementAsConstant(Elt)
473 : nullptr;
474
475 return nullptr;
476}
477
479 assert(isa<IntegerType>(Elt->getType()) && "Index must be an integer");
480 if (ConstantInt *CI = dyn_cast<ConstantInt>(Elt)) {
481 // Check if the constant fits into an uint64_t.
482 if (CI->getValue().getActiveBits() > 64)
483 return nullptr;
484 return getAggregateElement(CI->getZExtValue());
485 }
486 return nullptr;
487}
488
490 /// First call destroyConstantImpl on the subclass. This gives the subclass
491 /// a chance to remove the constant from any maps/pools it's contained in.
492 switch (getValueID()) {
493 default:
494 llvm_unreachable("Not a constant!");
495#define HANDLE_CONSTANT(Name) \
496 case Value::Name##Val: \
497 cast<Name>(this)->destroyConstantImpl(); \
498 break;
499#include "llvm/IR/Value.def"
500 }
501
502 // When a Constant is destroyed, there may be lingering
503 // references to the constant by other constants in the constant pool. These
504 // constants are implicitly dependent on the module that is being deleted,
505 // but they don't know that. Because we only find out when the CPV is
506 // deleted, we must now notify all of our users (that should only be
507 // Constants) that they are, in fact, invalid now and should be deleted.
508 //
509 while (!use_empty()) {
510 Value *V = user_back();
511#ifndef NDEBUG // Only in -g mode...
512 if (!isa<Constant>(V)) {
513 dbgs() << "While deleting: " << *this
514 << "\n\nUse still stuck around after Def is destroyed: " << *V
515 << "\n\n";
516 }
517#endif
518 assert(isa<Constant>(V) && "References remain to Constant being destroyed");
519 cast<Constant>(V)->destroyConstant();
520
521 // The constant should remove itself from our use list...
522 assert((use_empty() || user_back() != V) && "Constant not removed!");
523 }
524
525 // Value has no outstanding references it is safe to delete it now...
526 deleteConstant(this);
527}
528
530 switch (C->getValueID()) {
531 case Constant::ConstantIntVal:
532 delete static_cast<ConstantInt *>(C);
533 break;
534 case Constant::ConstantFPVal:
535 delete static_cast<ConstantFP *>(C);
536 break;
537 case Constant::ConstantAggregateZeroVal:
538 delete static_cast<ConstantAggregateZero *>(C);
539 break;
540 case Constant::ConstantArrayVal:
541 delete static_cast<ConstantArray *>(C);
542 break;
543 case Constant::ConstantStructVal:
544 delete static_cast<ConstantStruct *>(C);
545 break;
546 case Constant::ConstantVectorVal:
547 delete static_cast<ConstantVector *>(C);
548 break;
549 case Constant::ConstantPointerNullVal:
550 delete static_cast<ConstantPointerNull *>(C);
551 break;
552 case Constant::ConstantDataArrayVal:
553 delete static_cast<ConstantDataArray *>(C);
554 break;
555 case Constant::ConstantDataVectorVal:
556 delete static_cast<ConstantDataVector *>(C);
557 break;
558 case Constant::ConstantTokenNoneVal:
559 delete static_cast<ConstantTokenNone *>(C);
560 break;
561 case Constant::BlockAddressVal:
562 delete static_cast<BlockAddress *>(C);
563 break;
564 case Constant::DSOLocalEquivalentVal:
565 delete static_cast<DSOLocalEquivalent *>(C);
566 break;
567 case Constant::NoCFIValueVal:
568 delete static_cast<NoCFIValue *>(C);
569 break;
570 case Constant::ConstantPtrAuthVal:
571 delete static_cast<ConstantPtrAuth *>(C);
572 break;
573 case Constant::UndefValueVal:
574 delete static_cast<UndefValue *>(C);
575 break;
576 case Constant::PoisonValueVal:
577 delete static_cast<PoisonValue *>(C);
578 break;
579 case Constant::ConstantExprVal:
580 if (isa<CastConstantExpr>(C))
581 delete static_cast<CastConstantExpr *>(C);
582 else if (isa<BinaryConstantExpr>(C))
583 delete static_cast<BinaryConstantExpr *>(C);
584 else if (isa<ExtractElementConstantExpr>(C))
585 delete static_cast<ExtractElementConstantExpr *>(C);
586 else if (isa<InsertElementConstantExpr>(C))
587 delete static_cast<InsertElementConstantExpr *>(C);
588 else if (isa<ShuffleVectorConstantExpr>(C))
589 delete static_cast<ShuffleVectorConstantExpr *>(C);
590 else if (isa<GetElementPtrConstantExpr>(C))
591 delete static_cast<GetElementPtrConstantExpr *>(C);
592 else
593 llvm_unreachable("Unexpected constant expr");
594 break;
595 default:
596 llvm_unreachable("Unexpected constant");
597 }
598}
599
600/// Check if C contains a GlobalValue for which Predicate is true.
601static bool
603 bool (*Predicate)(const GlobalValue *)) {
606 WorkList.push_back(C);
607 Visited.insert(C);
608
609 while (!WorkList.empty()) {
610 const Constant *WorkItem = WorkList.pop_back_val();
611 if (const auto *GV = dyn_cast<GlobalValue>(WorkItem))
612 if (Predicate(GV))
613 return true;
614 for (const Value *Op : WorkItem->operands()) {
615 const Constant *ConstOp = dyn_cast<Constant>(Op);
616 if (!ConstOp)
617 continue;
618 if (Visited.insert(ConstOp).second)
619 WorkList.push_back(ConstOp);
620 }
621 }
622 return false;
623}
624
626 auto DLLImportPredicate = [](const GlobalValue *GV) {
627 return GV->isThreadLocal();
628 };
629 return ConstHasGlobalValuePredicate(this, DLLImportPredicate);
630}
631
633 auto DLLImportPredicate = [](const GlobalValue *GV) {
634 return GV->hasDLLImportStorageClass();
635 };
636 return ConstHasGlobalValuePredicate(this, DLLImportPredicate);
637}
638
640 for (const User *U : users()) {
641 const Constant *UC = dyn_cast<Constant>(U);
642 if (!UC || isa<GlobalValue>(UC))
643 return true;
644
645 if (UC->isConstantUsed())
646 return true;
647 }
648 return false;
649}
650
652 return getRelocationInfo() == GlobalRelocation;
653}
654
656 return getRelocationInfo() != NoRelocation;
657}
658
659Constant::PossibleRelocationsTy Constant::getRelocationInfo() const {
660 if (isa<GlobalValue>(this))
661 return GlobalRelocation; // Global reference.
662
663 if (const BlockAddress *BA = dyn_cast<BlockAddress>(this))
664 return BA->getFunction()->getRelocationInfo();
665
666 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(this)) {
667 if (CE->getOpcode() == Instruction::Sub) {
668 ConstantExpr *LHS = dyn_cast<ConstantExpr>(CE->getOperand(0));
669 ConstantExpr *RHS = dyn_cast<ConstantExpr>(CE->getOperand(1));
670 if (LHS && RHS && LHS->getOpcode() == Instruction::PtrToInt &&
671 RHS->getOpcode() == Instruction::PtrToInt) {
672 Constant *LHSOp0 = LHS->getOperand(0);
673 Constant *RHSOp0 = RHS->getOperand(0);
674
675 // While raw uses of blockaddress need to be relocated, differences
676 // between two of them don't when they are for labels in the same
677 // function. This is a common idiom when creating a table for the
678 // indirect goto extension, so we handle it efficiently here.
679 if (isa<BlockAddress>(LHSOp0) && isa<BlockAddress>(RHSOp0) &&
680 cast<BlockAddress>(LHSOp0)->getFunction() ==
681 cast<BlockAddress>(RHSOp0)->getFunction())
682 return NoRelocation;
683
684 // Relative pointers do not need to be dynamically relocated.
685 if (auto *RHSGV =
686 dyn_cast<GlobalValue>(RHSOp0->stripInBoundsConstantOffsets())) {
687 auto *LHS = LHSOp0->stripInBoundsConstantOffsets();
688 if (auto *LHSGV = dyn_cast<GlobalValue>(LHS)) {
689 if (LHSGV->isDSOLocal() && RHSGV->isDSOLocal())
690 return LocalRelocation;
691 } else if (isa<DSOLocalEquivalent>(LHS)) {
692 if (RHSGV->isDSOLocal())
693 return LocalRelocation;
694 }
695 }
696 }
697 }
698 }
699
700 PossibleRelocationsTy Result = NoRelocation;
701 for (const Value *Op : operands())
702 Result = std::max(cast<Constant>(Op)->getRelocationInfo(), Result);
703
704 return Result;
705}
706
707/// Return true if the specified constantexpr is dead. This involves
708/// recursively traversing users of the constantexpr.
709/// If RemoveDeadUsers is true, also remove dead users at the same time.
710static bool constantIsDead(const Constant *C, bool RemoveDeadUsers) {
711 if (isa<GlobalValue>(C)) return false; // Cannot remove this
712
713 Value::const_user_iterator I = C->user_begin(), E = C->user_end();
714 while (I != E) {
715 const Constant *User = dyn_cast<Constant>(*I);
716 if (!User) return false; // Non-constant usage;
717 if (!constantIsDead(User, RemoveDeadUsers))
718 return false; // Constant wasn't dead
719
720 // Just removed User, so the iterator was invalidated.
721 // Since we return immediately upon finding a live user, we can always
722 // restart from user_begin().
723 if (RemoveDeadUsers)
724 I = C->user_begin();
725 else
726 ++I;
727 }
728
729 if (RemoveDeadUsers) {
730 // If C is only used by metadata, it should not be preserved but should
731 // have its uses replaced.
733 const_cast<Constant *>(C)->destroyConstant();
734 }
735
736 return true;
737}
738
741 Value::const_user_iterator LastNonDeadUser = E;
742 while (I != E) {
743 const Constant *User = dyn_cast<Constant>(*I);
744 if (!User) {
745 LastNonDeadUser = I;
746 ++I;
747 continue;
748 }
749
750 if (!constantIsDead(User, /* RemoveDeadUsers= */ true)) {
751 // If the constant wasn't dead, remember that this was the last live use
752 // and move on to the next constant.
753 LastNonDeadUser = I;
754 ++I;
755 continue;
756 }
757
758 // If the constant was dead, then the iterator is invalidated.
759 if (LastNonDeadUser == E)
760 I = user_begin();
761 else
762 I = std::next(LastNonDeadUser);
763 }
764}
765
766bool Constant::hasOneLiveUse() const { return hasNLiveUses(1); }
767
768bool Constant::hasZeroLiveUses() const { return hasNLiveUses(0); }
769
770bool Constant::hasNLiveUses(unsigned N) const {
771 unsigned NumUses = 0;
772 for (const Use &U : uses()) {
773 const Constant *User = dyn_cast<Constant>(U.getUser());
774 if (!User || !constantIsDead(User, /* RemoveDeadUsers= */ false)) {
775 ++NumUses;
776
777 if (NumUses > N)
778 return false;
779 }
780 }
781 return NumUses == N;
782}
783
785 assert(C && Replacement && "Expected non-nullptr constant arguments");
786 Type *Ty = C->getType();
787 if (match(C, m_Undef())) {
788 assert(Ty == Replacement->getType() && "Expected matching types");
789 return Replacement;
790 }
791
792 // Don't know how to deal with this constant.
793 auto *VTy = dyn_cast<FixedVectorType>(Ty);
794 if (!VTy)
795 return C;
796
797 unsigned NumElts = VTy->getNumElements();
798 SmallVector<Constant *, 32> NewC(NumElts);
799 for (unsigned i = 0; i != NumElts; ++i) {
800 Constant *EltC = C->getAggregateElement(i);
801 assert((!EltC || EltC->getType() == Replacement->getType()) &&
802 "Expected matching types");
803 NewC[i] = EltC && match(EltC, m_Undef()) ? Replacement : EltC;
804 }
805 return ConstantVector::get(NewC);
806}
807
809 assert(C && Other && "Expected non-nullptr constant arguments");
810 if (match(C, m_Undef()))
811 return C;
812
813 Type *Ty = C->getType();
814 if (match(Other, m_Undef()))
815 return UndefValue::get(Ty);
816
817 auto *VTy = dyn_cast<FixedVectorType>(Ty);
818 if (!VTy)
819 return C;
820
821 Type *EltTy = VTy->getElementType();
822 unsigned NumElts = VTy->getNumElements();
823 assert(isa<FixedVectorType>(Other->getType()) &&
824 cast<FixedVectorType>(Other->getType())->getNumElements() == NumElts &&
825 "Type mismatch");
826
827 bool FoundExtraUndef = false;
828 SmallVector<Constant *, 32> NewC(NumElts);
829 for (unsigned I = 0; I != NumElts; ++I) {
830 NewC[I] = C->getAggregateElement(I);
831 Constant *OtherEltC = Other->getAggregateElement(I);
832 assert(NewC[I] && OtherEltC && "Unknown vector element");
833 if (!match(NewC[I], m_Undef()) && match(OtherEltC, m_Undef())) {
834 NewC[I] = UndefValue::get(EltTy);
835 FoundExtraUndef = true;
836 }
837 }
838 if (FoundExtraUndef)
839 return ConstantVector::get(NewC);
840 return C;
841}
842
844 if (isa<ConstantData>(this))
845 return true;
846 if (isa<ConstantAggregate>(this) || isa<ConstantExpr>(this)) {
847 for (const Value *Op : operand_values())
848 if (!cast<Constant>(Op)->isManifestConstant())
849 return false;
850 return true;
851 }
852 return false;
853}
854
855//===----------------------------------------------------------------------===//
856// ConstantInt
857//===----------------------------------------------------------------------===//
858
859ConstantInt::ConstantInt(Type *Ty, const APInt &V)
860 : ConstantData(Ty, ConstantIntVal), Val(V) {
861 assert(V.getBitWidth() ==
862 cast<IntegerType>(Ty->getScalarType())->getBitWidth() &&
863 "Invalid constant for type");
864}
865
867 LLVMContextImpl *pImpl = Context.pImpl;
868 if (!pImpl->TheTrueVal)
869 pImpl->TheTrueVal = ConstantInt::get(Type::getInt1Ty(Context), 1);
870 return pImpl->TheTrueVal;
871}
872
874 LLVMContextImpl *pImpl = Context.pImpl;
875 if (!pImpl->TheFalseVal)
876 pImpl->TheFalseVal = ConstantInt::get(Type::getInt1Ty(Context), 0);
877 return pImpl->TheFalseVal;
878}
879
881 return V ? getTrue(Context) : getFalse(Context);
882}
883
885 assert(Ty->isIntOrIntVectorTy(1) && "Type not i1 or vector of i1.");
887 if (auto *VTy = dyn_cast<VectorType>(Ty))
888 return ConstantVector::getSplat(VTy->getElementCount(), TrueC);
889 return TrueC;
890}
891
893 assert(Ty->isIntOrIntVectorTy(1) && "Type not i1 or vector of i1.");
895 if (auto *VTy = dyn_cast<VectorType>(Ty))
896 return ConstantVector::getSplat(VTy->getElementCount(), FalseC);
897 return FalseC;
898}
899
901 return V ? getTrue(Ty) : getFalse(Ty);
902}
903
904// Get a ConstantInt from an APInt.
905ConstantInt *ConstantInt::get(LLVMContext &Context, const APInt &V) {
906 // get an existing value or the insertion position
907 LLVMContextImpl *pImpl = Context.pImpl;
908 std::unique_ptr<ConstantInt> &Slot =
909 V.isZero() ? pImpl->IntZeroConstants[V.getBitWidth()]
910 : V.isOne() ? pImpl->IntOneConstants[V.getBitWidth()]
911 : pImpl->IntConstants[V];
912 if (!Slot) {
913 // Get the corresponding integer type for the bit width of the value.
914 IntegerType *ITy = IntegerType::get(Context, V.getBitWidth());
915 Slot.reset(new ConstantInt(ITy, V));
916 }
917 assert(Slot->getType() == IntegerType::get(Context, V.getBitWidth()));
918 return Slot.get();
919}
920
921// Get a ConstantInt vector with each lane set to the same APInt.
922ConstantInt *ConstantInt::get(LLVMContext &Context, ElementCount EC,
923 const APInt &V) {
924 // Get an existing value or the insertion position.
925 std::unique_ptr<ConstantInt> &Slot =
926 Context.pImpl->IntSplatConstants[std::make_pair(EC, V)];
927 if (!Slot) {
928 IntegerType *ITy = IntegerType::get(Context, V.getBitWidth());
929 VectorType *VTy = VectorType::get(ITy, EC);
930 Slot.reset(new ConstantInt(VTy, V));
931 }
932
933#ifndef NDEBUG
934 IntegerType *ITy = IntegerType::get(Context, V.getBitWidth());
935 VectorType *VTy = VectorType::get(ITy, EC);
936 assert(Slot->getType() == VTy);
937#endif
938 return Slot.get();
939}
940
941Constant *ConstantInt::get(Type *Ty, uint64_t V, bool isSigned) {
942 Constant *C = get(cast<IntegerType>(Ty->getScalarType()), V, isSigned);
943
944 // For vectors, broadcast the value.
945 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
946 return ConstantVector::getSplat(VTy->getElementCount(), C);
947
948 return C;
949}
950
951ConstantInt *ConstantInt::get(IntegerType *Ty, uint64_t V, bool isSigned) {
952 // TODO: Avoid implicit trunc?
953 // See https://github.com/llvm/llvm-project/issues/112510.
954 return get(Ty->getContext(),
955 APInt(Ty->getBitWidth(), V, isSigned, /*implicitTrunc=*/true));
956}
957
958Constant *ConstantInt::get(Type *Ty, const APInt& V) {
959 ConstantInt *C = get(Ty->getContext(), V);
960 assert(C->getType() == Ty->getScalarType() &&
961 "ConstantInt type doesn't match the type implied by its value!");
962
963 // For vectors, broadcast the value.
964 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
965 return ConstantVector::getSplat(VTy->getElementCount(), C);
966
967 return C;
968}
969
970ConstantInt *ConstantInt::get(IntegerType* Ty, StringRef Str, uint8_t radix) {
971 return get(Ty->getContext(), APInt(Ty->getBitWidth(), Str, radix));
972}
973
974/// Remove the constant from the constant table.
975void ConstantInt::destroyConstantImpl() {
976 llvm_unreachable("You can't ConstantInt->destroyConstantImpl()!");
977}
978
979//===----------------------------------------------------------------------===//
980// ConstantFP
981//===----------------------------------------------------------------------===//
982
983Constant *ConstantFP::get(Type *Ty, double V) {
984 LLVMContext &Context = Ty->getContext();
985
986 APFloat FV(V);
987 bool ignored;
990 Constant *C = get(Context, FV);
991
992 // For vectors, broadcast the value.
993 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
994 return ConstantVector::getSplat(VTy->getElementCount(), C);
995
996 return C;
997}
998
999Constant *ConstantFP::get(Type *Ty, const APFloat &V) {
1000 ConstantFP *C = get(Ty->getContext(), V);
1001 assert(C->getType() == Ty->getScalarType() &&
1002 "ConstantFP type doesn't match the type implied by its value!");
1003
1004 // For vectors, broadcast the value.
1005 if (auto *VTy = dyn_cast<VectorType>(Ty))
1006 return ConstantVector::getSplat(VTy->getElementCount(), C);
1007
1008 return C;
1009}
1010
1011Constant *ConstantFP::get(Type *Ty, StringRef Str) {
1012 LLVMContext &Context = Ty->getContext();
1013
1014 APFloat FV(Ty->getScalarType()->getFltSemantics(), Str);
1015 Constant *C = get(Context, FV);
1016
1017 // For vectors, broadcast the value.
1018 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
1019 return ConstantVector::getSplat(VTy->getElementCount(), C);
1020
1021 return C;
1022}
1023
1024Constant *ConstantFP::getNaN(Type *Ty, bool Negative, uint64_t Payload) {
1025 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1026 APFloat NaN = APFloat::getNaN(Semantics, Negative, Payload);
1027 Constant *C = get(Ty->getContext(), NaN);
1028
1029 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
1030 return ConstantVector::getSplat(VTy->getElementCount(), C);
1031
1032 return C;
1033}
1034
1035Constant *ConstantFP::getQNaN(Type *Ty, bool Negative, APInt *Payload) {
1036 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1037 APFloat NaN = APFloat::getQNaN(Semantics, Negative, Payload);
1038 Constant *C = get(Ty->getContext(), NaN);
1039
1040 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
1041 return ConstantVector::getSplat(VTy->getElementCount(), C);
1042
1043 return C;
1044}
1045
1046Constant *ConstantFP::getSNaN(Type *Ty, bool Negative, APInt *Payload) {
1047 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1048 APFloat NaN = APFloat::getSNaN(Semantics, Negative, Payload);
1049 Constant *C = get(Ty->getContext(), NaN);
1050
1051 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
1052 return ConstantVector::getSplat(VTy->getElementCount(), C);
1053
1054 return C;
1055}
1056
1057Constant *ConstantFP::getZero(Type *Ty, bool Negative) {
1058 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1059 APFloat NegZero = APFloat::getZero(Semantics, Negative);
1060 Constant *C = get(Ty->getContext(), NegZero);
1061
1062 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
1063 return ConstantVector::getSplat(VTy->getElementCount(), C);
1064
1065 return C;
1066}
1067
1068
1069// ConstantFP accessors.
1070ConstantFP* ConstantFP::get(LLVMContext &Context, const APFloat& V) {
1071 LLVMContextImpl* pImpl = Context.pImpl;
1072
1073 std::unique_ptr<ConstantFP> &Slot = pImpl->FPConstants[V];
1074
1075 if (!Slot) {
1076 Type *Ty = Type::getFloatingPointTy(Context, V.getSemantics());
1077 Slot.reset(new ConstantFP(Ty, V));
1078 }
1079
1080 return Slot.get();
1081}
1082
1083// Get a ConstantFP vector with each lane set to the same APFloat.
1084ConstantFP *ConstantFP::get(LLVMContext &Context, ElementCount EC,
1085 const APFloat &V) {
1086 // Get an existing value or the insertion position.
1087 std::unique_ptr<ConstantFP> &Slot =
1088 Context.pImpl->FPSplatConstants[std::make_pair(EC, V)];
1089 if (!Slot) {
1090 Type *EltTy = Type::getFloatingPointTy(Context, V.getSemantics());
1091 VectorType *VTy = VectorType::get(EltTy, EC);
1092 Slot.reset(new ConstantFP(VTy, V));
1093 }
1094
1095#ifndef NDEBUG
1096 Type *EltTy = Type::getFloatingPointTy(Context, V.getSemantics());
1097 VectorType *VTy = VectorType::get(EltTy, EC);
1098 assert(Slot->getType() == VTy);
1099#endif
1100 return Slot.get();
1101}
1102
1104 const fltSemantics &Semantics = Ty->getScalarType()->getFltSemantics();
1105 Constant *C = get(Ty->getContext(), APFloat::getInf(Semantics, Negative));
1106
1107 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
1108 return ConstantVector::getSplat(VTy->getElementCount(), C);
1109
1110 return C;
1111}
1112
1113ConstantFP::ConstantFP(Type *Ty, const APFloat &V)
1114 : ConstantData(Ty, ConstantFPVal), Val(V) {
1115 assert(&V.getSemantics() == &Ty->getScalarType()->getFltSemantics() &&
1116 "FP type Mismatch");
1117}
1118
1120 return Val.bitwiseIsEqual(V);
1121}
1122
1123/// Remove the constant from the constant table.
1124void ConstantFP::destroyConstantImpl() {
1125 llvm_unreachable("You can't ConstantFP->destroyConstantImpl()!");
1126}
1127
1128//===----------------------------------------------------------------------===//
1129// ConstantAggregateZero Implementation
1130//===----------------------------------------------------------------------===//
1131
1133 if (auto *AT = dyn_cast<ArrayType>(getType()))
1134 return Constant::getNullValue(AT->getElementType());
1135 return Constant::getNullValue(cast<VectorType>(getType())->getElementType());
1136}
1137
1139 return Constant::getNullValue(getType()->getStructElementType(Elt));
1140}
1141
1143 if (isa<ArrayType>(getType()) || isa<VectorType>(getType()))
1144 return getSequentialElement();
1145 return getStructElement(cast<ConstantInt>(C)->getZExtValue());
1146}
1147
1149 if (isa<ArrayType>(getType()) || isa<VectorType>(getType()))
1150 return getSequentialElement();
1151 return getStructElement(Idx);
1152}
1153
1155 Type *Ty = getType();
1156 if (auto *AT = dyn_cast<ArrayType>(Ty))
1157 return ElementCount::getFixed(AT->getNumElements());
1158 if (auto *VT = dyn_cast<VectorType>(Ty))
1159 return VT->getElementCount();
1161}
1162
1163//===----------------------------------------------------------------------===//
1164// UndefValue Implementation
1165//===----------------------------------------------------------------------===//
1166
1168 if (ArrayType *ATy = dyn_cast<ArrayType>(getType()))
1169 return UndefValue::get(ATy->getElementType());
1170 return UndefValue::get(cast<VectorType>(getType())->getElementType());
1171}
1172
1174 return UndefValue::get(getType()->getStructElementType(Elt));
1175}
1176
1178 if (isa<ArrayType>(getType()) || isa<VectorType>(getType()))
1179 return getSequentialElement();
1180 return getStructElement(cast<ConstantInt>(C)->getZExtValue());
1181}
1182
1184 if (isa<ArrayType>(getType()) || isa<VectorType>(getType()))
1185 return getSequentialElement();
1186 return getStructElement(Idx);
1187}
1188
1190 Type *Ty = getType();
1191 if (auto *AT = dyn_cast<ArrayType>(Ty))
1192 return AT->getNumElements();
1193 if (auto *VT = dyn_cast<VectorType>(Ty))
1194 return cast<FixedVectorType>(VT)->getNumElements();
1195 return Ty->getStructNumElements();
1196}
1197
1198//===----------------------------------------------------------------------===//
1199// PoisonValue Implementation
1200//===----------------------------------------------------------------------===//
1201
1203 if (ArrayType *ATy = dyn_cast<ArrayType>(getType()))
1204 return PoisonValue::get(ATy->getElementType());
1205 return PoisonValue::get(cast<VectorType>(getType())->getElementType());
1206}
1207
1209 return PoisonValue::get(getType()->getStructElementType(Elt));
1210}
1211
1213 if (isa<ArrayType>(getType()) || isa<VectorType>(getType()))
1214 return getSequentialElement();
1215 return getStructElement(cast<ConstantInt>(C)->getZExtValue());
1216}
1217
1219 if (isa<ArrayType>(getType()) || isa<VectorType>(getType()))
1220 return getSequentialElement();
1221 return getStructElement(Idx);
1222}
1223
1224//===----------------------------------------------------------------------===//
1225// ConstantXXX Classes
1226//===----------------------------------------------------------------------===//
1227
1228template <typename ItTy, typename EltTy>
1229static bool rangeOnlyContains(ItTy Start, ItTy End, EltTy Elt) {
1230 for (; Start != End; ++Start)
1231 if (*Start != Elt)
1232 return false;
1233 return true;
1234}
1235
1236template <typename SequentialTy, typename ElementTy>
1238 assert(!V.empty() && "Cannot get empty int sequence.");
1239
1241 for (Constant *C : V)
1242 if (auto *CI = dyn_cast<ConstantInt>(C))
1243 Elts.push_back(CI->getZExtValue());
1244 else
1245 return nullptr;
1246 return SequentialTy::get(V[0]->getContext(), Elts);
1247}
1248
1249template <typename SequentialTy, typename ElementTy>
1251 assert(!V.empty() && "Cannot get empty FP sequence.");
1252
1254 for (Constant *C : V)
1255 if (auto *CFP = dyn_cast<ConstantFP>(C))
1256 Elts.push_back(CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
1257 else
1258 return nullptr;
1259 return SequentialTy::getFP(V[0]->getType(), Elts);
1260}
1261
1262template <typename SequenceTy>
1265 // We speculatively build the elements here even if it turns out that there is
1266 // a constantexpr or something else weird, since it is so uncommon for that to
1267 // happen.
1268 if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
1269 if (CI->getType()->isIntegerTy(8))
1270 return getIntSequenceIfElementsMatch<SequenceTy, uint8_t>(V);
1271 else if (CI->getType()->isIntegerTy(16))
1272 return getIntSequenceIfElementsMatch<SequenceTy, uint16_t>(V);
1273 else if (CI->getType()->isIntegerTy(32))
1274 return getIntSequenceIfElementsMatch<SequenceTy, uint32_t>(V);
1275 else if (CI->getType()->isIntegerTy(64))
1276 return getIntSequenceIfElementsMatch<SequenceTy, uint64_t>(V);
1277 } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
1278 if (CFP->getType()->isHalfTy() || CFP->getType()->isBFloatTy())
1279 return getFPSequenceIfElementsMatch<SequenceTy, uint16_t>(V);
1280 else if (CFP->getType()->isFloatTy())
1281 return getFPSequenceIfElementsMatch<SequenceTy, uint32_t>(V);
1282 else if (CFP->getType()->isDoubleTy())
1283 return getFPSequenceIfElementsMatch<SequenceTy, uint64_t>(V);
1284 }
1285
1286 return nullptr;
1287}
1288
1292 : Constant(T, VT, AllocInfo) {
1293 llvm::copy(V, op_begin());
1294
1295 // Check that types match, unless this is an opaque struct.
1296 if (auto *ST = dyn_cast<StructType>(T)) {
1297 if (ST->isOpaque())
1298 return;
1299 for (unsigned I = 0, E = V.size(); I != E; ++I)
1300 assert(V[I]->getType() == ST->getTypeAtIndex(I) &&
1301 "Initializer for struct element doesn't match!");
1302 }
1303}
1304
1305ConstantArray::ConstantArray(ArrayType *T, ArrayRef<Constant *> V,
1307 : ConstantAggregate(T, ConstantArrayVal, V, AllocInfo) {
1308 assert(V.size() == T->getNumElements() &&
1309 "Invalid initializer for constant array");
1310}
1311
1313 if (Constant *C = getImpl(Ty, V))
1314 return C;
1315 return Ty->getContext().pImpl->ArrayConstants.getOrCreate(Ty, V);
1316}
1317
1318Constant *ConstantArray::getImpl(ArrayType *Ty, ArrayRef<Constant*> V) {
1319 // Empty arrays are canonicalized to ConstantAggregateZero.
1320 if (V.empty())
1321 return ConstantAggregateZero::get(Ty);
1322
1323 for (Constant *C : V) {
1324 assert(C->getType() == Ty->getElementType() &&
1325 "Wrong type in array element initializer");
1326 (void)C;
1327 }
1328
1329 // If this is an all-zero array, return a ConstantAggregateZero object. If
1330 // all undef, return an UndefValue, if "all simple", then return a
1331 // ConstantDataArray.
1332 Constant *C = V[0];
1333 if (isa<PoisonValue>(C) && rangeOnlyContains(V.begin(), V.end(), C))
1334 return PoisonValue::get(Ty);
1335
1336 if (isa<UndefValue>(C) && rangeOnlyContains(V.begin(), V.end(), C))
1337 return UndefValue::get(Ty);
1338
1339 if (C->isNullValue() && rangeOnlyContains(V.begin(), V.end(), C))
1340 return ConstantAggregateZero::get(Ty);
1341
1342 // Check to see if all of the elements are ConstantFP or ConstantInt and if
1343 // the element type is compatible with ConstantDataVector. If so, use it.
1345 return getSequenceIfElementsMatch<ConstantDataArray>(C, V);
1346
1347 // Otherwise, we really do want to create a ConstantArray.
1348 return nullptr;
1349}
1350
1353 bool Packed) {
1354 unsigned VecSize = V.size();
1355 SmallVector<Type*, 16> EltTypes(VecSize);
1356 for (unsigned i = 0; i != VecSize; ++i)
1357 EltTypes[i] = V[i]->getType();
1358
1359 return StructType::get(Context, EltTypes, Packed);
1360}
1361
1362
1364 bool Packed) {
1365 assert(!V.empty() &&
1366 "ConstantStruct::getTypeForElements cannot be called on empty list");
1367 return getTypeForElements(V[0]->getContext(), V, Packed);
1368}
1369
1370ConstantStruct::ConstantStruct(StructType *T, ArrayRef<Constant *> V,
1372 : ConstantAggregate(T, ConstantStructVal, V, AllocInfo) {
1373 assert((T->isOpaque() || V.size() == T->getNumElements()) &&
1374 "Invalid initializer for constant struct");
1375}
1376
1377// ConstantStruct accessors.
1379 assert((ST->isOpaque() || ST->getNumElements() == V.size()) &&
1380 "Incorrect # elements specified to ConstantStruct::get");
1381
1382 // Create a ConstantAggregateZero value if all elements are zeros.
1383 bool isZero = true;
1384 bool isUndef = false;
1385 bool isPoison = false;
1386
1387 if (!V.empty()) {
1388 isUndef = isa<UndefValue>(V[0]);
1389 isPoison = isa<PoisonValue>(V[0]);
1390 isZero = V[0]->isNullValue();
1391 // PoisonValue inherits UndefValue, so its check is not necessary.
1392 if (isUndef || isZero) {
1393 for (Constant *C : V) {
1394 if (!C->isNullValue())
1395 isZero = false;
1396 if (!isa<PoisonValue>(C))
1397 isPoison = false;
1398 if (isa<PoisonValue>(C) || !isa<UndefValue>(C))
1399 isUndef = false;
1400 }
1401 }
1402 }
1403 if (isZero)
1404 return ConstantAggregateZero::get(ST);
1405 if (isPoison)
1406 return PoisonValue::get(ST);
1407 if (isUndef)
1408 return UndefValue::get(ST);
1409
1410 return ST->getContext().pImpl->StructConstants.getOrCreate(ST, V);
1411}
1412
1413ConstantVector::ConstantVector(VectorType *T, ArrayRef<Constant *> V,
1415 : ConstantAggregate(T, ConstantVectorVal, V, AllocInfo) {
1416 assert(V.size() == cast<FixedVectorType>(T)->getNumElements() &&
1417 "Invalid initializer for constant vector");
1418}
1419
1420// ConstantVector accessors.
1422 if (Constant *C = getImpl(V))
1423 return C;
1424 auto *Ty = FixedVectorType::get(V.front()->getType(), V.size());
1425 return Ty->getContext().pImpl->VectorConstants.getOrCreate(Ty, V);
1426}
1427
1428Constant *ConstantVector::getImpl(ArrayRef<Constant*> V) {
1429 assert(!V.empty() && "Vectors can't be empty");
1430 auto *T = FixedVectorType::get(V.front()->getType(), V.size());
1431
1432 // If this is an all-undef or all-zero vector, return a
1433 // ConstantAggregateZero or UndefValue.
1434 Constant *C = V[0];
1435 bool isZero = C->isNullValue();
1436 bool isUndef = isa<UndefValue>(C);
1437 bool isPoison = isa<PoisonValue>(C);
1438 bool isSplatFP = UseConstantFPForFixedLengthSplat && isa<ConstantFP>(C);
1439 bool isSplatInt = UseConstantIntForFixedLengthSplat && isa<ConstantInt>(C);
1440
1441 if (isZero || isUndef || isSplatFP || isSplatInt) {
1442 for (unsigned i = 1, e = V.size(); i != e; ++i)
1443 if (V[i] != C) {
1444 isZero = isUndef = isPoison = isSplatFP = isSplatInt = false;
1445 break;
1446 }
1447 }
1448
1449 if (isZero)
1451 if (isPoison)
1452 return PoisonValue::get(T);
1453 if (isUndef)
1454 return UndefValue::get(T);
1455 if (isSplatFP)
1456 return ConstantFP::get(C->getContext(), T->getElementCount(),
1457 cast<ConstantFP>(C)->getValue());
1458 if (isSplatInt)
1459 return ConstantInt::get(C->getContext(), T->getElementCount(),
1460 cast<ConstantInt>(C)->getValue());
1461
1462 // Check to see if all of the elements are ConstantFP or ConstantInt and if
1463 // the element type is compatible with ConstantDataVector. If so, use it.
1465 return getSequenceIfElementsMatch<ConstantDataVector>(C, V);
1466
1467 // Otherwise, the element type isn't compatible with ConstantDataVector, or
1468 // the operand list contains a ConstantExpr or something else strange.
1469 return nullptr;
1470}
1471
1473 if (!EC.isScalable()) {
1474 // Maintain special handling of zero.
1475 if (!V->isNullValue()) {
1476 if (UseConstantIntForFixedLengthSplat && isa<ConstantInt>(V))
1477 return ConstantInt::get(V->getContext(), EC,
1478 cast<ConstantInt>(V)->getValue());
1479 if (UseConstantFPForFixedLengthSplat && isa<ConstantFP>(V))
1480 return ConstantFP::get(V->getContext(), EC,
1481 cast<ConstantFP>(V)->getValue());
1482 }
1483
1484 // If this splat is compatible with ConstantDataVector, use it instead of
1485 // ConstantVector.
1486 if ((isa<ConstantFP>(V) || isa<ConstantInt>(V)) &&
1488 return ConstantDataVector::getSplat(EC.getKnownMinValue(), V);
1489
1490 SmallVector<Constant *, 32> Elts(EC.getKnownMinValue(), V);
1491 return get(Elts);
1492 }
1493
1494 // Maintain special handling of zero.
1495 if (!V->isNullValue()) {
1496 if (UseConstantIntForScalableSplat && isa<ConstantInt>(V))
1497 return ConstantInt::get(V->getContext(), EC,
1498 cast<ConstantInt>(V)->getValue());
1499 if (UseConstantFPForScalableSplat && isa<ConstantFP>(V))
1500 return ConstantFP::get(V->getContext(), EC,
1501 cast<ConstantFP>(V)->getValue());
1502 }
1503
1504 Type *VTy = VectorType::get(V->getType(), EC);
1505
1506 if (V->isNullValue())
1507 return ConstantAggregateZero::get(VTy);
1508 else if (isa<UndefValue>(V))
1509 return UndefValue::get(VTy);
1510
1511 Type *IdxTy = Type::getInt64Ty(VTy->getContext());
1512
1513 // Move scalar into vector.
1514 Constant *PoisonV = PoisonValue::get(VTy);
1515 V = ConstantExpr::getInsertElement(PoisonV, V, ConstantInt::get(IdxTy, 0));
1516 // Build shuffle mask to perform the splat.
1517 SmallVector<int, 8> Zeros(EC.getKnownMinValue(), 0);
1518 // Splat.
1519 return ConstantExpr::getShuffleVector(V, PoisonV, Zeros);
1520}
1521
1523 LLVMContextImpl *pImpl = Context.pImpl;
1524 if (!pImpl->TheNoneToken)
1525 pImpl->TheNoneToken.reset(new ConstantTokenNone(Context));
1526 return pImpl->TheNoneToken.get();
1527}
1528
1529/// Remove the constant from the constant table.
1530void ConstantTokenNone::destroyConstantImpl() {
1531 llvm_unreachable("You can't ConstantTokenNone->destroyConstantImpl()!");
1532}
1533
1534// Utility function for determining if a ConstantExpr is a CastOp or not. This
1535// can't be inline because we don't want to #include Instruction.h into
1536// Constant.h
1538
1540 return cast<ShuffleVectorConstantExpr>(this)->ShuffleMask;
1541}
1542
1544 return cast<ShuffleVectorConstantExpr>(this)->ShuffleMaskForBitcode;
1545}
1546
1548 bool OnlyIfReduced, Type *SrcTy) const {
1549 assert(Ops.size() == getNumOperands() && "Operand count mismatch!");
1550
1551 // If no operands changed return self.
1552 if (Ty == getType() && std::equal(Ops.begin(), Ops.end(), op_begin()))
1553 return const_cast<ConstantExpr*>(this);
1554
1555 Type *OnlyIfReducedTy = OnlyIfReduced ? Ty : nullptr;
1556 switch (getOpcode()) {
1557 case Instruction::Trunc:
1558 case Instruction::ZExt:
1559 case Instruction::SExt:
1560 case Instruction::FPTrunc:
1561 case Instruction::FPExt:
1562 case Instruction::UIToFP:
1563 case Instruction::SIToFP:
1564 case Instruction::FPToUI:
1565 case Instruction::FPToSI:
1566 case Instruction::PtrToInt:
1567 case Instruction::IntToPtr:
1568 case Instruction::BitCast:
1569 case Instruction::AddrSpaceCast:
1570 return ConstantExpr::getCast(getOpcode(), Ops[0], Ty, OnlyIfReduced);
1571 case Instruction::InsertElement:
1572 return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2],
1573 OnlyIfReducedTy);
1574 case Instruction::ExtractElement:
1575 return ConstantExpr::getExtractElement(Ops[0], Ops[1], OnlyIfReducedTy);
1576 case Instruction::ShuffleVector:
1577 return ConstantExpr::getShuffleVector(Ops[0], Ops[1], getShuffleMask(),
1578 OnlyIfReducedTy);
1579 case Instruction::GetElementPtr: {
1580 auto *GEPO = cast<GEPOperator>(this);
1581 assert(SrcTy || (Ops[0]->getType() == getOperand(0)->getType()));
1583 SrcTy ? SrcTy : GEPO->getSourceElementType(), Ops[0], Ops.slice(1),
1584 GEPO->getNoWrapFlags(), GEPO->getInRange(), OnlyIfReducedTy);
1585 }
1586 default:
1587 assert(getNumOperands() == 2 && "Must be binary operator?");
1588 return ConstantExpr::get(getOpcode(), Ops[0], Ops[1], SubclassOptionalData,
1589 OnlyIfReducedTy);
1590 }
1591}
1592
1593
1594//===----------------------------------------------------------------------===//
1595// isValueValidForType implementations
1596
1598 unsigned NumBits = Ty->getIntegerBitWidth(); // assert okay
1599 if (Ty->isIntegerTy(1))
1600 return Val == 0 || Val == 1;
1601 return isUIntN(NumBits, Val);
1602}
1603
1605 unsigned NumBits = Ty->getIntegerBitWidth();
1606 if (Ty->isIntegerTy(1))
1607 return Val == 0 || Val == 1 || Val == -1;
1608 return isIntN(NumBits, Val);
1609}
1610
1612 // convert modifies in place, so make a copy.
1613 APFloat Val2 = APFloat(Val);
1614 bool losesInfo;
1615 switch (Ty->getTypeID()) {
1616 default:
1617 return false; // These can't be represented as floating point!
1618
1619 // FIXME rounding mode needs to be more flexible
1620 case Type::HalfTyID: {
1621 if (&Val2.getSemantics() == &APFloat::IEEEhalf())
1622 return true;
1624 return !losesInfo;
1625 }
1626 case Type::BFloatTyID: {
1627 if (&Val2.getSemantics() == &APFloat::BFloat())
1628 return true;
1630 return !losesInfo;
1631 }
1632 case Type::FloatTyID: {
1633 if (&Val2.getSemantics() == &APFloat::IEEEsingle())
1634 return true;
1636 return !losesInfo;
1637 }
1638 case Type::DoubleTyID: {
1639 if (&Val2.getSemantics() == &APFloat::IEEEhalf() ||
1640 &Val2.getSemantics() == &APFloat::BFloat() ||
1641 &Val2.getSemantics() == &APFloat::IEEEsingle() ||
1642 &Val2.getSemantics() == &APFloat::IEEEdouble())
1643 return true;
1645 return !losesInfo;
1646 }
1647 case Type::X86_FP80TyID:
1648 return &Val2.getSemantics() == &APFloat::IEEEhalf() ||
1649 &Val2.getSemantics() == &APFloat::BFloat() ||
1650 &Val2.getSemantics() == &APFloat::IEEEsingle() ||
1651 &Val2.getSemantics() == &APFloat::IEEEdouble() ||
1653 case Type::FP128TyID:
1654 return &Val2.getSemantics() == &APFloat::IEEEhalf() ||
1655 &Val2.getSemantics() == &APFloat::BFloat() ||
1656 &Val2.getSemantics() == &APFloat::IEEEsingle() ||
1657 &Val2.getSemantics() == &APFloat::IEEEdouble() ||
1658 &Val2.getSemantics() == &APFloat::IEEEquad();
1660 return &Val2.getSemantics() == &APFloat::IEEEhalf() ||
1661 &Val2.getSemantics() == &APFloat::BFloat() ||
1662 &Val2.getSemantics() == &APFloat::IEEEsingle() ||
1663 &Val2.getSemantics() == &APFloat::IEEEdouble() ||
1665 }
1666}
1667
1668
1669//===----------------------------------------------------------------------===//
1670// Factory Function Implementation
1671
1673 assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
1674 "Cannot create an aggregate zero of non-aggregate type!");
1675
1676 std::unique_ptr<ConstantAggregateZero> &Entry =
1677 Ty->getContext().pImpl->CAZConstants[Ty];
1678 if (!Entry)
1679 Entry.reset(new ConstantAggregateZero(Ty));
1680
1681 return Entry.get();
1682}
1683
1684/// Remove the constant from the constant table.
1685void ConstantAggregateZero::destroyConstantImpl() {
1687}
1688
1689/// Remove the constant from the constant table.
1690void ConstantArray::destroyConstantImpl() {
1692}
1693
1694
1695//---- ConstantStruct::get() implementation...
1696//
1697
1698/// Remove the constant from the constant table.
1699void ConstantStruct::destroyConstantImpl() {
1701}
1702
1703/// Remove the constant from the constant table.
1704void ConstantVector::destroyConstantImpl() {
1706}
1707
1708Constant *Constant::getSplatValue(bool AllowPoison) const {
1709 assert(this->getType()->isVectorTy() && "Only valid for vectors!");
1710 if (isa<ConstantAggregateZero>(this))
1711 return getNullValue(cast<VectorType>(getType())->getElementType());
1712 if (auto *CI = dyn_cast<ConstantInt>(this))
1713 return ConstantInt::get(getContext(), CI->getValue());
1714 if (auto *CFP = dyn_cast<ConstantFP>(this))
1715 return ConstantFP::get(getContext(), CFP->getValue());
1716 if (const ConstantDataVector *CV = dyn_cast<ConstantDataVector>(this))
1717 return CV->getSplatValue();
1718 if (const ConstantVector *CV = dyn_cast<ConstantVector>(this))
1719 return CV->getSplatValue(AllowPoison);
1720
1721 // Check if this is a constant expression splat of the form returned by
1722 // ConstantVector::getSplat()
1723 const auto *Shuf = dyn_cast<ConstantExpr>(this);
1724 if (Shuf && Shuf->getOpcode() == Instruction::ShuffleVector &&
1725 isa<UndefValue>(Shuf->getOperand(1))) {
1726
1727 const auto *IElt = dyn_cast<ConstantExpr>(Shuf->getOperand(0));
1728 if (IElt && IElt->getOpcode() == Instruction::InsertElement &&
1729 isa<UndefValue>(IElt->getOperand(0))) {
1730
1731 ArrayRef<int> Mask = Shuf->getShuffleMask();
1732 Constant *SplatVal = IElt->getOperand(1);
1733 ConstantInt *Index = dyn_cast<ConstantInt>(IElt->getOperand(2));
1734
1735 if (Index && Index->getValue() == 0 &&
1736 llvm::all_of(Mask, [](int I) { return I == 0; }))
1737 return SplatVal;
1738 }
1739 }
1740
1741 return nullptr;
1742}
1743
1744Constant *ConstantVector::getSplatValue(bool AllowPoison) const {
1745 // Check out first element.
1746 Constant *Elt = getOperand(0);
1747 // Then make sure all remaining elements point to the same value.
1748 for (unsigned I = 1, E = getNumOperands(); I < E; ++I) {
1749 Constant *OpC = getOperand(I);
1750 if (OpC == Elt)
1751 continue;
1752
1753 // Strict mode: any mismatch is not a splat.
1754 if (!AllowPoison)
1755 return nullptr;
1756
1757 // Allow poison mode: ignore poison elements.
1758 if (isa<PoisonValue>(OpC))
1759 continue;
1760
1761 // If we do not have a defined element yet, use the current operand.
1762 if (isa<PoisonValue>(Elt))
1763 Elt = OpC;
1764
1765 if (OpC != Elt)
1766 return nullptr;
1767 }
1768 return Elt;
1769}
1770
1772 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
1773 return CI->getValue();
1774 // Scalable vectors can use a ConstantExpr to build a splat.
1775 if (isa<ConstantExpr>(this))
1776 return cast<ConstantInt>(this->getSplatValue())->getValue();
1777 // For non-ConstantExpr we use getAggregateElement as a fast path to avoid
1778 // calling getSplatValue in release builds.
1779 assert(this->getSplatValue() && "Doesn't contain a unique integer!");
1780 const Constant *C = this->getAggregateElement(0U);
1781 assert(C && isa<ConstantInt>(C) && "Not a vector of numbers!");
1782 return cast<ConstantInt>(C)->getValue();
1783}
1784
1786 if (auto *CI = dyn_cast<ConstantInt>(this))
1787 return ConstantRange(CI->getValue());
1788
1789 unsigned BitWidth = getType()->getScalarSizeInBits();
1790 if (!getType()->isVectorTy())
1791 return ConstantRange::getFull(BitWidth);
1792
1793 if (auto *CI = dyn_cast_or_null<ConstantInt>(
1794 getSplatValue(/*AllowPoison=*/true)))
1795 return ConstantRange(CI->getValue());
1796
1797 if (auto *CDV = dyn_cast<ConstantDataVector>(this)) {
1798 ConstantRange CR = ConstantRange::getEmpty(BitWidth);
1799 for (unsigned I = 0, E = CDV->getNumElements(); I < E; ++I)
1800 CR = CR.unionWith(CDV->getElementAsAPInt(I));
1801 return CR;
1802 }
1803
1804 if (auto *CV = dyn_cast<ConstantVector>(this)) {
1805 ConstantRange CR = ConstantRange::getEmpty(BitWidth);
1806 for (unsigned I = 0, E = CV->getNumOperands(); I < E; ++I) {
1807 Constant *Elem = CV->getOperand(I);
1808 if (!Elem)
1809 return ConstantRange::getFull(BitWidth);
1810 if (isa<PoisonValue>(Elem))
1811 continue;
1812 auto *CI = dyn_cast<ConstantInt>(Elem);
1813 if (!CI)
1814 return ConstantRange::getFull(BitWidth);
1815 CR = CR.unionWith(CI->getValue());
1816 }
1817 return CR;
1818 }
1819
1820 return ConstantRange::getFull(BitWidth);
1821}
1822
1823//---- ConstantPointerNull::get() implementation.
1824//
1825
1827 std::unique_ptr<ConstantPointerNull> &Entry =
1828 Ty->getContext().pImpl->CPNConstants[Ty];
1829 if (!Entry)
1830 Entry.reset(new ConstantPointerNull(Ty));
1831
1832 return Entry.get();
1833}
1834
1835/// Remove the constant from the constant table.
1836void ConstantPointerNull::destroyConstantImpl() {
1838}
1839
1840//---- ConstantTargetNone::get() implementation.
1841//
1842
1845 "Target extension type not allowed to have a zeroinitializer");
1846 std::unique_ptr<ConstantTargetNone> &Entry =
1847 Ty->getContext().pImpl->CTNConstants[Ty];
1848 if (!Entry)
1849 Entry.reset(new ConstantTargetNone(Ty));
1850
1851 return Entry.get();
1852}
1853
1854/// Remove the constant from the constant table.
1855void ConstantTargetNone::destroyConstantImpl() {
1857}
1858
1860 std::unique_ptr<UndefValue> &Entry = Ty->getContext().pImpl->UVConstants[Ty];
1861 if (!Entry)
1862 Entry.reset(new UndefValue(Ty));
1863
1864 return Entry.get();
1865}
1866
1867/// Remove the constant from the constant table.
1868void UndefValue::destroyConstantImpl() {
1869 // Free the constant and any dangling references to it.
1870 if (getValueID() == UndefValueVal) {
1871 getContext().pImpl->UVConstants.erase(getType());
1872 } else if (getValueID() == PoisonValueVal) {
1873 getContext().pImpl->PVConstants.erase(getType());
1874 }
1875 llvm_unreachable("Not a undef or a poison!");
1876}
1877
1879 std::unique_ptr<PoisonValue> &Entry = Ty->getContext().pImpl->PVConstants[Ty];
1880 if (!Entry)
1881 Entry.reset(new PoisonValue(Ty));
1882
1883 return Entry.get();
1884}
1885
1886/// Remove the constant from the constant table.
1887void PoisonValue::destroyConstantImpl() {
1888 // Free the constant and any dangling references to it.
1889 getContext().pImpl->PVConstants.erase(getType());
1890}
1891
1893 assert(BB->getParent() && "Block must have a parent");
1894 return get(BB->getParent(), BB);
1895}
1896
1898 BlockAddress *&BA =
1899 F->getContext().pImpl->BlockAddresses[std::make_pair(F, BB)];
1900 if (!BA)
1901 BA = new BlockAddress(F, BB);
1902
1903 assert(BA->getFunction() == F && "Basic block moved between functions");
1904 return BA;
1905}
1906
1907BlockAddress::BlockAddress(Function *F, BasicBlock *BB)
1908 : Constant(PointerType::get(F->getContext(), F->getAddressSpace()),
1909 Value::BlockAddressVal, AllocMarker) {
1910 setOperand(0, F);
1911 setOperand(1, BB);
1912 BB->AdjustBlockAddressRefCount(1);
1913}
1914
1916 if (!BB->hasAddressTaken())
1917 return nullptr;
1918
1919 const Function *F = BB->getParent();
1920 assert(F && "Block must have a parent");
1921 BlockAddress *BA =
1922 F->getContext().pImpl->BlockAddresses.lookup(std::make_pair(F, BB));
1923 assert(BA && "Refcount and block address map disagree!");
1924 return BA;
1925}
1926
1927/// Remove the constant from the constant table.
1928void BlockAddress::destroyConstantImpl() {
1930 ->BlockAddresses.erase(std::make_pair(getFunction(), getBasicBlock()));
1931 getBasicBlock()->AdjustBlockAddressRefCount(-1);
1932}
1933
1934Value *BlockAddress::handleOperandChangeImpl(Value *From, Value *To) {
1935 // This could be replacing either the Basic Block or the Function. In either
1936 // case, we have to remove the map entry.
1937 Function *NewF = getFunction();
1938 BasicBlock *NewBB = getBasicBlock();
1939
1940 if (From == NewF)
1941 NewF = cast<Function>(To->stripPointerCasts());
1942 else {
1943 assert(From == NewBB && "From does not match any operand");
1944 NewBB = cast<BasicBlock>(To);
1945 }
1946
1947 // See if the 'new' entry already exists, if not, just update this in place
1948 // and return early.
1949 BlockAddress *&NewBA =
1950 getContext().pImpl->BlockAddresses[std::make_pair(NewF, NewBB)];
1951 if (NewBA)
1952 return NewBA;
1953
1954 getBasicBlock()->AdjustBlockAddressRefCount(-1);
1955
1956 // Remove the old entry, this can't cause the map to rehash (just a
1957 // tombstone will get added).
1958 getContext().pImpl->BlockAddresses.erase(std::make_pair(getFunction(),
1959 getBasicBlock()));
1960 NewBA = this;
1961 setOperand(0, NewF);
1962 setOperand(1, NewBB);
1963 getBasicBlock()->AdjustBlockAddressRefCount(1);
1964
1965 // If we just want to keep the existing value, then return null.
1966 // Callers know that this means we shouldn't delete this value.
1967 return nullptr;
1968}
1969
1972 if (!Equiv)
1973 Equiv = new DSOLocalEquivalent(GV);
1974
1975 assert(Equiv->getGlobalValue() == GV &&
1976 "DSOLocalFunction does not match the expected global value");
1977 return Equiv;
1978}
1979
1980DSOLocalEquivalent::DSOLocalEquivalent(GlobalValue *GV)
1981 : Constant(GV->getType(), Value::DSOLocalEquivalentVal, AllocMarker) {
1982 setOperand(0, GV);
1983}
1984
1985/// Remove the constant from the constant table.
1986void DSOLocalEquivalent::destroyConstantImpl() {
1987 const GlobalValue *GV = getGlobalValue();
1988 GV->getContext().pImpl->DSOLocalEquivalents.erase(GV);
1989}
1990
1991Value *DSOLocalEquivalent::handleOperandChangeImpl(Value *From, Value *To) {
1992 assert(From == getGlobalValue() && "Changing value does not match operand.");
1993 assert(isa<Constant>(To) && "Can only replace the operands with a constant");
1994
1995 // The replacement is with another global value.
1996 if (const auto *ToObj = dyn_cast<GlobalValue>(To)) {
1997 DSOLocalEquivalent *&NewEquiv =
1999 if (NewEquiv)
2000 return llvm::ConstantExpr::getBitCast(NewEquiv, getType());
2001 }
2002
2003 // If the argument is replaced with a null value, just replace this constant
2004 // with a null value.
2005 if (cast<Constant>(To)->isNullValue())
2006 return To;
2007
2008 // The replacement could be a bitcast or an alias to another function. We can
2009 // replace it with a bitcast to the dso_local_equivalent of that function.
2010 auto *Func = cast<Function>(To->stripPointerCastsAndAliases());
2012 if (NewEquiv)
2013 return llvm::ConstantExpr::getBitCast(NewEquiv, getType());
2014
2015 // Replace this with the new one.
2017 NewEquiv = this;
2018 setOperand(0, Func);
2019
2020 if (Func->getType() != getType()) {
2021 // It is ok to mutate the type here because this constant should always
2022 // reflect the type of the function it's holding.
2023 mutateType(Func->getType());
2024 }
2025 return nullptr;
2026}
2027
2029 NoCFIValue *&NC = GV->getContext().pImpl->NoCFIValues[GV];
2030 if (!NC)
2031 NC = new NoCFIValue(GV);
2032
2033 assert(NC->getGlobalValue() == GV &&
2034 "NoCFIValue does not match the expected global value");
2035 return NC;
2036}
2037
2038NoCFIValue::NoCFIValue(GlobalValue *GV)
2039 : Constant(GV->getType(), Value::NoCFIValueVal, AllocMarker) {
2040 setOperand(0, GV);
2041}
2042
2043/// Remove the constant from the constant table.
2044void NoCFIValue::destroyConstantImpl() {
2045 const GlobalValue *GV = getGlobalValue();
2046 GV->getContext().pImpl->NoCFIValues.erase(GV);
2047}
2048
2049Value *NoCFIValue::handleOperandChangeImpl(Value *From, Value *To) {
2050 assert(From == getGlobalValue() && "Changing value does not match operand.");
2051
2052 GlobalValue *GV = dyn_cast<GlobalValue>(To->stripPointerCasts());
2053 assert(GV && "Can only replace the operands with a global value");
2054
2055 NoCFIValue *&NewNC = getContext().pImpl->NoCFIValues[GV];
2056 if (NewNC)
2057 return llvm::ConstantExpr::getBitCast(NewNC, getType());
2058
2060 NewNC = this;
2061 setOperand(0, GV);
2062
2063 if (GV->getType() != getType())
2064 mutateType(GV->getType());
2065
2066 return nullptr;
2067}
2068
2069//---- ConstantPtrAuth::get() implementations.
2070//
2071
2073 ConstantInt *Disc, Constant *AddrDisc) {
2074 Constant *ArgVec[] = {Ptr, Key, Disc, AddrDisc};
2075 ConstantPtrAuthKeyType MapKey(ArgVec);
2076 LLVMContextImpl *pImpl = Ptr->getContext().pImpl;
2077 return pImpl->ConstantPtrAuths.getOrCreate(Ptr->getType(), MapKey);
2078}
2079
2081 return get(Pointer, getKey(), getDiscriminator(), getAddrDiscriminator());
2082}
2083
2084ConstantPtrAuth::ConstantPtrAuth(Constant *Ptr, ConstantInt *Key,
2085 ConstantInt *Disc, Constant *AddrDisc)
2086 : Constant(Ptr->getType(), Value::ConstantPtrAuthVal, AllocMarker) {
2087 assert(Ptr->getType()->isPointerTy());
2088 assert(Key->getBitWidth() == 32);
2089 assert(Disc->getBitWidth() == 64);
2090 assert(AddrDisc->getType()->isPointerTy());
2091 setOperand(0, Ptr);
2092 setOperand(1, Key);
2093 setOperand(2, Disc);
2094 setOperand(3, AddrDisc);
2095}
2096
2097/// Remove the constant from the constant table.
2098void ConstantPtrAuth::destroyConstantImpl() {
2099 getType()->getContext().pImpl->ConstantPtrAuths.remove(this);
2100}
2101
2102Value *ConstantPtrAuth::handleOperandChangeImpl(Value *From, Value *ToV) {
2103 assert(isa<Constant>(ToV) && "Cannot make Constant refer to non-constant!");
2104 Constant *To = cast<Constant>(ToV);
2105
2107 Values.reserve(getNumOperands());
2108
2109 unsigned NumUpdated = 0;
2110
2111 Use *OperandList = getOperandList();
2112 unsigned OperandNo = 0;
2113 for (Use *O = OperandList, *E = OperandList + getNumOperands(); O != E; ++O) {
2114 Constant *Val = cast<Constant>(O->get());
2115 if (Val == From) {
2116 OperandNo = (O - OperandList);
2117 Val = To;
2118 ++NumUpdated;
2119 }
2120 Values.push_back(Val);
2121 }
2122
2123 return getContext().pImpl->ConstantPtrAuths.replaceOperandsInPlace(
2124 Values, this, From, To, NumUpdated, OperandNo);
2125}
2126
2128 const auto *CastV = dyn_cast<ConstantExpr>(getAddrDiscriminator());
2129 if (!CastV || CastV->getOpcode() != Instruction::IntToPtr)
2130 return false;
2131
2132 const auto *IntVal = dyn_cast<ConstantInt>(CastV->getOperand(0));
2133 if (!IntVal)
2134 return false;
2135
2136 return IntVal->getValue() == Value;
2137}
2138
2140 const Value *Discriminator,
2141 const DataLayout &DL) const {
2142 // If the keys are different, there's no chance for this to be compatible.
2143 if (getKey() != Key)
2144 return false;
2145
2146 // We can have 3 kinds of discriminators:
2147 // - simple, integer-only: `i64 x, ptr null` vs. `i64 x`
2148 // - address-only: `i64 0, ptr p` vs. `ptr p`
2149 // - blended address/integer: `i64 x, ptr p` vs. `@llvm.ptrauth.blend(p, x)`
2150
2151 // If this constant has a simple discriminator (integer, no address), easy:
2152 // it's compatible iff the provided full discriminator is also a simple
2153 // discriminator, identical to our integer discriminator.
2155 return getDiscriminator() == Discriminator;
2156
2157 // Otherwise, we can isolate address and integer discriminator components.
2158 const Value *AddrDiscriminator = nullptr;
2159
2160 // This constant may or may not have an integer discriminator (instead of 0).
2161 if (!getDiscriminator()->isNullValue()) {
2162 // If it does, there's an implicit blend. We need to have a matching blend
2163 // intrinsic in the provided full discriminator.
2164 if (!match(Discriminator,
2165 m_Intrinsic<Intrinsic::ptrauth_blend>(
2166 m_Value(AddrDiscriminator), m_Specific(getDiscriminator()))))
2167 return false;
2168 } else {
2169 // Otherwise, interpret the provided full discriminator as address-only.
2170 AddrDiscriminator = Discriminator;
2171 }
2172
2173 // Either way, we can now focus on comparing the address discriminators.
2174
2175 // Discriminators are i64, so the provided addr disc may be a ptrtoint.
2176 if (auto *Cast = dyn_cast<PtrToIntOperator>(AddrDiscriminator))
2177 AddrDiscriminator = Cast->getPointerOperand();
2178
2179 // Beyond that, we're only interested in compatible pointers.
2180 if (getAddrDiscriminator()->getType() != AddrDiscriminator->getType())
2181 return false;
2182
2183 // These are often the same constant GEP, making them trivially equivalent.
2184 if (getAddrDiscriminator() == AddrDiscriminator)
2185 return true;
2186
2187 // Finally, they may be equivalent base+offset expressions.
2188 APInt Off1(DL.getIndexTypeSizeInBits(getAddrDiscriminator()->getType()), 0);
2190 DL, Off1, /*AllowNonInbounds=*/true);
2191
2192 APInt Off2(DL.getIndexTypeSizeInBits(AddrDiscriminator->getType()), 0);
2193 auto *Base2 = AddrDiscriminator->stripAndAccumulateConstantOffsets(
2194 DL, Off2, /*AllowNonInbounds=*/true);
2195
2196 return Base1 == Base2 && Off1 == Off2;
2197}
2198
2199//---- ConstantExpr::get() implementations.
2200//
2201
2202/// This is a utility function to handle folding of casts and lookup of the
2203/// cast in the ExprConstants map. It is used by the various get* methods below.
2205 bool OnlyIfReduced = false) {
2206 assert(Ty->isFirstClassType() && "Cannot cast to an aggregate type!");
2207 // Fold a few common cases
2208 if (Constant *FC = ConstantFoldCastInstruction(opc, C, Ty))
2209 return FC;
2210
2211 if (OnlyIfReduced)
2212 return nullptr;
2213
2214 LLVMContextImpl *pImpl = Ty->getContext().pImpl;
2215
2216 // Look up the constant in the table first to ensure uniqueness.
2217 ConstantExprKeyType Key(opc, C);
2218
2219 return pImpl->ExprConstants.getOrCreate(Ty, Key);
2220}
2221
2223 bool OnlyIfReduced) {
2225 assert(Instruction::isCast(opc) && "opcode out of range");
2227 "Cast opcode not supported as constant expression");
2228 assert(C && Ty && "Null arguments to getCast");
2229 assert(CastInst::castIsValid(opc, C, Ty) && "Invalid constantexpr cast!");
2230
2231 switch (opc) {
2232 default:
2233 llvm_unreachable("Invalid cast opcode");
2234 case Instruction::Trunc:
2235 return getTrunc(C, Ty, OnlyIfReduced);
2236 case Instruction::PtrToInt:
2237 return getPtrToInt(C, Ty, OnlyIfReduced);
2238 case Instruction::IntToPtr:
2239 return getIntToPtr(C, Ty, OnlyIfReduced);
2240 case Instruction::BitCast:
2241 return getBitCast(C, Ty, OnlyIfReduced);
2242 case Instruction::AddrSpaceCast:
2243 return getAddrSpaceCast(C, Ty, OnlyIfReduced);
2244 }
2245}
2246
2248 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
2249 return getBitCast(C, Ty);
2250 return getTrunc(C, Ty);
2251}
2252
2254 assert(S->getType()->isPtrOrPtrVectorTy() && "Invalid cast");
2255 assert((Ty->isIntOrIntVectorTy() || Ty->isPtrOrPtrVectorTy()) &&
2256 "Invalid cast");
2257
2258 if (Ty->isIntOrIntVectorTy())
2259 return getPtrToInt(S, Ty);
2260
2261 unsigned SrcAS = S->getType()->getPointerAddressSpace();
2262 if (Ty->isPtrOrPtrVectorTy() && SrcAS != Ty->getPointerAddressSpace())
2263 return getAddrSpaceCast(S, Ty);
2264
2265 return getBitCast(S, Ty);
2266}
2267
2269 Type *Ty) {
2270 assert(S->getType()->isPtrOrPtrVectorTy() && "Invalid cast");
2271 assert(Ty->isPtrOrPtrVectorTy() && "Invalid cast");
2272
2274 return getAddrSpaceCast(S, Ty);
2275
2276 return getBitCast(S, Ty);
2277}
2278
2279Constant *ConstantExpr::getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced) {
2280#ifndef NDEBUG
2281 bool fromVec = isa<VectorType>(C->getType());
2282 bool toVec = isa<VectorType>(Ty);
2283#endif
2284 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
2285 assert(C->getType()->isIntOrIntVectorTy() && "Trunc operand must be integer");
2286 assert(Ty->isIntOrIntVectorTy() && "Trunc produces only integral");
2287 assert(C->getType()->getScalarSizeInBits() > Ty->getScalarSizeInBits()&&
2288 "SrcTy must be larger than DestTy for Trunc!");
2289
2290 return getFoldedCast(Instruction::Trunc, C, Ty, OnlyIfReduced);
2291}
2292
2294 bool OnlyIfReduced) {
2295 assert(C->getType()->isPtrOrPtrVectorTy() &&
2296 "PtrToInt source must be pointer or pointer vector");
2297 assert(DstTy->isIntOrIntVectorTy() &&
2298 "PtrToInt destination must be integer or integer vector");
2299 assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy));
2300 if (isa<VectorType>(C->getType()))
2301 assert(cast<VectorType>(C->getType())->getElementCount() ==
2302 cast<VectorType>(DstTy)->getElementCount() &&
2303 "Invalid cast between a different number of vector elements");
2304 return getFoldedCast(Instruction::PtrToInt, C, DstTy, OnlyIfReduced);
2305}
2306
2308 bool OnlyIfReduced) {
2309 assert(C->getType()->isIntOrIntVectorTy() &&
2310 "IntToPtr source must be integer or integer vector");
2311 assert(DstTy->isPtrOrPtrVectorTy() &&
2312 "IntToPtr destination must be a pointer or pointer vector");
2313 assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy));
2314 if (isa<VectorType>(C->getType()))
2315 assert(cast<VectorType>(C->getType())->getElementCount() ==
2316 cast<VectorType>(DstTy)->getElementCount() &&
2317 "Invalid cast between a different number of vector elements");
2318 return getFoldedCast(Instruction::IntToPtr, C, DstTy, OnlyIfReduced);
2319}
2320
2322 bool OnlyIfReduced) {
2323 assert(CastInst::castIsValid(Instruction::BitCast, C, DstTy) &&
2324 "Invalid constantexpr bitcast!");
2325
2326 // It is common to ask for a bitcast of a value to its own type, handle this
2327 // speedily.
2328 if (C->getType() == DstTy) return C;
2329
2330 return getFoldedCast(Instruction::BitCast, C, DstTy, OnlyIfReduced);
2331}
2332
2334 bool OnlyIfReduced) {
2335 assert(CastInst::castIsValid(Instruction::AddrSpaceCast, C, DstTy) &&
2336 "Invalid constantexpr addrspacecast!");
2337 return getFoldedCast(Instruction::AddrSpaceCast, C, DstTy, OnlyIfReduced);
2338}
2339
2340Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2,
2341 unsigned Flags, Type *OnlyIfReducedTy) {
2342 // Check the operands for consistency first.
2344 "Invalid opcode in binary constant expression");
2345 assert(isSupportedBinOp(Opcode) &&
2346 "Binop not supported as constant expression");
2347 assert(C1->getType() == C2->getType() &&
2348 "Operand types in binary constant expression should match");
2349
2350#ifndef NDEBUG
2351 switch (Opcode) {
2352 case Instruction::Add:
2353 case Instruction::Sub:
2354 case Instruction::Mul:
2356 "Tried to create an integer operation on a non-integer type!");
2357 break;
2358 case Instruction::And:
2359 case Instruction::Or:
2360 case Instruction::Xor:
2362 "Tried to create a logical operation on a non-integral type!");
2363 break;
2364 default:
2365 break;
2366 }
2367#endif
2368
2369 if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2))
2370 return FC;
2371
2372 if (OnlyIfReducedTy == C1->getType())
2373 return nullptr;
2374
2375 Constant *ArgVec[] = {C1, C2};
2376 ConstantExprKeyType Key(Opcode, ArgVec, Flags);
2377
2378 LLVMContextImpl *pImpl = C1->getContext().pImpl;
2379 return pImpl->ExprConstants.getOrCreate(C1->getType(), Key);
2380}
2381
2382bool ConstantExpr::isDesirableBinOp(unsigned Opcode) {
2383 switch (Opcode) {
2384 case Instruction::UDiv:
2385 case Instruction::SDiv:
2386 case Instruction::URem:
2387 case Instruction::SRem:
2388 case Instruction::FAdd:
2389 case Instruction::FSub:
2390 case Instruction::FMul:
2391 case Instruction::FDiv:
2392 case Instruction::FRem:
2393 case Instruction::And:
2394 case Instruction::Or:
2395 case Instruction::LShr:
2396 case Instruction::AShr:
2397 case Instruction::Shl:
2398 return false;
2399 case Instruction::Add:
2400 case Instruction::Sub:
2401 case Instruction::Mul:
2402 case Instruction::Xor:
2403 return true;
2404 default:
2405 llvm_unreachable("Argument must be binop opcode");
2406 }
2407}
2408
2409bool ConstantExpr::isSupportedBinOp(unsigned Opcode) {
2410 switch (Opcode) {
2411 case Instruction::UDiv:
2412 case Instruction::SDiv:
2413 case Instruction::URem:
2414 case Instruction::SRem:
2415 case Instruction::FAdd:
2416 case Instruction::FSub:
2417 case Instruction::FMul:
2418 case Instruction::FDiv:
2419 case Instruction::FRem:
2420 case Instruction::And:
2421 case Instruction::Or:
2422 case Instruction::LShr:
2423 case Instruction::AShr:
2424 case Instruction::Shl:
2425 return false;
2426 case Instruction::Add:
2427 case Instruction::Sub:
2428 case Instruction::Mul:
2429 case Instruction::Xor:
2430 return true;
2431 default:
2432 llvm_unreachable("Argument must be binop opcode");
2433 }
2434}
2435
2436bool ConstantExpr::isDesirableCastOp(unsigned Opcode) {
2437 switch (Opcode) {
2438 case Instruction::ZExt:
2439 case Instruction::SExt:
2440 case Instruction::FPTrunc:
2441 case Instruction::FPExt:
2442 case Instruction::UIToFP:
2443 case Instruction::SIToFP:
2444 case Instruction::FPToUI:
2445 case Instruction::FPToSI:
2446 return false;
2447 case Instruction::Trunc:
2448 case Instruction::PtrToInt:
2449 case Instruction::IntToPtr:
2450 case Instruction::BitCast:
2451 case Instruction::AddrSpaceCast:
2452 return true;
2453 default:
2454 llvm_unreachable("Argument must be cast opcode");
2455 }
2456}
2457
2458bool ConstantExpr::isSupportedCastOp(unsigned Opcode) {
2459 switch (Opcode) {
2460 case Instruction::ZExt:
2461 case Instruction::SExt:
2462 case Instruction::FPTrunc:
2463 case Instruction::FPExt:
2464 case Instruction::UIToFP:
2465 case Instruction::SIToFP:
2466 case Instruction::FPToUI:
2467 case Instruction::FPToSI:
2468 return false;
2469 case Instruction::Trunc:
2470 case Instruction::PtrToInt:
2471 case Instruction::IntToPtr:
2472 case Instruction::BitCast:
2473 case Instruction::AddrSpaceCast:
2474 return true;
2475 default:
2476 llvm_unreachable("Argument must be cast opcode");
2477 }
2478}
2479
2481 // sizeof is implemented as: (i64) gep (Ty*)null, 1
2482 // Note that a non-inbounds gep is used, as null isn't within any object.
2483 Constant *GEPIdx = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
2486 return getPtrToInt(GEP,
2488}
2489
2491 // alignof is implemented as: (i64) gep ({i1,Ty}*)null, 0, 1
2492 // Note that a non-inbounds gep is used, as null isn't within any object.
2493 Type *AligningTy = StructType::get(Type::getInt1Ty(Ty->getContext()), Ty);
2494 Constant *NullPtr =
2496 Constant *Zero = ConstantInt::get(Type::getInt64Ty(Ty->getContext()), 0);
2497 Constant *One = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
2498 Constant *Indices[2] = {Zero, One};
2499 Constant *GEP = getGetElementPtr(AligningTy, NullPtr, Indices);
2501}
2502
2504 ArrayRef<Value *> Idxs,
2505 GEPNoWrapFlags NW,
2506 std::optional<ConstantRange> InRange,
2507 Type *OnlyIfReducedTy) {
2508 assert(Ty && "Must specify element type");
2509 assert(isSupportedGetElementPtr(Ty) && "Element type is unsupported!");
2510
2511 if (Constant *FC = ConstantFoldGetElementPtr(Ty, C, InRange, Idxs))
2512 return FC; // Fold a few common cases.
2513
2514 assert(GetElementPtrInst::getIndexedType(Ty, Idxs) && "GEP indices invalid!");
2515 ;
2516
2517 // Get the result type of the getelementptr!
2519 if (OnlyIfReducedTy == ReqTy)
2520 return nullptr;
2521
2522 auto EltCount = ElementCount::getFixed(0);
2523 if (VectorType *VecTy = dyn_cast<VectorType>(ReqTy))
2524 EltCount = VecTy->getElementCount();
2525
2526 // Look up the constant in the table first to ensure uniqueness
2527 std::vector<Constant*> ArgVec;
2528 ArgVec.reserve(1 + Idxs.size());
2529 ArgVec.push_back(C);
2530 auto GTI = gep_type_begin(Ty, Idxs), GTE = gep_type_end(Ty, Idxs);
2531 for (; GTI != GTE; ++GTI) {
2532 auto *Idx = cast<Constant>(GTI.getOperand());
2533 assert(
2534 (!isa<VectorType>(Idx->getType()) ||
2535 cast<VectorType>(Idx->getType())->getElementCount() == EltCount) &&
2536 "getelementptr index type missmatch");
2537
2538 if (GTI.isStruct() && Idx->getType()->isVectorTy()) {
2539 Idx = Idx->getSplatValue();
2540 } else if (GTI.isSequential() && EltCount.isNonZero() &&
2541 !Idx->getType()->isVectorTy()) {
2542 Idx = ConstantVector::getSplat(EltCount, Idx);
2543 }
2544 ArgVec.push_back(Idx);
2545 }
2546
2547 const ConstantExprKeyType Key(Instruction::GetElementPtr, ArgVec, NW.getRaw(),
2548 {}, Ty, InRange);
2549
2550 LLVMContextImpl *pImpl = C->getContext().pImpl;
2551 return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
2552}
2553
2555 Type *OnlyIfReducedTy) {
2556 assert(Val->getType()->isVectorTy() &&
2557 "Tried to create extractelement operation on non-vector type!");
2558 assert(Idx->getType()->isIntegerTy() &&
2559 "Extractelement index must be an integer type!");
2560
2562 return FC; // Fold a few common cases.
2563
2564 Type *ReqTy = cast<VectorType>(Val->getType())->getElementType();
2565 if (OnlyIfReducedTy == ReqTy)
2566 return nullptr;
2567
2568 // Look up the constant in the table first to ensure uniqueness
2569 Constant *ArgVec[] = { Val, Idx };
2570 const ConstantExprKeyType Key(Instruction::ExtractElement, ArgVec);
2571
2572 LLVMContextImpl *pImpl = Val->getContext().pImpl;
2573 return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
2574}
2575
2577 Constant *Idx, Type *OnlyIfReducedTy) {
2578 assert(Val->getType()->isVectorTy() &&
2579 "Tried to create insertelement operation on non-vector type!");
2580 assert(Elt->getType() == cast<VectorType>(Val->getType())->getElementType() &&
2581 "Insertelement types must match!");
2582 assert(Idx->getType()->isIntegerTy() &&
2583 "Insertelement index must be i32 type!");
2584
2586 return FC; // Fold a few common cases.
2587
2588 if (OnlyIfReducedTy == Val->getType())
2589 return nullptr;
2590
2591 // Look up the constant in the table first to ensure uniqueness
2592 Constant *ArgVec[] = { Val, Elt, Idx };
2593 const ConstantExprKeyType Key(Instruction::InsertElement, ArgVec);
2594
2595 LLVMContextImpl *pImpl = Val->getContext().pImpl;
2596 return pImpl->ExprConstants.getOrCreate(Val->getType(), Key);
2597}
2598
2600 ArrayRef<int> Mask,
2601 Type *OnlyIfReducedTy) {
2603 "Invalid shuffle vector constant expr operands!");
2604
2605 if (Constant *FC = ConstantFoldShuffleVectorInstruction(V1, V2, Mask))
2606 return FC; // Fold a few common cases.
2607
2608 unsigned NElts = Mask.size();
2609 auto V1VTy = cast<VectorType>(V1->getType());
2610 Type *EltTy = V1VTy->getElementType();
2611 bool TypeIsScalable = isa<ScalableVectorType>(V1VTy);
2612 Type *ShufTy = VectorType::get(EltTy, NElts, TypeIsScalable);
2613
2614 if (OnlyIfReducedTy == ShufTy)
2615 return nullptr;
2616
2617 // Look up the constant in the table first to ensure uniqueness
2618 Constant *ArgVec[] = {V1, V2};
2619 ConstantExprKeyType Key(Instruction::ShuffleVector, ArgVec, 0, Mask);
2620
2621 LLVMContextImpl *pImpl = ShufTy->getContext().pImpl;
2622 return pImpl->ExprConstants.getOrCreate(ShufTy, Key);
2623}
2624
2626 assert(C->getType()->isIntOrIntVectorTy() &&
2627 "Cannot NEG a nonintegral value!");
2628 return getSub(ConstantInt::get(C->getType(), 0), C, /*HasNUW=*/false, HasNSW);
2629}
2630
2632 assert(C->getType()->isIntOrIntVectorTy() &&
2633 "Cannot NOT a nonintegral value!");
2634 return get(Instruction::Xor, C, Constant::getAllOnesValue(C->getType()));
2635}
2636
2638 bool HasNUW, bool HasNSW) {
2639 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
2641 return get(Instruction::Add, C1, C2, Flags);
2642}
2643
2645 bool HasNUW, bool HasNSW) {
2646 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
2648 return get(Instruction::Sub, C1, C2, Flags);
2649}
2650
2652 bool HasNUW, bool HasNSW) {
2653 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
2655 return get(Instruction::Mul, C1, C2, Flags);
2656}
2657
2659 return get(Instruction::Xor, C1, C2);
2660}
2661
2663 Type *Ty = C->getType();
2664 const APInt *IVal;
2665 if (match(C, m_APInt(IVal)) && IVal->isPowerOf2())
2666 return ConstantInt::get(Ty, IVal->logBase2());
2667
2668 // FIXME: We can extract pow of 2 of splat constant for scalable vectors.
2669 auto *VecTy = dyn_cast<FixedVectorType>(Ty);
2670 if (!VecTy)
2671 return nullptr;
2672
2674 for (unsigned I = 0, E = VecTy->getNumElements(); I != E; ++I) {
2675 Constant *Elt = C->getAggregateElement(I);
2676 if (!Elt)
2677 return nullptr;
2678 // Note that log2(iN undef) is *NOT* iN undef, because log2(iN undef) u< N.
2679 if (isa<UndefValue>(Elt)) {
2681 continue;
2682 }
2683 if (!match(Elt, m_APInt(IVal)) || !IVal->isPowerOf2())
2684 return nullptr;
2685 Elts.push_back(ConstantInt::get(Ty->getScalarType(), IVal->logBase2()));
2686 }
2687
2688 return ConstantVector::get(Elts);
2689}
2690
2692 bool AllowRHSConstant, bool NSZ) {
2693 assert(Instruction::isBinaryOp(Opcode) && "Only binops allowed");
2694
2695 // Commutative opcodes: it does not matter if AllowRHSConstant is set.
2696 if (Instruction::isCommutative(Opcode)) {
2697 switch (Opcode) {
2698 case Instruction::Add: // X + 0 = X
2699 case Instruction::Or: // X | 0 = X
2700 case Instruction::Xor: // X ^ 0 = X
2701 return Constant::getNullValue(Ty);
2702 case Instruction::Mul: // X * 1 = X
2703 return ConstantInt::get(Ty, 1);
2704 case Instruction::And: // X & -1 = X
2705 return Constant::getAllOnesValue(Ty);
2706 case Instruction::FAdd: // X + -0.0 = X
2707 return ConstantFP::getZero(Ty, !NSZ);
2708 case Instruction::FMul: // X * 1.0 = X
2709 return ConstantFP::get(Ty, 1.0);
2710 default:
2711 llvm_unreachable("Every commutative binop has an identity constant");
2712 }
2713 }
2714
2715 // Non-commutative opcodes: AllowRHSConstant must be set.
2716 if (!AllowRHSConstant)
2717 return nullptr;
2718
2719 switch (Opcode) {
2720 case Instruction::Sub: // X - 0 = X
2721 case Instruction::Shl: // X << 0 = X
2722 case Instruction::LShr: // X >>u 0 = X
2723 case Instruction::AShr: // X >> 0 = X
2724 case Instruction::FSub: // X - 0.0 = X
2725 return Constant::getNullValue(Ty);
2726 case Instruction::SDiv: // X / 1 = X
2727 case Instruction::UDiv: // X /u 1 = X
2728 return ConstantInt::get(Ty, 1);
2729 case Instruction::FDiv: // X / 1.0 = X
2730 return ConstantFP::get(Ty, 1.0);
2731 default:
2732 return nullptr;
2733 }
2734}
2735
2737 switch (ID) {
2738 case Intrinsic::umax:
2739 return Constant::getNullValue(Ty);
2740 case Intrinsic::umin:
2741 return Constant::getAllOnesValue(Ty);
2742 case Intrinsic::smax:
2745 case Intrinsic::smin:
2748 default:
2749 return nullptr;
2750 }
2751}
2752
2754 bool AllowRHSConstant, bool NSZ) {
2755 if (I->isBinaryOp())
2756 return getBinOpIdentity(I->getOpcode(), Ty, AllowRHSConstant, NSZ);
2757 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
2758 return getIntrinsicIdentity(II->getIntrinsicID(), Ty);
2759 return nullptr;
2760}
2761
2763 bool AllowLHSConstant) {
2764 switch (Opcode) {
2765 default:
2766 break;
2767
2768 case Instruction::Or: // -1 | X = -1
2769 return Constant::getAllOnesValue(Ty);
2770
2771 case Instruction::And: // 0 & X = 0
2772 case Instruction::Mul: // 0 * X = 0
2773 return Constant::getNullValue(Ty);
2774 }
2775
2776 // AllowLHSConstant must be set.
2777 if (!AllowLHSConstant)
2778 return nullptr;
2779
2780 switch (Opcode) {
2781 default:
2782 return nullptr;
2783 case Instruction::Shl: // 0 << X = 0
2784 case Instruction::LShr: // 0 >>l X = 0
2785 case Instruction::AShr: // 0 >>a X = 0
2786 case Instruction::SDiv: // 0 /s X = 0
2787 case Instruction::UDiv: // 0 /u X = 0
2788 case Instruction::URem: // 0 %u X = 0
2789 case Instruction::SRem: // 0 %s X = 0
2790 return Constant::getNullValue(Ty);
2791 }
2792}
2793
2794/// Remove the constant from the constant table.
2795void ConstantExpr::destroyConstantImpl() {
2796 getType()->getContext().pImpl->ExprConstants.remove(this);
2797}
2798
2799const char *ConstantExpr::getOpcodeName() const {
2801}
2802
2803GetElementPtrConstantExpr::GetElementPtrConstantExpr(
2804 Type *SrcElementTy, Constant *C, ArrayRef<Constant *> IdxList, Type *DestTy,
2805 std::optional<ConstantRange> InRange, AllocInfo AllocInfo)
2806 : ConstantExpr(DestTy, Instruction::GetElementPtr, AllocInfo),
2807 SrcElementTy(SrcElementTy),
2808 ResElementTy(GetElementPtrInst::getIndexedType(SrcElementTy, IdxList)),
2809 InRange(std::move(InRange)) {
2810 Op<0>() = C;
2811 Use *OperandList = getOperandList();
2812 for (unsigned i = 0, E = IdxList.size(); i != E; ++i)
2813 OperandList[i+1] = IdxList[i];
2814}
2815
2817 return SrcElementTy;
2818}
2819
2821 return ResElementTy;
2822}
2823
2824std::optional<ConstantRange> GetElementPtrConstantExpr::getInRange() const {
2825 return InRange;
2826}
2827
2828//===----------------------------------------------------------------------===//
2829// ConstantData* implementations
2830
2832 if (ArrayType *ATy = dyn_cast<ArrayType>(getType()))
2833 return ATy->getElementType();
2834 return cast<VectorType>(getType())->getElementType();
2835}
2836
2838 return StringRef(DataElements, getNumElements()*getElementByteSize());
2839}
2840
2842 if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() || Ty->isDoubleTy())
2843 return true;
2844 if (auto *IT = dyn_cast<IntegerType>(Ty)) {
2845 switch (IT->getBitWidth()) {
2846 case 8:
2847 case 16:
2848 case 32:
2849 case 64:
2850 return true;
2851 default: break;
2852 }
2853 }
2854 return false;
2855}
2856
2858 if (ArrayType *AT = dyn_cast<ArrayType>(getType()))
2859 return AT->getNumElements();
2860 return cast<FixedVectorType>(getType())->getNumElements();
2861}
2862
2863
2866}
2867
2868/// Return the start of the specified element.
2869const char *ConstantDataSequential::getElementPointer(unsigned Elt) const {
2870 assert(Elt < getNumElements() && "Invalid Elt");
2871 return DataElements+Elt*getElementByteSize();
2872}
2873
2874
2875/// Return true if the array is empty or all zeros.
2876static bool isAllZeros(StringRef Arr) {
2877 for (char I : Arr)
2878 if (I != 0)
2879 return false;
2880 return true;
2881}
2882
2883/// This is the underlying implementation of all of the
2884/// ConstantDataSequential::get methods. They all thunk down to here, providing
2885/// the correct element type. We take the bytes in as a StringRef because
2886/// we *want* an underlying "char*" to avoid TBAA type punning violations.
2888#ifndef NDEBUG
2889 if (ArrayType *ATy = dyn_cast<ArrayType>(Ty))
2890 assert(isElementTypeCompatible(ATy->getElementType()));
2891 else
2892 assert(isElementTypeCompatible(cast<VectorType>(Ty)->getElementType()));
2893#endif
2894 // If the elements are all zero or there are no elements, return a CAZ, which
2895 // is more dense and canonical.
2896 if (isAllZeros(Elements))
2897 return ConstantAggregateZero::get(Ty);
2898
2899 // Do a lookup to see if we have already formed one of these.
2900 auto &Slot =
2901 *Ty->getContext()
2902 .pImpl->CDSConstants.insert(std::make_pair(Elements, nullptr))
2903 .first;
2904
2905 // The bucket can point to a linked list of different CDS's that have the same
2906 // body but different types. For example, 0,0,0,1 could be a 4 element array
2907 // of i8, or a 1-element array of i32. They'll both end up in the same
2908 /// StringMap bucket, linked up by their Next pointers. Walk the list.
2909 std::unique_ptr<ConstantDataSequential> *Entry = &Slot.second;
2910 for (; *Entry; Entry = &(*Entry)->Next)
2911 if ((*Entry)->getType() == Ty)
2912 return Entry->get();
2913
2914 // Okay, we didn't get a hit. Create a node of the right class, link it in,
2915 // and return it.
2916 if (isa<ArrayType>(Ty)) {
2917 // Use reset because std::make_unique can't access the constructor.
2918 Entry->reset(new ConstantDataArray(Ty, Slot.first().data()));
2919 return Entry->get();
2920 }
2921
2922 assert(isa<VectorType>(Ty));
2923 // Use reset because std::make_unique can't access the constructor.
2924 Entry->reset(new ConstantDataVector(Ty, Slot.first().data()));
2925 return Entry->get();
2926}
2927
2928void ConstantDataSequential::destroyConstantImpl() {
2929 // Remove the constant from the StringMap.
2932
2933 auto Slot = CDSConstants.find(getRawDataValues());
2934
2935 assert(Slot != CDSConstants.end() && "CDS not found in uniquing table");
2936
2937 std::unique_ptr<ConstantDataSequential> *Entry = &Slot->getValue();
2938
2939 // Remove the entry from the hash table.
2940 if (!(*Entry)->Next) {
2941 // If there is only one value in the bucket (common case) it must be this
2942 // entry, and removing the entry should remove the bucket completely.
2943 assert(Entry->get() == this && "Hash mismatch in ConstantDataSequential");
2944 getContext().pImpl->CDSConstants.erase(Slot);
2945 return;
2946 }
2947
2948 // Otherwise, there are multiple entries linked off the bucket, unlink the
2949 // node we care about but keep the bucket around.
2950 while (true) {
2951 std::unique_ptr<ConstantDataSequential> &Node = *Entry;
2952 assert(Node && "Didn't find entry in its uniquing hash table!");
2953 // If we found our entry, unlink it from the list and we're done.
2954 if (Node.get() == this) {
2955 Node = std::move(Node->Next);
2956 return;
2957 }
2958
2959 Entry = &Node->Next;
2960 }
2961}
2962
2963/// getFP() constructors - Return a constant of array type with a float
2964/// element type taken from argument `ElementType', and count taken from
2965/// argument `Elts'. The amount of bits of the contained type must match the
2966/// number of bits of the type contained in the passed in ArrayRef.
2967/// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
2968/// that this can return a ConstantAggregateZero object.
2970 assert((ElementType->isHalfTy() || ElementType->isBFloatTy()) &&
2971 "Element type is not a 16-bit float type");
2972 Type *Ty = ArrayType::get(ElementType, Elts.size());
2973 const char *Data = reinterpret_cast<const char *>(Elts.data());
2974 return getImpl(StringRef(Data, Elts.size() * 2), Ty);
2975}
2977 assert(ElementType->isFloatTy() && "Element type is not a 32-bit float type");
2978 Type *Ty = ArrayType::get(ElementType, Elts.size());
2979 const char *Data = reinterpret_cast<const char *>(Elts.data());
2980 return getImpl(StringRef(Data, Elts.size() * 4), Ty);
2981}
2983 assert(ElementType->isDoubleTy() &&
2984 "Element type is not a 64-bit float type");
2985 Type *Ty = ArrayType::get(ElementType, Elts.size());
2986 const char *Data = reinterpret_cast<const char *>(Elts.data());
2987 return getImpl(StringRef(Data, Elts.size() * 8), Ty);
2988}
2989
2991 StringRef Str, bool AddNull) {
2992 if (!AddNull) {
2993 const uint8_t *Data = Str.bytes_begin();
2994 return get(Context, ArrayRef(Data, Str.size()));
2995 }
2996
2997 SmallVector<uint8_t, 64> ElementVals;
2998 ElementVals.append(Str.begin(), Str.end());
2999 ElementVals.push_back(0);
3000 return get(Context, ElementVals);
3001}
3002
3003/// get() constructors - Return a constant with vector type with an element
3004/// count and element type matching the ArrayRef passed in. Note that this
3005/// can return a ConstantAggregateZero object.
3007 auto *Ty = FixedVectorType::get(Type::getInt8Ty(Context), Elts.size());
3008 const char *Data = reinterpret_cast<const char *>(Elts.data());
3009 return getImpl(StringRef(Data, Elts.size() * 1), Ty);
3010}
3012 auto *Ty = FixedVectorType::get(Type::getInt16Ty(Context), Elts.size());
3013 const char *Data = reinterpret_cast<const char *>(Elts.data());
3014 return getImpl(StringRef(Data, Elts.size() * 2), Ty);
3015}
3017 auto *Ty = FixedVectorType::get(Type::getInt32Ty(Context), Elts.size());
3018 const char *Data = reinterpret_cast<const char *>(Elts.data());
3019 return getImpl(StringRef(Data, Elts.size() * 4), Ty);
3020}
3022 auto *Ty = FixedVectorType::get(Type::getInt64Ty(Context), Elts.size());
3023 const char *Data = reinterpret_cast<const char *>(Elts.data());
3024 return getImpl(StringRef(Data, Elts.size() * 8), Ty);
3025}
3027 auto *Ty = FixedVectorType::get(Type::getFloatTy(Context), Elts.size());
3028 const char *Data = reinterpret_cast<const char *>(Elts.data());
3029 return getImpl(StringRef(Data, Elts.size() * 4), Ty);
3030}
3032 auto *Ty = FixedVectorType::get(Type::getDoubleTy(Context), Elts.size());
3033 const char *Data = reinterpret_cast<const char *>(Elts.data());
3034 return getImpl(StringRef(Data, Elts.size() * 8), Ty);
3035}
3036
3037/// getFP() constructors - Return a constant of vector type with a float
3038/// element type taken from argument `ElementType', and count taken from
3039/// argument `Elts'. The amount of bits of the contained type must match the
3040/// number of bits of the type contained in the passed in ArrayRef.
3041/// (i.e. half or bfloat for 16bits, float for 32bits, double for 64bits) Note
3042/// that this can return a ConstantAggregateZero object.
3044 ArrayRef<uint16_t> Elts) {
3045 assert((ElementType->isHalfTy() || ElementType->isBFloatTy()) &&
3046 "Element type is not a 16-bit float type");
3047 auto *Ty = FixedVectorType::get(ElementType, Elts.size());
3048 const char *Data = reinterpret_cast<const char *>(Elts.data());
3049 return getImpl(StringRef(Data, Elts.size() * 2), Ty);
3050}
3052 ArrayRef<uint32_t> Elts) {
3053 assert(ElementType->isFloatTy() && "Element type is not a 32-bit float type");
3054 auto *Ty = FixedVectorType::get(ElementType, Elts.size());
3055 const char *Data = reinterpret_cast<const char *>(Elts.data());
3056 return getImpl(StringRef(Data, Elts.size() * 4), Ty);
3057}
3059 ArrayRef<uint64_t> Elts) {
3060 assert(ElementType->isDoubleTy() &&
3061 "Element type is not a 64-bit float type");
3062 auto *Ty = FixedVectorType::get(ElementType, Elts.size());
3063 const char *Data = reinterpret_cast<const char *>(Elts.data());
3064 return getImpl(StringRef(Data, Elts.size() * 8), Ty);
3065}
3066
3068 assert(isElementTypeCompatible(V->getType()) &&
3069 "Element type not compatible with ConstantData");
3070 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
3071 if (CI->getType()->isIntegerTy(8)) {
3072 SmallVector<uint8_t, 16> Elts(NumElts, CI->getZExtValue());
3073 return get(V->getContext(), Elts);
3074 }
3075 if (CI->getType()->isIntegerTy(16)) {
3076 SmallVector<uint16_t, 16> Elts(NumElts, CI->getZExtValue());
3077 return get(V->getContext(), Elts);
3078 }
3079 if (CI->getType()->isIntegerTy(32)) {
3080 SmallVector<uint32_t, 16> Elts(NumElts, CI->getZExtValue());
3081 return get(V->getContext(), Elts);
3082 }
3083 assert(CI->getType()->isIntegerTy(64) && "Unsupported ConstantData type");
3084 SmallVector<uint64_t, 16> Elts(NumElts, CI->getZExtValue());
3085 return get(V->getContext(), Elts);
3086 }
3087
3088 if (ConstantFP *CFP = dyn_cast<ConstantFP>(V)) {
3089 if (CFP->getType()->isHalfTy()) {
3091 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3092 return getFP(V->getType(), Elts);
3093 }
3094 if (CFP->getType()->isBFloatTy()) {
3096 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3097 return getFP(V->getType(), Elts);
3098 }
3099 if (CFP->getType()->isFloatTy()) {
3101 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3102 return getFP(V->getType(), Elts);
3103 }
3104 if (CFP->getType()->isDoubleTy()) {
3106 NumElts, CFP->getValueAPF().bitcastToAPInt().getLimitedValue());
3107 return getFP(V->getType(), Elts);
3108 }
3109 }
3111}
3112
3113
3115 assert(isa<IntegerType>(getElementType()) &&
3116 "Accessor can only be used when element is an integer");
3117 const char *EltPtr = getElementPointer(Elt);
3118
3119 // The data is stored in host byte order, make sure to cast back to the right
3120 // type to load with the right endianness.
3121 switch (getElementType()->getIntegerBitWidth()) {
3122 default: llvm_unreachable("Invalid bitwidth for CDS");
3123 case 8:
3124 return *reinterpret_cast<const uint8_t *>(EltPtr);
3125 case 16:
3126 return *reinterpret_cast<const uint16_t *>(EltPtr);
3127 case 32:
3128 return *reinterpret_cast<const uint32_t *>(EltPtr);
3129 case 64:
3130 return *reinterpret_cast<const uint64_t *>(EltPtr);
3131 }
3132}
3133
3135 assert(isa<IntegerType>(getElementType()) &&
3136 "Accessor can only be used when element is an integer");
3137 const char *EltPtr = getElementPointer(Elt);
3138
3139 // The data is stored in host byte order, make sure to cast back to the right
3140 // type to load with the right endianness.
3141 switch (getElementType()->getIntegerBitWidth()) {
3142 default: llvm_unreachable("Invalid bitwidth for CDS");
3143 case 8: {
3144 auto EltVal = *reinterpret_cast<const uint8_t *>(EltPtr);
3145 return APInt(8, EltVal);
3146 }
3147 case 16: {
3148 auto EltVal = *reinterpret_cast<const uint16_t *>(EltPtr);
3149 return APInt(16, EltVal);
3150 }
3151 case 32: {
3152 auto EltVal = *reinterpret_cast<const uint32_t *>(EltPtr);
3153 return APInt(32, EltVal);
3154 }
3155 case 64: {
3156 auto EltVal = *reinterpret_cast<const uint64_t *>(EltPtr);
3157 return APInt(64, EltVal);
3158 }
3159 }
3160}
3161
3163 const char *EltPtr = getElementPointer(Elt);
3164
3165 switch (getElementType()->getTypeID()) {
3166 default:
3167 llvm_unreachable("Accessor can only be used when element is float/double!");
3168 case Type::HalfTyID: {
3169 auto EltVal = *reinterpret_cast<const uint16_t *>(EltPtr);
3170 return APFloat(APFloat::IEEEhalf(), APInt(16, EltVal));
3171 }
3172 case Type::BFloatTyID: {
3173 auto EltVal = *reinterpret_cast<const uint16_t *>(EltPtr);
3174 return APFloat(APFloat::BFloat(), APInt(16, EltVal));
3175 }
3176 case Type::FloatTyID: {
3177 auto EltVal = *reinterpret_cast<const uint32_t *>(EltPtr);
3178 return APFloat(APFloat::IEEEsingle(), APInt(32, EltVal));
3179 }
3180 case Type::DoubleTyID: {
3181 auto EltVal = *reinterpret_cast<const uint64_t *>(EltPtr);
3182 return APFloat(APFloat::IEEEdouble(), APInt(64, EltVal));
3183 }
3184 }
3185}
3186
3188 assert(getElementType()->isFloatTy() &&
3189 "Accessor can only be used when element is a 'float'");
3190 return *reinterpret_cast<const float *>(getElementPointer(Elt));
3191}
3192
3194 assert(getElementType()->isDoubleTy() &&
3195 "Accessor can only be used when element is a 'float'");
3196 return *reinterpret_cast<const double *>(getElementPointer(Elt));
3197}
3198
3200 if (getElementType()->isHalfTy() || getElementType()->isBFloatTy() ||
3201 getElementType()->isFloatTy() || getElementType()->isDoubleTy())
3202 return ConstantFP::get(getContext(), getElementAsAPFloat(Elt));
3203
3204 return ConstantInt::get(getElementType(), getElementAsInteger(Elt));
3205}
3206
3207bool ConstantDataSequential::isString(unsigned CharSize) const {
3208 return isa<ArrayType>(getType()) && getElementType()->isIntegerTy(CharSize);
3209}
3210
3212 if (!isString())
3213 return false;
3214
3215 StringRef Str = getAsString();
3216
3217 // The last value must be nul.
3218 if (Str.back() != 0) return false;
3219
3220 // Other elements must be non-nul.
3221 return !Str.drop_back().contains(0);
3222}
3223
3224bool ConstantDataVector::isSplatData() const {
3225 const char *Base = getRawDataValues().data();
3226
3227 // Compare elements 1+ to the 0'th element.
3228 unsigned EltSize = getElementByteSize();
3229 for (unsigned i = 1, e = getNumElements(); i != e; ++i)
3230 if (memcmp(Base, Base+i*EltSize, EltSize))
3231 return false;
3232
3233 return true;
3234}
3235
3237 if (!IsSplatSet) {
3238 IsSplatSet = true;
3239 IsSplat = isSplatData();
3240 }
3241 return IsSplat;
3242}
3243
3245 // If they're all the same, return the 0th one as a representative.
3246 return isSplat() ? getElementAsConstant(0) : nullptr;
3247}
3248
3249//===----------------------------------------------------------------------===//
3250// handleOperandChange implementations
3251
3252/// Update this constant array to change uses of
3253/// 'From' to be uses of 'To'. This must update the uniquing data structures
3254/// etc.
3255///
3256/// Note that we intentionally replace all uses of From with To here. Consider
3257/// a large array that uses 'From' 1000 times. By handling this case all here,
3258/// ConstantArray::handleOperandChange is only invoked once, and that
3259/// single invocation handles all 1000 uses. Handling them one at a time would
3260/// work, but would be really slow because it would have to unique each updated
3261/// array instance.
3262///
3264 Value *Replacement = nullptr;
3265 switch (getValueID()) {
3266 default:
3267 llvm_unreachable("Not a constant!");
3268#define HANDLE_CONSTANT(Name) \
3269 case Value::Name##Val: \
3270 Replacement = cast<Name>(this)->handleOperandChangeImpl(From, To); \
3271 break;
3272#include "llvm/IR/Value.def"
3273 }
3274
3275 // If handleOperandChangeImpl returned nullptr, then it handled
3276 // replacing itself and we don't want to delete or replace anything else here.
3277 if (!Replacement)
3278 return;
3279
3280 // I do need to replace this with an existing value.
3281 assert(Replacement != this && "I didn't contain From!");
3282
3283 // Everyone using this now uses the replacement.
3284 replaceAllUsesWith(Replacement);
3285
3286 // Delete the old constant!
3288}
3289
3290Value *ConstantArray::handleOperandChangeImpl(Value *From, Value *To) {
3291 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
3292 Constant *ToC = cast<Constant>(To);
3293
3295 Values.reserve(getNumOperands()); // Build replacement array.
3296
3297 // Fill values with the modified operands of the constant array. Also,
3298 // compute whether this turns into an all-zeros array.
3299 unsigned NumUpdated = 0;
3300
3301 // Keep track of whether all the values in the array are "ToC".
3302 bool AllSame = true;
3303 Use *OperandList = getOperandList();
3304 unsigned OperandNo = 0;
3305 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
3306 Constant *Val = cast<Constant>(O->get());
3307 if (Val == From) {
3308 OperandNo = (O - OperandList);
3309 Val = ToC;
3310 ++NumUpdated;
3311 }
3312 Values.push_back(Val);
3313 AllSame &= Val == ToC;
3314 }
3315
3316 if (AllSame && ToC->isNullValue())
3318
3319 if (AllSame && isa<UndefValue>(ToC))
3320 return UndefValue::get(getType());
3321
3322 // Check for any other type of constant-folding.
3323 if (Constant *C = getImpl(getType(), Values))
3324 return C;
3325
3326 // Update to the new value.
3328 Values, this, From, ToC, NumUpdated, OperandNo);
3329}
3330
3331Value *ConstantStruct::handleOperandChangeImpl(Value *From, Value *To) {
3332 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
3333 Constant *ToC = cast<Constant>(To);
3334
3335 Use *OperandList = getOperandList();
3336
3338 Values.reserve(getNumOperands()); // Build replacement struct.
3339
3340 // Fill values with the modified operands of the constant struct. Also,
3341 // compute whether this turns into an all-zeros struct.
3342 unsigned NumUpdated = 0;
3343 bool AllSame = true;
3344 unsigned OperandNo = 0;
3345 for (Use *O = OperandList, *E = OperandList + getNumOperands(); O != E; ++O) {
3346 Constant *Val = cast<Constant>(O->get());
3347 if (Val == From) {
3348 OperandNo = (O - OperandList);
3349 Val = ToC;
3350 ++NumUpdated;
3351 }
3352 Values.push_back(Val);
3353 AllSame &= Val == ToC;
3354 }
3355
3356 if (AllSame && ToC->isNullValue())
3358
3359 if (AllSame && isa<UndefValue>(ToC))
3360 return UndefValue::get(getType());
3361
3362 // Update to the new value.
3364 Values, this, From, ToC, NumUpdated, OperandNo);
3365}
3366
3367Value *ConstantVector::handleOperandChangeImpl(Value *From, Value *To) {
3368 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
3369 Constant *ToC = cast<Constant>(To);
3370
3372 Values.reserve(getNumOperands()); // Build replacement array...
3373 unsigned NumUpdated = 0;
3374 unsigned OperandNo = 0;
3375 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
3376 Constant *Val = getOperand(i);
3377 if (Val == From) {
3378 OperandNo = i;
3379 ++NumUpdated;
3380 Val = ToC;
3381 }
3382 Values.push_back(Val);
3383 }
3384
3385 if (Constant *C = getImpl(Values))
3386 return C;
3387
3388 // Update to the new value.
3390 Values, this, From, ToC, NumUpdated, OperandNo);
3391}
3392
3393Value *ConstantExpr::handleOperandChangeImpl(Value *From, Value *ToV) {
3394 assert(isa<Constant>(ToV) && "Cannot make Constant refer to non-constant!");
3395 Constant *To = cast<Constant>(ToV);
3396
3398 unsigned NumUpdated = 0;
3399 unsigned OperandNo = 0;
3400 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
3401 Constant *Op = getOperand(i);
3402 if (Op == From) {
3403 OperandNo = i;
3404 ++NumUpdated;
3405 Op = To;
3406 }
3407 NewOps.push_back(Op);
3408 }
3409 assert(NumUpdated && "I didn't contain From!");
3410
3411 if (Constant *C = getWithOperands(NewOps, getType(), true))
3412 return C;
3413
3414 // Update to the new value.
3415 return getContext().pImpl->ExprConstants.replaceOperandsInPlace(
3416 NewOps, this, From, To, NumUpdated, OperandNo);
3417}
3418
3420 SmallVector<Value *, 4> ValueOperands(operands());
3421 ArrayRef<Value*> Ops(ValueOperands);
3422
3423 switch (getOpcode()) {
3424 case Instruction::Trunc:
3425 case Instruction::PtrToInt:
3426 case Instruction::IntToPtr:
3427 case Instruction::BitCast:
3428 case Instruction::AddrSpaceCast:
3430 getType(), "");
3431 case Instruction::InsertElement:
3432 return InsertElementInst::Create(Ops[0], Ops[1], Ops[2], "");
3433 case Instruction::ExtractElement:
3434 return ExtractElementInst::Create(Ops[0], Ops[1], "");
3435 case Instruction::ShuffleVector:
3436 return new ShuffleVectorInst(Ops[0], Ops[1], getShuffleMask(), "");
3437
3438 case Instruction::GetElementPtr: {
3439 const auto *GO = cast<GEPOperator>(this);
3440 return GetElementPtrInst::Create(GO->getSourceElementType(), Ops[0],
3441 Ops.slice(1), GO->getNoWrapFlags(), "");
3442 }
3443 default:
3444 assert(getNumOperands() == 2 && "Must be binary operator?");
3446 (Instruction::BinaryOps)getOpcode(), Ops[0], Ops[1], "");
3447 if (isa<OverflowingBinaryOperator>(BO)) {
3452 }
3453 if (isa<PossiblyExactOperator>(BO))
3455 return BO;
3456 }
3457}
This file defines the StringMap class.
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
BlockVerifier::State From
static bool isAllZeros(StringRef Arr)
Return true if the array is empty or all zeros.
Definition: Constants.cpp:2876
static cl::opt< bool > UseConstantIntForScalableSplat("use-constant-int-for-scalable-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantInt's native scalable vector splat support."))
static cl::opt< bool > UseConstantIntForFixedLengthSplat("use-constant-int-for-fixed-length-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantInt's native fixed-length vector splat support."))
static Constant * getFPSequenceIfElementsMatch(ArrayRef< Constant * > V)
Definition: Constants.cpp:1250
static bool rangeOnlyContains(ItTy Start, ItTy End, EltTy Elt)
Definition: Constants.cpp:1229
static Constant * getIntSequenceIfElementsMatch(ArrayRef< Constant * > V)
Definition: Constants.cpp:1237
static Constant * getSequenceIfElementsMatch(Constant *C, ArrayRef< Constant * > V)
Definition: Constants.cpp:1263
static bool ConstHasGlobalValuePredicate(const Constant *C, bool(*Predicate)(const GlobalValue *))
Check if C contains a GlobalValue for which Predicate is true.
Definition: Constants.cpp:602
static cl::opt< bool > UseConstantFPForScalableSplat("use-constant-fp-for-scalable-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantFP's native scalable vector splat support."))
static bool constantIsDead(const Constant *C, bool RemoveDeadUsers)
Return true if the specified constantexpr is dead.
Definition: Constants.cpp:710
static bool containsUndefinedElement(const Constant *C, function_ref< bool(const Constant *)> HasFn)
Definition: Constants.cpp:323
static Constant * getFoldedCast(Instruction::CastOps opc, Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is a utility function to handle folding of casts and lookup of the cast in the ExprConstants map...
Definition: Constants.cpp:2204
static cl::opt< bool > UseConstantFPForFixedLengthSplat("use-constant-fp-for-fixed-length-splat", cl::init(false), cl::Hidden, cl::desc("Use ConstantFP's native fixed-length vector splat support."))
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
bool End
Definition: ELF_riscv.cpp:480
static Function * getFunction(Constant *C)
Definition: Evaluator.cpp:235
static bool isSigned(unsigned int Opcode)
static char getTypeID(Type *Ty)
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Hexagon Common GEP
static bool isUndef(ArrayRef< int > Mask)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition: Lint.cpp:533
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
Merge contiguous icmps into a memcmp
Definition: MergeICmps.cpp:911
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static unsigned getNumElements(Type *Ty)
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:39
Value * RHS
Value * LHS
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
Definition: APFloat.h:1117
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
Definition: APFloat.h:1125
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5465
bool bitwiseIsEqual(const APFloat &RHS) const
Definition: APFloat.h:1405
static APFloat getAllOnesValue(const fltSemantics &Semantics)
Returns a float which is bitcasted from an all one value int.
Definition: APFloat.cpp:5490
const fltSemantics & getSemantics() const
Definition: APFloat.h:1448
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition: APFloat.h:1095
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition: APFloat.h:1106
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Definition: APFloat.h:1076
Class for arbitrary precision integers.
Definition: APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition: APInt.h:234
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition: APInt.h:209
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition: APInt.h:219
unsigned logBase2() const
Definition: APInt.h:1739
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition: APInt.h:440
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:157
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:168
iterator begin() const
Definition: ArrayRef.h:156
const T * data() const
Definition: ArrayRef.h:165
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition: ArrayRef.h:198
Class to represent array types.
Definition: DerivedTypes.h:395
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
Type * getElementType() const
Definition: DerivedTypes.h:408
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition: BasicBlock.h:658
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:219
BinaryConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to impleme...
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
The address of a basic block.
Definition: Constants.h:893
static BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
Definition: Constants.cpp:1915
Function * getFunction() const
Definition: Constants.h:923
BasicBlock * getBasicBlock() const
Definition: Constants.h:924
static BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Definition: Constants.cpp:1897
CastConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to implement...
static CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
@ ICMP_EQ
equal
Definition: InstrTypes.h:694
All zero aggregate value.
Definition: Constants.h:353
ElementCount getElementCount() const
Return the number of elements in the array, vector, or struct.
Definition: Constants.cpp:1154
Constant * getSequentialElement() const
If this CAZ has array or vector type, return a zero with the right element type.
Definition: Constants.cpp:1132
Constant * getElementValue(Constant *C) const
Return a zero of the right value for the specified GEP index if we can, otherwise return null (e....
Definition: Constants.cpp:1142
Constant * getStructElement(unsigned Elt) const
If this CAZ has struct type, return a zero with the right element type for the specified element.
Definition: Constants.cpp:1138
static ConstantAggregateZero * get(Type *Ty)
Definition: Constants.cpp:1672
Base class for aggregate constants (with operands).
Definition: Constants.h:402
ConstantAggregate(Type *T, ValueTy VT, ArrayRef< Constant * > V, AllocInfo AllocInfo)
Definition: Constants.cpp:1289
ConstantArray - Constant Array Declarations.
Definition: Constants.h:427
static Constant * get(ArrayType *T, ArrayRef< Constant * > V)
Definition: Constants.cpp:1312
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition: Constants.h:446
An array constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
Definition: Constants.h:696
static Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
Definition: Constants.cpp:2990
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:709
static Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of array type with a float element type taken from argument ...
Definition: Constants.cpp:2969
APInt getElementAsAPInt(unsigned i) const
If this is a sequential container of integers (of any size), return the specified element as an APInt...
Definition: Constants.cpp:3134
double getElementAsDouble(unsigned i) const
If this is an sequential container of doubles, return the specified element as a double.
Definition: Constants.cpp:3193
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition: Constants.h:662
uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
Definition: Constants.cpp:2864
float getElementAsFloat(unsigned i) const
If this is an sequential container of floats, return the specified element as a float.
Definition: Constants.cpp:3187
bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers.
Definition: Constants.cpp:3207
uint64_t getElementAsInteger(unsigned i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
Definition: Constants.cpp:3114
static Constant * getImpl(StringRef Bytes, Type *Ty)
This is the underlying implementation of all of the ConstantDataSequential::get methods.
Definition: Constants.cpp:2887
unsigned getNumElements() const
Return the number of elements in the array or vector.
Definition: Constants.cpp:2857
Constant * getElementAsConstant(unsigned i) const
Return a Constant for a specified index's element.
Definition: Constants.cpp:3199
Type * getElementType() const
Return the element type of the array/vector.
Definition: Constants.cpp:2831
bool isCString() const
This method returns true if the array "isString", ends with a null byte, and does not contains any ot...
Definition: Constants.cpp:3211
APFloat getElementAsAPFloat(unsigned i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
Definition: Constants.cpp:3162
StringRef getRawDataValues() const
Return the raw, underlying, bytes of this data.
Definition: Constants.cpp:2837
static bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
Definition: Constants.cpp:2841
A vector constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
Definition: Constants.h:770
Constant * getSplatValue() const
If this is a splat constant, meaning that all of the elements have the same value,...
Definition: Constants.cpp:3244
static Constant * getSplat(unsigned NumElts, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
Definition: Constants.cpp:3067
bool isSplat() const
Returns true if this is a splat constant, meaning that all elements have the same value.
Definition: Constants.cpp:3236
static Constant * get(LLVMContext &Context, ArrayRef< uint8_t > Elts)
get() constructors - Return a constant with vector type with an element count and element type matchi...
Definition: Constants.cpp:3006
static Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of vector type with a float element type taken from argument...
Definition: Constants.cpp:3043
Base class for constants with no operands.
Definition: Constants.h:53
A constant value that is initialized with an expression using other constant values.
Definition: Constants.h:1108
static Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2307
static Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
Definition: Constants.cpp:2554
static Constant * getAlignOf(Type *Ty)
getAlignOf constant expr - computes the alignment of a type in a target independent way (Note: the re...
Definition: Constants.cpp:2490
static Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
Definition: Constants.cpp:2253
static Constant * getTruncOrBitCast(Constant *C, Type *Ty)
Definition: Constants.cpp:2247
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
Definition: Constants.cpp:2268
bool isCast() const
Return true if this is a convert constant expression.
Definition: Constants.cpp:1537
static Constant * getIdentity(Instruction *I, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary or intrinsic Instruction.
Definition: Constants.cpp:2753
static bool isDesirableCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is desirable.
Definition: Constants.cpp:2436
Constant * getShuffleMaskForBitcode() const
Assert that this is a shufflevector and return the mask.
Definition: Constants.cpp:1543
static Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
Definition: Constants.cpp:2762
static Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
Definition: Constants.cpp:2222
static Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2644
static Constant * getNot(Constant *C)
Definition: Constants.cpp:2631
const char * getOpcodeName() const
Return a string representation for an opcode.
Definition: Constants.cpp:2799
static Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
Definition: Constants.cpp:2576
static Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2293
static Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
Definition: Constants.cpp:2599
static Constant * getSizeOf(Type *Ty)
getSizeOf constant expr - computes the (alloc) size of a type (in address-units, not bits) in a targe...
Definition: Constants.cpp:2480
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
Definition: Constants.h:1379
static Constant * getIntrinsicIdentity(Intrinsic::ID, Type *Ty)
Definition: Constants.cpp:2736
static Constant * getXor(Constant *C1, Constant *C2)
Definition: Constants.cpp:2658
static Constant * getMul(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2651
static Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
Definition: Constants.cpp:2340
static bool isDesirableBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is desirable.
Definition: Constants.cpp:2382
ArrayRef< int > getShuffleMask() const
Assert that this is a shufflevector and return the mask.
Definition: Constants.cpp:1539
static bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
Definition: Constants.cpp:2409
static Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2333
unsigned getOpcode() const
Return the opcode at the root of this constant expression.
Definition: Constants.h:1319
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:1267
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
Definition: Constants.cpp:2637
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2321
static Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
Definition: Constants.cpp:2691
static bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
Definition: Constants.cpp:2458
static Constant * getNeg(Constant *C, bool HasNSW=false)
Definition: Constants.cpp:2625
static Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2279
static Constant * getExactLogBase2(Constant *C)
If C is a scalar/fixed width vector of known powers of 2, then this function returns a new scalar/fix...
Definition: Constants.cpp:2662
Constant * getWithOperands(ArrayRef< Constant * > Ops) const
This returns the current constant expression with the operands replaced with the specified values.
Definition: Constants.h:1337
Instruction * getAsInstruction() const
Returns an Instruction which implements the same operation as this ConstantExpr.
Definition: Constants.cpp:3419
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:271
static Constant * getSNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
Definition: Constants.cpp:1046
static Constant * getInfinity(Type *Ty, bool Negative=false)
Definition: Constants.cpp:1103
static Constant * getZero(Type *Ty, bool Negative=false)
Definition: Constants.cpp:1057
static Constant * getNaN(Type *Ty, bool Negative=false, uint64_t Payload=0)
Definition: Constants.cpp:1024
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 ...
Definition: Constants.cpp:1119
static bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
Definition: Constants.cpp:1611
static Constant * getQNaN(Type *Ty, bool Negative=false, APInt *Payload=nullptr)
Definition: Constants.cpp:1035
This is the shared class of boolean and integer constants.
Definition: Constants.h:83
static bool isValueValidForType(Type *Ty, uint64_t V)
This static method returns true if the type Ty is big enough to represent the value V.
Definition: Constants.cpp:1597
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:866
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:873
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:151
static ConstantInt * getBool(LLVMContext &Context, bool V)
Definition: Constants.cpp:880
A constant pointer value that points to null.
Definition: Constants.h:552
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
Definition: Constants.cpp:1826
PointerType * getType() const
Specialize the getType() method to always return an PointerType, which reduces the amount of casting ...
Definition: Constants.h:568
A signed pointer, in the ptrauth sense.
Definition: Constants.h:1021
Constant * getAddrDiscriminator() const
The address discriminator if any, or the null constant.
Definition: Constants.h:1061
bool isKnownCompatibleWith(const Value *Key, const Value *Discriminator, const DataLayout &DL) const
Check whether an authentication operation with key Key and (possibly blended) discriminator Discrimin...
Definition: Constants.cpp:2139
bool hasSpecialAddressDiscriminator(uint64_t Value) const
Whether the address uses a special address discriminator.
Definition: Constants.cpp:2127
static ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc)
Return a pointer signed with the specified parameters.
Definition: Constants.cpp:2072
ConstantPtrAuth * getWithSameSchema(Constant *Pointer) const
Produce a new ptrauth expression signing the given value using the same schema as is stored in one.
Definition: Constants.cpp:2080
ConstantInt * getKey() const
The Key ID, an i32 constant.
Definition: Constants.h:1051
bool hasAddressDiscriminator() const
Whether there is any non-null address discriminator.
Definition: Constants.h:1066
ConstantInt * getDiscriminator() const
The integer discriminator, an i64 constant, or 0.
Definition: Constants.h:1054
This class represents a range of values.
Definition: ConstantRange.h:47
ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
static Constant * get(StructType *T, ArrayRef< Constant * > V)
Definition: Constants.cpp:1378
static StructType * getTypeForElements(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct type to use for a constant with the specified set of elements.
Definition: Constants.cpp:1363
StructType * getType() const
Specialization - reduce amount of casting.
Definition: Constants.h:498
A constant target extension type default initializer.
Definition: Constants.h:865
static ConstantTargetNone * get(TargetExtType *T)
Static factory methods - Return objects of the specified value.
Definition: Constants.cpp:1843
TargetExtType * getType() const
Specialize the getType() method to always return an TargetExtType, which reduces the amount of castin...
Definition: Constants.h:881
A constant token which is empty.
Definition: Constants.h:844
static ConstantTokenNone * get(LLVMContext &Context)
Return the ConstantTokenNone.
Definition: Constants.cpp:1522
ConstantClass * getOrCreate(TypeClass *Ty, ValType V)
Return the specified constant from the map, creating it if necessary.
void remove(ConstantClass *CP)
Remove this constant from the map.
ConstantClass * replaceOperandsInPlace(ArrayRef< Constant * > Operands, ConstantClass *CP, Value *From, Constant *To, unsigned NumUpdated=0, unsigned OperandNo=~0u)
Constant Vector Declarations.
Definition: Constants.h:511
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition: Constants.h:534
Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
Definition: Constants.cpp:1744
static Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
Definition: Constants.cpp:1472
static Constant * get(ArrayRef< Constant * > V)
Definition: Constants.cpp:1421
This is an important base class in LLVM.
Definition: Constant.h:42
static Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
Definition: Constants.cpp:403
bool hasExactInverseFP() const
Return true if this scalar has an exact multiplicative inverse or this vector has an exact multiplica...
Definition: Constants.cpp:256
static Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
Definition: Constants.cpp:784
Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
Definition: Constants.cpp:1708
bool containsUndefElement() const
Return true if this is a vector constant that includes any strictly undef (not poison) elements.
Definition: Constants.cpp:354
static Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
Definition: Constants.cpp:808
ConstantRange toConstantRange() const
Convert constant to an approximate constant range.
Definition: Constants.cpp:1785
static Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:420
bool hasZeroLiveUses() const
Return true if the constant has no live uses.
Definition: Constants.cpp:768
bool isOneValue() const
Returns true if the value is one.
Definition: Constants.cpp:124
bool isManifestConstant() const
Return true if a constant is ConstantData or a ConstantAggregate or ConstantExpr that contain only Co...
Definition: Constants.cpp:843
bool isNegativeZeroValue() const
Return true if the value is what would be returned by getZeroValueForNegation.
Definition: Constants.cpp:56
bool isAllOnesValue() const
Return true if this is the value that would be returned by getAllOnesValue.
Definition: Constants.cpp:107
bool hasOneLiveUse() const
Return true if the constant has exactly one live use.
Definition: Constants.cpp:766
bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry (eith...
Definition: Constants.cpp:655
bool isDLLImportDependent() const
Return true if the value is dependent on a dllimport variable.
Definition: Constants.cpp:632
const APInt & getUniqueInteger() const
If C is a constant integer then return its value, otherwise C must be a vector of constant integers,...
Definition: Constants.cpp:1771
bool containsConstantExpression() const
Return true if this is a fixed width vector constant that includes any constant expressions.
Definition: Constants.cpp:360
bool isFiniteNonZeroFP() const
Return true if this is a finite and non-zero floating-point scalar constant or a fixed width vector c...
Definition: Constants.cpp:214
void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
Definition: Constants.cpp:739
bool isNormalFP() const
Return true if this is a normal (as opposed to denormal, infinity, nan, or zero) floating-point scala...
Definition: Constants.cpp:235
bool needsDynamicRelocation() const
Definition: Constants.cpp:651
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:373
bool isNaN() const
Return true if this is a floating-point NaN constant or a vector floating-point constant with all NaN...
Definition: Constants.cpp:277
bool isMinSignedValue() const
Return true if the value is the smallest signed value.
Definition: Constants.cpp:169
bool isConstantUsed() const
Return true if the constant has users other than constant expressions and other dangling things.
Definition: Constants.cpp:639
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
Definition: Constants.cpp:435
bool isThreadDependent() const
Return true if the value can vary between threads.
Definition: Constants.cpp:625
bool isZeroValue() const
Return true if the value is negative zero or null value.
Definition: Constants.cpp:76
void destroyConstant()
Called if some element of this constant is no longer valid.
Definition: Constants.cpp:489
bool isNotMinSignedValue() const
Return true if the value is not the smallest signed value, or, for vectors, does not contain smallest...
Definition: Constants.cpp:186
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition: Constants.cpp:90
bool isNotOneValue() const
Return true if the value is not the one value, or, for vectors, does not contain one value elements.
Definition: Constants.cpp:141
bool isElementWiseEqual(Value *Y) const
Return true if this constant and a constant 'Y' are element-wise equal.
Definition: Constants.cpp:298
bool containsUndefOrPoisonElement() const
Return true if this is a vector constant that includes any undef or poison elements.
Definition: Constants.cpp:344
bool containsPoisonElement() const
Return true if this is a vector constant that includes any poison elements.
Definition: Constants.cpp:349
void handleOperandChange(Value *, Value *)
This method is a special form of User::replaceUsesOfWith (which does not work on constants) that does...
Definition: Constants.cpp:3263
Wrapper for a function that represents a value that functionally represents the original function.
Definition: Constants.h:941
GlobalValue * getGlobalValue() const
Definition: Constants.h:962
static DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
Definition: Constants.cpp:1970
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition: TypeSize.h:311
ExtractElementConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to...
static ExtractElementInst * Create(Value *Vec, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition: Type.cpp:791
Represents flags for the getelementptr instruction/expression.
unsigned getRaw() const
GetElementPtrConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
std::optional< ConstantRange > getInRange() const
Definition: Constants.cpp:2824
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:933
static Type * getGEPReturnType(Value *Ptr, ArrayRef< Value * > IdxList)
Returns the pointer type returned by the GEP instruction, which may be a vector of pointers.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Definition: Instructions.h:956
static Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:294
InsertElementConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
bool isCast() const
Definition: Instruction.h:283
void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
bool isBinaryOp() const
Definition: Instruction.h:279
const char * getOpcodeName() const
Definition: Instruction.h:276
void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
Class to represent integer types.
Definition: DerivedTypes.h:42
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:311
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
Definition: DerivedTypes.h:74
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:48
DenseMap< unsigned, std::unique_ptr< ConstantInt > > IntOneConstants
DenseMap< unsigned, std::unique_ptr< ConstantInt > > IntZeroConstants
DenseMap< APFloat, std::unique_ptr< ConstantFP > > FPConstants
DenseMap< PointerType *, std::unique_ptr< ConstantPointerNull > > CPNConstants
DenseMap< Type *, std::unique_ptr< ConstantAggregateZero > > CAZConstants
DenseMap< Type *, std::unique_ptr< PoisonValue > > PVConstants
DenseMap< std::pair< const Function *, const BasicBlock * >, BlockAddress * > BlockAddresses
DenseMap< APInt, std::unique_ptr< ConstantInt > > IntConstants
std::unique_ptr< ConstantTokenNone > TheNoneToken
VectorConstantsTy VectorConstants
DenseMap< const GlobalValue *, NoCFIValue * > NoCFIValues
DenseMap< Type *, std::unique_ptr< UndefValue > > UVConstants
StringMap< std::unique_ptr< ConstantDataSequential > > CDSConstants
StructConstantsTy StructConstants
ConstantUniqueMap< ConstantPtrAuth > ConstantPtrAuths
DenseMap< TargetExtType *, std::unique_ptr< ConstantTargetNone > > CTNConstants
ConstantUniqueMap< ConstantExpr > ExprConstants
DenseMap< std::pair< ElementCount, APInt >, std::unique_ptr< ConstantInt > > IntSplatConstants
ArrayConstantsTy ArrayConstants
DenseMap< const GlobalValue *, DSOLocalEquivalent * > DSOLocalEquivalents
DenseMap< std::pair< ElementCount, APFloat >, std::unique_ptr< ConstantFP > > FPSplatConstants
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
LLVMContextImpl *const pImpl
Definition: LLVMContext.h:69
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
Definition: Constants.h:980
static NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
Definition: Constants.cpp:2028
PointerType * getType() const
NoCFIValue is always a pointer.
Definition: Constants.h:1004
GlobalValue * getGlobalValue() const
Definition: Constants.h:999
Class to represent pointers.
Definition: DerivedTypes.h:670
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:686
In order to facilitate speculative execution, many instructions do not invoke immediate undefined beh...
Definition: Constants.h:1460
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1878
PoisonValue * getStructElement(unsigned Elt) const
If this poison has struct type, return a poison with the right element type for the specified element...
Definition: Constants.cpp:1208
PoisonValue * getSequentialElement() const
If this poison has array or vector type, return a poison with the right element type.
Definition: Constants.cpp:1202
PoisonValue * getElementValue(Constant *C) const
Return an poison of the right value for the specified GEP index if we can, otherwise return null (e....
Definition: Constants.cpp:1212
static void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
Definition: Metadata.cpp:331
ShuffleVectorConstantExpr - This class is private to Constants.cpp, and is used behind the scenes to ...
This instruction constructs a fixed permutation of two input vectors.
static bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:384
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:519
bool empty() const
Definition: SmallVector.h:81
void reserve(size_type N)
Definition: SmallVector.h:663
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
Definition: SmallVector.h:683
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition: StringMap.h:128
iterator end()
Definition: StringMap.h:220
iterator find(StringRef Key)
Definition: StringMap.h:233
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition: StringRef.h:144
Class to represent struct types.
Definition: DerivedTypes.h:218
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition: Type.cpp:406
Class to represent target extensions types, which are generally unintrospectable from target-independ...
Definition: DerivedTypes.h:744
bool hasProperty(Property Prop) const
Returns true if the target extension type contains the given property.
Definition: Type.cpp:1014
@ HasZeroInit
zeroinitializer is valid for this target extension type.
Definition: DerivedTypes.h:806
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
unsigned getIntegerBitWidth() const
static Type * getDoubleTy(LLVMContext &C)
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:270
static Type * getFloatingPointTy(LLVMContext &C, const fltSemantics &S)
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition: Type.h:261
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:243
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:264
static IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition: Type.h:145
unsigned getStructNumElements() const
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ ArrayTyID
Arrays.
Definition: Type.h:74
@ HalfTyID
16-bit floating point type
Definition: Type.h:56
@ TargetExtTyID
Target extension type.
Definition: Type.h:78
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition: Type.h:76
@ FloatTyID
32-bit floating point type
Definition: Type.h:58
@ StructTyID
Structures.
Definition: Type.h:73
@ IntegerTyID
Arbitrary bit width integers.
Definition: Type.h:70
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition: Type.h:75
@ BFloatTyID
16-bit floating point type (7-bit significand)
Definition: Type.h:57
@ DoubleTyID
64-bit floating point type
Definition: Type.h:59
@ X86_FP80TyID
80-bit floating point type (X87)
Definition: Type.h:60
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
Definition: Type.h:62
@ TokenTyID
Tokens.
Definition: Type.h:67
@ PointerTyID
Pointers.
Definition: Type.h:72
@ FP128TyID
128-bit floating point type (112-bit significand)
Definition: Type.h:61
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isStructTy() const
True if this is an instance of StructType.
Definition: Type.h:258
bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
Definition: Type.h:289
static IntegerType * getInt16Ty(LLVMContext &C)
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition: Type.h:142
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition: Type.h:128
static IntegerType * getInt8Ty(LLVMContext &C)
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:156
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition: Type.h:184
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition: Type.h:267
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
static Type * getFloatTy(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:237
TypeID getTypeID() const
Return the type id for the type.
Definition: Type.h:136
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:355
'undef' values are things that do not have specified contents.
Definition: Constants.h:1412
UndefValue * getElementValue(Constant *C) const
Return an undef of the right value for the specified GEP index if we can, otherwise return null (e....
Definition: Constants.cpp:1177
UndefValue * getStructElement(unsigned Elt) const
If this undef has struct type, return a undef with the right element type for the specified element.
Definition: Constants.cpp:1173
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Definition: Constants.cpp:1859
unsigned getNumElements() const
Return the number of elements in the array, vector, or struct.
Definition: Constants.cpp:1189
UndefValue * getSequentialElement() const
If this Undef has array or vector type, return a undef with the right element type.
Definition: Constants.cpp:1167
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
const Use * getOperandList() const
Definition: User.h:221
op_range operands()
Definition: User.h:288
op_iterator op_begin()
Definition: User.h:280
void setOperand(unsigned i, Value *Val)
Definition: User.h:233
Value * getOperand(unsigned i) const
Definition: User.h:228
unsigned getNumOperands() const
Definition: User.h:250
iterator_range< value_op_iterator > operand_values()
Definition: User.h:312
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
user_iterator_impl< const User > const_user_iterator
Definition: Value.h:391
user_iterator user_begin()
Definition: Value.h:397
unsigned char SubclassOptionalData
Hold subclass data that can be dropped.
Definition: Value.h:84
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr) const
Accumulate the constant offset this value has compared to a base pointer.
const Value * stripPointerCastsAndAliases() const
Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
Definition: Value.cpp:698
const Value * stripInBoundsConstantOffsets() const
Strip off pointer casts and all-constant inbounds GEPs.
Definition: Value.cpp:706
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:534
iterator_range< user_iterator > users()
Definition: Value.h:421
User * user_back()
Definition: Value.h:407
unsigned getValueID() const
Return an ID for the concrete type of this object.
Definition: Value.h:532
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:694
bool use_empty() const
Definition: Value.h:344
user_iterator user_end()
Definition: Value.h:405
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1075
iterator_range< use_iterator > uses()
Definition: Value.h:376
void mutateType(Type *Ty)
Mutate the type of this Value to be of the specified type.
Definition: Value.h:819
ValueTy
Concrete subclass of this.
Definition: Value.h:513
Base class of all SIMD vector types.
Definition: DerivedTypes.h:427
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
Definition: DerivedTypes.h:665
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
Definition: DerivedTypes.h:478
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Type * getElementType() const
Definition: DerivedTypes.h:460
An efficient, type-erasing, non-owning reference to a callable.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Entry
Definition: COFF.h:844
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:885
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
Definition: PatternMatch.h:592
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
Definition: PatternMatch.h:299
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
auto m_Undef()
Match an arbitrary undef constant.
Definition: PatternMatch.h:152
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
constexpr double e
Definition: MathExtras.h:47
NodeAddr< FuncNode * > Func
Definition: RDFGraph.h:393
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1739
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:255
Constant * ConstantFoldCompareInstruction(CmpInst::Predicate Predicate, Constant *C1, Constant *C2)
gep_type_iterator gep_type_end(const User *GEP)
void deleteConstant(Constant *C)
Definition: Constants.cpp:529
Constant * ConstantFoldGetElementPtr(Type *Ty, Constant *C, std::optional< ConstantRange > InRange, ArrayRef< Value * > Idxs)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
Constant * ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt, Constant *Idx)
Attempt to constant fold an insertelement instruction with the specified operands and indices.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
@ Other
Any other memory.
Constant * ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx)
Attempt to constant fold an extractelement instruction with the specified operands and indices.
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:260
OutputIt copy(R &&Range, OutputIt Out)
Definition: STLExtras.h:1841
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:217
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1873
gep_type_iterator gep_type_begin(const User *GEP)
Constant * ConstantFoldCastInstruction(unsigned opcode, Constant *V, Type *DestTy)
Constant * ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2, ArrayRef< int > Mask)
Attempt to constant fold a shufflevector instruction with the specified operands and mask.
Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
#define NC
Definition: regutils.h:42
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:265
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:297
static const fltSemantics & PPCDoubleDouble() LLVM_READNONE
Definition: APFloat.cpp:268
static const fltSemantics & x87DoubleExtended() LLVM_READNONE
Definition: APFloat.cpp:288
static const fltSemantics & IEEEquad() LLVM_READNONE
Definition: APFloat.cpp:267
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:266
static const fltSemantics & IEEEhalf() LLVM_READNONE
Definition: APFloat.cpp:263
static const fltSemantics & BFloat() LLVM_READNONE
Definition: APFloat.cpp:264
Summary of memprof metadata on allocations.
Information about how a User object was allocated, to be passed into the User constructor.
Definition: User.h:79