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