1 //===-- Constants.cpp - Implement Constant nodes --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the Constant* classes...
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Constants.h"
15 #include "ConstantFolding.h"
16 #include "llvm/DerivedTypes.h"
17 #include "llvm/GlobalValue.h"
18 #include "llvm/Instructions.h"
19 #include "llvm/SymbolTable.h"
20 #include "llvm/Module.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/Support/MathExtras.h"
23 #include "llvm/Support/Visibility.h"
28 ConstantBool
*ConstantBool::True
= new ConstantBool(true);
29 ConstantBool
*ConstantBool::False
= new ConstantBool(false);
32 //===----------------------------------------------------------------------===//
34 //===----------------------------------------------------------------------===//
36 void Constant::destroyConstantImpl() {
37 // When a Constant is destroyed, there may be lingering
38 // references to the constant by other constants in the constant pool. These
39 // constants are implicitly dependent on the module that is being deleted,
40 // but they don't know that. Because we only find out when the CPV is
41 // deleted, we must now notify all of our users (that should only be
42 // Constants) that they are, in fact, invalid now and should be deleted.
44 while (!use_empty()) {
45 Value
*V
= use_back();
46 #ifndef NDEBUG // Only in -g mode...
47 if (!isa
<Constant
>(V
))
48 std::cerr
<< "While deleting: " << *this
49 << "\n\nUse still stuck around after Def is destroyed: "
52 assert(isa
<Constant
>(V
) && "References remain to Constant being destroyed");
53 Constant
*CV
= cast
<Constant
>(V
);
54 CV
->destroyConstant();
56 // The constant should remove itself from our use list...
57 assert((use_empty() || use_back() != V
) && "Constant not removed!");
60 // Value has no outstanding references it is safe to delete it now...
64 // Static constructor to create a '0' constant of arbitrary type...
65 Constant
*Constant::getNullValue(const Type
*Ty
) {
66 switch (Ty
->getTypeID()) {
67 case Type::BoolTyID
: {
68 static Constant
*NullBool
= ConstantBool::get(false);
71 case Type::SByteTyID
: {
72 static Constant
*NullSByte
= ConstantSInt::get(Type::SByteTy
, 0);
75 case Type::UByteTyID
: {
76 static Constant
*NullUByte
= ConstantUInt::get(Type::UByteTy
, 0);
79 case Type::ShortTyID
: {
80 static Constant
*NullShort
= ConstantSInt::get(Type::ShortTy
, 0);
83 case Type::UShortTyID
: {
84 static Constant
*NullUShort
= ConstantUInt::get(Type::UShortTy
, 0);
88 static Constant
*NullInt
= ConstantSInt::get(Type::IntTy
, 0);
91 case Type::UIntTyID
: {
92 static Constant
*NullUInt
= ConstantUInt::get(Type::UIntTy
, 0);
95 case Type::LongTyID
: {
96 static Constant
*NullLong
= ConstantSInt::get(Type::LongTy
, 0);
99 case Type::ULongTyID
: {
100 static Constant
*NullULong
= ConstantUInt::get(Type::ULongTy
, 0);
104 case Type::FloatTyID
: {
105 static Constant
*NullFloat
= ConstantFP::get(Type::FloatTy
, 0);
108 case Type::DoubleTyID
: {
109 static Constant
*NullDouble
= ConstantFP::get(Type::DoubleTy
, 0);
113 case Type::PointerTyID
:
114 return ConstantPointerNull::get(cast
<PointerType
>(Ty
));
116 case Type::StructTyID
:
117 case Type::ArrayTyID
:
118 case Type::PackedTyID
:
119 return ConstantAggregateZero::get(Ty
);
121 // Function, Label, or Opaque type?
122 assert(!"Cannot create a null constant of that type!");
127 // Static constructor to create the maximum constant of an integral type...
128 ConstantIntegral
*ConstantIntegral::getMaxValue(const Type
*Ty
) {
129 switch (Ty
->getTypeID()) {
130 case Type::BoolTyID
: return ConstantBool::True
;
131 case Type::SByteTyID
:
132 case Type::ShortTyID
:
134 case Type::LongTyID
: {
135 // Calculate 011111111111111...
136 unsigned TypeBits
= Ty
->getPrimitiveSize()*8;
137 int64_t Val
= INT64_MAX
; // All ones
138 Val
>>= 64-TypeBits
; // Shift out unwanted 1 bits...
139 return ConstantSInt::get(Ty
, Val
);
142 case Type::UByteTyID
:
143 case Type::UShortTyID
:
145 case Type::ULongTyID
: return getAllOnesValue(Ty
);
151 // Static constructor to create the minimum constant for an integral type...
152 ConstantIntegral
*ConstantIntegral::getMinValue(const Type
*Ty
) {
153 switch (Ty
->getTypeID()) {
154 case Type::BoolTyID
: return ConstantBool::False
;
155 case Type::SByteTyID
:
156 case Type::ShortTyID
:
158 case Type::LongTyID
: {
159 // Calculate 1111111111000000000000
160 unsigned TypeBits
= Ty
->getPrimitiveSize()*8;
161 int64_t Val
= -1; // All ones
162 Val
<<= TypeBits
-1; // Shift over to the right spot
163 return ConstantSInt::get(Ty
, Val
);
166 case Type::UByteTyID
:
167 case Type::UShortTyID
:
169 case Type::ULongTyID
: return ConstantUInt::get(Ty
, 0);
175 // Static constructor to create an integral constant with all bits set
176 ConstantIntegral
*ConstantIntegral::getAllOnesValue(const Type
*Ty
) {
177 switch (Ty
->getTypeID()) {
178 case Type::BoolTyID
: return ConstantBool::True
;
179 case Type::SByteTyID
:
180 case Type::ShortTyID
:
182 case Type::LongTyID
: return ConstantSInt::get(Ty
, -1);
184 case Type::UByteTyID
:
185 case Type::UShortTyID
:
187 case Type::ULongTyID
: {
188 // Calculate ~0 of the right type...
189 unsigned TypeBits
= Ty
->getPrimitiveSize()*8;
190 uint64_t Val
= ~0ULL; // All ones
191 Val
>>= 64-TypeBits
; // Shift out unwanted 1 bits...
192 return ConstantUInt::get(Ty
, Val
);
198 bool ConstantUInt::isAllOnesValue() const {
199 unsigned TypeBits
= getType()->getPrimitiveSize()*8;
200 uint64_t Val
= ~0ULL; // All ones
201 Val
>>= 64-TypeBits
; // Shift out inappropriate bits
202 return getValue() == Val
;
206 //===----------------------------------------------------------------------===//
207 // ConstantXXX Classes
208 //===----------------------------------------------------------------------===//
210 //===----------------------------------------------------------------------===//
211 // Normal Constructors
213 ConstantIntegral::ConstantIntegral(const Type
*Ty
, ValueTy VT
, uint64_t V
)
214 : Constant(Ty
, VT
, 0, 0) {
218 ConstantBool::ConstantBool(bool V
)
219 : ConstantIntegral(Type::BoolTy
, ConstantBoolVal
, V
) {
222 ConstantInt::ConstantInt(const Type
*Ty
, ValueTy VT
, uint64_t V
)
223 : ConstantIntegral(Ty
, VT
, V
) {
226 ConstantSInt::ConstantSInt(const Type
*Ty
, int64_t V
)
227 : ConstantInt(Ty
, ConstantSIntVal
, V
) {
228 assert(Ty
->isInteger() && Ty
->isSigned() &&
229 "Illegal type for signed integer constant!");
230 assert(isValueValidForType(Ty
, V
) && "Value too large for type!");
233 ConstantUInt::ConstantUInt(const Type
*Ty
, uint64_t V
)
234 : ConstantInt(Ty
, ConstantUIntVal
, V
) {
235 assert(Ty
->isInteger() && Ty
->isUnsigned() &&
236 "Illegal type for unsigned integer constant!");
237 assert(isValueValidForType(Ty
, V
) && "Value too large for type!");
240 ConstantFP::ConstantFP(const Type
*Ty
, double V
)
241 : Constant(Ty
, ConstantFPVal
, 0, 0) {
242 assert(isValueValidForType(Ty
, V
) && "Value too large for type!");
246 ConstantArray::ConstantArray(const ArrayType
*T
,
247 const std::vector
<Constant
*> &V
)
248 : Constant(T
, ConstantArrayVal
, new Use
[V
.size()], V
.size()) {
249 assert(V
.size() == T
->getNumElements() &&
250 "Invalid initializer vector for constant array");
251 Use
*OL
= OperandList
;
252 for (std::vector
<Constant
*>::const_iterator I
= V
.begin(), E
= V
.end();
255 assert((C
->getType() == T
->getElementType() ||
257 C
->getType()->getTypeID() == T
->getElementType()->getTypeID())) &&
258 "Initializer for array element doesn't match array element type!");
263 ConstantArray::~ConstantArray() {
264 delete [] OperandList
;
267 ConstantStruct::ConstantStruct(const StructType
*T
,
268 const std::vector
<Constant
*> &V
)
269 : Constant(T
, ConstantStructVal
, new Use
[V
.size()], V
.size()) {
270 assert(V
.size() == T
->getNumElements() &&
271 "Invalid initializer vector for constant structure");
272 Use
*OL
= OperandList
;
273 for (std::vector
<Constant
*>::const_iterator I
= V
.begin(), E
= V
.end();
276 assert((C
->getType() == T
->getElementType(I
-V
.begin()) ||
277 ((T
->getElementType(I
-V
.begin())->isAbstract() ||
278 C
->getType()->isAbstract()) &&
279 T
->getElementType(I
-V
.begin())->getTypeID() ==
280 C
->getType()->getTypeID())) &&
281 "Initializer for struct element doesn't match struct element type!");
286 ConstantStruct::~ConstantStruct() {
287 delete [] OperandList
;
291 ConstantPacked::ConstantPacked(const PackedType
*T
,
292 const std::vector
<Constant
*> &V
)
293 : Constant(T
, ConstantPackedVal
, new Use
[V
.size()], V
.size()) {
294 Use
*OL
= OperandList
;
295 for (std::vector
<Constant
*>::const_iterator I
= V
.begin(), E
= V
.end();
298 assert((C
->getType() == T
->getElementType() ||
300 C
->getType()->getTypeID() == T
->getElementType()->getTypeID())) &&
301 "Initializer for packed element doesn't match packed element type!");
306 ConstantPacked::~ConstantPacked() {
307 delete [] OperandList
;
310 /// UnaryConstantExpr - This class is private to Constants.cpp, and is used
311 /// behind the scenes to implement unary constant exprs.
313 class VISIBILITY_HIDDEN UnaryConstantExpr
: public ConstantExpr
{
316 UnaryConstantExpr(unsigned Opcode
, Constant
*C
, const Type
*Ty
)
317 : ConstantExpr(Ty
, Opcode
, &Op
, 1), Op(C
, this) {}
321 static bool isSetCC(unsigned Opcode
) {
322 return Opcode
== Instruction::SetEQ
|| Opcode
== Instruction::SetNE
||
323 Opcode
== Instruction::SetLT
|| Opcode
== Instruction::SetGT
||
324 Opcode
== Instruction::SetLE
|| Opcode
== Instruction::SetGE
;
327 /// BinaryConstantExpr - This class is private to Constants.cpp, and is used
328 /// behind the scenes to implement binary constant exprs.
330 class VISIBILITY_HIDDEN BinaryConstantExpr
: public ConstantExpr
{
333 BinaryConstantExpr(unsigned Opcode
, Constant
*C1
, Constant
*C2
)
334 : ConstantExpr(isSetCC(Opcode
) ? Type::BoolTy
: C1
->getType(),
336 Ops
[0].init(C1
, this);
337 Ops
[1].init(C2
, this);
342 /// SelectConstantExpr - This class is private to Constants.cpp, and is used
343 /// behind the scenes to implement select constant exprs.
345 class VISIBILITY_HIDDEN SelectConstantExpr
: public ConstantExpr
{
348 SelectConstantExpr(Constant
*C1
, Constant
*C2
, Constant
*C3
)
349 : ConstantExpr(C2
->getType(), Instruction::Select
, Ops
, 3) {
350 Ops
[0].init(C1
, this);
351 Ops
[1].init(C2
, this);
352 Ops
[2].init(C3
, this);
357 /// ExtractElementConstantExpr - This class is private to
358 /// Constants.cpp, and is used behind the scenes to implement
359 /// extractelement constant exprs.
361 class VISIBILITY_HIDDEN ExtractElementConstantExpr
: public ConstantExpr
{
364 ExtractElementConstantExpr(Constant
*C1
, Constant
*C2
)
365 : ConstantExpr(cast
<PackedType
>(C1
->getType())->getElementType(),
366 Instruction::ExtractElement
, Ops
, 2) {
367 Ops
[0].init(C1
, this);
368 Ops
[1].init(C2
, this);
373 /// InsertElementConstantExpr - This class is private to
374 /// Constants.cpp, and is used behind the scenes to implement
375 /// insertelement constant exprs.
377 class VISIBILITY_HIDDEN InsertElementConstantExpr
: public ConstantExpr
{
380 InsertElementConstantExpr(Constant
*C1
, Constant
*C2
, Constant
*C3
)
381 : ConstantExpr(C1
->getType(), Instruction::InsertElement
,
383 Ops
[0].init(C1
, this);
384 Ops
[1].init(C2
, this);
385 Ops
[2].init(C3
, this);
390 /// ShuffleVectorConstantExpr - This class is private to
391 /// Constants.cpp, and is used behind the scenes to implement
392 /// shufflevector constant exprs.
394 class VISIBILITY_HIDDEN ShuffleVectorConstantExpr
: public ConstantExpr
{
397 ShuffleVectorConstantExpr(Constant
*C1
, Constant
*C2
, Constant
*C3
)
398 : ConstantExpr(C1
->getType(), Instruction::ShuffleVector
,
400 Ops
[0].init(C1
, this);
401 Ops
[1].init(C2
, this);
402 Ops
[2].init(C3
, this);
407 /// GetElementPtrConstantExpr - This class is private to Constants.cpp, and is
408 /// used behind the scenes to implement getelementpr constant exprs.
410 struct VISIBILITY_HIDDEN GetElementPtrConstantExpr
: public ConstantExpr
{
411 GetElementPtrConstantExpr(Constant
*C
, const std::vector
<Constant
*> &IdxList
,
413 : ConstantExpr(DestTy
, Instruction::GetElementPtr
,
414 new Use
[IdxList
.size()+1], IdxList
.size()+1) {
415 OperandList
[0].init(C
, this);
416 for (unsigned i
= 0, E
= IdxList
.size(); i
!= E
; ++i
)
417 OperandList
[i
+1].init(IdxList
[i
], this);
419 ~GetElementPtrConstantExpr() {
420 delete [] OperandList
;
425 /// ConstantExpr::get* - Return some common constants without having to
426 /// specify the full Instruction::OPCODE identifier.
428 Constant
*ConstantExpr::getNeg(Constant
*C
) {
429 if (!C
->getType()->isFloatingPoint())
430 return get(Instruction::Sub
, getNullValue(C
->getType()), C
);
432 return get(Instruction::Sub
, ConstantFP::get(C
->getType(), -0.0), C
);
434 Constant
*ConstantExpr::getNot(Constant
*C
) {
435 assert(isa
<ConstantIntegral
>(C
) && "Cannot NOT a nonintegral type!");
436 return get(Instruction::Xor
, C
,
437 ConstantIntegral::getAllOnesValue(C
->getType()));
439 Constant
*ConstantExpr::getAdd(Constant
*C1
, Constant
*C2
) {
440 return get(Instruction::Add
, C1
, C2
);
442 Constant
*ConstantExpr::getSub(Constant
*C1
, Constant
*C2
) {
443 return get(Instruction::Sub
, C1
, C2
);
445 Constant
*ConstantExpr::getMul(Constant
*C1
, Constant
*C2
) {
446 return get(Instruction::Mul
, C1
, C2
);
448 Constant
*ConstantExpr::getDiv(Constant
*C1
, Constant
*C2
) {
449 return get(Instruction::Div
, C1
, C2
);
451 Constant
*ConstantExpr::getRem(Constant
*C1
, Constant
*C2
) {
452 return get(Instruction::Rem
, C1
, C2
);
454 Constant
*ConstantExpr::getAnd(Constant
*C1
, Constant
*C2
) {
455 return get(Instruction::And
, C1
, C2
);
457 Constant
*ConstantExpr::getOr(Constant
*C1
, Constant
*C2
) {
458 return get(Instruction::Or
, C1
, C2
);
460 Constant
*ConstantExpr::getXor(Constant
*C1
, Constant
*C2
) {
461 return get(Instruction::Xor
, C1
, C2
);
463 Constant
*ConstantExpr::getSetEQ(Constant
*C1
, Constant
*C2
) {
464 return get(Instruction::SetEQ
, C1
, C2
);
466 Constant
*ConstantExpr::getSetNE(Constant
*C1
, Constant
*C2
) {
467 return get(Instruction::SetNE
, C1
, C2
);
469 Constant
*ConstantExpr::getSetLT(Constant
*C1
, Constant
*C2
) {
470 return get(Instruction::SetLT
, C1
, C2
);
472 Constant
*ConstantExpr::getSetGT(Constant
*C1
, Constant
*C2
) {
473 return get(Instruction::SetGT
, C1
, C2
);
475 Constant
*ConstantExpr::getSetLE(Constant
*C1
, Constant
*C2
) {
476 return get(Instruction::SetLE
, C1
, C2
);
478 Constant
*ConstantExpr::getSetGE(Constant
*C1
, Constant
*C2
) {
479 return get(Instruction::SetGE
, C1
, C2
);
481 Constant
*ConstantExpr::getShl(Constant
*C1
, Constant
*C2
) {
482 return get(Instruction::Shl
, C1
, C2
);
484 Constant
*ConstantExpr::getShr(Constant
*C1
, Constant
*C2
) {
485 return get(Instruction::Shr
, C1
, C2
);
488 Constant
*ConstantExpr::getUShr(Constant
*C1
, Constant
*C2
) {
489 if (C1
->getType()->isUnsigned()) return getShr(C1
, C2
);
490 return getCast(getShr(getCast(C1
,
491 C1
->getType()->getUnsignedVersion()), C2
), C1
->getType());
494 Constant
*ConstantExpr::getSShr(Constant
*C1
, Constant
*C2
) {
495 if (C1
->getType()->isSigned()) return getShr(C1
, C2
);
496 return getCast(getShr(getCast(C1
,
497 C1
->getType()->getSignedVersion()), C2
), C1
->getType());
500 /// getWithOperandReplaced - Return a constant expression identical to this
501 /// one, but with the specified operand set to the specified value.
502 Constant
*ConstantExpr::getWithOperandReplaced(unsigned OpNo
,
503 Constant
*Op
) const {
504 assert(OpNo
< getNumOperands() && "Operand num is out of range!");
505 assert(Op
->getType() == getOperand(OpNo
)->getType() &&
506 "Replacing operand with value of different type!");
507 if (getOperand(OpNo
) == Op
)
508 return const_cast<ConstantExpr
*>(this);
510 Constant
*Op0
, *Op1
, *Op2
;
511 switch (getOpcode()) {
512 case Instruction::Cast
:
513 return ConstantExpr::getCast(Op
, getType());
514 case Instruction::Select
:
515 Op0
= (OpNo
== 0) ? Op
: getOperand(0);
516 Op1
= (OpNo
== 1) ? Op
: getOperand(1);
517 Op2
= (OpNo
== 2) ? Op
: getOperand(2);
518 return ConstantExpr::getSelect(Op0
, Op1
, Op2
);
519 case Instruction::InsertElement
:
520 Op0
= (OpNo
== 0) ? Op
: getOperand(0);
521 Op1
= (OpNo
== 1) ? Op
: getOperand(1);
522 Op2
= (OpNo
== 2) ? Op
: getOperand(2);
523 return ConstantExpr::getInsertElement(Op0
, Op1
, Op2
);
524 case Instruction::ExtractElement
:
525 Op0
= (OpNo
== 0) ? Op
: getOperand(0);
526 Op1
= (OpNo
== 1) ? Op
: getOperand(1);
527 return ConstantExpr::getExtractElement(Op0
, Op1
);
528 case Instruction::ShuffleVector
:
529 Op0
= (OpNo
== 0) ? Op
: getOperand(0);
530 Op1
= (OpNo
== 1) ? Op
: getOperand(1);
531 Op2
= (OpNo
== 2) ? Op
: getOperand(2);
532 return ConstantExpr::getShuffleVector(Op0
, Op1
, Op2
);
533 case Instruction::GetElementPtr
: {
534 std::vector
<Constant
*> Ops
;
535 for (unsigned i
= 1, e
= getNumOperands(); i
!= e
; ++i
)
536 Ops
.push_back(getOperand(i
));
538 return ConstantExpr::getGetElementPtr(Op
, Ops
);
540 return ConstantExpr::getGetElementPtr(getOperand(0), Ops
);
543 assert(getNumOperands() == 2 && "Must be binary operator?");
544 Op0
= (OpNo
== 0) ? Op
: getOperand(0);
545 Op1
= (OpNo
== 1) ? Op
: getOperand(1);
546 return ConstantExpr::get(getOpcode(), Op0
, Op1
);
550 /// getWithOperands - This returns the current constant expression with the
551 /// operands replaced with the specified values. The specified operands must
552 /// match count and type with the existing ones.
553 Constant
*ConstantExpr::
554 getWithOperands(const std::vector
<Constant
*> &Ops
) const {
555 assert(Ops
.size() == getNumOperands() && "Operand count mismatch!");
556 bool AnyChange
= false;
557 for (unsigned i
= 0, e
= Ops
.size(); i
!= e
; ++i
) {
558 assert(Ops
[i
]->getType() == getOperand(i
)->getType() &&
559 "Operand type mismatch!");
560 AnyChange
|= Ops
[i
] != getOperand(i
);
562 if (!AnyChange
) // No operands changed, return self.
563 return const_cast<ConstantExpr
*>(this);
565 switch (getOpcode()) {
566 case Instruction::Cast
:
567 return ConstantExpr::getCast(Ops
[0], getType());
568 case Instruction::Select
:
569 return ConstantExpr::getSelect(Ops
[0], Ops
[1], Ops
[2]);
570 case Instruction::InsertElement
:
571 return ConstantExpr::getInsertElement(Ops
[0], Ops
[1], Ops
[2]);
572 case Instruction::ExtractElement
:
573 return ConstantExpr::getExtractElement(Ops
[0], Ops
[1]);
574 case Instruction::ShuffleVector
:
575 return ConstantExpr::getShuffleVector(Ops
[0], Ops
[1], Ops
[2]);
576 case Instruction::GetElementPtr
: {
577 std::vector
<Constant
*> ActualOps(Ops
.begin()+1, Ops
.end());
578 return ConstantExpr::getGetElementPtr(Ops
[0], ActualOps
);
581 assert(getNumOperands() == 2 && "Must be binary operator?");
582 return ConstantExpr::get(getOpcode(), Ops
[0], Ops
[1]);
587 //===----------------------------------------------------------------------===//
588 // isValueValidForType implementations
590 bool ConstantSInt::isValueValidForType(const Type
*Ty
, int64_t Val
) {
591 switch (Ty
->getTypeID()) {
593 return false; // These can't be represented as integers!!!
595 case Type::SByteTyID
:
596 return (Val
<= INT8_MAX
&& Val
>= INT8_MIN
);
597 case Type::ShortTyID
:
598 return (Val
<= INT16_MAX
&& Val
>= INT16_MIN
);
600 return (Val
<= int(INT32_MAX
) && Val
>= int(INT32_MIN
));
602 return true; // This is the largest type...
606 bool ConstantUInt::isValueValidForType(const Type
*Ty
, uint64_t Val
) {
607 switch (Ty
->getTypeID()) {
609 return false; // These can't be represented as integers!!!
612 case Type::UByteTyID
:
613 return (Val
<= UINT8_MAX
);
614 case Type::UShortTyID
:
615 return (Val
<= UINT16_MAX
);
617 return (Val
<= UINT32_MAX
);
618 case Type::ULongTyID
:
619 return true; // This is the largest type...
623 bool ConstantFP::isValueValidForType(const Type
*Ty
, double Val
) {
624 switch (Ty
->getTypeID()) {
626 return false; // These can't be represented as floating point!
628 // TODO: Figure out how to test if a double can be cast to a float!
629 case Type::FloatTyID
:
630 case Type::DoubleTyID
:
631 return true; // This is the largest type...
635 //===----------------------------------------------------------------------===//
636 // Factory Function Implementation
638 // ConstantCreator - A class that is used to create constants by
639 // ValueMap*. This class should be partially specialized if there is
640 // something strange that needs to be done to interface to the ctor for the
644 template<class ConstantClass
, class TypeClass
, class ValType
>
645 struct VISIBILITY_HIDDEN ConstantCreator
{
646 static ConstantClass
*create(const TypeClass
*Ty
, const ValType
&V
) {
647 return new ConstantClass(Ty
, V
);
651 template<class ConstantClass
, class TypeClass
>
652 struct VISIBILITY_HIDDEN ConvertConstantType
{
653 static void convert(ConstantClass
*OldC
, const TypeClass
*NewTy
) {
654 assert(0 && "This type cannot be converted!\n");
659 template<class ValType
, class TypeClass
, class ConstantClass
,
660 bool HasLargeKey
= false /*true for arrays and structs*/ >
661 class VISIBILITY_HIDDEN ValueMap
: public AbstractTypeUser
{
663 typedef std::pair
<const Type
*, ValType
> MapKey
;
664 typedef std::map
<MapKey
, Constant
*> MapTy
;
665 typedef std::map
<Constant
*, typename
MapTy::iterator
> InverseMapTy
;
666 typedef std::map
<const Type
*, typename
MapTy::iterator
> AbstractTypeMapTy
;
668 /// Map - This is the main map from the element descriptor to the Constants.
669 /// This is the primary way we avoid creating two of the same shape
673 /// InverseMap - If "HasLargeKey" is true, this contains an inverse mapping
674 /// from the constants to their element in Map. This is important for
675 /// removal of constants from the array, which would otherwise have to scan
676 /// through the map with very large keys.
677 InverseMapTy InverseMap
;
679 /// AbstractTypeMap - Map for abstract type constants.
681 AbstractTypeMapTy AbstractTypeMap
;
683 friend void Constant::clearAllValueMaps();
685 void clear(std::vector
<Constant
*> &Constants
) {
686 for(typename
MapTy::iterator I
= Map
.begin(); I
!= Map
.end(); ++I
)
687 Constants
.push_back(I
->second
);
689 AbstractTypeMap
.clear();
694 typename
MapTy::iterator
map_end() { return Map
.end(); }
696 /// InsertOrGetItem - Return an iterator for the specified element.
697 /// If the element exists in the map, the returned iterator points to the
698 /// entry and Exists=true. If not, the iterator points to the newly
699 /// inserted entry and returns Exists=false. Newly inserted entries have
700 /// I->second == 0, and should be filled in.
701 typename
MapTy::iterator
InsertOrGetItem(std::pair
<MapKey
, Constant
*>
704 std::pair
<typename
MapTy::iterator
, bool> IP
= Map
.insert(InsertVal
);
710 typename
MapTy::iterator
FindExistingElement(ConstantClass
*CP
) {
712 typename
InverseMapTy::iterator IMI
= InverseMap
.find(CP
);
713 assert(IMI
!= InverseMap
.end() && IMI
->second
!= Map
.end() &&
714 IMI
->second
->second
== CP
&&
715 "InverseMap corrupt!");
719 typename
MapTy::iterator I
=
720 Map
.find(MapKey((TypeClass
*)CP
->getRawType(), getValType(CP
)));
721 if (I
== Map
.end() || I
->second
!= CP
) {
722 // FIXME: This should not use a linear scan. If this gets to be a
723 // performance problem, someone should look at this.
724 for (I
= Map
.begin(); I
!= Map
.end() && I
->second
!= CP
; ++I
)
731 /// getOrCreate - Return the specified constant from the map, creating it if
733 ConstantClass
*getOrCreate(const TypeClass
*Ty
, const ValType
&V
) {
734 MapKey
Lookup(Ty
, V
);
735 typename
MapTy::iterator I
= Map
.lower_bound(Lookup
);
736 if (I
!= Map
.end() && I
->first
== Lookup
)
737 return static_cast<ConstantClass
*>(I
->second
); // Is it in the map?
739 // If no preexisting value, create one now...
740 ConstantClass
*Result
=
741 ConstantCreator
<ConstantClass
,TypeClass
,ValType
>::create(Ty
, V
);
743 /// FIXME: why does this assert fail when loading 176.gcc?
744 //assert(Result->getType() == Ty && "Type specified is not correct!");
745 I
= Map
.insert(I
, std::make_pair(MapKey(Ty
, V
), Result
));
747 if (HasLargeKey
) // Remember the reverse mapping if needed.
748 InverseMap
.insert(std::make_pair(Result
, I
));
750 // If the type of the constant is abstract, make sure that an entry exists
751 // for it in the AbstractTypeMap.
752 if (Ty
->isAbstract()) {
753 typename
AbstractTypeMapTy::iterator TI
=
754 AbstractTypeMap
.lower_bound(Ty
);
756 if (TI
== AbstractTypeMap
.end() || TI
->first
!= Ty
) {
757 // Add ourselves to the ATU list of the type.
758 cast
<DerivedType
>(Ty
)->addAbstractTypeUser(this);
760 AbstractTypeMap
.insert(TI
, std::make_pair(Ty
, I
));
766 void remove(ConstantClass
*CP
) {
767 typename
MapTy::iterator I
= FindExistingElement(CP
);
768 assert(I
!= Map
.end() && "Constant not found in constant table!");
769 assert(I
->second
== CP
&& "Didn't find correct element?");
771 if (HasLargeKey
) // Remember the reverse mapping if needed.
772 InverseMap
.erase(CP
);
774 // Now that we found the entry, make sure this isn't the entry that
775 // the AbstractTypeMap points to.
776 const TypeClass
*Ty
= static_cast<const TypeClass
*>(I
->first
.first
);
777 if (Ty
->isAbstract()) {
778 assert(AbstractTypeMap
.count(Ty
) &&
779 "Abstract type not in AbstractTypeMap?");
780 typename
MapTy::iterator
&ATMEntryIt
= AbstractTypeMap
[Ty
];
781 if (ATMEntryIt
== I
) {
782 // Yes, we are removing the representative entry for this type.
783 // See if there are any other entries of the same type.
784 typename
MapTy::iterator TmpIt
= ATMEntryIt
;
786 // First check the entry before this one...
787 if (TmpIt
!= Map
.begin()) {
789 if (TmpIt
->first
.first
!= Ty
) // Not the same type, move back...
793 // If we didn't find the same type, try to move forward...
794 if (TmpIt
== ATMEntryIt
) {
796 if (TmpIt
== Map
.end() || TmpIt
->first
.first
!= Ty
)
797 --TmpIt
; // No entry afterwards with the same type
800 // If there is another entry in the map of the same abstract type,
801 // update the AbstractTypeMap entry now.
802 if (TmpIt
!= ATMEntryIt
) {
805 // Otherwise, we are removing the last instance of this type
806 // from the table. Remove from the ATM, and from user list.
807 cast
<DerivedType
>(Ty
)->removeAbstractTypeUser(this);
808 AbstractTypeMap
.erase(Ty
);
817 /// MoveConstantToNewSlot - If we are about to change C to be the element
818 /// specified by I, update our internal data structures to reflect this
820 void MoveConstantToNewSlot(ConstantClass
*C
, typename
MapTy::iterator I
) {
821 // First, remove the old location of the specified constant in the map.
822 typename
MapTy::iterator OldI
= FindExistingElement(C
);
823 assert(OldI
!= Map
.end() && "Constant not found in constant table!");
824 assert(OldI
->second
== C
&& "Didn't find correct element?");
826 // If this constant is the representative element for its abstract type,
827 // update the AbstractTypeMap so that the representative element is I.
828 if (C
->getType()->isAbstract()) {
829 typename
AbstractTypeMapTy::iterator ATI
=
830 AbstractTypeMap
.find(C
->getType());
831 assert(ATI
!= AbstractTypeMap
.end() &&
832 "Abstract type not in AbstractTypeMap?");
833 if (ATI
->second
== OldI
)
837 // Remove the old entry from the map.
840 // Update the inverse map so that we know that this constant is now
841 // located at descriptor I.
843 assert(I
->second
== C
&& "Bad inversemap entry!");
848 void refineAbstractType(const DerivedType
*OldTy
, const Type
*NewTy
) {
849 typename
AbstractTypeMapTy::iterator I
=
850 AbstractTypeMap
.find(cast
<Type
>(OldTy
));
852 assert(I
!= AbstractTypeMap
.end() &&
853 "Abstract type not in AbstractTypeMap?");
855 // Convert a constant at a time until the last one is gone. The last one
856 // leaving will remove() itself, causing the AbstractTypeMapEntry to be
857 // eliminated eventually.
859 ConvertConstantType
<ConstantClass
,
861 static_cast<ConstantClass
*>(I
->second
->second
),
862 cast
<TypeClass
>(NewTy
));
864 I
= AbstractTypeMap
.find(cast
<Type
>(OldTy
));
865 } while (I
!= AbstractTypeMap
.end());
868 // If the type became concrete without being refined to any other existing
869 // type, we just remove ourselves from the ATU list.
870 void typeBecameConcrete(const DerivedType
*AbsTy
) {
871 AbsTy
->removeAbstractTypeUser(this);
875 std::cerr
<< "Constant.cpp: ValueMap\n";
880 //---- ConstantUInt::get() and ConstantSInt::get() implementations...
882 static ValueMap
< int64_t, Type
, ConstantSInt
> SIntConstants
;
883 static ValueMap
<uint64_t, Type
, ConstantUInt
> UIntConstants
;
885 ConstantSInt
*ConstantSInt::get(const Type
*Ty
, int64_t V
) {
886 return SIntConstants
.getOrCreate(Ty
, V
);
889 ConstantUInt
*ConstantUInt::get(const Type
*Ty
, uint64_t V
) {
890 return UIntConstants
.getOrCreate(Ty
, V
);
893 ConstantInt
*ConstantInt::get(const Type
*Ty
, unsigned char V
) {
894 assert(V
<= 127 && "Can only be used with very small positive constants!");
895 if (Ty
->isSigned()) return ConstantSInt::get(Ty
, V
);
896 return ConstantUInt::get(Ty
, V
);
899 //---- ConstantFP::get() implementation...
903 struct ConstantCreator
<ConstantFP
, Type
, uint64_t> {
904 static ConstantFP
*create(const Type
*Ty
, uint64_t V
) {
905 assert(Ty
== Type::DoubleTy
);
906 return new ConstantFP(Ty
, BitsToDouble(V
));
910 struct ConstantCreator
<ConstantFP
, Type
, uint32_t> {
911 static ConstantFP
*create(const Type
*Ty
, uint32_t V
) {
912 assert(Ty
== Type::FloatTy
);
913 return new ConstantFP(Ty
, BitsToFloat(V
));
918 static ValueMap
<uint64_t, Type
, ConstantFP
> DoubleConstants
;
919 static ValueMap
<uint32_t, Type
, ConstantFP
> FloatConstants
;
921 bool ConstantFP::isNullValue() const {
922 return DoubleToBits(Val
) == 0;
925 bool ConstantFP::isExactlyValue(double V
) const {
926 return DoubleToBits(V
) == DoubleToBits(Val
);
930 ConstantFP
*ConstantFP::get(const Type
*Ty
, double V
) {
931 if (Ty
== Type::FloatTy
) {
932 // Force the value through memory to normalize it.
933 return FloatConstants
.getOrCreate(Ty
, FloatToBits(V
));
935 assert(Ty
== Type::DoubleTy
);
936 return DoubleConstants
.getOrCreate(Ty
, DoubleToBits(V
));
940 //---- ConstantAggregateZero::get() implementation...
943 // ConstantAggregateZero does not take extra "value" argument...
944 template<class ValType
>
945 struct ConstantCreator
<ConstantAggregateZero
, Type
, ValType
> {
946 static ConstantAggregateZero
*create(const Type
*Ty
, const ValType
&V
){
947 return new ConstantAggregateZero(Ty
);
952 struct ConvertConstantType
<ConstantAggregateZero
, Type
> {
953 static void convert(ConstantAggregateZero
*OldC
, const Type
*NewTy
) {
954 // Make everyone now use a constant of the new type...
955 Constant
*New
= ConstantAggregateZero::get(NewTy
);
956 assert(New
!= OldC
&& "Didn't replace constant??");
957 OldC
->uncheckedReplaceAllUsesWith(New
);
958 OldC
->destroyConstant(); // This constant is now dead, destroy it.
963 static ValueMap
<char, Type
, ConstantAggregateZero
> AggZeroConstants
;
965 static char getValType(ConstantAggregateZero
*CPZ
) { return 0; }
967 Constant
*ConstantAggregateZero::get(const Type
*Ty
) {
968 assert((isa
<StructType
>(Ty
) || isa
<ArrayType
>(Ty
) || isa
<PackedType
>(Ty
)) &&
969 "Cannot create an aggregate zero of non-aggregate type!");
970 return AggZeroConstants
.getOrCreate(Ty
, 0);
973 // destroyConstant - Remove the constant from the constant table...
975 void ConstantAggregateZero::destroyConstant() {
976 AggZeroConstants
.remove(this);
977 destroyConstantImpl();
980 //---- ConstantArray::get() implementation...
984 struct ConvertConstantType
<ConstantArray
, ArrayType
> {
985 static void convert(ConstantArray
*OldC
, const ArrayType
*NewTy
) {
986 // Make everyone now use a constant of the new type...
987 std::vector
<Constant
*> C
;
988 for (unsigned i
= 0, e
= OldC
->getNumOperands(); i
!= e
; ++i
)
989 C
.push_back(cast
<Constant
>(OldC
->getOperand(i
)));
990 Constant
*New
= ConstantArray::get(NewTy
, C
);
991 assert(New
!= OldC
&& "Didn't replace constant??");
992 OldC
->uncheckedReplaceAllUsesWith(New
);
993 OldC
->destroyConstant(); // This constant is now dead, destroy it.
998 static std::vector
<Constant
*> getValType(ConstantArray
*CA
) {
999 std::vector
<Constant
*> Elements
;
1000 Elements
.reserve(CA
->getNumOperands());
1001 for (unsigned i
= 0, e
= CA
->getNumOperands(); i
!= e
; ++i
)
1002 Elements
.push_back(cast
<Constant
>(CA
->getOperand(i
)));
1006 typedef ValueMap
<std::vector
<Constant
*>, ArrayType
,
1007 ConstantArray
, true /*largekey*/> ArrayConstantsTy
;
1008 static ArrayConstantsTy ArrayConstants
;
1010 Constant
*ConstantArray::get(const ArrayType
*Ty
,
1011 const std::vector
<Constant
*> &V
) {
1012 // If this is an all-zero array, return a ConstantAggregateZero object
1015 if (!C
->isNullValue())
1016 return ArrayConstants
.getOrCreate(Ty
, V
);
1017 for (unsigned i
= 1, e
= V
.size(); i
!= e
; ++i
)
1019 return ArrayConstants
.getOrCreate(Ty
, V
);
1021 return ConstantAggregateZero::get(Ty
);
1024 // destroyConstant - Remove the constant from the constant table...
1026 void ConstantArray::destroyConstant() {
1027 ArrayConstants
.remove(this);
1028 destroyConstantImpl();
1031 /// ConstantArray::get(const string&) - Return an array that is initialized to
1032 /// contain the specified string. If length is zero then a null terminator is
1033 /// added to the specified string so that it may be used in a natural way.
1034 /// Otherwise, the length parameter specifies how much of the string to use
1035 /// and it won't be null terminated.
1037 Constant
*ConstantArray::get(const std::string
&Str
, bool AddNull
) {
1038 std::vector
<Constant
*> ElementVals
;
1039 for (unsigned i
= 0; i
< Str
.length(); ++i
)
1040 ElementVals
.push_back(ConstantSInt::get(Type::SByteTy
, Str
[i
]));
1042 // Add a null terminator to the string...
1044 ElementVals
.push_back(ConstantSInt::get(Type::SByteTy
, 0));
1047 ArrayType
*ATy
= ArrayType::get(Type::SByteTy
, ElementVals
.size());
1048 return ConstantArray::get(ATy
, ElementVals
);
1051 /// isString - This method returns true if the array is an array of sbyte or
1052 /// ubyte, and if the elements of the array are all ConstantInt's.
1053 bool ConstantArray::isString() const {
1054 // Check the element type for sbyte or ubyte...
1055 if (getType()->getElementType() != Type::UByteTy
&&
1056 getType()->getElementType() != Type::SByteTy
)
1058 // Check the elements to make sure they are all integers, not constant
1060 for (unsigned i
= 0, e
= getNumOperands(); i
!= e
; ++i
)
1061 if (!isa
<ConstantInt
>(getOperand(i
)))
1066 // getAsString - If the sub-element type of this array is either sbyte or ubyte,
1067 // then this method converts the array to an std::string and returns it.
1068 // Otherwise, it asserts out.
1070 std::string
ConstantArray::getAsString() const {
1071 assert(isString() && "Not a string!");
1073 for (unsigned i
= 0, e
= getNumOperands(); i
!= e
; ++i
)
1074 Result
+= (char)cast
<ConstantInt
>(getOperand(i
))->getRawValue();
1079 //---- ConstantStruct::get() implementation...
1084 struct ConvertConstantType
<ConstantStruct
, StructType
> {
1085 static void convert(ConstantStruct
*OldC
, const StructType
*NewTy
) {
1086 // Make everyone now use a constant of the new type...
1087 std::vector
<Constant
*> C
;
1088 for (unsigned i
= 0, e
= OldC
->getNumOperands(); i
!= e
; ++i
)
1089 C
.push_back(cast
<Constant
>(OldC
->getOperand(i
)));
1090 Constant
*New
= ConstantStruct::get(NewTy
, C
);
1091 assert(New
!= OldC
&& "Didn't replace constant??");
1093 OldC
->uncheckedReplaceAllUsesWith(New
);
1094 OldC
->destroyConstant(); // This constant is now dead, destroy it.
1099 typedef ValueMap
<std::vector
<Constant
*>, StructType
,
1100 ConstantStruct
, true /*largekey*/> StructConstantsTy
;
1101 static StructConstantsTy StructConstants
;
1103 static std::vector
<Constant
*> getValType(ConstantStruct
*CS
) {
1104 std::vector
<Constant
*> Elements
;
1105 Elements
.reserve(CS
->getNumOperands());
1106 for (unsigned i
= 0, e
= CS
->getNumOperands(); i
!= e
; ++i
)
1107 Elements
.push_back(cast
<Constant
>(CS
->getOperand(i
)));
1111 Constant
*ConstantStruct::get(const StructType
*Ty
,
1112 const std::vector
<Constant
*> &V
) {
1113 // Create a ConstantAggregateZero value if all elements are zeros...
1114 for (unsigned i
= 0, e
= V
.size(); i
!= e
; ++i
)
1115 if (!V
[i
]->isNullValue())
1116 return StructConstants
.getOrCreate(Ty
, V
);
1118 return ConstantAggregateZero::get(Ty
);
1121 Constant
*ConstantStruct::get(const std::vector
<Constant
*> &V
) {
1122 std::vector
<const Type
*> StructEls
;
1123 StructEls
.reserve(V
.size());
1124 for (unsigned i
= 0, e
= V
.size(); i
!= e
; ++i
)
1125 StructEls
.push_back(V
[i
]->getType());
1126 return get(StructType::get(StructEls
), V
);
1129 // destroyConstant - Remove the constant from the constant table...
1131 void ConstantStruct::destroyConstant() {
1132 StructConstants
.remove(this);
1133 destroyConstantImpl();
1136 //---- ConstantPacked::get() implementation...
1140 struct ConvertConstantType
<ConstantPacked
, PackedType
> {
1141 static void convert(ConstantPacked
*OldC
, const PackedType
*NewTy
) {
1142 // Make everyone now use a constant of the new type...
1143 std::vector
<Constant
*> C
;
1144 for (unsigned i
= 0, e
= OldC
->getNumOperands(); i
!= e
; ++i
)
1145 C
.push_back(cast
<Constant
>(OldC
->getOperand(i
)));
1146 Constant
*New
= ConstantPacked::get(NewTy
, C
);
1147 assert(New
!= OldC
&& "Didn't replace constant??");
1148 OldC
->uncheckedReplaceAllUsesWith(New
);
1149 OldC
->destroyConstant(); // This constant is now dead, destroy it.
1154 static std::vector
<Constant
*> getValType(ConstantPacked
*CP
) {
1155 std::vector
<Constant
*> Elements
;
1156 Elements
.reserve(CP
->getNumOperands());
1157 for (unsigned i
= 0, e
= CP
->getNumOperands(); i
!= e
; ++i
)
1158 Elements
.push_back(CP
->getOperand(i
));
1162 static ValueMap
<std::vector
<Constant
*>, PackedType
,
1163 ConstantPacked
> PackedConstants
;
1165 Constant
*ConstantPacked::get(const PackedType
*Ty
,
1166 const std::vector
<Constant
*> &V
) {
1167 // If this is an all-zero packed, return a ConstantAggregateZero object
1170 if (!C
->isNullValue())
1171 return PackedConstants
.getOrCreate(Ty
, V
);
1172 for (unsigned i
= 1, e
= V
.size(); i
!= e
; ++i
)
1174 return PackedConstants
.getOrCreate(Ty
, V
);
1176 return ConstantAggregateZero::get(Ty
);
1179 Constant
*ConstantPacked::get(const std::vector
<Constant
*> &V
) {
1180 assert(!V
.empty() && "Cannot infer type if V is empty");
1181 return get(PackedType::get(V
.front()->getType(),V
.size()), V
);
1184 // destroyConstant - Remove the constant from the constant table...
1186 void ConstantPacked::destroyConstant() {
1187 PackedConstants
.remove(this);
1188 destroyConstantImpl();
1191 //---- ConstantPointerNull::get() implementation...
1195 // ConstantPointerNull does not take extra "value" argument...
1196 template<class ValType
>
1197 struct ConstantCreator
<ConstantPointerNull
, PointerType
, ValType
> {
1198 static ConstantPointerNull
*create(const PointerType
*Ty
, const ValType
&V
){
1199 return new ConstantPointerNull(Ty
);
1204 struct ConvertConstantType
<ConstantPointerNull
, PointerType
> {
1205 static void convert(ConstantPointerNull
*OldC
, const PointerType
*NewTy
) {
1206 // Make everyone now use a constant of the new type...
1207 Constant
*New
= ConstantPointerNull::get(NewTy
);
1208 assert(New
!= OldC
&& "Didn't replace constant??");
1209 OldC
->uncheckedReplaceAllUsesWith(New
);
1210 OldC
->destroyConstant(); // This constant is now dead, destroy it.
1215 static ValueMap
<char, PointerType
, ConstantPointerNull
> NullPtrConstants
;
1217 static char getValType(ConstantPointerNull
*) {
1222 ConstantPointerNull
*ConstantPointerNull::get(const PointerType
*Ty
) {
1223 return NullPtrConstants
.getOrCreate(Ty
, 0);
1226 // destroyConstant - Remove the constant from the constant table...
1228 void ConstantPointerNull::destroyConstant() {
1229 NullPtrConstants
.remove(this);
1230 destroyConstantImpl();
1234 //---- UndefValue::get() implementation...
1238 // UndefValue does not take extra "value" argument...
1239 template<class ValType
>
1240 struct ConstantCreator
<UndefValue
, Type
, ValType
> {
1241 static UndefValue
*create(const Type
*Ty
, const ValType
&V
) {
1242 return new UndefValue(Ty
);
1247 struct ConvertConstantType
<UndefValue
, Type
> {
1248 static void convert(UndefValue
*OldC
, const Type
*NewTy
) {
1249 // Make everyone now use a constant of the new type.
1250 Constant
*New
= UndefValue::get(NewTy
);
1251 assert(New
!= OldC
&& "Didn't replace constant??");
1252 OldC
->uncheckedReplaceAllUsesWith(New
);
1253 OldC
->destroyConstant(); // This constant is now dead, destroy it.
1258 static ValueMap
<char, Type
, UndefValue
> UndefValueConstants
;
1260 static char getValType(UndefValue
*) {
1265 UndefValue
*UndefValue::get(const Type
*Ty
) {
1266 return UndefValueConstants
.getOrCreate(Ty
, 0);
1269 // destroyConstant - Remove the constant from the constant table.
1271 void UndefValue::destroyConstant() {
1272 UndefValueConstants
.remove(this);
1273 destroyConstantImpl();
1279 //---- ConstantExpr::get() implementations...
1281 typedef std::pair
<unsigned, std::vector
<Constant
*> > ExprMapKeyType
;
1285 struct ConstantCreator
<ConstantExpr
, Type
, ExprMapKeyType
> {
1286 static ConstantExpr
*create(const Type
*Ty
, const ExprMapKeyType
&V
) {
1287 if (V
.first
== Instruction::Cast
)
1288 return new UnaryConstantExpr(Instruction::Cast
, V
.second
[0], Ty
);
1289 if ((V
.first
>= Instruction::BinaryOpsBegin
&&
1290 V
.first
< Instruction::BinaryOpsEnd
) ||
1291 V
.first
== Instruction::Shl
|| V
.first
== Instruction::Shr
)
1292 return new BinaryConstantExpr(V
.first
, V
.second
[0], V
.second
[1]);
1293 if (V
.first
== Instruction::Select
)
1294 return new SelectConstantExpr(V
.second
[0], V
.second
[1], V
.second
[2]);
1295 if (V
.first
== Instruction::ExtractElement
)
1296 return new ExtractElementConstantExpr(V
.second
[0], V
.second
[1]);
1297 if (V
.first
== Instruction::InsertElement
)
1298 return new InsertElementConstantExpr(V
.second
[0], V
.second
[1],
1300 if (V
.first
== Instruction::ShuffleVector
)
1301 return new ShuffleVectorConstantExpr(V
.second
[0], V
.second
[1],
1304 assert(V
.first
== Instruction::GetElementPtr
&& "Invalid ConstantExpr!");
1306 std::vector
<Constant
*> IdxList(V
.second
.begin()+1, V
.second
.end());
1307 return new GetElementPtrConstantExpr(V
.second
[0], IdxList
, Ty
);
1312 struct ConvertConstantType
<ConstantExpr
, Type
> {
1313 static void convert(ConstantExpr
*OldC
, const Type
*NewTy
) {
1315 switch (OldC
->getOpcode()) {
1316 case Instruction::Cast
:
1317 New
= ConstantExpr::getCast(OldC
->getOperand(0), NewTy
);
1319 case Instruction::Select
:
1320 New
= ConstantExpr::getSelectTy(NewTy
, OldC
->getOperand(0),
1321 OldC
->getOperand(1),
1322 OldC
->getOperand(2));
1324 case Instruction::Shl
:
1325 case Instruction::Shr
:
1326 New
= ConstantExpr::getShiftTy(NewTy
, OldC
->getOpcode(),
1327 OldC
->getOperand(0), OldC
->getOperand(1));
1330 assert(OldC
->getOpcode() >= Instruction::BinaryOpsBegin
&&
1331 OldC
->getOpcode() < Instruction::BinaryOpsEnd
);
1332 New
= ConstantExpr::getTy(NewTy
, OldC
->getOpcode(), OldC
->getOperand(0),
1333 OldC
->getOperand(1));
1335 case Instruction::GetElementPtr
:
1336 // Make everyone now use a constant of the new type...
1337 std::vector
<Value
*> Idx(OldC
->op_begin()+1, OldC
->op_end());
1338 New
= ConstantExpr::getGetElementPtrTy(NewTy
, OldC
->getOperand(0), Idx
);
1342 assert(New
!= OldC
&& "Didn't replace constant??");
1343 OldC
->uncheckedReplaceAllUsesWith(New
);
1344 OldC
->destroyConstant(); // This constant is now dead, destroy it.
1347 } // end namespace llvm
1350 static ExprMapKeyType
getValType(ConstantExpr
*CE
) {
1351 std::vector
<Constant
*> Operands
;
1352 Operands
.reserve(CE
->getNumOperands());
1353 for (unsigned i
= 0, e
= CE
->getNumOperands(); i
!= e
; ++i
)
1354 Operands
.push_back(cast
<Constant
>(CE
->getOperand(i
)));
1355 return ExprMapKeyType(CE
->getOpcode(), Operands
);
1358 static ValueMap
<ExprMapKeyType
, Type
, ConstantExpr
> ExprConstants
;
1360 Constant
*ConstantExpr::getCast(Constant
*C
, const Type
*Ty
) {
1361 assert(Ty
->isFirstClassType() && "Cannot cast to an aggregate type!");
1363 if (Constant
*FC
= ConstantFoldCastInstruction(C
, Ty
))
1364 return FC
; // Fold a few common cases...
1366 // Look up the constant in the table first to ensure uniqueness
1367 std::vector
<Constant
*> argVec(1, C
);
1368 ExprMapKeyType Key
= std::make_pair(Instruction::Cast
, argVec
);
1369 return ExprConstants
.getOrCreate(Ty
, Key
);
1372 Constant
*ConstantExpr::getSignExtend(Constant
*C
, const Type
*Ty
) {
1373 assert(C
->getType()->isIntegral() && Ty
->isIntegral() &&
1374 C
->getType()->getPrimitiveSize() <= Ty
->getPrimitiveSize() &&
1375 "This is an illegal sign extension!");
1376 if (C
->getType() != Type::BoolTy
) {
1377 C
= ConstantExpr::getCast(C
, C
->getType()->getSignedVersion());
1378 return ConstantExpr::getCast(C
, Ty
);
1380 if (C
== ConstantBool::True
)
1381 return ConstantIntegral::getAllOnesValue(Ty
);
1383 return ConstantIntegral::getNullValue(Ty
);
1387 Constant
*ConstantExpr::getZeroExtend(Constant
*C
, const Type
*Ty
) {
1388 assert(C
->getType()->isIntegral() && Ty
->isIntegral() &&
1389 C
->getType()->getPrimitiveSize() <= Ty
->getPrimitiveSize() &&
1390 "This is an illegal zero extension!");
1391 if (C
->getType() != Type::BoolTy
)
1392 C
= ConstantExpr::getCast(C
, C
->getType()->getUnsignedVersion());
1393 return ConstantExpr::getCast(C
, Ty
);
1396 Constant
*ConstantExpr::getSizeOf(const Type
*Ty
) {
1397 // sizeof is implemented as: (ulong) gep (Ty*)null, 1
1399 getGetElementPtr(getNullValue(PointerType::get(Ty
)),
1400 std::vector
<Constant
*>(1, ConstantInt::get(Type::UIntTy
, 1))),
1404 Constant
*ConstantExpr::getPtrPtrFromArrayPtr(Constant
*C
) {
1405 // pointer from array is implemented as: getelementptr arr ptr, 0, 0
1406 static std::vector
<Constant
*> Indices(2, ConstantUInt::get(Type::UIntTy
, 0));
1408 return ConstantExpr::getGetElementPtr(C
, Indices
);
1411 Constant
*ConstantExpr::getTy(const Type
*ReqTy
, unsigned Opcode
,
1412 Constant
*C1
, Constant
*C2
) {
1413 if (Opcode
== Instruction::Shl
|| Opcode
== Instruction::Shr
)
1414 return getShiftTy(ReqTy
, Opcode
, C1
, C2
);
1415 // Check the operands for consistency first
1416 assert((Opcode
>= Instruction::BinaryOpsBegin
&&
1417 Opcode
< Instruction::BinaryOpsEnd
) &&
1418 "Invalid opcode in binary constant expression");
1419 assert(C1
->getType() == C2
->getType() &&
1420 "Operand types in binary constant expression should match");
1422 if (ReqTy
== C1
->getType() || (Instruction::isRelational(Opcode
) &&
1423 ReqTy
== Type::BoolTy
))
1424 if (Constant
*FC
= ConstantFoldBinaryInstruction(Opcode
, C1
, C2
))
1425 return FC
; // Fold a few common cases...
1427 std::vector
<Constant
*> argVec(1, C1
); argVec
.push_back(C2
);
1428 ExprMapKeyType Key
= std::make_pair(Opcode
, argVec
);
1429 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1432 Constant
*ConstantExpr::get(unsigned Opcode
, Constant
*C1
, Constant
*C2
) {
1435 case Instruction::Add
: case Instruction::Sub
:
1436 case Instruction::Mul
: case Instruction::Div
:
1437 case Instruction::Rem
:
1438 assert(C1
->getType() == C2
->getType() && "Op types should be identical!");
1439 assert((C1
->getType()->isInteger() || C1
->getType()->isFloatingPoint() ||
1440 isa
<PackedType
>(C1
->getType())) &&
1441 "Tried to create an arithmetic operation on a non-arithmetic type!");
1443 case Instruction::And
:
1444 case Instruction::Or
:
1445 case Instruction::Xor
:
1446 assert(C1
->getType() == C2
->getType() && "Op types should be identical!");
1447 assert((C1
->getType()->isIntegral() || isa
<PackedType
>(C1
->getType())) &&
1448 "Tried to create a logical operation on a non-integral type!");
1450 case Instruction::SetLT
: case Instruction::SetGT
: case Instruction::SetLE
:
1451 case Instruction::SetGE
: case Instruction::SetEQ
: case Instruction::SetNE
:
1452 assert(C1
->getType() == C2
->getType() && "Op types should be identical!");
1454 case Instruction::Shl
:
1455 case Instruction::Shr
:
1456 assert(C2
->getType() == Type::UByteTy
&& "Shift should be by ubyte!");
1457 assert((C1
->getType()->isInteger() || isa
<PackedType
>(C1
->getType())) &&
1458 "Tried to create a shift operation on a non-integer type!");
1465 if (Instruction::isRelational(Opcode
))
1466 return getTy(Type::BoolTy
, Opcode
, C1
, C2
);
1468 return getTy(C1
->getType(), Opcode
, C1
, C2
);
1471 Constant
*ConstantExpr::getSelectTy(const Type
*ReqTy
, Constant
*C
,
1472 Constant
*V1
, Constant
*V2
) {
1473 assert(C
->getType() == Type::BoolTy
&& "Select condition must be bool!");
1474 assert(V1
->getType() == V2
->getType() && "Select value types must match!");
1475 assert(V1
->getType()->isFirstClassType() && "Cannot select aggregate type!");
1477 if (ReqTy
== V1
->getType())
1478 if (Constant
*SC
= ConstantFoldSelectInstruction(C
, V1
, V2
))
1479 return SC
; // Fold common cases
1481 std::vector
<Constant
*> argVec(3, C
);
1484 ExprMapKeyType Key
= std::make_pair(Instruction::Select
, argVec
);
1485 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1488 /// getShiftTy - Return a shift left or shift right constant expr
1489 Constant
*ConstantExpr::getShiftTy(const Type
*ReqTy
, unsigned Opcode
,
1490 Constant
*C1
, Constant
*C2
) {
1491 // Check the operands for consistency first
1492 assert((Opcode
== Instruction::Shl
||
1493 Opcode
== Instruction::Shr
) &&
1494 "Invalid opcode in binary constant expression");
1495 assert(C1
->getType()->isIntegral() && C2
->getType() == Type::UByteTy
&&
1496 "Invalid operand types for Shift constant expr!");
1498 if (Constant
*FC
= ConstantFoldBinaryInstruction(Opcode
, C1
, C2
))
1499 return FC
; // Fold a few common cases...
1501 // Look up the constant in the table first to ensure uniqueness
1502 std::vector
<Constant
*> argVec(1, C1
); argVec
.push_back(C2
);
1503 ExprMapKeyType Key
= std::make_pair(Opcode
, argVec
);
1504 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1508 Constant
*ConstantExpr::getGetElementPtrTy(const Type
*ReqTy
, Constant
*C
,
1509 const std::vector
<Value
*> &IdxList
) {
1510 assert(GetElementPtrInst::getIndexedType(C
->getType(), IdxList
, true) &&
1511 "GEP indices invalid!");
1513 if (Constant
*FC
= ConstantFoldGetElementPtr(C
, IdxList
))
1514 return FC
; // Fold a few common cases...
1516 assert(isa
<PointerType
>(C
->getType()) &&
1517 "Non-pointer type for constant GetElementPtr expression");
1518 // Look up the constant in the table first to ensure uniqueness
1519 std::vector
<Constant
*> ArgVec
;
1520 ArgVec
.reserve(IdxList
.size()+1);
1521 ArgVec
.push_back(C
);
1522 for (unsigned i
= 0, e
= IdxList
.size(); i
!= e
; ++i
)
1523 ArgVec
.push_back(cast
<Constant
>(IdxList
[i
]));
1524 const ExprMapKeyType
&Key
= std::make_pair(Instruction::GetElementPtr
,ArgVec
);
1525 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1528 Constant
*ConstantExpr::getGetElementPtr(Constant
*C
,
1529 const std::vector
<Constant
*> &IdxList
){
1530 // Get the result type of the getelementptr!
1531 std::vector
<Value
*> VIdxList(IdxList
.begin(), IdxList
.end());
1533 const Type
*Ty
= GetElementPtrInst::getIndexedType(C
->getType(), VIdxList
,
1535 assert(Ty
&& "GEP indices invalid!");
1536 return getGetElementPtrTy(PointerType::get(Ty
), C
, VIdxList
);
1539 Constant
*ConstantExpr::getGetElementPtr(Constant
*C
,
1540 const std::vector
<Value
*> &IdxList
) {
1541 // Get the result type of the getelementptr!
1542 const Type
*Ty
= GetElementPtrInst::getIndexedType(C
->getType(), IdxList
,
1544 assert(Ty
&& "GEP indices invalid!");
1545 return getGetElementPtrTy(PointerType::get(Ty
), C
, IdxList
);
1548 Constant
*ConstantExpr::getExtractElementTy(const Type
*ReqTy
, Constant
*Val
,
1550 if (Constant
*FC
= ConstantFoldExtractElementInstruction(Val
, Idx
))
1551 return FC
; // Fold a few common cases...
1552 // Look up the constant in the table first to ensure uniqueness
1553 std::vector
<Constant
*> ArgVec(1, Val
);
1554 ArgVec
.push_back(Idx
);
1555 const ExprMapKeyType
&Key
= std::make_pair(Instruction::ExtractElement
,ArgVec
);
1556 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1559 Constant
*ConstantExpr::getExtractElement(Constant
*Val
, Constant
*Idx
) {
1560 assert(isa
<PackedType
>(Val
->getType()) &&
1561 "Tried to create extractelement operation on non-packed type!");
1562 assert(Idx
->getType() == Type::UIntTy
&&
1563 "Extractelement index must be uint type!");
1564 return getExtractElementTy(cast
<PackedType
>(Val
->getType())->getElementType(),
1568 Constant
*ConstantExpr::getInsertElementTy(const Type
*ReqTy
, Constant
*Val
,
1569 Constant
*Elt
, Constant
*Idx
) {
1570 if (Constant
*FC
= ConstantFoldInsertElementInstruction(Val
, Elt
, Idx
))
1571 return FC
; // Fold a few common cases...
1572 // Look up the constant in the table first to ensure uniqueness
1573 std::vector
<Constant
*> ArgVec(1, Val
);
1574 ArgVec
.push_back(Elt
);
1575 ArgVec
.push_back(Idx
);
1576 const ExprMapKeyType
&Key
= std::make_pair(Instruction::InsertElement
,ArgVec
);
1577 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1580 Constant
*ConstantExpr::getInsertElement(Constant
*Val
, Constant
*Elt
,
1582 assert(isa
<PackedType
>(Val
->getType()) &&
1583 "Tried to create insertelement operation on non-packed type!");
1584 assert(Elt
->getType() == cast
<PackedType
>(Val
->getType())->getElementType()
1585 && "Insertelement types must match!");
1586 assert(Idx
->getType() == Type::UIntTy
&&
1587 "Insertelement index must be uint type!");
1588 return getInsertElementTy(cast
<PackedType
>(Val
->getType())->getElementType(),
1592 Constant
*ConstantExpr::getShuffleVectorTy(const Type
*ReqTy
, Constant
*V1
,
1593 Constant
*V2
, Constant
*Mask
) {
1594 if (Constant
*FC
= ConstantFoldShuffleVectorInstruction(V1
, V2
, Mask
))
1595 return FC
; // Fold a few common cases...
1596 // Look up the constant in the table first to ensure uniqueness
1597 std::vector
<Constant
*> ArgVec(1, V1
);
1598 ArgVec
.push_back(V2
);
1599 ArgVec
.push_back(Mask
);
1600 const ExprMapKeyType
&Key
= std::make_pair(Instruction::ShuffleVector
,ArgVec
);
1601 return ExprConstants
.getOrCreate(ReqTy
, Key
);
1604 Constant
*ConstantExpr::getShuffleVector(Constant
*V1
, Constant
*V2
,
1606 assert(ShuffleVectorInst::isValidOperands(V1
, V2
, Mask
) &&
1607 "Invalid shuffle vector constant expr operands!");
1608 return getShuffleVectorTy(V1
->getType(), V1
, V2
, Mask
);
1612 // destroyConstant - Remove the constant from the constant table...
1614 void ConstantExpr::destroyConstant() {
1615 ExprConstants
.remove(this);
1616 destroyConstantImpl();
1619 const char *ConstantExpr::getOpcodeName() const {
1620 return Instruction::getOpcodeName(getOpcode());
1623 //===----------------------------------------------------------------------===//
1624 // replaceUsesOfWithOnConstant implementations
1626 void ConstantArray::replaceUsesOfWithOnConstant(Value
*From
, Value
*To
,
1628 assert(isa
<Constant
>(To
) && "Cannot make Constant refer to non-constant!");
1629 Constant
*ToC
= cast
<Constant
>(To
);
1631 unsigned OperandToUpdate
= U
-OperandList
;
1632 assert(getOperand(OperandToUpdate
) == From
&& "ReplaceAllUsesWith broken!");
1634 std::pair
<ArrayConstantsTy::MapKey
, Constant
*> Lookup
;
1635 Lookup
.first
.first
= getType();
1636 Lookup
.second
= this;
1638 std::vector
<Constant
*> &Values
= Lookup
.first
.second
;
1639 Values
.reserve(getNumOperands()); // Build replacement array.
1641 // Fill values with the modified operands of the constant array. Also,
1642 // compute whether this turns into an all-zeros array.
1643 bool isAllZeros
= false;
1644 if (!ToC
->isNullValue()) {
1645 for (Use
*O
= OperandList
, *E
= OperandList
+getNumOperands(); O
!= E
; ++O
)
1646 Values
.push_back(cast
<Constant
>(O
->get()));
1649 for (Use
*O
= OperandList
, *E
= OperandList
+getNumOperands(); O
!= E
; ++O
) {
1650 Constant
*Val
= cast
<Constant
>(O
->get());
1651 Values
.push_back(Val
);
1652 if (isAllZeros
) isAllZeros
= Val
->isNullValue();
1655 Values
[OperandToUpdate
] = ToC
;
1657 Constant
*Replacement
= 0;
1659 Replacement
= ConstantAggregateZero::get(getType());
1661 // Check to see if we have this array type already.
1663 ArrayConstantsTy::MapTy::iterator I
=
1664 ArrayConstants
.InsertOrGetItem(Lookup
, Exists
);
1667 Replacement
= I
->second
;
1669 // Okay, the new shape doesn't exist in the system yet. Instead of
1670 // creating a new constant array, inserting it, replaceallusesof'ing the
1671 // old with the new, then deleting the old... just update the current one
1673 ArrayConstants
.MoveConstantToNewSlot(this, I
);
1675 // Update to the new value.
1676 setOperand(OperandToUpdate
, ToC
);
1681 // Otherwise, I do need to replace this with an existing value.
1682 assert(Replacement
!= this && "I didn't contain From!");
1684 // Everyone using this now uses the replacement.
1685 uncheckedReplaceAllUsesWith(Replacement
);
1687 // Delete the old constant!
1691 void ConstantStruct::replaceUsesOfWithOnConstant(Value
*From
, Value
*To
,
1693 assert(isa
<Constant
>(To
) && "Cannot make Constant refer to non-constant!");
1694 Constant
*ToC
= cast
<Constant
>(To
);
1696 unsigned OperandToUpdate
= U
-OperandList
;
1697 assert(getOperand(OperandToUpdate
) == From
&& "ReplaceAllUsesWith broken!");
1699 std::pair
<StructConstantsTy::MapKey
, Constant
*> Lookup
;
1700 Lookup
.first
.first
= getType();
1701 Lookup
.second
= this;
1702 std::vector
<Constant
*> &Values
= Lookup
.first
.second
;
1703 Values
.reserve(getNumOperands()); // Build replacement struct.
1706 // Fill values with the modified operands of the constant struct. Also,
1707 // compute whether this turns into an all-zeros struct.
1708 bool isAllZeros
= false;
1709 if (!ToC
->isNullValue()) {
1710 for (Use
*O
= OperandList
, *E
= OperandList
+getNumOperands(); O
!= E
; ++O
)
1711 Values
.push_back(cast
<Constant
>(O
->get()));
1714 for (Use
*O
= OperandList
, *E
= OperandList
+getNumOperands(); O
!= E
; ++O
) {
1715 Constant
*Val
= cast
<Constant
>(O
->get());
1716 Values
.push_back(Val
);
1717 if (isAllZeros
) isAllZeros
= Val
->isNullValue();
1720 Values
[OperandToUpdate
] = ToC
;
1722 Constant
*Replacement
= 0;
1724 Replacement
= ConstantAggregateZero::get(getType());
1726 // Check to see if we have this array type already.
1728 StructConstantsTy::MapTy::iterator I
=
1729 StructConstants
.InsertOrGetItem(Lookup
, Exists
);
1732 Replacement
= I
->second
;
1734 // Okay, the new shape doesn't exist in the system yet. Instead of
1735 // creating a new constant struct, inserting it, replaceallusesof'ing the
1736 // old with the new, then deleting the old... just update the current one
1738 StructConstants
.MoveConstantToNewSlot(this, I
);
1740 // Update to the new value.
1741 setOperand(OperandToUpdate
, ToC
);
1746 assert(Replacement
!= this && "I didn't contain From!");
1748 // Everyone using this now uses the replacement.
1749 uncheckedReplaceAllUsesWith(Replacement
);
1751 // Delete the old constant!
1755 void ConstantPacked::replaceUsesOfWithOnConstant(Value
*From
, Value
*To
,
1757 assert(isa
<Constant
>(To
) && "Cannot make Constant refer to non-constant!");
1759 std::vector
<Constant
*> Values
;
1760 Values
.reserve(getNumOperands()); // Build replacement array...
1761 for (unsigned i
= 0, e
= getNumOperands(); i
!= e
; ++i
) {
1762 Constant
*Val
= getOperand(i
);
1763 if (Val
== From
) Val
= cast
<Constant
>(To
);
1764 Values
.push_back(Val
);
1767 Constant
*Replacement
= ConstantPacked::get(getType(), Values
);
1768 assert(Replacement
!= this && "I didn't contain From!");
1770 // Everyone using this now uses the replacement.
1771 uncheckedReplaceAllUsesWith(Replacement
);
1773 // Delete the old constant!
1777 void ConstantExpr::replaceUsesOfWithOnConstant(Value
*From
, Value
*ToV
,
1779 assert(isa
<Constant
>(ToV
) && "Cannot make Constant refer to non-constant!");
1780 Constant
*To
= cast
<Constant
>(ToV
);
1782 Constant
*Replacement
= 0;
1783 if (getOpcode() == Instruction::GetElementPtr
) {
1784 std::vector
<Constant
*> Indices
;
1785 Constant
*Pointer
= getOperand(0);
1786 Indices
.reserve(getNumOperands()-1);
1787 if (Pointer
== From
) Pointer
= To
;
1789 for (unsigned i
= 1, e
= getNumOperands(); i
!= e
; ++i
) {
1790 Constant
*Val
= getOperand(i
);
1791 if (Val
== From
) Val
= To
;
1792 Indices
.push_back(Val
);
1794 Replacement
= ConstantExpr::getGetElementPtr(Pointer
, Indices
);
1795 } else if (getOpcode() == Instruction::Cast
) {
1796 assert(getOperand(0) == From
&& "Cast only has one use!");
1797 Replacement
= ConstantExpr::getCast(To
, getType());
1798 } else if (getOpcode() == Instruction::Select
) {
1799 Constant
*C1
= getOperand(0);
1800 Constant
*C2
= getOperand(1);
1801 Constant
*C3
= getOperand(2);
1802 if (C1
== From
) C1
= To
;
1803 if (C2
== From
) C2
= To
;
1804 if (C3
== From
) C3
= To
;
1805 Replacement
= ConstantExpr::getSelect(C1
, C2
, C3
);
1806 } else if (getOpcode() == Instruction::ExtractElement
) {
1807 Constant
*C1
= getOperand(0);
1808 Constant
*C2
= getOperand(1);
1809 if (C1
== From
) C1
= To
;
1810 if (C2
== From
) C2
= To
;
1811 Replacement
= ConstantExpr::getExtractElement(C1
, C2
);
1812 } else if (getOpcode() == Instruction::InsertElement
) {
1813 Constant
*C1
= getOperand(0);
1814 Constant
*C2
= getOperand(1);
1815 Constant
*C3
= getOperand(1);
1816 if (C1
== From
) C1
= To
;
1817 if (C2
== From
) C2
= To
;
1818 if (C3
== From
) C3
= To
;
1819 Replacement
= ConstantExpr::getInsertElement(C1
, C2
, C3
);
1820 } else if (getOpcode() == Instruction::ShuffleVector
) {
1821 Constant
*C1
= getOperand(0);
1822 Constant
*C2
= getOperand(1);
1823 Constant
*C3
= getOperand(2);
1824 if (C1
== From
) C1
= To
;
1825 if (C2
== From
) C2
= To
;
1826 if (C3
== From
) C3
= To
;
1827 Replacement
= ConstantExpr::getShuffleVector(C1
, C2
, C3
);
1828 } else if (getNumOperands() == 2) {
1829 Constant
*C1
= getOperand(0);
1830 Constant
*C2
= getOperand(1);
1831 if (C1
== From
) C1
= To
;
1832 if (C2
== From
) C2
= To
;
1833 Replacement
= ConstantExpr::get(getOpcode(), C1
, C2
);
1835 assert(0 && "Unknown ConstantExpr type!");
1839 assert(Replacement
!= this && "I didn't contain From!");
1841 // Everyone using this now uses the replacement.
1842 uncheckedReplaceAllUsesWith(Replacement
);
1844 // Delete the old constant!
1850 /// clearAllValueMaps - This method frees all internal memory used by the
1851 /// constant subsystem, which can be used in environments where this memory
1852 /// is otherwise reported as a leak.
1853 void Constant::clearAllValueMaps() {
1854 std::vector
<Constant
*> Constants
;
1856 DoubleConstants
.clear(Constants
);
1857 FloatConstants
.clear(Constants
);
1858 SIntConstants
.clear(Constants
);
1859 UIntConstants
.clear(Constants
);
1860 AggZeroConstants
.clear(Constants
);
1861 ArrayConstants
.clear(Constants
);
1862 StructConstants
.clear(Constants
);
1863 PackedConstants
.clear(Constants
);
1864 NullPtrConstants
.clear(Constants
);
1865 UndefValueConstants
.clear(Constants
);
1866 ExprConstants
.clear(Constants
);
1868 for (std::vector
<Constant
*>::iterator I
= Constants
.begin(),
1869 E
= Constants
.end(); I
!= E
; ++I
)
1870 (*I
)->dropAllReferences();
1871 for (std::vector
<Constant
*>::iterator I
= Constants
.begin(),
1872 E
= Constants
.end(); I
!= E
; ++I
)
1873 (*I
)->destroyConstantImpl();
1877 /// getStringValue - Turn an LLVM constant pointer that eventually points to a
1878 /// global into a string value. Return an empty string if we can't do it.
1879 /// Parameter Chop determines if the result is chopped at the first null
1882 std::string
Constant::getStringValue(bool Chop
, unsigned Offset
) {
1883 if (GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(this)) {
1884 if (GV
->hasInitializer() && isa
<ConstantArray
>(GV
->getInitializer())) {
1885 ConstantArray
*Init
= cast
<ConstantArray
>(GV
->getInitializer());
1886 if (Init
->isString()) {
1887 std::string Result
= Init
->getAsString();
1888 if (Offset
< Result
.size()) {
1889 // If we are pointing INTO The string, erase the beginning...
1890 Result
.erase(Result
.begin(), Result
.begin()+Offset
);
1892 // Take off the null terminator, and any string fragments after it.
1894 std::string::size_type NullPos
= Result
.find_first_of((char)0);
1895 if (NullPos
!= std::string::npos
)
1896 Result
.erase(Result
.begin()+NullPos
, Result
.end());
1902 } else if (Constant
*C
= dyn_cast
<Constant
>(this)) {
1903 if (GlobalValue
*GV
= dyn_cast
<GlobalValue
>(C
))
1904 return GV
->getStringValue(Chop
, Offset
);
1905 else if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(C
)) {
1906 if (CE
->getOpcode() == Instruction::GetElementPtr
) {
1907 // Turn a gep into the specified offset.
1908 if (CE
->getNumOperands() == 3 &&
1909 cast
<Constant
>(CE
->getOperand(1))->isNullValue() &&
1910 isa
<ConstantInt
>(CE
->getOperand(2))) {
1911 Offset
+= cast
<ConstantInt
>(CE
->getOperand(2))->getRawValue();
1912 return CE
->getOperand(0)->getStringValue(Chop
, Offset
);