blob: 5c7c288ce9e9b95a68c91ec67d9899e00e5b025d [file] [log] [blame]
Chris Lattner2b383d2e2003-05-13 21:37:02 +00001//===-- Constants.cpp - Implement Constant nodes --------------------------===//
Misha Brukmanb1c93172005-04-21 23:48:37 +00002//
John Criswell482202a2003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanb1c93172005-04-21 23:48:37 +00007//
John Criswell482202a2003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner2f7c9632001-06-06 20:29:01 +00009//
Chris Lattner3462ae32001-12-03 22:26:30 +000010// This file implements the Constant* classes...
Chris Lattner2f7c9632001-06-06 20:29:01 +000011//
12//===----------------------------------------------------------------------===//
13
Chris Lattnerca142372002-04-28 19:55:58 +000014#include "llvm/Constants.h"
Chris Lattner33e93b82007-02-27 03:05:06 +000015#include "ConstantFold.h"
Chris Lattner2f7c9632001-06-06 20:29:01 +000016#include "llvm/DerivedTypes.h"
Reid Spencer1ebe1ab2004-07-17 23:48:33 +000017#include "llvm/GlobalValue.h"
Misha Brukman63b38bd2004-07-29 17:30:56 +000018#include "llvm/Instructions.h"
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +000019#include "llvm/MDNode.h"
Chris Lattnerd7a73302001-10-13 06:57:33 +000020#include "llvm/Module.h"
Nick Lewycky49f89192009-04-04 07:22:01 +000021#include "llvm/ADT/FoldingSet.h"
Reid Spencer7c16caa2004-09-01 22:55:40 +000022#include "llvm/ADT/StringExtras.h"
Nick Lewycky49f89192009-04-04 07:22:01 +000023#include "llvm/ADT/StringMap.h"
Chris Lattner3d27be12006-08-27 12:54:02 +000024#include "llvm/Support/Compiler.h"
Bill Wendling6a462f12006-11-17 08:03:48 +000025#include "llvm/Support/Debug.h"
Torok Edwinccb29cd2009-07-11 13:10:19 +000026#include "llvm/Support/ErrorHandling.h"
Chris Lattner69edc982006-09-28 00:35:06 +000027#include "llvm/Support/ManagedStatic.h"
Bill Wendling6a462f12006-11-17 08:03:48 +000028#include "llvm/Support/MathExtras.h"
Owen Anderson0d2de8c2009-06-20 00:24:58 +000029#include "llvm/System/Mutex.h"
Owen Anderson2d7231d2009-06-17 18:40:29 +000030#include "llvm/System/RWMutex.h"
Owen Anderson7d42b952009-06-18 16:54:52 +000031#include "llvm/System/Threading.h"
Chris Lattnera80bf0b2007-02-20 06:39:57 +000032#include "llvm/ADT/DenseMap.h"
Chris Lattnerb5d70302007-02-19 20:01:23 +000033#include "llvm/ADT/SmallVector.h"
Chris Lattner2f7c9632001-06-06 20:29:01 +000034#include <algorithm>
Reid Spencer3aaaa0b2007-02-05 20:47:22 +000035#include <map>
Chris Lattner189d19f2003-11-21 20:23:48 +000036using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000037
Chris Lattner2f7c9632001-06-06 20:29:01 +000038//===----------------------------------------------------------------------===//
Chris Lattner3462ae32001-12-03 22:26:30 +000039// Constant Class
Chris Lattner2f7c9632001-06-06 20:29:01 +000040//===----------------------------------------------------------------------===//
41
Owen Andersond830eb82009-06-18 19:10:19 +000042// Becomes a no-op when multithreading is disabled.
43ManagedStatic<sys::SmartRWMutex<true> > ConstantsLock;
Owen Anderson2d7231d2009-06-17 18:40:29 +000044
Chris Lattner3462ae32001-12-03 22:26:30 +000045void Constant::destroyConstantImpl() {
46 // When a Constant is destroyed, there may be lingering
Chris Lattnerd7a73302001-10-13 06:57:33 +000047 // references to the constant by other constants in the constant pool. These
Misha Brukmanbe372b92003-08-21 22:14:26 +000048 // constants are implicitly dependent on the module that is being deleted,
Chris Lattnerd7a73302001-10-13 06:57:33 +000049 // but they don't know that. Because we only find out when the CPV is
50 // deleted, we must now notify all of our users (that should only be
Chris Lattner3462ae32001-12-03 22:26:30 +000051 // Constants) that they are, in fact, invalid now and should be deleted.
Chris Lattnerd7a73302001-10-13 06:57:33 +000052 //
53 while (!use_empty()) {
54 Value *V = use_back();
55#ifndef NDEBUG // Only in -g mode...
Chris Lattnerd9f4ac662002-07-18 00:14:50 +000056 if (!isa<Constant>(V))
Bill Wendling6a462f12006-11-17 08:03:48 +000057 DOUT << "While deleting: " << *this
58 << "\n\nUse still stuck around after Def is destroyed: "
59 << *V << "\n\n";
Chris Lattnerd7a73302001-10-13 06:57:33 +000060#endif
Vikram S. Adve4e537b22002-07-14 23:13:17 +000061 assert(isa<Constant>(V) && "References remain to Constant being destroyed");
Reid Spencer1ebe1ab2004-07-17 23:48:33 +000062 Constant *CV = cast<Constant>(V);
63 CV->destroyConstant();
Chris Lattnerd7a73302001-10-13 06:57:33 +000064
65 // The constant should remove itself from our use list...
Vikram S. Adve4e537b22002-07-14 23:13:17 +000066 assert((use_empty() || use_back() != V) && "Constant not removed!");
Chris Lattnerd7a73302001-10-13 06:57:33 +000067 }
68
69 // Value has no outstanding references it is safe to delete it now...
70 delete this;
Chris Lattner38569342001-10-01 20:11:19 +000071}
Chris Lattner2f7c9632001-06-06 20:29:01 +000072
Chris Lattner23dd1f62006-10-20 00:27:06 +000073/// canTrap - Return true if evaluation of this constant could trap. This is
74/// true for things like constant expressions that could divide by zero.
75bool Constant::canTrap() const {
76 assert(getType()->isFirstClassType() && "Cannot evaluate aggregate vals!");
77 // The only thing that could possibly trap are constant exprs.
78 const ConstantExpr *CE = dyn_cast<ConstantExpr>(this);
79 if (!CE) return false;
80
81 // ConstantExpr traps if any operands can trap.
82 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
83 if (getOperand(i)->canTrap())
84 return true;
85
86 // Otherwise, only specific operations can trap.
87 switch (CE->getOpcode()) {
88 default:
89 return false;
Reid Spencer7e80b0b2006-10-26 06:15:43 +000090 case Instruction::UDiv:
91 case Instruction::SDiv:
92 case Instruction::FDiv:
Reid Spencer7eb55b32006-11-02 01:53:59 +000093 case Instruction::URem:
94 case Instruction::SRem:
95 case Instruction::FRem:
Chris Lattner23dd1f62006-10-20 00:27:06 +000096 // Div and rem can trap if the RHS is not known to be non-zero.
97 if (!isa<ConstantInt>(getOperand(1)) || getOperand(1)->isNullValue())
98 return true;
99 return false;
100 }
101}
102
Anton Korobeynikov7437b592009-03-29 17:13:18 +0000103/// ContainsRelocations - Return true if the constant value contains relocations
104/// which cannot be resolved at compile time. Kind argument is used to filter
105/// only 'interesting' sorts of relocations.
106bool Constant::ContainsRelocations(unsigned Kind) const {
107 if (const GlobalValue* GV = dyn_cast<GlobalValue>(this)) {
108 bool isLocal = GV->hasLocalLinkage();
109 if ((Kind & Reloc::Local) && isLocal) {
110 // Global has local linkage and 'local' kind of relocations are
111 // requested
112 return true;
113 }
114
115 if ((Kind & Reloc::Global) && !isLocal) {
116 // Global has non-local linkage and 'global' kind of relocations are
117 // requested
118 return true;
119 }
Anton Korobeynikov255a3cb2009-03-30 15:28:21 +0000120
121 return false;
Anton Korobeynikov7437b592009-03-29 17:13:18 +0000122 }
123
Evan Chengf9e003b2007-03-08 00:59:12 +0000124 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
Anton Korobeynikovd5e8e932009-03-30 15:28:00 +0000125 if (getOperand(i)->ContainsRelocations(Kind))
Evan Chengf9e003b2007-03-08 00:59:12 +0000126 return true;
Anton Korobeynikov7437b592009-03-29 17:13:18 +0000127
Evan Chengf9e003b2007-03-08 00:59:12 +0000128 return false;
129}
130
Chris Lattner2105d662008-07-10 00:28:11 +0000131/// getVectorElements - This method, which is only valid on constant of vector
132/// type, returns the elements of the vector in the specified smallvector.
Chris Lattnerc5098a22008-07-14 05:10:41 +0000133/// This handles breaking down a vector undef into undef elements, etc. For
134/// constant exprs and other cases we can't handle, we return an empty vector.
Owen Anderson53a52212009-07-13 04:09:18 +0000135void Constant::getVectorElements(LLVMContext &Context,
136 SmallVectorImpl<Constant*> &Elts) const {
Chris Lattner2105d662008-07-10 00:28:11 +0000137 assert(isa<VectorType>(getType()) && "Not a vector constant!");
138
139 if (const ConstantVector *CV = dyn_cast<ConstantVector>(this)) {
140 for (unsigned i = 0, e = CV->getNumOperands(); i != e; ++i)
141 Elts.push_back(CV->getOperand(i));
142 return;
143 }
144
145 const VectorType *VT = cast<VectorType>(getType());
146 if (isa<ConstantAggregateZero>(this)) {
147 Elts.assign(VT->getNumElements(),
Owen Anderson53a52212009-07-13 04:09:18 +0000148 Context.getNullValue(VT->getElementType()));
Chris Lattner2105d662008-07-10 00:28:11 +0000149 return;
150 }
151
Chris Lattnerc5098a22008-07-14 05:10:41 +0000152 if (isa<UndefValue>(this)) {
Owen Anderson53a52212009-07-13 04:09:18 +0000153 Elts.assign(VT->getNumElements(), Context.getUndef(VT->getElementType()));
Chris Lattnerc5098a22008-07-14 05:10:41 +0000154 return;
155 }
156
157 // Unknown type, must be constant expr etc.
Chris Lattner2105d662008-07-10 00:28:11 +0000158}
159
160
161
Chris Lattner2f7c9632001-06-06 20:29:01 +0000162//===----------------------------------------------------------------------===//
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000163// ConstantInt
Chris Lattner2f7c9632001-06-06 20:29:01 +0000164//===----------------------------------------------------------------------===//
165
Reid Spencerb31bffe2007-02-26 23:54:03 +0000166ConstantInt::ConstantInt(const IntegerType *Ty, const APInt& V)
Chris Lattner5db2f472007-02-20 05:55:46 +0000167 : Constant(Ty, ConstantIntVal, 0, 0), Val(V) {
Reid Spencerb31bffe2007-02-26 23:54:03 +0000168 assert(V.getBitWidth() == Ty->getBitWidth() && "Invalid constant for type");
Chris Lattner2f7c9632001-06-06 20:29:01 +0000169}
170
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000171ConstantInt *ConstantInt::TheTrueVal = 0;
172ConstantInt *ConstantInt::TheFalseVal = 0;
173
174namespace llvm {
175 void CleanupTrueFalse(void *) {
176 ConstantInt::ResetTrueFalse();
177 }
178}
179
180static ManagedCleanup<llvm::CleanupTrueFalse> TrueFalseCleanup;
181
182ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) {
183 assert(TheTrueVal == 0 && TheFalseVal == 0);
Owen Andersonb6b25302009-07-14 23:09:55 +0000184 TheTrueVal = getGlobalContext().getConstantInt(Type::Int1Ty, 1);
185 TheFalseVal = getGlobalContext().getConstantInt(Type::Int1Ty, 0);
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000186
187 // Ensure that llvm_shutdown nulls out TheTrueVal/TheFalseVal.
188 TrueFalseCleanup.Register();
189
190 return WhichOne ? TheTrueVal : TheFalseVal;
191}
192
193
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000194namespace {
Reid Spencerb31bffe2007-02-26 23:54:03 +0000195 struct DenseMapAPIntKeyInfo {
196 struct KeyTy {
197 APInt val;
198 const Type* type;
199 KeyTy(const APInt& V, const Type* Ty) : val(V), type(Ty) {}
200 KeyTy(const KeyTy& that) : val(that.val), type(that.type) {}
201 bool operator==(const KeyTy& that) const {
202 return type == that.type && this->val == that.val;
203 }
204 bool operator!=(const KeyTy& that) const {
205 return !this->operator==(that);
206 }
207 };
208 static inline KeyTy getEmptyKey() { return KeyTy(APInt(1,0), 0); }
209 static inline KeyTy getTombstoneKey() { return KeyTy(APInt(1,1), 0); }
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000210 static unsigned getHashValue(const KeyTy &Key) {
Chris Lattner0625bd62007-09-17 18:34:04 +0000211 return DenseMapInfo<void*>::getHashValue(Key.type) ^
Reid Spencerb31bffe2007-02-26 23:54:03 +0000212 Key.val.getHashValue();
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000213 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000214 static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
215 return LHS == RHS;
216 }
Dale Johannesena719a602007-08-24 00:56:33 +0000217 static bool isPod() { return false; }
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000218 };
219}
220
221
Reid Spencerb31bffe2007-02-26 23:54:03 +0000222typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
223 DenseMapAPIntKeyInfo> IntMapTy;
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000224static ManagedStatic<IntMapTy> IntConstants;
225
Reid Spencerd1bbfa52007-03-01 19:30:34 +0000226// Get a ConstantInt from an APInt. Note that the value stored in the DenseMap
Dan Gohmanb3efe032008-02-07 02:30:40 +0000227// as the key, is a DenseMapAPIntKeyInfo::KeyTy which has provided the
Reid Spencerb31bffe2007-02-26 23:54:03 +0000228// operator== and operator!= to ensure that the DenseMap doesn't attempt to
229// compare APInt's of different widths, which would violate an APInt class
230// invariant which generates an assertion.
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000231ConstantInt *ConstantInt::get(const APInt& V) {
Reid Spencerd1bbfa52007-03-01 19:30:34 +0000232 // Get the corresponding integer type for the bit width of the value.
233 const IntegerType *ITy = IntegerType::get(V.getBitWidth());
Reid Spencerb31bffe2007-02-26 23:54:03 +0000234 // get an existing value or the insertion position
Reid Spencerd1bbfa52007-03-01 19:30:34 +0000235 DenseMapAPIntKeyInfo::KeyTy Key(V, ITy);
Owen Anderson2d7231d2009-06-17 18:40:29 +0000236
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000237 ConstantsLock->reader_acquire();
Owen Andersond830eb82009-06-18 19:10:19 +0000238 ConstantInt *&Slot = (*IntConstants)[Key];
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000239 ConstantsLock->reader_release();
Owen Anderson2d7231d2009-06-17 18:40:29 +0000240
Owen Andersond830eb82009-06-18 19:10:19 +0000241 if (!Slot) {
Owen Anderson5c96ef72009-07-07 18:33:04 +0000242 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000243 ConstantInt *&NewSlot = (*IntConstants)[Key];
244 if (!Slot) {
245 NewSlot = new ConstantInt(ITy, V);
Owen Anderson2d7231d2009-06-17 18:40:29 +0000246 }
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000247
248 return NewSlot;
249 } else {
250 return Slot;
Owen Anderson2d7231d2009-06-17 18:40:29 +0000251 }
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000252}
253
254//===----------------------------------------------------------------------===//
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000255// ConstantFP
Chris Lattnera80bf0b2007-02-20 06:39:57 +0000256//===----------------------------------------------------------------------===//
257
Rafael Espindolaf5d53d42009-07-15 17:40:42 +0000258static const fltSemantics *TypeToFloatSemantics(const Type *Ty) {
259 if (Ty == Type::FloatTy)
260 return &APFloat::IEEEsingle;
261 if (Ty == Type::DoubleTy)
262 return &APFloat::IEEEdouble;
263 if (Ty == Type::X86_FP80Ty)
264 return &APFloat::x87DoubleExtended;
265 else if (Ty == Type::FP128Ty)
266 return &APFloat::IEEEquad;
267
268 assert(Ty == Type::PPC_FP128Ty && "Unknown FP format");
269 return &APFloat::PPCDoubleDouble;
270}
271
Dale Johannesend246b2c2007-08-30 00:23:21 +0000272ConstantFP::ConstantFP(const Type *Ty, const APFloat& V)
273 : Constant(Ty, ConstantFPVal, 0, 0), Val(V) {
Chris Lattner98bd9392008-04-09 06:38:30 +0000274 assert(&V.getSemantics() == TypeToFloatSemantics(Ty) &&
275 "FP type Mismatch");
Chris Lattner2f7c9632001-06-06 20:29:01 +0000276}
277
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000278bool ConstantFP::isNullValue() const {
Dale Johannesena719a602007-08-24 00:56:33 +0000279 return Val.isZero() && !Val.isNegative();
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000280}
281
Dale Johannesend246b2c2007-08-30 00:23:21 +0000282bool ConstantFP::isExactlyValue(const APFloat& V) const {
283 return Val.bitwiseIsEqual(V);
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000284}
285
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000286namespace {
Dale Johannesena719a602007-08-24 00:56:33 +0000287 struct DenseMapAPFloatKeyInfo {
Dale Johannesenbdea32d2007-08-24 22:09:56 +0000288 struct KeyTy {
289 APFloat val;
290 KeyTy(const APFloat& V) : val(V){}
291 KeyTy(const KeyTy& that) : val(that.val) {}
292 bool operator==(const KeyTy& that) const {
293 return this->val.bitwiseIsEqual(that.val);
294 }
295 bool operator!=(const KeyTy& that) const {
296 return !this->operator==(that);
297 }
298 };
299 static inline KeyTy getEmptyKey() {
300 return KeyTy(APFloat(APFloat::Bogus,1));
Reid Spencerb31bffe2007-02-26 23:54:03 +0000301 }
Dale Johannesenbdea32d2007-08-24 22:09:56 +0000302 static inline KeyTy getTombstoneKey() {
303 return KeyTy(APFloat(APFloat::Bogus,2));
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000304 }
Dale Johannesenbdea32d2007-08-24 22:09:56 +0000305 static unsigned getHashValue(const KeyTy &Key) {
306 return Key.val.getHashValue();
Dale Johannesena719a602007-08-24 00:56:33 +0000307 }
Chris Lattner0625bd62007-09-17 18:34:04 +0000308 static bool isEqual(const KeyTy &LHS, const KeyTy &RHS) {
309 return LHS == RHS;
310 }
Dale Johannesena719a602007-08-24 00:56:33 +0000311 static bool isPod() { return false; }
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000312 };
313}
314
315//---- ConstantFP::get() implementation...
316//
Dale Johannesenbdea32d2007-08-24 22:09:56 +0000317typedef DenseMap<DenseMapAPFloatKeyInfo::KeyTy, ConstantFP*,
Dale Johannesena719a602007-08-24 00:56:33 +0000318 DenseMapAPFloatKeyInfo> FPMapTy;
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000319
Dale Johannesena719a602007-08-24 00:56:33 +0000320static ManagedStatic<FPMapTy> FPConstants;
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000321
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000322ConstantFP *ConstantFP::get(const APFloat &V) {
Dale Johannesend246b2c2007-08-30 00:23:21 +0000323 DenseMapAPFloatKeyInfo::KeyTy Key(V);
Chris Lattnerb5b3e312008-04-09 00:45:01 +0000324
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000325 ConstantsLock->reader_acquire();
Owen Andersond830eb82009-06-18 19:10:19 +0000326 ConstantFP *&Slot = (*FPConstants)[Key];
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000327 ConstantsLock->reader_release();
Owen Anderson2d7231d2009-06-17 18:40:29 +0000328
Owen Andersond830eb82009-06-18 19:10:19 +0000329 if (!Slot) {
Owen Anderson5c96ef72009-07-07 18:33:04 +0000330 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000331 ConstantFP *&NewSlot = (*FPConstants)[Key];
332 if (!NewSlot) {
Owen Andersond830eb82009-06-18 19:10:19 +0000333 const Type *Ty;
334 if (&V.getSemantics() == &APFloat::IEEEsingle)
335 Ty = Type::FloatTy;
336 else if (&V.getSemantics() == &APFloat::IEEEdouble)
337 Ty = Type::DoubleTy;
338 else if (&V.getSemantics() == &APFloat::x87DoubleExtended)
339 Ty = Type::X86_FP80Ty;
340 else if (&V.getSemantics() == &APFloat::IEEEquad)
341 Ty = Type::FP128Ty;
342 else {
343 assert(&V.getSemantics() == &APFloat::PPCDoubleDouble &&
344 "Unknown FP format");
345 Ty = Type::PPC_FP128Ty;
Owen Anderson2d7231d2009-06-17 18:40:29 +0000346 }
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000347 NewSlot = new ConstantFP(Ty, V);
Owen Anderson2d7231d2009-06-17 18:40:29 +0000348 }
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000349
350 return NewSlot;
Chris Lattnerb5b3e312008-04-09 00:45:01 +0000351 }
Owen Andersond830eb82009-06-18 19:10:19 +0000352
353 return Slot;
Dale Johannesend246b2c2007-08-30 00:23:21 +0000354}
Chris Lattnerc6ee77d2007-02-20 07:17:17 +0000355
356//===----------------------------------------------------------------------===//
357// ConstantXXX Classes
358//===----------------------------------------------------------------------===//
359
360
Chris Lattner3462ae32001-12-03 22:26:30 +0000361ConstantArray::ConstantArray(const ArrayType *T,
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000362 const std::vector<Constant*> &V)
Gabor Greiff6caff662008-05-10 08:32:32 +0000363 : Constant(T, ConstantArrayVal,
364 OperandTraits<ConstantArray>::op_end(this) - V.size(),
365 V.size()) {
Alkis Evlogimenos0507ffe2004-09-15 02:32:15 +0000366 assert(V.size() == T->getNumElements() &&
367 "Invalid initializer vector for constant array");
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000368 Use *OL = OperandList;
Chris Lattner0144fad2005-10-03 21:56:24 +0000369 for (std::vector<Constant*>::const_iterator I = V.begin(), E = V.end();
370 I != E; ++I, ++OL) {
Chris Lattner20a24452005-10-07 05:23:36 +0000371 Constant *C = *I;
372 assert((C->getType() == T->getElementType() ||
Alkis Evlogimenoscb031d92004-09-10 04:16:59 +0000373 (T->isAbstract() &&
Chris Lattner20a24452005-10-07 05:23:36 +0000374 C->getType()->getTypeID() == T->getElementType()->getTypeID())) &&
Alkis Evlogimenoscb031d92004-09-10 04:16:59 +0000375 "Initializer for array element doesn't match array element type!");
Gabor Greif2d3024d2008-05-26 21:33:52 +0000376 *OL = C;
Chris Lattner2f7c9632001-06-06 20:29:01 +0000377 }
378}
379
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000380
Chris Lattner3462ae32001-12-03 22:26:30 +0000381ConstantStruct::ConstantStruct(const StructType *T,
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000382 const std::vector<Constant*> &V)
Gabor Greiff6caff662008-05-10 08:32:32 +0000383 : Constant(T, ConstantStructVal,
384 OperandTraits<ConstantStruct>::op_end(this) - V.size(),
385 V.size()) {
Chris Lattnerac6db752004-02-09 04:37:31 +0000386 assert(V.size() == T->getNumElements() &&
Vikram S. Adve4e537b22002-07-14 23:13:17 +0000387 "Invalid initializer vector for constant structure");
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000388 Use *OL = OperandList;
Chris Lattner0144fad2005-10-03 21:56:24 +0000389 for (std::vector<Constant*>::const_iterator I = V.begin(), E = V.end();
390 I != E; ++I, ++OL) {
Chris Lattner20a24452005-10-07 05:23:36 +0000391 Constant *C = *I;
392 assert((C->getType() == T->getElementType(I-V.begin()) ||
Chris Lattner0144fad2005-10-03 21:56:24 +0000393 ((T->getElementType(I-V.begin())->isAbstract() ||
Chris Lattner20a24452005-10-07 05:23:36 +0000394 C->getType()->isAbstract()) &&
Chris Lattner0144fad2005-10-03 21:56:24 +0000395 T->getElementType(I-V.begin())->getTypeID() ==
Chris Lattner20a24452005-10-07 05:23:36 +0000396 C->getType()->getTypeID())) &&
Chris Lattner93c8f142003-06-02 17:42:47 +0000397 "Initializer for struct element doesn't match struct element type!");
Gabor Greif2d3024d2008-05-26 21:33:52 +0000398 *OL = C;
Chris Lattner2f7c9632001-06-06 20:29:01 +0000399 }
400}
401
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000402
Reid Spencerd84d35b2007-02-15 02:26:10 +0000403ConstantVector::ConstantVector(const VectorType *T,
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000404 const std::vector<Constant*> &V)
Gabor Greiff6caff662008-05-10 08:32:32 +0000405 : Constant(T, ConstantVectorVal,
406 OperandTraits<ConstantVector>::op_end(this) - V.size(),
407 V.size()) {
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000408 Use *OL = OperandList;
Chris Lattner0144fad2005-10-03 21:56:24 +0000409 for (std::vector<Constant*>::const_iterator I = V.begin(), E = V.end();
410 I != E; ++I, ++OL) {
Chris Lattner20a24452005-10-07 05:23:36 +0000411 Constant *C = *I;
412 assert((C->getType() == T->getElementType() ||
Alkis Evlogimenoscb031d92004-09-10 04:16:59 +0000413 (T->isAbstract() &&
Chris Lattner20a24452005-10-07 05:23:36 +0000414 C->getType()->getTypeID() == T->getElementType()->getTypeID())) &&
Dan Gohman30978072007-05-24 14:36:04 +0000415 "Initializer for vector element doesn't match vector element type!");
Gabor Greif2d3024d2008-05-26 21:33:52 +0000416 *OL = C;
Brian Gaeke02209042004-08-20 06:00:58 +0000417 }
418}
419
Vikram S. Adve4e537b22002-07-14 23:13:17 +0000420
Gabor Greiff6caff662008-05-10 08:32:32 +0000421namespace llvm {
Gordon Henriksen14a55692007-12-10 02:14:30 +0000422// We declare several classes private to this file, so use an anonymous
423// namespace
424namespace {
Reid Spencer10fbf0e2006-12-03 05:48:19 +0000425
Gordon Henriksen14a55692007-12-10 02:14:30 +0000426/// UnaryConstantExpr - This class is private to Constants.cpp, and is used
427/// behind the scenes to implement unary constant exprs.
428class VISIBILITY_HIDDEN UnaryConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000429 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Gordon Henriksen14a55692007-12-10 02:14:30 +0000430public:
Gabor Greife9ecc682008-04-06 20:25:17 +0000431 // allocate space for exactly one operand
432 void *operator new(size_t s) {
433 return User::operator new(s, 1);
434 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000435 UnaryConstantExpr(unsigned Opcode, Constant *C, const Type *Ty)
Gabor Greiff6caff662008-05-10 08:32:32 +0000436 : ConstantExpr(Ty, Opcode, &Op<0>(), 1) {
437 Op<0>() = C;
438 }
439 /// Transparently provide more efficient getOperand methods.
440 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000441};
Reid Spencer10fbf0e2006-12-03 05:48:19 +0000442
Gordon Henriksen14a55692007-12-10 02:14:30 +0000443/// BinaryConstantExpr - This class is private to Constants.cpp, and is used
444/// behind the scenes to implement binary constant exprs.
445class VISIBILITY_HIDDEN BinaryConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000446 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Gordon Henriksen14a55692007-12-10 02:14:30 +0000447public:
Gabor Greife9ecc682008-04-06 20:25:17 +0000448 // allocate space for exactly two operands
449 void *operator new(size_t s) {
450 return User::operator new(s, 2);
451 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000452 BinaryConstantExpr(unsigned Opcode, Constant *C1, Constant *C2)
Gabor Greiff6caff662008-05-10 08:32:32 +0000453 : ConstantExpr(C1->getType(), Opcode, &Op<0>(), 2) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000454 Op<0>() = C1;
455 Op<1>() = C2;
Gordon Henriksen14a55692007-12-10 02:14:30 +0000456 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000457 /// Transparently provide more efficient getOperand methods.
458 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000459};
Vikram S. Adve4e537b22002-07-14 23:13:17 +0000460
Gordon Henriksen14a55692007-12-10 02:14:30 +0000461/// SelectConstantExpr - This class is private to Constants.cpp, and is used
462/// behind the scenes to implement select constant exprs.
463class VISIBILITY_HIDDEN SelectConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000464 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Gordon Henriksen14a55692007-12-10 02:14:30 +0000465public:
Gabor Greife9ecc682008-04-06 20:25:17 +0000466 // allocate space for exactly three operands
467 void *operator new(size_t s) {
468 return User::operator new(s, 3);
469 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000470 SelectConstantExpr(Constant *C1, Constant *C2, Constant *C3)
Gabor Greiff6caff662008-05-10 08:32:32 +0000471 : ConstantExpr(C2->getType(), Instruction::Select, &Op<0>(), 3) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000472 Op<0>() = C1;
473 Op<1>() = C2;
474 Op<2>() = C3;
Gordon Henriksen14a55692007-12-10 02:14:30 +0000475 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000476 /// Transparently provide more efficient getOperand methods.
477 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000478};
Chris Lattnerd0df99c2005-01-29 00:34:39 +0000479
Gordon Henriksen14a55692007-12-10 02:14:30 +0000480/// ExtractElementConstantExpr - This class is private to
481/// Constants.cpp, and is used behind the scenes to implement
482/// extractelement constant exprs.
483class VISIBILITY_HIDDEN ExtractElementConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000484 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Gordon Henriksen14a55692007-12-10 02:14:30 +0000485public:
Gabor Greife9ecc682008-04-06 20:25:17 +0000486 // allocate space for exactly two operands
487 void *operator new(size_t s) {
488 return User::operator new(s, 2);
489 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000490 ExtractElementConstantExpr(Constant *C1, Constant *C2)
491 : ConstantExpr(cast<VectorType>(C1->getType())->getElementType(),
Gabor Greiff6caff662008-05-10 08:32:32 +0000492 Instruction::ExtractElement, &Op<0>(), 2) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000493 Op<0>() = C1;
494 Op<1>() = C2;
Gordon Henriksen14a55692007-12-10 02:14:30 +0000495 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000496 /// Transparently provide more efficient getOperand methods.
497 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000498};
Robert Bocchino23004482006-01-10 19:05:34 +0000499
Gordon Henriksen14a55692007-12-10 02:14:30 +0000500/// InsertElementConstantExpr - This class is private to
501/// Constants.cpp, and is used behind the scenes to implement
502/// insertelement constant exprs.
503class VISIBILITY_HIDDEN InsertElementConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000504 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Gordon Henriksen14a55692007-12-10 02:14:30 +0000505public:
Gabor Greife9ecc682008-04-06 20:25:17 +0000506 // allocate space for exactly three operands
507 void *operator new(size_t s) {
508 return User::operator new(s, 3);
509 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000510 InsertElementConstantExpr(Constant *C1, Constant *C2, Constant *C3)
511 : ConstantExpr(C1->getType(), Instruction::InsertElement,
Gabor Greiff6caff662008-05-10 08:32:32 +0000512 &Op<0>(), 3) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000513 Op<0>() = C1;
514 Op<1>() = C2;
515 Op<2>() = C3;
Gordon Henriksen14a55692007-12-10 02:14:30 +0000516 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000517 /// Transparently provide more efficient getOperand methods.
518 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000519};
Robert Bocchinoca27f032006-01-17 20:07:22 +0000520
Gordon Henriksen14a55692007-12-10 02:14:30 +0000521/// ShuffleVectorConstantExpr - This class is private to
522/// Constants.cpp, and is used behind the scenes to implement
523/// shufflevector constant exprs.
524class VISIBILITY_HIDDEN ShuffleVectorConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000525 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Gordon Henriksen14a55692007-12-10 02:14:30 +0000526public:
Gabor Greife9ecc682008-04-06 20:25:17 +0000527 // allocate space for exactly three operands
528 void *operator new(size_t s) {
529 return User::operator new(s, 3);
530 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000531 ShuffleVectorConstantExpr(Constant *C1, Constant *C2, Constant *C3)
Nate Begeman94aa38d2009-02-12 21:28:33 +0000532 : ConstantExpr(VectorType::get(
533 cast<VectorType>(C1->getType())->getElementType(),
534 cast<VectorType>(C3->getType())->getNumElements()),
535 Instruction::ShuffleVector,
Gabor Greiff6caff662008-05-10 08:32:32 +0000536 &Op<0>(), 3) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000537 Op<0>() = C1;
538 Op<1>() = C2;
539 Op<2>() = C3;
Gordon Henriksen14a55692007-12-10 02:14:30 +0000540 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000541 /// Transparently provide more efficient getOperand methods.
542 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000543};
544
Dan Gohman12fce772008-05-15 19:50:34 +0000545/// ExtractValueConstantExpr - This class is private to
546/// Constants.cpp, and is used behind the scenes to implement
547/// extractvalue constant exprs.
548class VISIBILITY_HIDDEN ExtractValueConstantExpr : public ConstantExpr {
Dan Gohman1ecaf452008-05-31 00:58:22 +0000549 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Dan Gohman12fce772008-05-15 19:50:34 +0000550public:
Dan Gohman1ecaf452008-05-31 00:58:22 +0000551 // allocate space for exactly one operand
552 void *operator new(size_t s) {
553 return User::operator new(s, 1);
Dan Gohman12fce772008-05-15 19:50:34 +0000554 }
Dan Gohman1ecaf452008-05-31 00:58:22 +0000555 ExtractValueConstantExpr(Constant *Agg,
556 const SmallVector<unsigned, 4> &IdxList,
557 const Type *DestTy)
558 : ConstantExpr(DestTy, Instruction::ExtractValue, &Op<0>(), 1),
559 Indices(IdxList) {
560 Op<0>() = Agg;
561 }
562
Dan Gohman7bb04502008-05-31 19:09:08 +0000563 /// Indices - These identify which value to extract.
Dan Gohman1ecaf452008-05-31 00:58:22 +0000564 const SmallVector<unsigned, 4> Indices;
565
Dan Gohman12fce772008-05-15 19:50:34 +0000566 /// Transparently provide more efficient getOperand methods.
567 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
568};
569
570/// InsertValueConstantExpr - This class is private to
571/// Constants.cpp, and is used behind the scenes to implement
572/// insertvalue constant exprs.
573class VISIBILITY_HIDDEN InsertValueConstantExpr : public ConstantExpr {
Dan Gohman1ecaf452008-05-31 00:58:22 +0000574 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Dan Gohman12fce772008-05-15 19:50:34 +0000575public:
Dan Gohman1ecaf452008-05-31 00:58:22 +0000576 // allocate space for exactly one operand
577 void *operator new(size_t s) {
578 return User::operator new(s, 2);
Dan Gohman12fce772008-05-15 19:50:34 +0000579 }
Dan Gohman1ecaf452008-05-31 00:58:22 +0000580 InsertValueConstantExpr(Constant *Agg, Constant *Val,
581 const SmallVector<unsigned, 4> &IdxList,
582 const Type *DestTy)
583 : ConstantExpr(DestTy, Instruction::InsertValue, &Op<0>(), 2),
584 Indices(IdxList) {
585 Op<0>() = Agg;
586 Op<1>() = Val;
587 }
588
Dan Gohman7bb04502008-05-31 19:09:08 +0000589 /// Indices - These identify the position for the insertion.
Dan Gohman1ecaf452008-05-31 00:58:22 +0000590 const SmallVector<unsigned, 4> Indices;
591
Dan Gohman12fce772008-05-15 19:50:34 +0000592 /// Transparently provide more efficient getOperand methods.
593 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
594};
595
596
Gordon Henriksen14a55692007-12-10 02:14:30 +0000597/// GetElementPtrConstantExpr - This class is private to Constants.cpp, and is
598/// used behind the scenes to implement getelementpr constant exprs.
Gabor Greife9ecc682008-04-06 20:25:17 +0000599class VISIBILITY_HIDDEN GetElementPtrConstantExpr : public ConstantExpr {
Gordon Henriksen14a55692007-12-10 02:14:30 +0000600 GetElementPtrConstantExpr(Constant *C, const std::vector<Constant*> &IdxList,
Gabor Greiff6caff662008-05-10 08:32:32 +0000601 const Type *DestTy);
Gabor Greife9ecc682008-04-06 20:25:17 +0000602public:
Gabor Greif697e94c2008-05-15 10:04:30 +0000603 static GetElementPtrConstantExpr *Create(Constant *C,
604 const std::vector<Constant*>&IdxList,
Gabor Greiff6caff662008-05-10 08:32:32 +0000605 const Type *DestTy) {
Gabor Greif697e94c2008-05-15 10:04:30 +0000606 return new(IdxList.size() + 1)
607 GetElementPtrConstantExpr(C, IdxList, DestTy);
Gabor Greife9ecc682008-04-06 20:25:17 +0000608 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000609 /// Transparently provide more efficient getOperand methods.
610 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000611};
612
613// CompareConstantExpr - This class is private to Constants.cpp, and is used
614// behind the scenes to implement ICmp and FCmp constant expressions. This is
615// needed in order to store the predicate value for these instructions.
616struct VISIBILITY_HIDDEN CompareConstantExpr : public ConstantExpr {
Gabor Greife9ecc682008-04-06 20:25:17 +0000617 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
618 // allocate space for exactly two operands
619 void *operator new(size_t s) {
620 return User::operator new(s, 2);
621 }
Gordon Henriksen14a55692007-12-10 02:14:30 +0000622 unsigned short predicate;
Nate Begemand2195702008-05-12 19:01:56 +0000623 CompareConstantExpr(const Type *ty, Instruction::OtherOps opc,
624 unsigned short pred, Constant* LHS, Constant* RHS)
625 : ConstantExpr(ty, opc, &Op<0>(), 2), predicate(pred) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000626 Op<0>() = LHS;
627 Op<1>() = RHS;
Gordon Henriksen14a55692007-12-10 02:14:30 +0000628 }
Gabor Greiff6caff662008-05-10 08:32:32 +0000629 /// Transparently provide more efficient getOperand methods.
630 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Gordon Henriksen14a55692007-12-10 02:14:30 +0000631};
632
633} // end anonymous namespace
634
Gabor Greiff6caff662008-05-10 08:32:32 +0000635template <>
636struct OperandTraits<UnaryConstantExpr> : FixedNumOperandTraits<1> {
637};
638DEFINE_TRANSPARENT_OPERAND_ACCESSORS(UnaryConstantExpr, Value)
639
640template <>
641struct OperandTraits<BinaryConstantExpr> : FixedNumOperandTraits<2> {
642};
643DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BinaryConstantExpr, Value)
644
645template <>
646struct OperandTraits<SelectConstantExpr> : FixedNumOperandTraits<3> {
647};
648DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SelectConstantExpr, Value)
649
650template <>
651struct OperandTraits<ExtractElementConstantExpr> : FixedNumOperandTraits<2> {
652};
653DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractElementConstantExpr, Value)
654
655template <>
656struct OperandTraits<InsertElementConstantExpr> : FixedNumOperandTraits<3> {
657};
658DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertElementConstantExpr, Value)
659
660template <>
661struct OperandTraits<ShuffleVectorConstantExpr> : FixedNumOperandTraits<3> {
662};
663DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ShuffleVectorConstantExpr, Value)
664
Dan Gohman12fce772008-05-15 19:50:34 +0000665template <>
Dan Gohman1ecaf452008-05-31 00:58:22 +0000666struct OperandTraits<ExtractValueConstantExpr> : FixedNumOperandTraits<1> {
Dan Gohman12fce772008-05-15 19:50:34 +0000667};
Dan Gohman12fce772008-05-15 19:50:34 +0000668DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractValueConstantExpr, Value)
669
670template <>
Dan Gohman1ecaf452008-05-31 00:58:22 +0000671struct OperandTraits<InsertValueConstantExpr> : FixedNumOperandTraits<2> {
Dan Gohman12fce772008-05-15 19:50:34 +0000672};
Dan Gohman12fce772008-05-15 19:50:34 +0000673DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueConstantExpr, Value)
674
Gabor Greiff6caff662008-05-10 08:32:32 +0000675template <>
676struct OperandTraits<GetElementPtrConstantExpr> : VariadicOperandTraits<1> {
677};
678
679GetElementPtrConstantExpr::GetElementPtrConstantExpr
680 (Constant *C,
681 const std::vector<Constant*> &IdxList,
682 const Type *DestTy)
683 : ConstantExpr(DestTy, Instruction::GetElementPtr,
684 OperandTraits<GetElementPtrConstantExpr>::op_end(this)
685 - (IdxList.size()+1),
686 IdxList.size()+1) {
Gabor Greif2d3024d2008-05-26 21:33:52 +0000687 OperandList[0] = C;
Gabor Greiff6caff662008-05-10 08:32:32 +0000688 for (unsigned i = 0, E = IdxList.size(); i != E; ++i)
Gabor Greif2d3024d2008-05-26 21:33:52 +0000689 OperandList[i+1] = IdxList[i];
Gabor Greiff6caff662008-05-10 08:32:32 +0000690}
691
692DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetElementPtrConstantExpr, Value)
693
694
695template <>
696struct OperandTraits<CompareConstantExpr> : FixedNumOperandTraits<2> {
697};
698DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CompareConstantExpr, Value)
699
700
701} // End llvm namespace
702
Reid Spencer6c38f0b2006-11-27 01:05:10 +0000703
704// Utility function for determining if a ConstantExpr is a CastOp or not. This
705// can't be inline because we don't want to #include Instruction.h into
706// Constant.h
707bool ConstantExpr::isCast() const {
708 return Instruction::isCast(getOpcode());
709}
710
Reid Spenceree3c9912006-12-04 05:19:50 +0000711bool ConstantExpr::isCompare() const {
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000712 return getOpcode() == Instruction::ICmp || getOpcode() == Instruction::FCmp;
Reid Spenceree3c9912006-12-04 05:19:50 +0000713}
714
Dan Gohman1ecaf452008-05-31 00:58:22 +0000715bool ConstantExpr::hasIndices() const {
716 return getOpcode() == Instruction::ExtractValue ||
717 getOpcode() == Instruction::InsertValue;
718}
719
720const SmallVector<unsigned, 4> &ConstantExpr::getIndices() const {
721 if (const ExtractValueConstantExpr *EVCE =
722 dyn_cast<ExtractValueConstantExpr>(this))
723 return EVCE->Indices;
Dan Gohmana469bdb2008-06-23 16:39:44 +0000724
725 return cast<InsertValueConstantExpr>(this)->Indices;
Dan Gohman1ecaf452008-05-31 00:58:22 +0000726}
727
Reid Spencer10fbf0e2006-12-03 05:48:19 +0000728unsigned ConstantExpr::getPredicate() const {
Nate Begemand2195702008-05-12 19:01:56 +0000729 assert(getOpcode() == Instruction::FCmp ||
Nick Lewyckya21d3da2009-07-08 03:04:38 +0000730 getOpcode() == Instruction::ICmp);
Chris Lattneref650092007-10-18 16:26:24 +0000731 return ((const CompareConstantExpr*)this)->predicate;
Reid Spencer10fbf0e2006-12-03 05:48:19 +0000732}
Chris Lattner60e0dd72001-10-03 06:12:09 +0000733
Chris Lattner7c1018a2006-07-14 19:37:40 +0000734/// getWithOperandReplaced - Return a constant expression identical to this
735/// one, but with the specified operand set to the specified value.
Reid Spencer6c38f0b2006-11-27 01:05:10 +0000736Constant *
737ConstantExpr::getWithOperandReplaced(unsigned OpNo, Constant *Op) const {
Chris Lattner7c1018a2006-07-14 19:37:40 +0000738 assert(OpNo < getNumOperands() && "Operand num is out of range!");
739 assert(Op->getType() == getOperand(OpNo)->getType() &&
740 "Replacing operand with value of different type!");
Chris Lattner227816342006-07-14 22:20:01 +0000741 if (getOperand(OpNo) == Op)
742 return const_cast<ConstantExpr*>(this);
Chris Lattner7c1018a2006-07-14 19:37:40 +0000743
Chris Lattner227816342006-07-14 22:20:01 +0000744 Constant *Op0, *Op1, *Op2;
Chris Lattner7c1018a2006-07-14 19:37:40 +0000745 switch (getOpcode()) {
Reid Spencer6c38f0b2006-11-27 01:05:10 +0000746 case Instruction::Trunc:
747 case Instruction::ZExt:
748 case Instruction::SExt:
749 case Instruction::FPTrunc:
750 case Instruction::FPExt:
751 case Instruction::UIToFP:
752 case Instruction::SIToFP:
753 case Instruction::FPToUI:
754 case Instruction::FPToSI:
755 case Instruction::PtrToInt:
756 case Instruction::IntToPtr:
757 case Instruction::BitCast:
758 return ConstantExpr::getCast(getOpcode(), Op, getType());
Chris Lattner227816342006-07-14 22:20:01 +0000759 case Instruction::Select:
760 Op0 = (OpNo == 0) ? Op : getOperand(0);
761 Op1 = (OpNo == 1) ? Op : getOperand(1);
762 Op2 = (OpNo == 2) ? Op : getOperand(2);
763 return ConstantExpr::getSelect(Op0, Op1, Op2);
764 case Instruction::InsertElement:
765 Op0 = (OpNo == 0) ? Op : getOperand(0);
766 Op1 = (OpNo == 1) ? Op : getOperand(1);
767 Op2 = (OpNo == 2) ? Op : getOperand(2);
768 return ConstantExpr::getInsertElement(Op0, Op1, Op2);
769 case Instruction::ExtractElement:
770 Op0 = (OpNo == 0) ? Op : getOperand(0);
771 Op1 = (OpNo == 1) ? Op : getOperand(1);
772 return ConstantExpr::getExtractElement(Op0, Op1);
773 case Instruction::ShuffleVector:
774 Op0 = (OpNo == 0) ? Op : getOperand(0);
775 Op1 = (OpNo == 1) ? Op : getOperand(1);
776 Op2 = (OpNo == 2) ? Op : getOperand(2);
777 return ConstantExpr::getShuffleVector(Op0, Op1, Op2);
Chris Lattner7c1018a2006-07-14 19:37:40 +0000778 case Instruction::GetElementPtr: {
Chris Lattnerb5d70302007-02-19 20:01:23 +0000779 SmallVector<Constant*, 8> Ops;
Dan Gohman12fce772008-05-15 19:50:34 +0000780 Ops.resize(getNumOperands()-1);
Chris Lattner7c1018a2006-07-14 19:37:40 +0000781 for (unsigned i = 1, e = getNumOperands(); i != e; ++i)
Dan Gohman12fce772008-05-15 19:50:34 +0000782 Ops[i-1] = getOperand(i);
Chris Lattner7c1018a2006-07-14 19:37:40 +0000783 if (OpNo == 0)
Chris Lattnerb5d70302007-02-19 20:01:23 +0000784 return ConstantExpr::getGetElementPtr(Op, &Ops[0], Ops.size());
Chris Lattner7c1018a2006-07-14 19:37:40 +0000785 Ops[OpNo-1] = Op;
Chris Lattnerb5d70302007-02-19 20:01:23 +0000786 return ConstantExpr::getGetElementPtr(getOperand(0), &Ops[0], Ops.size());
Chris Lattner7c1018a2006-07-14 19:37:40 +0000787 }
Chris Lattner7c1018a2006-07-14 19:37:40 +0000788 default:
789 assert(getNumOperands() == 2 && "Must be binary operator?");
Chris Lattner227816342006-07-14 22:20:01 +0000790 Op0 = (OpNo == 0) ? Op : getOperand(0);
791 Op1 = (OpNo == 1) ? Op : getOperand(1);
792 return ConstantExpr::get(getOpcode(), Op0, Op1);
793 }
794}
795
796/// getWithOperands - This returns the current constant expression with the
797/// operands replaced with the specified values. The specified operands must
798/// match count and type with the existing ones.
799Constant *ConstantExpr::
Chris Lattnerb078e282008-08-20 22:27:40 +0000800getWithOperands(Constant* const *Ops, unsigned NumOps) const {
801 assert(NumOps == getNumOperands() && "Operand count mismatch!");
Chris Lattner227816342006-07-14 22:20:01 +0000802 bool AnyChange = false;
Chris Lattnerb078e282008-08-20 22:27:40 +0000803 for (unsigned i = 0; i != NumOps; ++i) {
Chris Lattner227816342006-07-14 22:20:01 +0000804 assert(Ops[i]->getType() == getOperand(i)->getType() &&
805 "Operand type mismatch!");
806 AnyChange |= Ops[i] != getOperand(i);
807 }
808 if (!AnyChange) // No operands changed, return self.
809 return const_cast<ConstantExpr*>(this);
810
811 switch (getOpcode()) {
Reid Spencer6c38f0b2006-11-27 01:05:10 +0000812 case Instruction::Trunc:
813 case Instruction::ZExt:
814 case Instruction::SExt:
815 case Instruction::FPTrunc:
816 case Instruction::FPExt:
817 case Instruction::UIToFP:
818 case Instruction::SIToFP:
819 case Instruction::FPToUI:
820 case Instruction::FPToSI:
821 case Instruction::PtrToInt:
822 case Instruction::IntToPtr:
823 case Instruction::BitCast:
824 return ConstantExpr::getCast(getOpcode(), Ops[0], getType());
Chris Lattner227816342006-07-14 22:20:01 +0000825 case Instruction::Select:
826 return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
827 case Instruction::InsertElement:
828 return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]);
829 case Instruction::ExtractElement:
830 return ConstantExpr::getExtractElement(Ops[0], Ops[1]);
831 case Instruction::ShuffleVector:
832 return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
Chris Lattnerb5d70302007-02-19 20:01:23 +0000833 case Instruction::GetElementPtr:
Chris Lattnerb078e282008-08-20 22:27:40 +0000834 return ConstantExpr::getGetElementPtr(Ops[0], &Ops[1], NumOps-1);
Reid Spencer266e42b2006-12-23 06:05:41 +0000835 case Instruction::ICmp:
836 case Instruction::FCmp:
837 return ConstantExpr::getCompare(getPredicate(), Ops[0], Ops[1]);
Chris Lattner227816342006-07-14 22:20:01 +0000838 default:
839 assert(getNumOperands() == 2 && "Must be binary operator?");
840 return ConstantExpr::get(getOpcode(), Ops[0], Ops[1]);
Chris Lattner7c1018a2006-07-14 19:37:40 +0000841 }
842}
843
Chris Lattner2f7c9632001-06-06 20:29:01 +0000844
845//===----------------------------------------------------------------------===//
Chris Lattner2f7c9632001-06-06 20:29:01 +0000846// isValueValidForType implementations
847
Reid Spencere7334722006-12-19 01:28:19 +0000848bool ConstantInt::isValueValidForType(const Type *Ty, uint64_t Val) {
Reid Spencer7a9c62b2007-01-12 07:05:14 +0000849 unsigned NumBits = cast<IntegerType>(Ty)->getBitWidth(); // assert okay
Reid Spencer7a9c62b2007-01-12 07:05:14 +0000850 if (Ty == Type::Int1Ty)
851 return Val == 0 || Val == 1;
Reid Spencerd7a00d72007-02-05 23:47:56 +0000852 if (NumBits >= 64)
Reid Spencer7a9c62b2007-01-12 07:05:14 +0000853 return true; // always true, has to fit in largest type
854 uint64_t Max = (1ll << NumBits) - 1;
855 return Val <= Max;
Reid Spencere7334722006-12-19 01:28:19 +0000856}
857
Reid Spencere0fc4df2006-10-20 07:07:24 +0000858bool ConstantInt::isValueValidForType(const Type *Ty, int64_t Val) {
Reid Spencer7a9c62b2007-01-12 07:05:14 +0000859 unsigned NumBits = cast<IntegerType>(Ty)->getBitWidth(); // assert okay
Reid Spencer7a9c62b2007-01-12 07:05:14 +0000860 if (Ty == Type::Int1Ty)
Reid Spencera94d3942007-01-19 21:13:56 +0000861 return Val == 0 || Val == 1 || Val == -1;
Reid Spencerd7a00d72007-02-05 23:47:56 +0000862 if (NumBits >= 64)
Reid Spencer7a9c62b2007-01-12 07:05:14 +0000863 return true; // always true, has to fit in largest type
864 int64_t Min = -(1ll << (NumBits-1));
865 int64_t Max = (1ll << (NumBits-1)) - 1;
866 return (Val >= Min && Val <= Max);
Chris Lattner2f7c9632001-06-06 20:29:01 +0000867}
868
Dale Johannesend246b2c2007-08-30 00:23:21 +0000869bool ConstantFP::isValueValidForType(const Type *Ty, const APFloat& Val) {
870 // convert modifies in place, so make a copy.
871 APFloat Val2 = APFloat(Val);
Dale Johannesen4f0bd682008-10-09 23:00:39 +0000872 bool losesInfo;
Chris Lattner6b727592004-06-17 18:19:28 +0000873 switch (Ty->getTypeID()) {
Chris Lattner2f7c9632001-06-06 20:29:01 +0000874 default:
875 return false; // These can't be represented as floating point!
876
Dale Johannesend246b2c2007-08-30 00:23:21 +0000877 // FIXME rounding mode needs to be more flexible
Dale Johannesen4f0bd682008-10-09 23:00:39 +0000878 case Type::FloatTyID: {
879 if (&Val2.getSemantics() == &APFloat::IEEEsingle)
880 return true;
881 Val2.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
882 return !losesInfo;
883 }
884 case Type::DoubleTyID: {
885 if (&Val2.getSemantics() == &APFloat::IEEEsingle ||
886 &Val2.getSemantics() == &APFloat::IEEEdouble)
887 return true;
888 Val2.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
889 return !losesInfo;
890 }
Dale Johannesenbdad8092007-08-09 22:51:36 +0000891 case Type::X86_FP80TyID:
Dale Johannesen028084e2007-09-12 03:30:33 +0000892 return &Val2.getSemantics() == &APFloat::IEEEsingle ||
893 &Val2.getSemantics() == &APFloat::IEEEdouble ||
894 &Val2.getSemantics() == &APFloat::x87DoubleExtended;
Dale Johannesenbdad8092007-08-09 22:51:36 +0000895 case Type::FP128TyID:
Dale Johannesen028084e2007-09-12 03:30:33 +0000896 return &Val2.getSemantics() == &APFloat::IEEEsingle ||
897 &Val2.getSemantics() == &APFloat::IEEEdouble ||
898 &Val2.getSemantics() == &APFloat::IEEEquad;
Dale Johannesen007aa372007-10-11 18:07:22 +0000899 case Type::PPC_FP128TyID:
900 return &Val2.getSemantics() == &APFloat::IEEEsingle ||
901 &Val2.getSemantics() == &APFloat::IEEEdouble ||
902 &Val2.getSemantics() == &APFloat::PPCDoubleDouble;
Chris Lattner2f7c9632001-06-06 20:29:01 +0000903 }
Chris Lattneraa2372562006-05-24 17:04:05 +0000904}
Chris Lattner9655e542001-07-20 19:16:02 +0000905
Chris Lattner49d855c2001-09-07 16:46:31 +0000906//===----------------------------------------------------------------------===//
Chris Lattner49d855c2001-09-07 16:46:31 +0000907// Factory Function Implementation
908
Gabor Greiff6caff662008-05-10 08:32:32 +0000909
910// The number of operands for each ConstantCreator::create method is
911// determined by the ConstantTraits template.
Chris Lattner98fa07b2003-05-23 20:03:32 +0000912// ConstantCreator - A class that is used to create constants by
913// ValueMap*. This class should be partially specialized if there is
914// something strange that needs to be done to interface to the ctor for the
915// constant.
916//
Chris Lattner189d19f2003-11-21 20:23:48 +0000917namespace llvm {
Gabor Greiff6caff662008-05-10 08:32:32 +0000918 template<class ValType>
919 struct ConstantTraits;
920
921 template<typename T, typename Alloc>
922 struct VISIBILITY_HIDDEN ConstantTraits< std::vector<T, Alloc> > {
923 static unsigned uses(const std::vector<T, Alloc>& v) {
924 return v.size();
925 }
926 };
927
Chris Lattner189d19f2003-11-21 20:23:48 +0000928 template<class ConstantClass, class TypeClass, class ValType>
Chris Lattner02157b02006-06-28 21:38:54 +0000929 struct VISIBILITY_HIDDEN ConstantCreator {
Chris Lattner189d19f2003-11-21 20:23:48 +0000930 static ConstantClass *create(const TypeClass *Ty, const ValType &V) {
Gabor Greiff6caff662008-05-10 08:32:32 +0000931 return new(ConstantTraits<ValType>::uses(V)) ConstantClass(Ty, V);
Chris Lattner189d19f2003-11-21 20:23:48 +0000932 }
933 };
Misha Brukmanb1c93172005-04-21 23:48:37 +0000934
Chris Lattner189d19f2003-11-21 20:23:48 +0000935 template<class ConstantClass, class TypeClass>
Chris Lattner02157b02006-06-28 21:38:54 +0000936 struct VISIBILITY_HIDDEN ConvertConstantType {
Chris Lattner189d19f2003-11-21 20:23:48 +0000937 static void convert(ConstantClass *OldC, const TypeClass *NewTy) {
Torok Edwinfbcc6632009-07-14 16:55:14 +0000938 llvm_unreachable("This type cannot be converted!");
Chris Lattner189d19f2003-11-21 20:23:48 +0000939 }
940 };
Chris Lattnerb50d1352003-10-05 00:17:43 +0000941
Chris Lattner935aa922005-10-04 17:48:46 +0000942 template<class ValType, class TypeClass, class ConstantClass,
943 bool HasLargeKey = false /*true for arrays and structs*/ >
Chris Lattner02157b02006-06-28 21:38:54 +0000944 class VISIBILITY_HIDDEN ValueMap : public AbstractTypeUser {
Chris Lattnerb64419a2005-10-03 22:51:37 +0000945 public:
Jim Laskeyc03caef2006-07-17 17:38:29 +0000946 typedef std::pair<const Type*, ValType> MapKey;
947 typedef std::map<MapKey, Constant *> MapTy;
948 typedef std::map<Constant*, typename MapTy::iterator> InverseMapTy;
949 typedef std::map<const Type*, typename MapTy::iterator> AbstractTypeMapTy;
Chris Lattnerb64419a2005-10-03 22:51:37 +0000950 private:
Chris Lattner5bbf60a52005-10-04 16:52:46 +0000951 /// Map - This is the main map from the element descriptor to the Constants.
952 /// This is the primary way we avoid creating two of the same shape
953 /// constant.
Chris Lattnerb50d1352003-10-05 00:17:43 +0000954 MapTy Map;
Chris Lattner935aa922005-10-04 17:48:46 +0000955
956 /// InverseMap - If "HasLargeKey" is true, this contains an inverse mapping
957 /// from the constants to their element in Map. This is important for
958 /// removal of constants from the array, which would otherwise have to scan
959 /// through the map with very large keys.
Jim Laskeyc03caef2006-07-17 17:38:29 +0000960 InverseMapTy InverseMap;
Chris Lattnerb50d1352003-10-05 00:17:43 +0000961
Jim Laskeyc03caef2006-07-17 17:38:29 +0000962 /// AbstractTypeMap - Map for abstract type constants.
963 ///
Chris Lattnerb50d1352003-10-05 00:17:43 +0000964 AbstractTypeMapTy AbstractTypeMap;
Owen Anderson0d2de8c2009-06-20 00:24:58 +0000965
966 /// ValueMapLock - Mutex for this map.
967 sys::SmartMutex<true> ValueMapLock;
Chris Lattner99a669b2004-11-19 16:39:44 +0000968
Chris Lattner98fa07b2003-05-23 20:03:32 +0000969 public:
Owen Anderson61794042009-06-17 20:10:08 +0000970 // NOTE: This function is not locked. It is the caller's responsibility
971 // to enforce proper synchronization.
Jim Laskeyc03caef2006-07-17 17:38:29 +0000972 typename MapTy::iterator map_end() { return Map.end(); }
Chris Lattnerb64419a2005-10-03 22:51:37 +0000973
974 /// InsertOrGetItem - Return an iterator for the specified element.
975 /// If the element exists in the map, the returned iterator points to the
976 /// entry and Exists=true. If not, the iterator points to the newly
977 /// inserted entry and returns Exists=false. Newly inserted entries have
978 /// I->second == 0, and should be filled in.
Owen Anderson61794042009-06-17 20:10:08 +0000979 /// NOTE: This function is not locked. It is the caller's responsibility
980 // to enforce proper synchronization.
Jim Laskeyc03caef2006-07-17 17:38:29 +0000981 typename MapTy::iterator InsertOrGetItem(std::pair<MapKey, Constant *>
982 &InsertVal,
Chris Lattnerb64419a2005-10-03 22:51:37 +0000983 bool &Exists) {
Jim Laskeyc03caef2006-07-17 17:38:29 +0000984 std::pair<typename MapTy::iterator, bool> IP = Map.insert(InsertVal);
Chris Lattnerb64419a2005-10-03 22:51:37 +0000985 Exists = !IP.second;
986 return IP.first;
987 }
Chris Lattner5bbf60a52005-10-04 16:52:46 +0000988
Chris Lattner935aa922005-10-04 17:48:46 +0000989private:
Jim Laskeyc03caef2006-07-17 17:38:29 +0000990 typename MapTy::iterator FindExistingElement(ConstantClass *CP) {
Chris Lattner935aa922005-10-04 17:48:46 +0000991 if (HasLargeKey) {
Jim Laskeyc03caef2006-07-17 17:38:29 +0000992 typename InverseMapTy::iterator IMI = InverseMap.find(CP);
Chris Lattner935aa922005-10-04 17:48:46 +0000993 assert(IMI != InverseMap.end() && IMI->second != Map.end() &&
994 IMI->second->second == CP &&
995 "InverseMap corrupt!");
996 return IMI->second;
997 }
998
Jim Laskeyc03caef2006-07-17 17:38:29 +0000999 typename MapTy::iterator I =
Dan Gohmane955c482008-08-05 14:45:15 +00001000 Map.find(MapKey(static_cast<const TypeClass*>(CP->getRawType()),
1001 getValType(CP)));
Chris Lattner5bbf60a52005-10-04 16:52:46 +00001002 if (I == Map.end() || I->second != CP) {
1003 // FIXME: This should not use a linear scan. If this gets to be a
1004 // performance problem, someone should look at this.
1005 for (I = Map.begin(); I != Map.end() && I->second != CP; ++I)
1006 /* empty */;
1007 }
Chris Lattner935aa922005-10-04 17:48:46 +00001008 return I;
1009 }
Owen Andersonf89c38c2009-06-17 20:43:39 +00001010
1011 ConstantClass* Create(const TypeClass *Ty, const ValType &V,
1012 typename MapTy::iterator I) {
1013 ConstantClass* Result =
1014 ConstantCreator<ConstantClass,TypeClass,ValType>::create(Ty, V);
1015
1016 assert(Result->getType() == Ty && "Type specified is not correct!");
1017 I = Map.insert(I, std::make_pair(MapKey(Ty, V), Result));
1018
1019 if (HasLargeKey) // Remember the reverse mapping if needed.
1020 InverseMap.insert(std::make_pair(Result, I));
1021
1022 // If the type of the constant is abstract, make sure that an entry
1023 // exists for it in the AbstractTypeMap.
1024 if (Ty->isAbstract()) {
1025 typename AbstractTypeMapTy::iterator TI =
1026 AbstractTypeMap.find(Ty);
1027
1028 if (TI == AbstractTypeMap.end()) {
1029 // Add ourselves to the ATU list of the type.
1030 cast<DerivedType>(Ty)->addAbstractTypeUser(this);
1031
1032 AbstractTypeMap.insert(TI, std::make_pair(Ty, I));
1033 }
1034 }
1035
1036 return Result;
1037 }
Chris Lattner935aa922005-10-04 17:48:46 +00001038public:
1039
Chris Lattnerb64419a2005-10-03 22:51:37 +00001040 /// getOrCreate - Return the specified constant from the map, creating it if
1041 /// necessary.
Chris Lattner98fa07b2003-05-23 20:03:32 +00001042 ConstantClass *getOrCreate(const TypeClass *Ty, const ValType &V) {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001043 sys::SmartScopedLock<true> Lock(ValueMapLock);
Owen Andersonb07dd952009-06-19 23:16:19 +00001044 MapKey Lookup(Ty, V);
1045 ConstantClass* Result = 0;
1046
1047 typename MapTy::iterator I = Map.find(Lookup);
1048 // Is it in the map?
1049 if (I != Map.end())
1050 Result = static_cast<ConstantClass *>(I->second);
1051
1052 if (!Result) {
1053 // If no preexisting value, create one now...
1054 Result = Create(Ty, V, I);
1055 }
1056
1057 return Result;
1058 }
Misha Brukmanb1c93172005-04-21 23:48:37 +00001059
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001060 void remove(ConstantClass *CP) {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001061 sys::SmartScopedLock<true> Lock(ValueMapLock);
Jim Laskeyc03caef2006-07-17 17:38:29 +00001062 typename MapTy::iterator I = FindExistingElement(CP);
Chris Lattnerb50d1352003-10-05 00:17:43 +00001063 assert(I != Map.end() && "Constant not found in constant table!");
Chris Lattner3e650af2004-08-04 04:48:01 +00001064 assert(I->second == CP && "Didn't find correct element?");
Chris Lattnerb50d1352003-10-05 00:17:43 +00001065
Chris Lattner935aa922005-10-04 17:48:46 +00001066 if (HasLargeKey) // Remember the reverse mapping if needed.
1067 InverseMap.erase(CP);
1068
Chris Lattnerb50d1352003-10-05 00:17:43 +00001069 // Now that we found the entry, make sure this isn't the entry that
1070 // the AbstractTypeMap points to.
Jim Laskeyc03caef2006-07-17 17:38:29 +00001071 const TypeClass *Ty = static_cast<const TypeClass *>(I->first.first);
Chris Lattnerb50d1352003-10-05 00:17:43 +00001072 if (Ty->isAbstract()) {
1073 assert(AbstractTypeMap.count(Ty) &&
1074 "Abstract type not in AbstractTypeMap?");
Jim Laskeyc03caef2006-07-17 17:38:29 +00001075 typename MapTy::iterator &ATMEntryIt = AbstractTypeMap[Ty];
Chris Lattnerb50d1352003-10-05 00:17:43 +00001076 if (ATMEntryIt == I) {
1077 // Yes, we are removing the representative entry for this type.
1078 // See if there are any other entries of the same type.
Jim Laskeyc03caef2006-07-17 17:38:29 +00001079 typename MapTy::iterator TmpIt = ATMEntryIt;
Misha Brukmanb1c93172005-04-21 23:48:37 +00001080
Chris Lattnerb50d1352003-10-05 00:17:43 +00001081 // First check the entry before this one...
1082 if (TmpIt != Map.begin()) {
1083 --TmpIt;
1084 if (TmpIt->first.first != Ty) // Not the same type, move back...
1085 ++TmpIt;
1086 }
Misha Brukmanb1c93172005-04-21 23:48:37 +00001087
Chris Lattnerb50d1352003-10-05 00:17:43 +00001088 // If we didn't find the same type, try to move forward...
1089 if (TmpIt == ATMEntryIt) {
1090 ++TmpIt;
1091 if (TmpIt == Map.end() || TmpIt->first.first != Ty)
1092 --TmpIt; // No entry afterwards with the same type
1093 }
1094
1095 // If there is another entry in the map of the same abstract type,
1096 // update the AbstractTypeMap entry now.
1097 if (TmpIt != ATMEntryIt) {
1098 ATMEntryIt = TmpIt;
1099 } else {
1100 // Otherwise, we are removing the last instance of this type
1101 // from the table. Remove from the ATM, and from user list.
1102 cast<DerivedType>(Ty)->removeAbstractTypeUser(this);
1103 AbstractTypeMap.erase(Ty);
1104 }
Chris Lattner98fa07b2003-05-23 20:03:32 +00001105 }
Chris Lattnerb50d1352003-10-05 00:17:43 +00001106 }
Misha Brukmanb1c93172005-04-21 23:48:37 +00001107
Chris Lattnerb50d1352003-10-05 00:17:43 +00001108 Map.erase(I);
1109 }
1110
Chris Lattner3b793c62005-10-04 21:35:50 +00001111
1112 /// MoveConstantToNewSlot - If we are about to change C to be the element
1113 /// specified by I, update our internal data structures to reflect this
1114 /// fact.
Owen Anderson61794042009-06-17 20:10:08 +00001115 /// NOTE: This function is not locked. It is the responsibility of the
1116 /// caller to enforce proper synchronization if using this method.
Jim Laskeyc03caef2006-07-17 17:38:29 +00001117 void MoveConstantToNewSlot(ConstantClass *C, typename MapTy::iterator I) {
Chris Lattner3b793c62005-10-04 21:35:50 +00001118 // First, remove the old location of the specified constant in the map.
Jim Laskeyc03caef2006-07-17 17:38:29 +00001119 typename MapTy::iterator OldI = FindExistingElement(C);
Chris Lattner3b793c62005-10-04 21:35:50 +00001120 assert(OldI != Map.end() && "Constant not found in constant table!");
1121 assert(OldI->second == C && "Didn't find correct element?");
1122
1123 // If this constant is the representative element for its abstract type,
1124 // update the AbstractTypeMap so that the representative element is I.
1125 if (C->getType()->isAbstract()) {
1126 typename AbstractTypeMapTy::iterator ATI =
1127 AbstractTypeMap.find(C->getType());
1128 assert(ATI != AbstractTypeMap.end() &&
1129 "Abstract type not in AbstractTypeMap?");
1130 if (ATI->second == OldI)
1131 ATI->second = I;
1132 }
1133
1134 // Remove the old entry from the map.
1135 Map.erase(OldI);
1136
1137 // Update the inverse map so that we know that this constant is now
1138 // located at descriptor I.
1139 if (HasLargeKey) {
1140 assert(I->second == C && "Bad inversemap entry!");
1141 InverseMap[C] = I;
1142 }
1143 }
1144
Chris Lattnerb50d1352003-10-05 00:17:43 +00001145 void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001146 sys::SmartScopedLock<true> Lock(ValueMapLock);
Misha Brukmanb1c93172005-04-21 23:48:37 +00001147 typename AbstractTypeMapTy::iterator I =
Jim Laskeyc03caef2006-07-17 17:38:29 +00001148 AbstractTypeMap.find(cast<Type>(OldTy));
Chris Lattnerb50d1352003-10-05 00:17:43 +00001149
1150 assert(I != AbstractTypeMap.end() &&
1151 "Abstract type not in AbstractTypeMap?");
1152
1153 // Convert a constant at a time until the last one is gone. The last one
1154 // leaving will remove() itself, causing the AbstractTypeMapEntry to be
1155 // eliminated eventually.
1156 do {
1157 ConvertConstantType<ConstantClass,
Jim Laskeyc03caef2006-07-17 17:38:29 +00001158 TypeClass>::convert(
1159 static_cast<ConstantClass *>(I->second->second),
Chris Lattnerb50d1352003-10-05 00:17:43 +00001160 cast<TypeClass>(NewTy));
1161
Jim Laskeyc03caef2006-07-17 17:38:29 +00001162 I = AbstractTypeMap.find(cast<Type>(OldTy));
Chris Lattnerb50d1352003-10-05 00:17:43 +00001163 } while (I != AbstractTypeMap.end());
1164 }
1165
1166 // If the type became concrete without being refined to any other existing
1167 // type, we just remove ourselves from the ATU list.
1168 void typeBecameConcrete(const DerivedType *AbsTy) {
Owen Andersond830eb82009-06-18 19:10:19 +00001169 AbsTy->removeAbstractTypeUser(this);
Chris Lattnerb50d1352003-10-05 00:17:43 +00001170 }
1171
1172 void dump() const {
Bill Wendling6a462f12006-11-17 08:03:48 +00001173 DOUT << "Constant.cpp: ValueMap\n";
Chris Lattner98fa07b2003-05-23 20:03:32 +00001174 }
1175 };
1176}
1177
Chris Lattnera84df0a22006-09-28 23:36:21 +00001178
Chris Lattner28173502007-02-20 06:11:36 +00001179
Chris Lattner9fba3da2004-02-15 05:53:04 +00001180//---- ConstantAggregateZero::get() implementation...
1181//
1182namespace llvm {
1183 // ConstantAggregateZero does not take extra "value" argument...
1184 template<class ValType>
1185 struct ConstantCreator<ConstantAggregateZero, Type, ValType> {
1186 static ConstantAggregateZero *create(const Type *Ty, const ValType &V){
1187 return new ConstantAggregateZero(Ty);
1188 }
1189 };
1190
1191 template<>
1192 struct ConvertConstantType<ConstantAggregateZero, Type> {
1193 static void convert(ConstantAggregateZero *OldC, const Type *NewTy) {
1194 // Make everyone now use a constant of the new type...
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001195 Constant *New = ConstantAggregateZero::get(NewTy);
Chris Lattner9fba3da2004-02-15 05:53:04 +00001196 assert(New != OldC && "Didn't replace constant??");
1197 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001198 OldC->destroyConstant(); // This constant is now dead, destroy it.
Chris Lattner9fba3da2004-02-15 05:53:04 +00001199 }
1200 };
1201}
1202
Chris Lattner69edc982006-09-28 00:35:06 +00001203static ManagedStatic<ValueMap<char, Type,
1204 ConstantAggregateZero> > AggZeroConstants;
Chris Lattner9fba3da2004-02-15 05:53:04 +00001205
Chris Lattner3e650af2004-08-04 04:48:01 +00001206static char getValType(ConstantAggregateZero *CPZ) { return 0; }
1207
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001208ConstantAggregateZero *ConstantAggregateZero::get(const Type *Ty) {
Reid Spencerd84d35b2007-02-15 02:26:10 +00001209 assert((isa<StructType>(Ty) || isa<ArrayType>(Ty) || isa<VectorType>(Ty)) &&
Chris Lattnerbfd0b6d2006-06-10 04:16:23 +00001210 "Cannot create an aggregate zero of non-aggregate type!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001211
1212 // Implicitly locked.
1213 return AggZeroConstants->getOrCreate(Ty, 0);
Chris Lattner9fba3da2004-02-15 05:53:04 +00001214}
1215
Dan Gohman92b551b2009-03-03 02:55:14 +00001216/// destroyConstant - Remove the constant from the constant table...
1217///
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001218void ConstantAggregateZero::destroyConstant() {
Owen Anderson61794042009-06-17 20:10:08 +00001219 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001220 AggZeroConstants->remove(this);
Chris Lattner9fba3da2004-02-15 05:53:04 +00001221 destroyConstantImpl();
1222}
1223
Chris Lattner3462ae32001-12-03 22:26:30 +00001224//---- ConstantArray::get() implementation...
Chris Lattner49d855c2001-09-07 16:46:31 +00001225//
Chris Lattner189d19f2003-11-21 20:23:48 +00001226namespace llvm {
1227 template<>
1228 struct ConvertConstantType<ConstantArray, ArrayType> {
1229 static void convert(ConstantArray *OldC, const ArrayType *NewTy) {
1230 // Make everyone now use a constant of the new type...
1231 std::vector<Constant*> C;
1232 for (unsigned i = 0, e = OldC->getNumOperands(); i != e; ++i)
1233 C.push_back(cast<Constant>(OldC->getOperand(i)));
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001234 Constant *New = ConstantArray::get(NewTy, C);
Chris Lattner189d19f2003-11-21 20:23:48 +00001235 assert(New != OldC && "Didn't replace constant??");
1236 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001237 OldC->destroyConstant(); // This constant is now dead, destroy it.
Chris Lattner189d19f2003-11-21 20:23:48 +00001238 }
1239 };
1240}
Chris Lattnerb50d1352003-10-05 00:17:43 +00001241
Chris Lattner3e650af2004-08-04 04:48:01 +00001242static std::vector<Constant*> getValType(ConstantArray *CA) {
1243 std::vector<Constant*> Elements;
1244 Elements.reserve(CA->getNumOperands());
1245 for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
1246 Elements.push_back(cast<Constant>(CA->getOperand(i)));
1247 return Elements;
1248}
1249
Chris Lattnerb64419a2005-10-03 22:51:37 +00001250typedef ValueMap<std::vector<Constant*>, ArrayType,
Chris Lattner935aa922005-10-04 17:48:46 +00001251 ConstantArray, true /*largekey*/> ArrayConstantsTy;
Chris Lattner69edc982006-09-28 00:35:06 +00001252static ManagedStatic<ArrayConstantsTy> ArrayConstants;
Chris Lattner49d855c2001-09-07 16:46:31 +00001253
Chris Lattner015e8212004-02-15 04:14:47 +00001254Constant *ConstantArray::get(const ArrayType *Ty,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001255 const std::vector<Constant*> &V) {
Chris Lattner9fba3da2004-02-15 05:53:04 +00001256 // If this is an all-zero array, return a ConstantAggregateZero object
1257 if (!V.empty()) {
1258 Constant *C = V[0];
Owen Anderson2d7231d2009-06-17 18:40:29 +00001259 if (!C->isNullValue()) {
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001260 // Implicitly locked.
1261 return ArrayConstants->getOrCreate(Ty, V);
Owen Anderson2d7231d2009-06-17 18:40:29 +00001262 }
Chris Lattner9fba3da2004-02-15 05:53:04 +00001263 for (unsigned i = 1, e = V.size(); i != e; ++i)
Owen Anderson2d7231d2009-06-17 18:40:29 +00001264 if (V[i] != C) {
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001265 // Implicitly locked.
1266 return ArrayConstants->getOrCreate(Ty, V);
Owen Anderson2d7231d2009-06-17 18:40:29 +00001267 }
Chris Lattner9fba3da2004-02-15 05:53:04 +00001268 }
Owen Anderson2d7231d2009-06-17 18:40:29 +00001269
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001270 return ConstantAggregateZero::get(Ty);
Chris Lattner49d855c2001-09-07 16:46:31 +00001271}
1272
Dan Gohman92b551b2009-03-03 02:55:14 +00001273/// destroyConstant - Remove the constant from the constant table...
1274///
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001275void ConstantArray::destroyConstant() {
Owen Anderson59ba8142009-06-19 18:34:09 +00001276 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001277 ArrayConstants->remove(this);
Chris Lattner98fa07b2003-05-23 20:03:32 +00001278 destroyConstantImpl();
1279}
1280
Reid Spencer2546b762007-01-26 07:37:34 +00001281/// isString - This method returns true if the array is an array of i8, and
1282/// if the elements of the array are all ConstantInt's.
Chris Lattnere8dfcca2004-01-14 17:06:38 +00001283bool ConstantArray::isString() const {
Reid Spencer2546b762007-01-26 07:37:34 +00001284 // Check the element type for i8...
Reid Spencer8d9336d2006-12-31 05:26:44 +00001285 if (getType()->getElementType() != Type::Int8Ty)
Chris Lattnere8dfcca2004-01-14 17:06:38 +00001286 return false;
1287 // Check the elements to make sure they are all integers, not constant
1288 // expressions.
1289 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
1290 if (!isa<ConstantInt>(getOperand(i)))
1291 return false;
1292 return true;
1293}
1294
Evan Cheng3763c5b2006-10-26 19:15:05 +00001295/// isCString - This method returns true if the array is a string (see
Dan Gohman92b551b2009-03-03 02:55:14 +00001296/// isString) and it ends in a null byte \\0 and does not contains any other
Evan Cheng3763c5b2006-10-26 19:15:05 +00001297/// null bytes except its terminator.
Owen Andersone4dcecd2009-07-13 21:27:19 +00001298bool ConstantArray::isCString() const {
Reid Spencer2546b762007-01-26 07:37:34 +00001299 // Check the element type for i8...
Reid Spencer8d9336d2006-12-31 05:26:44 +00001300 if (getType()->getElementType() != Type::Int8Ty)
Evan Chenge974da62006-10-26 21:48:03 +00001301 return false;
Owen Andersone4dcecd2009-07-13 21:27:19 +00001302
Evan Chenge974da62006-10-26 21:48:03 +00001303 // Last element must be a null.
Owen Andersone4dcecd2009-07-13 21:27:19 +00001304 if (!getOperand(getNumOperands()-1)->isNullValue())
Evan Chenge974da62006-10-26 21:48:03 +00001305 return false;
1306 // Other elements must be non-null integers.
1307 for (unsigned i = 0, e = getNumOperands()-1; i != e; ++i) {
1308 if (!isa<ConstantInt>(getOperand(i)))
Evan Cheng3763c5b2006-10-26 19:15:05 +00001309 return false;
Owen Andersone4dcecd2009-07-13 21:27:19 +00001310 if (getOperand(i)->isNullValue())
Evan Chenge974da62006-10-26 21:48:03 +00001311 return false;
1312 }
Evan Cheng3763c5b2006-10-26 19:15:05 +00001313 return true;
1314}
1315
1316
Dan Gohman92b551b2009-03-03 02:55:14 +00001317/// getAsString - If the sub-element type of this array is i8
1318/// then this method converts the array to an std::string and returns it.
1319/// Otherwise, it asserts out.
1320///
Chris Lattner81fabb02002-08-26 17:53:56 +00001321std::string ConstantArray::getAsString() const {
Chris Lattnere8dfcca2004-01-14 17:06:38 +00001322 assert(isString() && "Not a string!");
Chris Lattner81fabb02002-08-26 17:53:56 +00001323 std::string Result;
Owen Anderson79c69bc2008-06-24 21:58:29 +00001324 Result.reserve(getNumOperands());
Chris Lattner6077c312003-07-23 15:22:26 +00001325 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
Owen Andersonee9c30d2008-06-25 01:05:05 +00001326 Result.push_back((char)cast<ConstantInt>(getOperand(i))->getZExtValue());
Chris Lattner81fabb02002-08-26 17:53:56 +00001327 return Result;
1328}
1329
1330
Chris Lattner3462ae32001-12-03 22:26:30 +00001331//---- ConstantStruct::get() implementation...
Chris Lattner49d855c2001-09-07 16:46:31 +00001332//
Chris Lattnerb50d1352003-10-05 00:17:43 +00001333
Chris Lattner189d19f2003-11-21 20:23:48 +00001334namespace llvm {
1335 template<>
1336 struct ConvertConstantType<ConstantStruct, StructType> {
1337 static void convert(ConstantStruct *OldC, const StructType *NewTy) {
1338 // Make everyone now use a constant of the new type...
1339 std::vector<Constant*> C;
1340 for (unsigned i = 0, e = OldC->getNumOperands(); i != e; ++i)
1341 C.push_back(cast<Constant>(OldC->getOperand(i)));
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001342 Constant *New = ConstantStruct::get(NewTy, C);
Chris Lattner189d19f2003-11-21 20:23:48 +00001343 assert(New != OldC && "Didn't replace constant??");
Misha Brukmanb1c93172005-04-21 23:48:37 +00001344
Chris Lattner189d19f2003-11-21 20:23:48 +00001345 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001346 OldC->destroyConstant(); // This constant is now dead, destroy it.
Chris Lattner189d19f2003-11-21 20:23:48 +00001347 }
1348 };
1349}
Chris Lattnerb50d1352003-10-05 00:17:43 +00001350
Chris Lattner8760ec72005-10-04 01:17:50 +00001351typedef ValueMap<std::vector<Constant*>, StructType,
Chris Lattner935aa922005-10-04 17:48:46 +00001352 ConstantStruct, true /*largekey*/> StructConstantsTy;
Chris Lattner69edc982006-09-28 00:35:06 +00001353static ManagedStatic<StructConstantsTy> StructConstants;
Chris Lattner49d855c2001-09-07 16:46:31 +00001354
Chris Lattner3e650af2004-08-04 04:48:01 +00001355static std::vector<Constant*> getValType(ConstantStruct *CS) {
1356 std::vector<Constant*> Elements;
1357 Elements.reserve(CS->getNumOperands());
1358 for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i)
1359 Elements.push_back(cast<Constant>(CS->getOperand(i)));
1360 return Elements;
1361}
1362
Chris Lattner015e8212004-02-15 04:14:47 +00001363Constant *ConstantStruct::get(const StructType *Ty,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001364 const std::vector<Constant*> &V) {
Chris Lattner9fba3da2004-02-15 05:53:04 +00001365 // Create a ConstantAggregateZero value if all elements are zeros...
1366 for (unsigned i = 0, e = V.size(); i != e; ++i)
Owen Anderson61794042009-06-17 20:10:08 +00001367 if (!V[i]->isNullValue())
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001368 // Implicitly locked.
1369 return StructConstants->getOrCreate(Ty, V);
Chris Lattner9fba3da2004-02-15 05:53:04 +00001370
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001371 return ConstantAggregateZero::get(Ty);
Chris Lattner49d855c2001-09-07 16:46:31 +00001372}
Chris Lattner883ad0b2001-10-03 15:39:36 +00001373
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001374Constant *ConstantStruct::get(const std::vector<Constant*> &V, bool packed) {
Chris Lattnerd6108ca2004-07-12 20:35:11 +00001375 std::vector<const Type*> StructEls;
1376 StructEls.reserve(V.size());
1377 for (unsigned i = 0, e = V.size(); i != e; ++i)
1378 StructEls.push_back(V[i]->getType());
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001379 return get(StructType::get(StructEls, packed), V);
Chris Lattnerd6108ca2004-07-12 20:35:11 +00001380}
1381
Chris Lattnerd7a73302001-10-13 06:57:33 +00001382// destroyConstant - Remove the constant from the constant table...
Chris Lattner883ad0b2001-10-03 15:39:36 +00001383//
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001384void ConstantStruct::destroyConstant() {
Owen Anderson59ba8142009-06-19 18:34:09 +00001385 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001386 StructConstants->remove(this);
Chris Lattnerd7a73302001-10-13 06:57:33 +00001387 destroyConstantImpl();
1388}
Chris Lattner883ad0b2001-10-03 15:39:36 +00001389
Reid Spencerd84d35b2007-02-15 02:26:10 +00001390//---- ConstantVector::get() implementation...
Brian Gaeke02209042004-08-20 06:00:58 +00001391//
1392namespace llvm {
1393 template<>
Reid Spencerd84d35b2007-02-15 02:26:10 +00001394 struct ConvertConstantType<ConstantVector, VectorType> {
1395 static void convert(ConstantVector *OldC, const VectorType *NewTy) {
Brian Gaeke02209042004-08-20 06:00:58 +00001396 // Make everyone now use a constant of the new type...
1397 std::vector<Constant*> C;
1398 for (unsigned i = 0, e = OldC->getNumOperands(); i != e; ++i)
1399 C.push_back(cast<Constant>(OldC->getOperand(i)));
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001400 Constant *New = ConstantVector::get(NewTy, C);
Brian Gaeke02209042004-08-20 06:00:58 +00001401 assert(New != OldC && "Didn't replace constant??");
1402 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001403 OldC->destroyConstant(); // This constant is now dead, destroy it.
Brian Gaeke02209042004-08-20 06:00:58 +00001404 }
1405 };
1406}
1407
Reid Spencerd84d35b2007-02-15 02:26:10 +00001408static std::vector<Constant*> getValType(ConstantVector *CP) {
Brian Gaeke02209042004-08-20 06:00:58 +00001409 std::vector<Constant*> Elements;
1410 Elements.reserve(CP->getNumOperands());
1411 for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
1412 Elements.push_back(CP->getOperand(i));
1413 return Elements;
1414}
1415
Reid Spencerd84d35b2007-02-15 02:26:10 +00001416static ManagedStatic<ValueMap<std::vector<Constant*>, VectorType,
Reid Spencer09575ba2007-02-15 03:39:18 +00001417 ConstantVector> > VectorConstants;
Brian Gaeke02209042004-08-20 06:00:58 +00001418
Reid Spencerd84d35b2007-02-15 02:26:10 +00001419Constant *ConstantVector::get(const VectorType *Ty,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001420 const std::vector<Constant*> &V) {
Chris Lattnerd977c072008-07-10 00:44:03 +00001421 assert(!V.empty() && "Vectors can't be empty");
1422 // If this is an all-undef or alll-zero vector, return a
1423 // ConstantAggregateZero or UndefValue.
1424 Constant *C = V[0];
1425 bool isZero = C->isNullValue();
1426 bool isUndef = isa<UndefValue>(C);
1427
1428 if (isZero || isUndef) {
Brian Gaeke02209042004-08-20 06:00:58 +00001429 for (unsigned i = 1, e = V.size(); i != e; ++i)
Chris Lattnerd977c072008-07-10 00:44:03 +00001430 if (V[i] != C) {
1431 isZero = isUndef = false;
1432 break;
1433 }
Brian Gaeke02209042004-08-20 06:00:58 +00001434 }
Chris Lattnerd977c072008-07-10 00:44:03 +00001435
1436 if (isZero)
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001437 return ConstantAggregateZero::get(Ty);
Chris Lattnerd977c072008-07-10 00:44:03 +00001438 if (isUndef)
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001439 return UndefValue::get(Ty);
Owen Anderson61794042009-06-17 20:10:08 +00001440
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001441 // Implicitly locked.
1442 return VectorConstants->getOrCreate(Ty, V);
Brian Gaeke02209042004-08-20 06:00:58 +00001443}
1444
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001445Constant *ConstantVector::get(const std::vector<Constant*> &V) {
Brian Gaeke02209042004-08-20 06:00:58 +00001446 assert(!V.empty() && "Cannot infer type if V is empty");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001447 return get(VectorType::get(V.front()->getType(),V.size()), V);
Brian Gaeke02209042004-08-20 06:00:58 +00001448}
1449
1450// destroyConstant - Remove the constant from the constant table...
1451//
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001452void ConstantVector::destroyConstant() {
Owen Anderson59ba8142009-06-19 18:34:09 +00001453 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001454 VectorConstants->remove(this);
Brian Gaeke02209042004-08-20 06:00:58 +00001455 destroyConstantImpl();
1456}
1457
Dan Gohman30978072007-05-24 14:36:04 +00001458/// This function will return true iff every element in this vector constant
Jim Laskeyf0478822007-01-12 22:39:14 +00001459/// is set to all ones.
1460/// @returns true iff this constant's emements are all set to all ones.
1461/// @brief Determine if the value is all ones.
Reid Spencerd84d35b2007-02-15 02:26:10 +00001462bool ConstantVector::isAllOnesValue() const {
Jim Laskeyf0478822007-01-12 22:39:14 +00001463 // Check out first element.
1464 const Constant *Elt = getOperand(0);
1465 const ConstantInt *CI = dyn_cast<ConstantInt>(Elt);
1466 if (!CI || !CI->isAllOnesValue()) return false;
1467 // Then make sure all remaining elements point to the same value.
1468 for (unsigned I = 1, E = getNumOperands(); I < E; ++I) {
1469 if (getOperand(I) != Elt) return false;
1470 }
1471 return true;
1472}
1473
Dan Gohman07159202007-10-17 17:51:30 +00001474/// getSplatValue - If this is a splat constant, where all of the
1475/// elements have the same value, return that value. Otherwise return null.
1476Constant *ConstantVector::getSplatValue() {
1477 // Check out first element.
1478 Constant *Elt = getOperand(0);
1479 // Then make sure all remaining elements point to the same value.
1480 for (unsigned I = 1, E = getNumOperands(); I < E; ++I)
1481 if (getOperand(I) != Elt) return 0;
1482 return Elt;
1483}
1484
Chris Lattner3462ae32001-12-03 22:26:30 +00001485//---- ConstantPointerNull::get() implementation...
Chris Lattnerd7a73302001-10-13 06:57:33 +00001486//
Chris Lattner98fa07b2003-05-23 20:03:32 +00001487
Chris Lattner189d19f2003-11-21 20:23:48 +00001488namespace llvm {
1489 // ConstantPointerNull does not take extra "value" argument...
1490 template<class ValType>
1491 struct ConstantCreator<ConstantPointerNull, PointerType, ValType> {
1492 static ConstantPointerNull *create(const PointerType *Ty, const ValType &V){
1493 return new ConstantPointerNull(Ty);
1494 }
1495 };
Chris Lattner98fa07b2003-05-23 20:03:32 +00001496
Chris Lattner189d19f2003-11-21 20:23:48 +00001497 template<>
1498 struct ConvertConstantType<ConstantPointerNull, PointerType> {
1499 static void convert(ConstantPointerNull *OldC, const PointerType *NewTy) {
1500 // Make everyone now use a constant of the new type...
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001501 Constant *New = ConstantPointerNull::get(NewTy);
Chris Lattner189d19f2003-11-21 20:23:48 +00001502 assert(New != OldC && "Didn't replace constant??");
1503 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001504 OldC->destroyConstant(); // This constant is now dead, destroy it.
Chris Lattner189d19f2003-11-21 20:23:48 +00001505 }
1506 };
1507}
Chris Lattnerb50d1352003-10-05 00:17:43 +00001508
Chris Lattner69edc982006-09-28 00:35:06 +00001509static ManagedStatic<ValueMap<char, PointerType,
1510 ConstantPointerNull> > NullPtrConstants;
Chris Lattnerd7a73302001-10-13 06:57:33 +00001511
Chris Lattner3e650af2004-08-04 04:48:01 +00001512static char getValType(ConstantPointerNull *) {
1513 return 0;
1514}
1515
1516
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001517ConstantPointerNull *ConstantPointerNull::get(const PointerType *Ty) {
Owen Anderson61794042009-06-17 20:10:08 +00001518 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001519 return NullPtrConstants->getOrCreate(Ty, 0);
Chris Lattner883ad0b2001-10-03 15:39:36 +00001520}
1521
Chris Lattner0c6e0b92002-08-18 00:40:04 +00001522// destroyConstant - Remove the constant from the constant table...
1523//
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001524void ConstantPointerNull::destroyConstant() {
Owen Anderson59ba8142009-06-19 18:34:09 +00001525 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001526 NullPtrConstants->remove(this);
Chris Lattner0c6e0b92002-08-18 00:40:04 +00001527 destroyConstantImpl();
1528}
1529
1530
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001531//---- UndefValue::get() implementation...
1532//
1533
1534namespace llvm {
1535 // UndefValue does not take extra "value" argument...
1536 template<class ValType>
1537 struct ConstantCreator<UndefValue, Type, ValType> {
1538 static UndefValue *create(const Type *Ty, const ValType &V) {
1539 return new UndefValue(Ty);
1540 }
1541 };
1542
1543 template<>
1544 struct ConvertConstantType<UndefValue, Type> {
1545 static void convert(UndefValue *OldC, const Type *NewTy) {
1546 // Make everyone now use a constant of the new type.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001547 Constant *New = UndefValue::get(NewTy);
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001548 assert(New != OldC && "Didn't replace constant??");
1549 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001550 OldC->destroyConstant(); // This constant is now dead, destroy it.
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001551 }
1552 };
1553}
1554
Chris Lattner69edc982006-09-28 00:35:06 +00001555static ManagedStatic<ValueMap<char, Type, UndefValue> > UndefValueConstants;
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001556
1557static char getValType(UndefValue *) {
1558 return 0;
1559}
1560
1561
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001562UndefValue *UndefValue::get(const Type *Ty) {
1563 // Implicitly locked.
1564 return UndefValueConstants->getOrCreate(Ty, 0);
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001565}
1566
1567// destroyConstant - Remove the constant from the constant table.
1568//
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001569void UndefValue::destroyConstant() {
Owen Anderson61794042009-06-17 20:10:08 +00001570 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001571 UndefValueConstants->remove(this);
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001572 destroyConstantImpl();
1573}
1574
Nick Lewycky49f89192009-04-04 07:22:01 +00001575//---- MDString::get() implementation
1576//
1577
1578MDString::MDString(const char *begin, const char *end)
Nick Lewyckyadbc2842009-05-30 05:06:04 +00001579 : Constant(Type::MetadataTy, MDStringVal, 0, 0),
Nick Lewycky49f89192009-04-04 07:22:01 +00001580 StrBegin(begin), StrEnd(end) {}
1581
1582static ManagedStatic<StringMap<MDString*> > MDStringCache;
1583
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001584MDString *MDString::get(const char *StrBegin, const char *StrEnd) {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001585 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Owen Andersond830eb82009-06-18 19:10:19 +00001586 StringMapEntry<MDString *> &Entry = MDStringCache->GetOrCreateValue(
1587 StrBegin, StrEnd);
1588 MDString *&S = Entry.getValue();
1589 if (!S) S = new MDString(Entry.getKeyData(),
1590 Entry.getKeyData() + Entry.getKeyLength());
Owen Anderson65c5cd72009-06-17 20:34:43 +00001591
Owen Andersond830eb82009-06-18 19:10:19 +00001592 return S;
Nick Lewycky49f89192009-04-04 07:22:01 +00001593}
1594
Devang Patel4c563162009-06-24 22:42:39 +00001595MDString *MDString::get(const std::string &Str) {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001596 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Devang Patel4c563162009-06-24 22:42:39 +00001597 StringMapEntry<MDString *> &Entry = MDStringCache->GetOrCreateValue(
1598 Str.data(), Str.data() + Str.size());
1599 MDString *&S = Entry.getValue();
1600 if (!S) S = new MDString(Entry.getKeyData(),
1601 Entry.getKeyData() + Entry.getKeyLength());
1602
1603 return S;
1604}
1605
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001606void MDString::destroyConstant() {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001607 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Owen Andersond830eb82009-06-18 19:10:19 +00001608 MDStringCache->erase(MDStringCache->find(StrBegin, StrEnd));
Nick Lewycky49f89192009-04-04 07:22:01 +00001609 destroyConstantImpl();
1610}
1611
1612//---- MDNode::get() implementation
1613//
1614
1615static ManagedStatic<FoldingSet<MDNode> > MDNodeSet;
1616
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00001617MDNode::MDNode(Value*const* Vals, unsigned NumVals)
Nick Lewyckyadbc2842009-05-30 05:06:04 +00001618 : Constant(Type::MetadataTy, MDNodeVal, 0, 0) {
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00001619 for (unsigned i = 0; i != NumVals; ++i)
1620 Node.push_back(ElementVH(Vals[i], this));
Nick Lewycky49f89192009-04-04 07:22:01 +00001621}
1622
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00001623void MDNode::Profile(FoldingSetNodeID &ID) const {
1624 for (const_elem_iterator I = elem_begin(), E = elem_end(); I != E; ++I)
Nick Lewycky49f89192009-04-04 07:22:01 +00001625 ID.AddPointer(*I);
1626}
1627
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001628MDNode *MDNode::get(Value*const* Vals, unsigned NumVals) {
Nick Lewycky49f89192009-04-04 07:22:01 +00001629 FoldingSetNodeID ID;
1630 for (unsigned i = 0; i != NumVals; ++i)
1631 ID.AddPointer(Vals[i]);
1632
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001633 ConstantsLock->reader_acquire();
Owen Andersond830eb82009-06-18 19:10:19 +00001634 void *InsertPoint;
1635 MDNode *N = MDNodeSet->FindNodeOrInsertPos(ID, InsertPoint);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001636 ConstantsLock->reader_release();
Owen Andersond830eb82009-06-18 19:10:19 +00001637
1638 if (!N) {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001639 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001640 N = MDNodeSet->FindNodeOrInsertPos(ID, InsertPoint);
1641 if (!N) {
Owen Andersond830eb82009-06-18 19:10:19 +00001642 // InsertPoint will have been set by the FindNodeOrInsertPos call.
1643 N = new(0) MDNode(Vals, NumVals);
1644 MDNodeSet->InsertNode(N, InsertPoint);
Owen Anderson2d7231d2009-06-17 18:40:29 +00001645 }
Owen Anderson2d7231d2009-06-17 18:40:29 +00001646 }
Owen Andersond830eb82009-06-18 19:10:19 +00001647 return N;
Nick Lewycky49f89192009-04-04 07:22:01 +00001648}
1649
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001650void MDNode::destroyConstant() {
Owen Anderson5c96ef72009-07-07 18:33:04 +00001651 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Owen Andersond830eb82009-06-18 19:10:19 +00001652 MDNodeSet->RemoveNode(this);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001653
Nick Lewycky49f89192009-04-04 07:22:01 +00001654 destroyConstantImpl();
1655}
Chris Lattnerd5f67d82004-10-16 18:07:16 +00001656
Vikram S. Adve4e537b22002-07-14 23:13:17 +00001657//---- ConstantExpr::get() implementations...
Vikram S. Adve4e537b22002-07-14 23:13:17 +00001658//
Reid Spencer8d9336d2006-12-31 05:26:44 +00001659
Dan Gohmand78c4002008-05-13 00:00:25 +00001660namespace {
1661
Reid Spenceree3c9912006-12-04 05:19:50 +00001662struct ExprMapKeyType {
Dan Gohman1ecaf452008-05-31 00:58:22 +00001663 typedef SmallVector<unsigned, 4> IndexList;
1664
1665 ExprMapKeyType(unsigned opc,
1666 const std::vector<Constant*> &ops,
1667 unsigned short pred = 0,
1668 const IndexList &inds = IndexList())
1669 : opcode(opc), predicate(pred), operands(ops), indices(inds) {}
Reid Spencerdba6aa42006-12-04 18:38:05 +00001670 uint16_t opcode;
1671 uint16_t predicate;
Reid Spenceree3c9912006-12-04 05:19:50 +00001672 std::vector<Constant*> operands;
Dan Gohman1ecaf452008-05-31 00:58:22 +00001673 IndexList indices;
Reid Spenceree3c9912006-12-04 05:19:50 +00001674 bool operator==(const ExprMapKeyType& that) const {
1675 return this->opcode == that.opcode &&
1676 this->predicate == that.predicate &&
Bill Wendling97f7de82008-10-26 00:19:56 +00001677 this->operands == that.operands &&
Dan Gohman1ecaf452008-05-31 00:58:22 +00001678 this->indices == that.indices;
Reid Spenceree3c9912006-12-04 05:19:50 +00001679 }
1680 bool operator<(const ExprMapKeyType & that) const {
1681 return this->opcode < that.opcode ||
1682 (this->opcode == that.opcode && this->predicate < that.predicate) ||
1683 (this->opcode == that.opcode && this->predicate == that.predicate &&
Dan Gohman1ecaf452008-05-31 00:58:22 +00001684 this->operands < that.operands) ||
1685 (this->opcode == that.opcode && this->predicate == that.predicate &&
1686 this->operands == that.operands && this->indices < that.indices);
Reid Spenceree3c9912006-12-04 05:19:50 +00001687 }
1688
1689 bool operator!=(const ExprMapKeyType& that) const {
1690 return !(*this == that);
1691 }
1692};
Chris Lattner98fa07b2003-05-23 20:03:32 +00001693
Dan Gohmand78c4002008-05-13 00:00:25 +00001694}
1695
Chris Lattner189d19f2003-11-21 20:23:48 +00001696namespace llvm {
1697 template<>
1698 struct ConstantCreator<ConstantExpr, Type, ExprMapKeyType> {
Reid Spencer10fbf0e2006-12-03 05:48:19 +00001699 static ConstantExpr *create(const Type *Ty, const ExprMapKeyType &V,
1700 unsigned short pred = 0) {
Reid Spenceree3c9912006-12-04 05:19:50 +00001701 if (Instruction::isCast(V.opcode))
1702 return new UnaryConstantExpr(V.opcode, V.operands[0], Ty);
1703 if ((V.opcode >= Instruction::BinaryOpsBegin &&
Reid Spencer2341c222007-02-02 02:16:23 +00001704 V.opcode < Instruction::BinaryOpsEnd))
Reid Spenceree3c9912006-12-04 05:19:50 +00001705 return new BinaryConstantExpr(V.opcode, V.operands[0], V.operands[1]);
1706 if (V.opcode == Instruction::Select)
1707 return new SelectConstantExpr(V.operands[0], V.operands[1],
1708 V.operands[2]);
1709 if (V.opcode == Instruction::ExtractElement)
1710 return new ExtractElementConstantExpr(V.operands[0], V.operands[1]);
1711 if (V.opcode == Instruction::InsertElement)
1712 return new InsertElementConstantExpr(V.operands[0], V.operands[1],
1713 V.operands[2]);
1714 if (V.opcode == Instruction::ShuffleVector)
1715 return new ShuffleVectorConstantExpr(V.operands[0], V.operands[1],
1716 V.operands[2]);
Dan Gohman1ecaf452008-05-31 00:58:22 +00001717 if (V.opcode == Instruction::InsertValue)
1718 return new InsertValueConstantExpr(V.operands[0], V.operands[1],
1719 V.indices, Ty);
1720 if (V.opcode == Instruction::ExtractValue)
1721 return new ExtractValueConstantExpr(V.operands[0], V.indices, Ty);
Reid Spenceree3c9912006-12-04 05:19:50 +00001722 if (V.opcode == Instruction::GetElementPtr) {
1723 std::vector<Constant*> IdxList(V.operands.begin()+1, V.operands.end());
Gabor Greife9ecc682008-04-06 20:25:17 +00001724 return GetElementPtrConstantExpr::Create(V.operands[0], IdxList, Ty);
Reid Spenceree3c9912006-12-04 05:19:50 +00001725 }
Misha Brukmanb1c93172005-04-21 23:48:37 +00001726
Reid Spenceree3c9912006-12-04 05:19:50 +00001727 // The compare instructions are weird. We have to encode the predicate
1728 // value and it is combined with the instruction opcode by multiplying
1729 // the opcode by one hundred. We must decode this to get the predicate.
1730 if (V.opcode == Instruction::ICmp)
Nate Begemand2195702008-05-12 19:01:56 +00001731 return new CompareConstantExpr(Ty, Instruction::ICmp, V.predicate,
Reid Spenceree3c9912006-12-04 05:19:50 +00001732 V.operands[0], V.operands[1]);
1733 if (V.opcode == Instruction::FCmp)
Nate Begemand2195702008-05-12 19:01:56 +00001734 return new CompareConstantExpr(Ty, Instruction::FCmp, V.predicate,
1735 V.operands[0], V.operands[1]);
Torok Edwinfbcc6632009-07-14 16:55:14 +00001736 llvm_unreachable("Invalid ConstantExpr!");
Jeff Cohen9f469632006-12-15 21:47:01 +00001737 return 0;
Chris Lattnerb50d1352003-10-05 00:17:43 +00001738 }
Chris Lattner189d19f2003-11-21 20:23:48 +00001739 };
Chris Lattnerb50d1352003-10-05 00:17:43 +00001740
Chris Lattner189d19f2003-11-21 20:23:48 +00001741 template<>
1742 struct ConvertConstantType<ConstantExpr, Type> {
1743 static void convert(ConstantExpr *OldC, const Type *NewTy) {
1744 Constant *New;
1745 switch (OldC->getOpcode()) {
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001746 case Instruction::Trunc:
1747 case Instruction::ZExt:
1748 case Instruction::SExt:
1749 case Instruction::FPTrunc:
1750 case Instruction::FPExt:
1751 case Instruction::UIToFP:
1752 case Instruction::SIToFP:
1753 case Instruction::FPToUI:
1754 case Instruction::FPToSI:
1755 case Instruction::PtrToInt:
1756 case Instruction::IntToPtr:
1757 case Instruction::BitCast:
Reid Spencerbb65ebf2006-12-12 23:36:14 +00001758 New = ConstantExpr::getCast(OldC->getOpcode(), OldC->getOperand(0),
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001759 NewTy);
Chris Lattner189d19f2003-11-21 20:23:48 +00001760 break;
Chris Lattner6e415c02004-03-12 05:54:04 +00001761 case Instruction::Select:
1762 New = ConstantExpr::getSelectTy(NewTy, OldC->getOperand(0),
1763 OldC->getOperand(1),
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001764 OldC->getOperand(2));
Chris Lattner6e415c02004-03-12 05:54:04 +00001765 break;
Chris Lattner189d19f2003-11-21 20:23:48 +00001766 default:
1767 assert(OldC->getOpcode() >= Instruction::BinaryOpsBegin &&
Reid Spencer7eb55b32006-11-02 01:53:59 +00001768 OldC->getOpcode() < Instruction::BinaryOpsEnd);
Chris Lattner189d19f2003-11-21 20:23:48 +00001769 New = ConstantExpr::getTy(NewTy, OldC->getOpcode(), OldC->getOperand(0),
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001770 OldC->getOperand(1));
Chris Lattner189d19f2003-11-21 20:23:48 +00001771 break;
1772 case Instruction::GetElementPtr:
Misha Brukmanb1c93172005-04-21 23:48:37 +00001773 // Make everyone now use a constant of the new type...
Chris Lattner13128ab2004-10-11 22:52:25 +00001774 std::vector<Value*> Idx(OldC->op_begin()+1, OldC->op_end());
Chris Lattner302116a2007-01-31 04:40:28 +00001775 New = ConstantExpr::getGetElementPtrTy(NewTy, OldC->getOperand(0),
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001776 &Idx[0], Idx.size());
Chris Lattner189d19f2003-11-21 20:23:48 +00001777 break;
1778 }
Misha Brukmanb1c93172005-04-21 23:48:37 +00001779
Chris Lattner189d19f2003-11-21 20:23:48 +00001780 assert(New != OldC && "Didn't replace constant??");
1781 OldC->uncheckedReplaceAllUsesWith(New);
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001782 OldC->destroyConstant(); // This constant is now dead, destroy it.
Chris Lattner189d19f2003-11-21 20:23:48 +00001783 }
1784 };
1785} // end namespace llvm
Chris Lattnerb50d1352003-10-05 00:17:43 +00001786
1787
Chris Lattner3e650af2004-08-04 04:48:01 +00001788static ExprMapKeyType getValType(ConstantExpr *CE) {
1789 std::vector<Constant*> Operands;
1790 Operands.reserve(CE->getNumOperands());
1791 for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i)
1792 Operands.push_back(cast<Constant>(CE->getOperand(i)));
Reid Spenceree3c9912006-12-04 05:19:50 +00001793 return ExprMapKeyType(CE->getOpcode(), Operands,
Dan Gohman1ecaf452008-05-31 00:58:22 +00001794 CE->isCompare() ? CE->getPredicate() : 0,
1795 CE->hasIndices() ?
1796 CE->getIndices() : SmallVector<unsigned, 4>());
Chris Lattner3e650af2004-08-04 04:48:01 +00001797}
1798
Chris Lattner69edc982006-09-28 00:35:06 +00001799static ManagedStatic<ValueMap<ExprMapKeyType, Type,
1800 ConstantExpr> > ExprConstants;
Vikram S. Adve4c485332002-07-15 18:19:33 +00001801
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001802/// This is a utility function to handle folding of casts and lookup of the
Duncan Sands7d6c8ae2008-03-30 19:38:55 +00001803/// cast in the ExprConstants map. It is used by the various get* methods below.
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001804static inline Constant *getFoldedCast(
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001805 Instruction::CastOps opc, Constant *C, const Type *Ty) {
Chris Lattner815ae2b2003-10-07 22:19:19 +00001806 assert(Ty->isFirstClassType() && "Cannot cast to an aggregate type!");
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001807 // Fold a few common cases
Owen Anderson53a52212009-07-13 04:09:18 +00001808 if (Constant *FC =
1809 ConstantFoldCastInstruction(getGlobalContext(), opc, C, Ty))
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001810 return FC;
Chris Lattneracdbe712003-04-17 19:24:48 +00001811
Vikram S. Adve4c485332002-07-15 18:19:33 +00001812 // Look up the constant in the table first to ensure uniqueness
Chris Lattner2b383d2e2003-05-13 21:37:02 +00001813 std::vector<Constant*> argVec(1, C);
Reid Spenceree3c9912006-12-04 05:19:50 +00001814 ExprMapKeyType Key(opc, argVec);
Owen Anderson2d7231d2009-06-17 18:40:29 +00001815
Owen Anderson61794042009-06-17 20:10:08 +00001816 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001817 return ExprConstants->getOrCreate(Ty, Key);
Vikram S. Adve4e537b22002-07-14 23:13:17 +00001818}
Reid Spencerf37dc652006-12-05 19:14:13 +00001819
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001820Constant *ConstantExpr::getCast(unsigned oc, Constant *C, const Type *Ty) {
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001821 Instruction::CastOps opc = Instruction::CastOps(oc);
1822 assert(Instruction::isCast(opc) && "opcode out of range");
1823 assert(C && Ty && "Null arguments to getCast");
1824 assert(Ty->isFirstClassType() && "Cannot cast to an aggregate type!");
1825
1826 switch (opc) {
1827 default:
Torok Edwinfbcc6632009-07-14 16:55:14 +00001828 llvm_unreachable("Invalid cast opcode");
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001829 break;
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001830 case Instruction::Trunc: return getTrunc(C, Ty);
1831 case Instruction::ZExt: return getZExt(C, Ty);
1832 case Instruction::SExt: return getSExt(C, Ty);
1833 case Instruction::FPTrunc: return getFPTrunc(C, Ty);
1834 case Instruction::FPExt: return getFPExtend(C, Ty);
1835 case Instruction::UIToFP: return getUIToFP(C, Ty);
1836 case Instruction::SIToFP: return getSIToFP(C, Ty);
1837 case Instruction::FPToUI: return getFPToUI(C, Ty);
1838 case Instruction::FPToSI: return getFPToSI(C, Ty);
1839 case Instruction::PtrToInt: return getPtrToInt(C, Ty);
1840 case Instruction::IntToPtr: return getIntToPtr(C, Ty);
1841 case Instruction::BitCast: return getBitCast(C, Ty);
Chris Lattner1ece6f82005-01-01 15:59:57 +00001842 }
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001843 return 0;
Reid Spencerf37dc652006-12-05 19:14:13 +00001844}
1845
Reid Spencer5c140882006-12-04 20:17:56 +00001846Constant *ConstantExpr::getZExtOrBitCast(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001847 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
Reid Spencer5c140882006-12-04 20:17:56 +00001848 return getCast(Instruction::BitCast, C, Ty);
1849 return getCast(Instruction::ZExt, C, Ty);
1850}
1851
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001852Constant *ConstantExpr::getSExtOrBitCast(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001853 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001854 return getCast(Instruction::BitCast, C, Ty);
1855 return getCast(Instruction::SExt, C, Ty);
Reid Spencer5c140882006-12-04 20:17:56 +00001856}
1857
1858Constant *ConstantExpr::getTruncOrBitCast(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001859 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
Reid Spencer5c140882006-12-04 20:17:56 +00001860 return getCast(Instruction::BitCast, C, Ty);
1861 return getCast(Instruction::Trunc, C, Ty);
1862}
1863
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001864Constant *ConstantExpr::getPointerCast(Constant *S, const Type *Ty) {
Reid Spencerbc245a02006-12-05 03:25:26 +00001865 assert(isa<PointerType>(S->getType()) && "Invalid cast");
Chris Lattner03c49532007-01-15 02:27:26 +00001866 assert((Ty->isInteger() || isa<PointerType>(Ty)) && "Invalid cast");
Reid Spencerbc245a02006-12-05 03:25:26 +00001867
Chris Lattner03c49532007-01-15 02:27:26 +00001868 if (Ty->isInteger())
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001869 return getCast(Instruction::PtrToInt, S, Ty);
1870 return getCast(Instruction::BitCast, S, Ty);
Reid Spencerbc245a02006-12-05 03:25:26 +00001871}
1872
Reid Spencer56521c42006-12-12 00:51:07 +00001873Constant *ConstantExpr::getIntegerCast(Constant *C, const Type *Ty,
1874 bool isSigned) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001875 assert(C->getType()->isIntOrIntVector() &&
1876 Ty->isIntOrIntVector() && "Invalid cast");
1877 unsigned SrcBits = C->getType()->getScalarSizeInBits();
1878 unsigned DstBits = Ty->getScalarSizeInBits();
Reid Spencer56521c42006-12-12 00:51:07 +00001879 Instruction::CastOps opcode =
1880 (SrcBits == DstBits ? Instruction::BitCast :
1881 (SrcBits > DstBits ? Instruction::Trunc :
1882 (isSigned ? Instruction::SExt : Instruction::ZExt)));
1883 return getCast(opcode, C, Ty);
1884}
1885
1886Constant *ConstantExpr::getFPCast(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001887 assert(C->getType()->isFPOrFPVector() && Ty->isFPOrFPVector() &&
Reid Spencer56521c42006-12-12 00:51:07 +00001888 "Invalid cast");
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001889 unsigned SrcBits = C->getType()->getScalarSizeInBits();
1890 unsigned DstBits = Ty->getScalarSizeInBits();
Reid Spencerca104e82006-12-12 05:38:50 +00001891 if (SrcBits == DstBits)
1892 return C; // Avoid a useless cast
Reid Spencer56521c42006-12-12 00:51:07 +00001893 Instruction::CastOps opcode =
Reid Spencerca104e82006-12-12 05:38:50 +00001894 (SrcBits > DstBits ? Instruction::FPTrunc : Instruction::FPExt);
Reid Spencer56521c42006-12-12 00:51:07 +00001895 return getCast(opcode, C, Ty);
1896}
1897
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001898Constant *ConstantExpr::getTrunc(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001899#ifndef NDEBUG
1900 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1901 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1902#endif
1903 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1904 assert(C->getType()->isIntOrIntVector() && "Trunc operand must be integer");
1905 assert(Ty->isIntOrIntVector() && "Trunc produces only integral");
1906 assert(C->getType()->getScalarSizeInBits() > Ty->getScalarSizeInBits()&&
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001907 "SrcTy must be larger than DestTy for Trunc!");
1908
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001909 return getFoldedCast(Instruction::Trunc, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001910}
1911
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001912Constant *ConstantExpr::getSExt(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001913#ifndef NDEBUG
1914 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1915 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1916#endif
1917 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1918 assert(C->getType()->isIntOrIntVector() && "SExt operand must be integral");
1919 assert(Ty->isIntOrIntVector() && "SExt produces only integer");
1920 assert(C->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits()&&
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001921 "SrcTy must be smaller than DestTy for SExt!");
1922
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001923 return getFoldedCast(Instruction::SExt, C, Ty);
Chris Lattnerdd284742004-04-04 23:20:30 +00001924}
1925
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001926Constant *ConstantExpr::getZExt(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001927#ifndef NDEBUG
1928 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1929 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1930#endif
1931 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1932 assert(C->getType()->isIntOrIntVector() && "ZEXt operand must be integral");
1933 assert(Ty->isIntOrIntVector() && "ZExt produces only integer");
1934 assert(C->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits()&&
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001935 "SrcTy must be smaller than DestTy for ZExt!");
1936
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001937 return getFoldedCast(Instruction::ZExt, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001938}
1939
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001940Constant *ConstantExpr::getFPTrunc(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001941#ifndef NDEBUG
1942 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1943 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1944#endif
1945 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1946 assert(C->getType()->isFPOrFPVector() && Ty->isFPOrFPVector() &&
1947 C->getType()->getScalarSizeInBits() > Ty->getScalarSizeInBits()&&
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001948 "This is an illegal floating point truncation!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001949 return getFoldedCast(Instruction::FPTrunc, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001950}
1951
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001952Constant *ConstantExpr::getFPExtend(Constant *C, const Type *Ty) {
Dan Gohman7ccc52f2009-06-15 22:12:54 +00001953#ifndef NDEBUG
1954 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1955 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1956#endif
1957 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1958 assert(C->getType()->isFPOrFPVector() && Ty->isFPOrFPVector() &&
1959 C->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits()&&
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001960 "This is an illegal floating point extension!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001961 return getFoldedCast(Instruction::FPExt, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001962}
1963
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001964Constant *ConstantExpr::getUIToFP(Constant *C, const Type *Ty) {
Devang Pateld26344d2008-11-03 23:20:04 +00001965#ifndef NDEBUG
Nate Begemand4d45c22007-11-17 03:58:34 +00001966 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1967 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Pateld26344d2008-11-03 23:20:04 +00001968#endif
Nate Begemand4d45c22007-11-17 03:58:34 +00001969 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1970 assert(C->getType()->isIntOrIntVector() && Ty->isFPOrFPVector() &&
1971 "This is an illegal uint to floating point cast!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001972 return getFoldedCast(Instruction::UIToFP, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001973}
1974
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001975Constant *ConstantExpr::getSIToFP(Constant *C, const Type *Ty) {
Devang Pateld26344d2008-11-03 23:20:04 +00001976#ifndef NDEBUG
Nate Begemand4d45c22007-11-17 03:58:34 +00001977 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1978 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Pateld26344d2008-11-03 23:20:04 +00001979#endif
Nate Begemand4d45c22007-11-17 03:58:34 +00001980 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1981 assert(C->getType()->isIntOrIntVector() && Ty->isFPOrFPVector() &&
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001982 "This is an illegal sint to floating point cast!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001983 return getFoldedCast(Instruction::SIToFP, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001984}
1985
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001986Constant *ConstantExpr::getFPToUI(Constant *C, const Type *Ty) {
Devang Pateld26344d2008-11-03 23:20:04 +00001987#ifndef NDEBUG
Nate Begemand4d45c22007-11-17 03:58:34 +00001988 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1989 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Pateld26344d2008-11-03 23:20:04 +00001990#endif
Nate Begemand4d45c22007-11-17 03:58:34 +00001991 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
1992 assert(C->getType()->isFPOrFPVector() && Ty->isIntOrIntVector() &&
1993 "This is an illegal floating point to uint cast!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001994 return getFoldedCast(Instruction::FPToUI, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00001995}
1996
Owen Anderson0d2de8c2009-06-20 00:24:58 +00001997Constant *ConstantExpr::getFPToSI(Constant *C, const Type *Ty) {
Devang Pateld26344d2008-11-03 23:20:04 +00001998#ifndef NDEBUG
Nate Begemand4d45c22007-11-17 03:58:34 +00001999 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
2000 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Pateld26344d2008-11-03 23:20:04 +00002001#endif
Nate Begemand4d45c22007-11-17 03:58:34 +00002002 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
2003 assert(C->getType()->isFPOrFPVector() && Ty->isIntOrIntVector() &&
2004 "This is an illegal floating point to sint cast!");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002005 return getFoldedCast(Instruction::FPToSI, C, Ty);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002006}
2007
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002008Constant *ConstantExpr::getPtrToInt(Constant *C, const Type *DstTy) {
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002009 assert(isa<PointerType>(C->getType()) && "PtrToInt source must be pointer");
Chris Lattner03c49532007-01-15 02:27:26 +00002010 assert(DstTy->isInteger() && "PtrToInt destination must be integral");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002011 return getFoldedCast(Instruction::PtrToInt, C, DstTy);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002012}
2013
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002014Constant *ConstantExpr::getIntToPtr(Constant *C, const Type *DstTy) {
Chris Lattner03c49532007-01-15 02:27:26 +00002015 assert(C->getType()->isInteger() && "IntToPtr source must be integral");
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002016 assert(isa<PointerType>(DstTy) && "IntToPtr destination must be a pointer");
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002017 return getFoldedCast(Instruction::IntToPtr, C, DstTy);
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002018}
2019
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002020Constant *ConstantExpr::getBitCast(Constant *C, const Type *DstTy) {
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002021 // BitCast implies a no-op cast of type only. No bits change. However, you
2022 // can't cast pointers to anything but pointers.
Devang Pateld26344d2008-11-03 23:20:04 +00002023#ifndef NDEBUG
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002024 const Type *SrcTy = C->getType();
2025 assert((isa<PointerType>(SrcTy) == isa<PointerType>(DstTy)) &&
Reid Spencer5c140882006-12-04 20:17:56 +00002026 "BitCast cannot cast pointer to non-pointer and vice versa");
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002027
2028 // Now we know we're not dealing with mismatched pointer casts (ptr->nonptr
2029 // or nonptr->ptr). For all the other types, the cast is okay if source and
2030 // destination bit widths are identical.
2031 unsigned SrcBitSize = SrcTy->getPrimitiveSizeInBits();
2032 unsigned DstBitSize = DstTy->getPrimitiveSizeInBits();
Devang Pateld26344d2008-11-03 23:20:04 +00002033#endif
Chris Lattnere4086012009-03-08 04:06:26 +00002034 assert(SrcBitSize == DstBitSize && "BitCast requires types of same width");
Chris Lattnercbeda872009-03-21 06:55:54 +00002035
2036 // It is common to ask for a bitcast of a value to its own type, handle this
2037 // speedily.
2038 if (C->getType() == DstTy) return C;
2039
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002040 return getFoldedCast(Instruction::BitCast, C, DstTy);
Chris Lattnerdd284742004-04-04 23:20:30 +00002041}
2042
Chris Lattnerb50d1352003-10-05 00:17:43 +00002043Constant *ConstantExpr::getTy(const Type *ReqTy, unsigned Opcode,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002044 Constant *C1, Constant *C2) {
Chris Lattner38a9bcd2003-05-21 17:49:25 +00002045 // Check the operands for consistency first
Reid Spencer7eb55b32006-11-02 01:53:59 +00002046 assert(Opcode >= Instruction::BinaryOpsBegin &&
2047 Opcode < Instruction::BinaryOpsEnd &&
Chris Lattner38a9bcd2003-05-21 17:49:25 +00002048 "Invalid opcode in binary constant expression");
2049 assert(C1->getType() == C2->getType() &&
2050 "Operand types in binary constant expression should match");
Chris Lattnerb50d1352003-10-05 00:17:43 +00002051
Reid Spencer542964f2007-01-11 18:21:29 +00002052 if (ReqTy == C1->getType() || ReqTy == Type::Int1Ty)
Owen Anderson53a52212009-07-13 04:09:18 +00002053 if (Constant *FC = ConstantFoldBinaryInstruction(
2054 getGlobalContext(), Opcode, C1, C2))
Chris Lattnerb50d1352003-10-05 00:17:43 +00002055 return FC; // Fold a few common cases...
Chris Lattneracdbe712003-04-17 19:24:48 +00002056
Chris Lattner2b383d2e2003-05-13 21:37:02 +00002057 std::vector<Constant*> argVec(1, C1); argVec.push_back(C2);
Reid Spencera009d0d2006-12-04 21:35:24 +00002058 ExprMapKeyType Key(Opcode, argVec);
Owen Anderson61794042009-06-17 20:10:08 +00002059
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002060 // Implicitly locked.
2061 return ExprConstants->getOrCreate(ReqTy, Key);
Vikram S. Adve4e537b22002-07-14 23:13:17 +00002062}
2063
Reid Spencer266e42b2006-12-23 06:05:41 +00002064Constant *ConstantExpr::getCompareTy(unsigned short predicate,
Nate Begeman098cc6f2008-07-25 17:56:27 +00002065 Constant *C1, Constant *C2) {
Reid Spencer266e42b2006-12-23 06:05:41 +00002066 switch (predicate) {
Torok Edwinfbcc6632009-07-14 16:55:14 +00002067 default: llvm_unreachable("Invalid CmpInst predicate");
Nate Begemanc96e2e42008-07-25 17:35:37 +00002068 case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT:
2069 case CmpInst::FCMP_OGE: case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE:
2070 case CmpInst::FCMP_ONE: case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO:
2071 case CmpInst::FCMP_UEQ: case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE:
2072 case CmpInst::FCMP_ULT: case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE:
2073 case CmpInst::FCMP_TRUE:
Nick Lewyckya21d3da2009-07-08 03:04:38 +00002074 return getFCmp(predicate, C1, C2);
2075
Nate Begemanc96e2e42008-07-25 17:35:37 +00002076 case CmpInst::ICMP_EQ: case CmpInst::ICMP_NE: case CmpInst::ICMP_UGT:
2077 case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE:
2078 case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT:
2079 case CmpInst::ICMP_SLE:
Nick Lewyckya21d3da2009-07-08 03:04:38 +00002080 return getICmp(predicate, C1, C2);
Reid Spencer266e42b2006-12-23 06:05:41 +00002081 }
Reid Spencera009d0d2006-12-04 21:35:24 +00002082}
2083
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002084Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2) {
Dan Gohmana5b96452009-06-04 22:49:04 +00002085 // API compatibility: Adjust integer opcodes to floating-point opcodes.
2086 if (C1->getType()->isFPOrFPVector()) {
2087 if (Opcode == Instruction::Add) Opcode = Instruction::FAdd;
2088 else if (Opcode == Instruction::Sub) Opcode = Instruction::FSub;
2089 else if (Opcode == Instruction::Mul) Opcode = Instruction::FMul;
2090 }
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002091#ifndef NDEBUG
2092 switch (Opcode) {
Dan Gohmana5b96452009-06-04 22:49:04 +00002093 case Instruction::Add:
Reid Spencer7eb55b32006-11-02 01:53:59 +00002094 case Instruction::Sub:
Dan Gohmana5b96452009-06-04 22:49:04 +00002095 case Instruction::Mul:
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002096 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohmana5b96452009-06-04 22:49:04 +00002097 assert(C1->getType()->isIntOrIntVector() &&
2098 "Tried to create an integer operation on a non-integer type!");
2099 break;
2100 case Instruction::FAdd:
2101 case Instruction::FSub:
2102 case Instruction::FMul:
2103 assert(C1->getType() == C2->getType() && "Op types should be identical!");
2104 assert(C1->getType()->isFPOrFPVector() &&
2105 "Tried to create a floating-point operation on a "
2106 "non-floating-point type!");
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002107 break;
Reid Spencer7e80b0b2006-10-26 06:15:43 +00002108 case Instruction::UDiv:
2109 case Instruction::SDiv:
2110 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohman7889f2b2009-06-15 22:25:12 +00002111 assert(C1->getType()->isIntOrIntVector() &&
Reid Spencer7e80b0b2006-10-26 06:15:43 +00002112 "Tried to create an arithmetic operation on a non-arithmetic type!");
2113 break;
2114 case Instruction::FDiv:
2115 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohman7889f2b2009-06-15 22:25:12 +00002116 assert(C1->getType()->isFPOrFPVector() &&
2117 "Tried to create an arithmetic operation on a non-arithmetic type!");
Reid Spencer7e80b0b2006-10-26 06:15:43 +00002118 break;
Reid Spencer7eb55b32006-11-02 01:53:59 +00002119 case Instruction::URem:
2120 case Instruction::SRem:
2121 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohman7889f2b2009-06-15 22:25:12 +00002122 assert(C1->getType()->isIntOrIntVector() &&
Reid Spencer7eb55b32006-11-02 01:53:59 +00002123 "Tried to create an arithmetic operation on a non-arithmetic type!");
2124 break;
2125 case Instruction::FRem:
2126 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohman7889f2b2009-06-15 22:25:12 +00002127 assert(C1->getType()->isFPOrFPVector() &&
2128 "Tried to create an arithmetic operation on a non-arithmetic type!");
Reid Spencer7eb55b32006-11-02 01:53:59 +00002129 break;
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002130 case Instruction::And:
2131 case Instruction::Or:
2132 case Instruction::Xor:
2133 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohman7889f2b2009-06-15 22:25:12 +00002134 assert(C1->getType()->isIntOrIntVector() &&
Misha Brukman3852f652005-01-27 06:46:38 +00002135 "Tried to create a logical operation on a non-integral type!");
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002136 break;
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002137 case Instruction::Shl:
Reid Spencerfdff9382006-11-08 06:47:33 +00002138 case Instruction::LShr:
2139 case Instruction::AShr:
Reid Spencer2341c222007-02-02 02:16:23 +00002140 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Dan Gohman79975d52009-03-14 17:09:17 +00002141 assert(C1->getType()->isIntOrIntVector() &&
Chris Lattnercaf3f3e2004-08-17 17:28:46 +00002142 "Tried to create a shift operation on a non-integer type!");
2143 break;
2144 default:
2145 break;
2146 }
2147#endif
2148
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002149 return getTy(C1->getType(), Opcode, C1, C2);
Reid Spencera009d0d2006-12-04 21:35:24 +00002150}
2151
Reid Spencer266e42b2006-12-23 06:05:41 +00002152Constant *ConstantExpr::getCompare(unsigned short pred,
Reid Spencera009d0d2006-12-04 21:35:24 +00002153 Constant *C1, Constant *C2) {
2154 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Reid Spencer266e42b2006-12-23 06:05:41 +00002155 return getCompareTy(pred, C1, C2);
Chris Lattner29ca2c62004-08-04 18:50:09 +00002156}
2157
Chris Lattner6e415c02004-03-12 05:54:04 +00002158Constant *ConstantExpr::getSelectTy(const Type *ReqTy, Constant *C,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002159 Constant *V1, Constant *V2) {
Chris Lattner41632132008-12-29 00:16:12 +00002160 assert(!SelectInst::areInvalidOperands(C, V1, V2)&&"Invalid select operands");
Chris Lattner6e415c02004-03-12 05:54:04 +00002161
2162 if (ReqTy == V1->getType())
Owen Anderson53a52212009-07-13 04:09:18 +00002163 if (Constant *SC = ConstantFoldSelectInstruction(
2164 getGlobalContext(), C, V1, V2))
Chris Lattner6e415c02004-03-12 05:54:04 +00002165 return SC; // Fold common cases
2166
2167 std::vector<Constant*> argVec(3, C);
2168 argVec[1] = V1;
2169 argVec[2] = V2;
Reid Spenceree3c9912006-12-04 05:19:50 +00002170 ExprMapKeyType Key(Instruction::Select, argVec);
Owen Anderson61794042009-06-17 20:10:08 +00002171
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002172 // Implicitly locked.
2173 return ExprConstants->getOrCreate(ReqTy, Key);
Chris Lattner6e415c02004-03-12 05:54:04 +00002174}
2175
Chris Lattnerb50d1352003-10-05 00:17:43 +00002176Constant *ConstantExpr::getGetElementPtrTy(const Type *ReqTy, Constant *C,
Chris Lattner302116a2007-01-31 04:40:28 +00002177 Value* const *Idxs,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002178 unsigned NumIdx) {
Dan Gohman12fce772008-05-15 19:50:34 +00002179 assert(GetElementPtrInst::getIndexedType(C->getType(), Idxs,
2180 Idxs+NumIdx) ==
2181 cast<PointerType>(ReqTy)->getElementType() &&
2182 "GEP indices invalid!");
Chris Lattner04b60fe2004-02-16 20:46:13 +00002183
Owen Anderson53a52212009-07-13 04:09:18 +00002184 if (Constant *FC = ConstantFoldGetElementPtr(
2185 getGlobalContext(), C, (Constant**)Idxs, NumIdx))
Chris Lattneracdbe712003-04-17 19:24:48 +00002186 return FC; // Fold a few common cases...
Chris Lattner04b60fe2004-02-16 20:46:13 +00002187
Chris Lattnerb50d1352003-10-05 00:17:43 +00002188 assert(isa<PointerType>(C->getType()) &&
Chris Lattner98fa07b2003-05-23 20:03:32 +00002189 "Non-pointer type for constant GetElementPtr expression");
Vikram S. Adve4c485332002-07-15 18:19:33 +00002190 // Look up the constant in the table first to ensure uniqueness
Chris Lattner13128ab2004-10-11 22:52:25 +00002191 std::vector<Constant*> ArgVec;
Chris Lattner302116a2007-01-31 04:40:28 +00002192 ArgVec.reserve(NumIdx+1);
Chris Lattner13128ab2004-10-11 22:52:25 +00002193 ArgVec.push_back(C);
Chris Lattner302116a2007-01-31 04:40:28 +00002194 for (unsigned i = 0; i != NumIdx; ++i)
2195 ArgVec.push_back(cast<Constant>(Idxs[i]));
2196 const ExprMapKeyType Key(Instruction::GetElementPtr, ArgVec);
Owen Anderson61794042009-06-17 20:10:08 +00002197
2198 // Implicitly locked.
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002199 return ExprConstants->getOrCreate(ReqTy, Key);
Vikram S. Adve4c485332002-07-15 18:19:33 +00002200}
2201
Chris Lattner302116a2007-01-31 04:40:28 +00002202Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002203 unsigned NumIdx) {
Chris Lattnerb50d1352003-10-05 00:17:43 +00002204 // Get the result type of the getelementptr!
Chris Lattner302116a2007-01-31 04:40:28 +00002205 const Type *Ty =
Dan Gohman12fce772008-05-15 19:50:34 +00002206 GetElementPtrInst::getIndexedType(C->getType(), Idxs, Idxs+NumIdx);
Chris Lattnerb50d1352003-10-05 00:17:43 +00002207 assert(Ty && "GEP indices invalid!");
Christopher Lamb54dd24c2007-12-11 08:59:05 +00002208 unsigned As = cast<PointerType>(C->getType())->getAddressSpace();
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002209 return getGetElementPtrTy(PointerType::get(Ty, As), C, Idxs, NumIdx);
Chris Lattner13128ab2004-10-11 22:52:25 +00002210}
2211
Chris Lattner302116a2007-01-31 04:40:28 +00002212Constant *ConstantExpr::getGetElementPtr(Constant *C, Constant* const *Idxs,
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002213 unsigned NumIdx) {
2214 return getGetElementPtr(C, (Value* const *)Idxs, NumIdx);
Chris Lattnerb50d1352003-10-05 00:17:43 +00002215}
2216
Chris Lattner302116a2007-01-31 04:40:28 +00002217
Reid Spenceree3c9912006-12-04 05:19:50 +00002218Constant *
2219ConstantExpr::getICmp(unsigned short pred, Constant* LHS, Constant* RHS) {
2220 assert(LHS->getType() == RHS->getType());
2221 assert(pred >= ICmpInst::FIRST_ICMP_PREDICATE &&
2222 pred <= ICmpInst::LAST_ICMP_PREDICATE && "Invalid ICmp Predicate");
2223
Owen Anderson53a52212009-07-13 04:09:18 +00002224 if (Constant *FC = ConstantFoldCompareInstruction(
2225 getGlobalContext(),pred, LHS, RHS))
Reid Spenceree3c9912006-12-04 05:19:50 +00002226 return FC; // Fold a few common cases...
2227
2228 // Look up the constant in the table first to ensure uniqueness
2229 std::vector<Constant*> ArgVec;
2230 ArgVec.push_back(LHS);
2231 ArgVec.push_back(RHS);
Reid Spencerb1537492006-12-24 18:42:29 +00002232 // Get the key type with both the opcode and predicate
Reid Spenceree3c9912006-12-04 05:19:50 +00002233 const ExprMapKeyType Key(Instruction::ICmp, ArgVec, pred);
Owen Anderson61794042009-06-17 20:10:08 +00002234
2235 // Implicitly locked.
2236 return ExprConstants->getOrCreate(Type::Int1Ty, Key);
Reid Spenceree3c9912006-12-04 05:19:50 +00002237}
2238
2239Constant *
2240ConstantExpr::getFCmp(unsigned short pred, Constant* LHS, Constant* RHS) {
2241 assert(LHS->getType() == RHS->getType());
2242 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE && "Invalid FCmp Predicate");
2243
Owen Anderson53a52212009-07-13 04:09:18 +00002244 if (Constant *FC = ConstantFoldCompareInstruction(
2245 getGlobalContext(), pred, LHS, RHS))
Reid Spenceree3c9912006-12-04 05:19:50 +00002246 return FC; // Fold a few common cases...
2247
2248 // Look up the constant in the table first to ensure uniqueness
2249 std::vector<Constant*> ArgVec;
2250 ArgVec.push_back(LHS);
2251 ArgVec.push_back(RHS);
Reid Spencerb1537492006-12-24 18:42:29 +00002252 // Get the key type with both the opcode and predicate
Reid Spenceree3c9912006-12-04 05:19:50 +00002253 const ExprMapKeyType Key(Instruction::FCmp, ArgVec, pred);
Owen Anderson61794042009-06-17 20:10:08 +00002254
2255 // Implicitly locked.
2256 return ExprConstants->getOrCreate(Type::Int1Ty, Key);
Reid Spenceree3c9912006-12-04 05:19:50 +00002257}
2258
Robert Bocchino23004482006-01-10 19:05:34 +00002259Constant *ConstantExpr::getExtractElementTy(const Type *ReqTy, Constant *Val,
2260 Constant *Idx) {
Owen Anderson53a52212009-07-13 04:09:18 +00002261 if (Constant *FC = ConstantFoldExtractElementInstruction(
2262 getGlobalContext(), Val, Idx))
Robert Bocchinode7f1c92006-01-10 20:03:46 +00002263 return FC; // Fold a few common cases...
Robert Bocchino23004482006-01-10 19:05:34 +00002264 // Look up the constant in the table first to ensure uniqueness
2265 std::vector<Constant*> ArgVec(1, Val);
2266 ArgVec.push_back(Idx);
Reid Spenceree3c9912006-12-04 05:19:50 +00002267 const ExprMapKeyType Key(Instruction::ExtractElement,ArgVec);
Owen Anderson61794042009-06-17 20:10:08 +00002268
2269 // Implicitly locked.
2270 return ExprConstants->getOrCreate(ReqTy, Key);
Robert Bocchino23004482006-01-10 19:05:34 +00002271}
2272
2273Constant *ConstantExpr::getExtractElement(Constant *Val, Constant *Idx) {
Reid Spencerd84d35b2007-02-15 02:26:10 +00002274 assert(isa<VectorType>(Val->getType()) &&
Reid Spencer09575ba2007-02-15 03:39:18 +00002275 "Tried to create extractelement operation on non-vector type!");
Reid Spencer8d9336d2006-12-31 05:26:44 +00002276 assert(Idx->getType() == Type::Int32Ty &&
Reid Spencer2546b762007-01-26 07:37:34 +00002277 "Extractelement index must be i32 type!");
Reid Spencerd84d35b2007-02-15 02:26:10 +00002278 return getExtractElementTy(cast<VectorType>(Val->getType())->getElementType(),
Robert Bocchino23004482006-01-10 19:05:34 +00002279 Val, Idx);
2280}
Chris Lattnerb50d1352003-10-05 00:17:43 +00002281
Robert Bocchinoca27f032006-01-17 20:07:22 +00002282Constant *ConstantExpr::getInsertElementTy(const Type *ReqTy, Constant *Val,
2283 Constant *Elt, Constant *Idx) {
Owen Anderson53a52212009-07-13 04:09:18 +00002284 if (Constant *FC = ConstantFoldInsertElementInstruction(
2285 getGlobalContext(), Val, Elt, Idx))
Robert Bocchinoca27f032006-01-17 20:07:22 +00002286 return FC; // Fold a few common cases...
2287 // Look up the constant in the table first to ensure uniqueness
2288 std::vector<Constant*> ArgVec(1, Val);
2289 ArgVec.push_back(Elt);
2290 ArgVec.push_back(Idx);
Reid Spenceree3c9912006-12-04 05:19:50 +00002291 const ExprMapKeyType Key(Instruction::InsertElement,ArgVec);
Owen Anderson61794042009-06-17 20:10:08 +00002292
2293 // Implicitly locked.
2294 return ExprConstants->getOrCreate(ReqTy, Key);
Robert Bocchinoca27f032006-01-17 20:07:22 +00002295}
2296
2297Constant *ConstantExpr::getInsertElement(Constant *Val, Constant *Elt,
2298 Constant *Idx) {
Reid Spencerd84d35b2007-02-15 02:26:10 +00002299 assert(isa<VectorType>(Val->getType()) &&
Reid Spencer09575ba2007-02-15 03:39:18 +00002300 "Tried to create insertelement operation on non-vector type!");
Reid Spencerd84d35b2007-02-15 02:26:10 +00002301 assert(Elt->getType() == cast<VectorType>(Val->getType())->getElementType()
Robert Bocchinoca27f032006-01-17 20:07:22 +00002302 && "Insertelement types must match!");
Reid Spencer8d9336d2006-12-31 05:26:44 +00002303 assert(Idx->getType() == Type::Int32Ty &&
Reid Spencer2546b762007-01-26 07:37:34 +00002304 "Insertelement index must be i32 type!");
Gordon Henriksenb52d1ed2008-08-30 15:41:51 +00002305 return getInsertElementTy(Val->getType(), Val, Elt, Idx);
Robert Bocchinoca27f032006-01-17 20:07:22 +00002306}
2307
Chris Lattnerbbe0a422006-04-08 01:18:18 +00002308Constant *ConstantExpr::getShuffleVectorTy(const Type *ReqTy, Constant *V1,
2309 Constant *V2, Constant *Mask) {
Owen Anderson53a52212009-07-13 04:09:18 +00002310 if (Constant *FC = ConstantFoldShuffleVectorInstruction(
2311 getGlobalContext(), V1, V2, Mask))
Chris Lattnerbbe0a422006-04-08 01:18:18 +00002312 return FC; // Fold a few common cases...
2313 // Look up the constant in the table first to ensure uniqueness
2314 std::vector<Constant*> ArgVec(1, V1);
2315 ArgVec.push_back(V2);
2316 ArgVec.push_back(Mask);
Reid Spenceree3c9912006-12-04 05:19:50 +00002317 const ExprMapKeyType Key(Instruction::ShuffleVector,ArgVec);
Owen Anderson61794042009-06-17 20:10:08 +00002318
2319 // Implicitly locked.
2320 return ExprConstants->getOrCreate(ReqTy, Key);
Chris Lattnerbbe0a422006-04-08 01:18:18 +00002321}
2322
2323Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,
2324 Constant *Mask) {
2325 assert(ShuffleVectorInst::isValidOperands(V1, V2, Mask) &&
2326 "Invalid shuffle vector constant expr operands!");
Nate Begeman94aa38d2009-02-12 21:28:33 +00002327
2328 unsigned NElts = cast<VectorType>(Mask->getType())->getNumElements();
2329 const Type *EltTy = cast<VectorType>(V1->getType())->getElementType();
2330 const Type *ShufTy = VectorType::get(EltTy, NElts);
2331 return getShuffleVectorTy(ShufTy, V1, V2, Mask);
Chris Lattnerbbe0a422006-04-08 01:18:18 +00002332}
2333
Dan Gohman12fce772008-05-15 19:50:34 +00002334Constant *ConstantExpr::getInsertValueTy(const Type *ReqTy, Constant *Agg,
2335 Constant *Val,
Dan Gohman1ecaf452008-05-31 00:58:22 +00002336 const unsigned *Idxs, unsigned NumIdx) {
Dan Gohman12fce772008-05-15 19:50:34 +00002337 assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs,
2338 Idxs+NumIdx) == Val->getType() &&
2339 "insertvalue indices invalid!");
2340 assert(Agg->getType() == ReqTy &&
2341 "insertvalue type invalid!");
Dan Gohman0752bff2008-05-23 00:36:11 +00002342 assert(Agg->getType()->isFirstClassType() &&
2343 "Non-first-class type for constant InsertValue expression");
Owen Anderson53a52212009-07-13 04:09:18 +00002344 Constant *FC = ConstantFoldInsertValueInstruction(
2345 getGlobalContext(), Agg, Val, Idxs, NumIdx);
Dan Gohmand5d24f62008-07-21 23:30:30 +00002346 assert(FC && "InsertValue constant expr couldn't be folded!");
2347 return FC;
Dan Gohman12fce772008-05-15 19:50:34 +00002348}
2349
2350Constant *ConstantExpr::getInsertValue(Constant *Agg, Constant *Val,
Dan Gohman1ecaf452008-05-31 00:58:22 +00002351 const unsigned *IdxList, unsigned NumIdx) {
Dan Gohman0752bff2008-05-23 00:36:11 +00002352 assert(Agg->getType()->isFirstClassType() &&
2353 "Tried to create insertelement operation on non-first-class type!");
Dan Gohman12fce772008-05-15 19:50:34 +00002354
Dan Gohman0752bff2008-05-23 00:36:11 +00002355 const Type *ReqTy = Agg->getType();
Devang Pateld26344d2008-11-03 23:20:04 +00002356#ifndef NDEBUG
Dan Gohman0752bff2008-05-23 00:36:11 +00002357 const Type *ValTy =
Dan Gohman12fce772008-05-15 19:50:34 +00002358 ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx);
Devang Pateld26344d2008-11-03 23:20:04 +00002359#endif
Dan Gohman0752bff2008-05-23 00:36:11 +00002360 assert(ValTy == Val->getType() && "insertvalue indices invalid!");
Dan Gohman12fce772008-05-15 19:50:34 +00002361 return getInsertValueTy(ReqTy, Agg, Val, IdxList, NumIdx);
2362}
2363
2364Constant *ConstantExpr::getExtractValueTy(const Type *ReqTy, Constant *Agg,
Dan Gohman1ecaf452008-05-31 00:58:22 +00002365 const unsigned *Idxs, unsigned NumIdx) {
Dan Gohman12fce772008-05-15 19:50:34 +00002366 assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs,
2367 Idxs+NumIdx) == ReqTy &&
2368 "extractvalue indices invalid!");
Dan Gohman0752bff2008-05-23 00:36:11 +00002369 assert(Agg->getType()->isFirstClassType() &&
2370 "Non-first-class type for constant extractvalue expression");
Owen Anderson53a52212009-07-13 04:09:18 +00002371 Constant *FC = ConstantFoldExtractValueInstruction(
2372 getGlobalContext(), Agg, Idxs, NumIdx);
Dan Gohmand5d24f62008-07-21 23:30:30 +00002373 assert(FC && "ExtractValue constant expr couldn't be folded!");
2374 return FC;
Dan Gohman12fce772008-05-15 19:50:34 +00002375}
2376
2377Constant *ConstantExpr::getExtractValue(Constant *Agg,
Dan Gohman1ecaf452008-05-31 00:58:22 +00002378 const unsigned *IdxList, unsigned NumIdx) {
Dan Gohman0752bff2008-05-23 00:36:11 +00002379 assert(Agg->getType()->isFirstClassType() &&
2380 "Tried to create extractelement operation on non-first-class type!");
Dan Gohman12fce772008-05-15 19:50:34 +00002381
2382 const Type *ReqTy =
2383 ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx);
2384 assert(ReqTy && "extractvalue indices invalid!");
2385 return getExtractValueTy(ReqTy, Agg, IdxList, NumIdx);
2386}
2387
Vikram S. Adve4c485332002-07-15 18:19:33 +00002388// destroyConstant - Remove the constant from the constant table...
2389//
Owen Anderson0d2de8c2009-06-20 00:24:58 +00002390void ConstantExpr::destroyConstant() {
2391 // Implicitly locked.
2392 ExprConstants->remove(this);
Vikram S. Adve4c485332002-07-15 18:19:33 +00002393 destroyConstantImpl();
Vikram S. Adve4e537b22002-07-14 23:13:17 +00002394}
2395
Chris Lattner3cd8c562002-07-30 18:54:25 +00002396const char *ConstantExpr::getOpcodeName() const {
2397 return Instruction::getOpcodeName(getOpcode());
Vikram S. Adve4e537b22002-07-14 23:13:17 +00002398}
Reid Spencer1ebe1ab2004-07-17 23:48:33 +00002399
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002400//===----------------------------------------------------------------------===//
2401// replaceUsesOfWithOnConstant implementations
2402
Chris Lattner913849b2007-08-21 00:55:23 +00002403/// replaceUsesOfWithOnConstant - Update this constant array to change uses of
2404/// 'From' to be uses of 'To'. This must update the uniquing data structures
2405/// etc.
2406///
2407/// Note that we intentionally replace all uses of From with To here. Consider
2408/// a large array that uses 'From' 1000 times. By handling this case all here,
2409/// ConstantArray::replaceUsesOfWithOnConstant is only invoked once, and that
2410/// single invocation handles all 1000 uses. Handling them one at a time would
2411/// work, but would be really slow because it would have to unique each updated
2412/// array instance.
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002413void ConstantArray::replaceUsesOfWithOnConstant(Value *From, Value *To,
Chris Lattner7a1450d2005-10-04 18:13:04 +00002414 Use *U) {
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002415 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
Chris Lattner8760ec72005-10-04 01:17:50 +00002416 Constant *ToC = cast<Constant>(To);
Chris Lattnerdff59112005-10-04 18:47:09 +00002417
Jim Laskeyc03caef2006-07-17 17:38:29 +00002418 std::pair<ArrayConstantsTy::MapKey, Constant*> Lookup;
Chris Lattnerb64419a2005-10-03 22:51:37 +00002419 Lookup.first.first = getType();
2420 Lookup.second = this;
Chris Lattnerdff59112005-10-04 18:47:09 +00002421
Chris Lattnerb64419a2005-10-03 22:51:37 +00002422 std::vector<Constant*> &Values = Lookup.first.second;
2423 Values.reserve(getNumOperands()); // Build replacement array.
Chris Lattnerdff59112005-10-04 18:47:09 +00002424
Chris Lattner8760ec72005-10-04 01:17:50 +00002425 // Fill values with the modified operands of the constant array. Also,
2426 // compute whether this turns into an all-zeros array.
Chris Lattnerdff59112005-10-04 18:47:09 +00002427 bool isAllZeros = false;
Chris Lattner913849b2007-08-21 00:55:23 +00002428 unsigned NumUpdated = 0;
Chris Lattnerdff59112005-10-04 18:47:09 +00002429 if (!ToC->isNullValue()) {
Chris Lattner913849b2007-08-21 00:55:23 +00002430 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
2431 Constant *Val = cast<Constant>(O->get());
2432 if (Val == From) {
2433 Val = ToC;
2434 ++NumUpdated;
2435 }
2436 Values.push_back(Val);
2437 }
Chris Lattnerdff59112005-10-04 18:47:09 +00002438 } else {
2439 isAllZeros = true;
2440 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
2441 Constant *Val = cast<Constant>(O->get());
Chris Lattner913849b2007-08-21 00:55:23 +00002442 if (Val == From) {
2443 Val = ToC;
2444 ++NumUpdated;
2445 }
Chris Lattnerdff59112005-10-04 18:47:09 +00002446 Values.push_back(Val);
2447 if (isAllZeros) isAllZeros = Val->isNullValue();
2448 }
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002449 }
2450
Chris Lattnerb64419a2005-10-03 22:51:37 +00002451 Constant *Replacement = 0;
2452 if (isAllZeros) {
2453 Replacement = ConstantAggregateZero::get(getType());
2454 } else {
2455 // Check to see if we have this array type already.
Owen Anderson5c96ef72009-07-07 18:33:04 +00002456 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Chris Lattnerb64419a2005-10-03 22:51:37 +00002457 bool Exists;
Jim Laskeyc03caef2006-07-17 17:38:29 +00002458 ArrayConstantsTy::MapTy::iterator I =
Chris Lattner69edc982006-09-28 00:35:06 +00002459 ArrayConstants->InsertOrGetItem(Lookup, Exists);
Chris Lattnerb64419a2005-10-03 22:51:37 +00002460
2461 if (Exists) {
2462 Replacement = I->second;
2463 } else {
2464 // Okay, the new shape doesn't exist in the system yet. Instead of
2465 // creating a new constant array, inserting it, replaceallusesof'ing the
2466 // old with the new, then deleting the old... just update the current one
2467 // in place!
Chris Lattner69edc982006-09-28 00:35:06 +00002468 ArrayConstants->MoveConstantToNewSlot(this, I);
Chris Lattnerb64419a2005-10-03 22:51:37 +00002469
Chris Lattner913849b2007-08-21 00:55:23 +00002470 // Update to the new value. Optimize for the case when we have a single
2471 // operand that we're changing, but handle bulk updates efficiently.
2472 if (NumUpdated == 1) {
2473 unsigned OperandToUpdate = U-OperandList;
2474 assert(getOperand(OperandToUpdate) == From &&
2475 "ReplaceAllUsesWith broken!");
2476 setOperand(OperandToUpdate, ToC);
2477 } else {
2478 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
2479 if (getOperand(i) == From)
2480 setOperand(i, ToC);
2481 }
Chris Lattnerb64419a2005-10-03 22:51:37 +00002482 return;
2483 }
2484 }
2485
2486 // Otherwise, I do need to replace this with an existing value.
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002487 assert(Replacement != this && "I didn't contain From!");
2488
Chris Lattner7a1450d2005-10-04 18:13:04 +00002489 // Everyone using this now uses the replacement.
2490 uncheckedReplaceAllUsesWith(Replacement);
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002491
2492 // Delete the old constant!
2493 destroyConstant();
2494}
2495
2496void ConstantStruct::replaceUsesOfWithOnConstant(Value *From, Value *To,
Chris Lattner7a1450d2005-10-04 18:13:04 +00002497 Use *U) {
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002498 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
Chris Lattner8760ec72005-10-04 01:17:50 +00002499 Constant *ToC = cast<Constant>(To);
2500
Chris Lattnerdff59112005-10-04 18:47:09 +00002501 unsigned OperandToUpdate = U-OperandList;
2502 assert(getOperand(OperandToUpdate) == From && "ReplaceAllUsesWith broken!");
2503
Jim Laskeyc03caef2006-07-17 17:38:29 +00002504 std::pair<StructConstantsTy::MapKey, Constant*> Lookup;
Chris Lattner8760ec72005-10-04 01:17:50 +00002505 Lookup.first.first = getType();
2506 Lookup.second = this;
2507 std::vector<Constant*> &Values = Lookup.first.second;
2508 Values.reserve(getNumOperands()); // Build replacement struct.
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002509
Chris Lattnerdff59112005-10-04 18:47:09 +00002510
Chris Lattner8760ec72005-10-04 01:17:50 +00002511 // Fill values with the modified operands of the constant struct. Also,
2512 // compute whether this turns into an all-zeros struct.
Chris Lattnerdff59112005-10-04 18:47:09 +00002513 bool isAllZeros = false;
2514 if (!ToC->isNullValue()) {
2515 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O)
2516 Values.push_back(cast<Constant>(O->get()));
2517 } else {
2518 isAllZeros = true;
2519 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
2520 Constant *Val = cast<Constant>(O->get());
2521 Values.push_back(Val);
2522 if (isAllZeros) isAllZeros = Val->isNullValue();
2523 }
Chris Lattner8760ec72005-10-04 01:17:50 +00002524 }
Chris Lattnerdff59112005-10-04 18:47:09 +00002525 Values[OperandToUpdate] = ToC;
2526
Chris Lattner8760ec72005-10-04 01:17:50 +00002527 Constant *Replacement = 0;
2528 if (isAllZeros) {
2529 Replacement = ConstantAggregateZero::get(getType());
2530 } else {
2531 // Check to see if we have this array type already.
Owen Anderson5c96ef72009-07-07 18:33:04 +00002532 sys::SmartScopedWriter<true> Writer(*ConstantsLock);
Chris Lattner8760ec72005-10-04 01:17:50 +00002533 bool Exists;
Jim Laskeyc03caef2006-07-17 17:38:29 +00002534 StructConstantsTy::MapTy::iterator I =
Chris Lattner69edc982006-09-28 00:35:06 +00002535 StructConstants->InsertOrGetItem(Lookup, Exists);
Chris Lattner8760ec72005-10-04 01:17:50 +00002536
2537 if (Exists) {
2538 Replacement = I->second;
2539 } else {
2540 // Okay, the new shape doesn't exist in the system yet. Instead of
2541 // creating a new constant struct, inserting it, replaceallusesof'ing the
2542 // old with the new, then deleting the old... just update the current one
2543 // in place!
Chris Lattner69edc982006-09-28 00:35:06 +00002544 StructConstants->MoveConstantToNewSlot(this, I);
Chris Lattner8760ec72005-10-04 01:17:50 +00002545
Chris Lattnerdff59112005-10-04 18:47:09 +00002546 // Update to the new value.
2547 setOperand(OperandToUpdate, ToC);
Chris Lattner8760ec72005-10-04 01:17:50 +00002548 return;
2549 }
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002550 }
2551
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002552 assert(Replacement != this && "I didn't contain From!");
2553
Chris Lattner7a1450d2005-10-04 18:13:04 +00002554 // Everyone using this now uses the replacement.
2555 uncheckedReplaceAllUsesWith(Replacement);
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002556
2557 // Delete the old constant!
2558 destroyConstant();
2559}
2560
Reid Spencerd84d35b2007-02-15 02:26:10 +00002561void ConstantVector::replaceUsesOfWithOnConstant(Value *From, Value *To,
Chris Lattner7a1450d2005-10-04 18:13:04 +00002562 Use *U) {
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002563 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
2564
2565 std::vector<Constant*> Values;
2566 Values.reserve(getNumOperands()); // Build replacement array...
2567 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2568 Constant *Val = getOperand(i);
2569 if (Val == From) Val = cast<Constant>(To);
2570 Values.push_back(Val);
2571 }
2572
Reid Spencerd84d35b2007-02-15 02:26:10 +00002573 Constant *Replacement = ConstantVector::get(getType(), Values);
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002574 assert(Replacement != this && "I didn't contain From!");
2575
Chris Lattner7a1450d2005-10-04 18:13:04 +00002576 // Everyone using this now uses the replacement.
2577 uncheckedReplaceAllUsesWith(Replacement);
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002578
2579 // Delete the old constant!
2580 destroyConstant();
2581}
2582
2583void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,
Chris Lattner7a1450d2005-10-04 18:13:04 +00002584 Use *U) {
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002585 assert(isa<Constant>(ToV) && "Cannot make Constant refer to non-constant!");
2586 Constant *To = cast<Constant>(ToV);
2587
2588 Constant *Replacement = 0;
2589 if (getOpcode() == Instruction::GetElementPtr) {
Chris Lattnerb5d70302007-02-19 20:01:23 +00002590 SmallVector<Constant*, 8> Indices;
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002591 Constant *Pointer = getOperand(0);
2592 Indices.reserve(getNumOperands()-1);
2593 if (Pointer == From) Pointer = To;
2594
2595 for (unsigned i = 1, e = getNumOperands(); i != e; ++i) {
2596 Constant *Val = getOperand(i);
2597 if (Val == From) Val = To;
2598 Indices.push_back(Val);
2599 }
Chris Lattnerb5d70302007-02-19 20:01:23 +00002600 Replacement = ConstantExpr::getGetElementPtr(Pointer,
2601 &Indices[0], Indices.size());
Dan Gohman12fce772008-05-15 19:50:34 +00002602 } else if (getOpcode() == Instruction::ExtractValue) {
Dan Gohman12fce772008-05-15 19:50:34 +00002603 Constant *Agg = getOperand(0);
Dan Gohman12fce772008-05-15 19:50:34 +00002604 if (Agg == From) Agg = To;
2605
Dan Gohman1ecaf452008-05-31 00:58:22 +00002606 const SmallVector<unsigned, 4> &Indices = getIndices();
Dan Gohman12fce772008-05-15 19:50:34 +00002607 Replacement = ConstantExpr::getExtractValue(Agg,
2608 &Indices[0], Indices.size());
2609 } else if (getOpcode() == Instruction::InsertValue) {
Dan Gohman12fce772008-05-15 19:50:34 +00002610 Constant *Agg = getOperand(0);
2611 Constant *Val = getOperand(1);
Dan Gohman12fce772008-05-15 19:50:34 +00002612 if (Agg == From) Agg = To;
2613 if (Val == From) Val = To;
2614
Dan Gohman1ecaf452008-05-31 00:58:22 +00002615 const SmallVector<unsigned, 4> &Indices = getIndices();
Dan Gohman12fce772008-05-15 19:50:34 +00002616 Replacement = ConstantExpr::getInsertValue(Agg, Val,
2617 &Indices[0], Indices.size());
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002618 } else if (isCast()) {
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002619 assert(getOperand(0) == From && "Cast only has one use!");
Reid Spencer6c38f0b2006-11-27 01:05:10 +00002620 Replacement = ConstantExpr::getCast(getOpcode(), To, getType());
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002621 } else if (getOpcode() == Instruction::Select) {
2622 Constant *C1 = getOperand(0);
2623 Constant *C2 = getOperand(1);
2624 Constant *C3 = getOperand(2);
2625 if (C1 == From) C1 = To;
2626 if (C2 == From) C2 = To;
2627 if (C3 == From) C3 = To;
2628 Replacement = ConstantExpr::getSelect(C1, C2, C3);
Robert Bocchino23004482006-01-10 19:05:34 +00002629 } else if (getOpcode() == Instruction::ExtractElement) {
2630 Constant *C1 = getOperand(0);
2631 Constant *C2 = getOperand(1);
2632 if (C1 == From) C1 = To;
2633 if (C2 == From) C2 = To;
2634 Replacement = ConstantExpr::getExtractElement(C1, C2);
Chris Lattnera93b4b52006-04-08 05:09:48 +00002635 } else if (getOpcode() == Instruction::InsertElement) {
2636 Constant *C1 = getOperand(0);
2637 Constant *C2 = getOperand(1);
2638 Constant *C3 = getOperand(1);
2639 if (C1 == From) C1 = To;
2640 if (C2 == From) C2 = To;
2641 if (C3 == From) C3 = To;
2642 Replacement = ConstantExpr::getInsertElement(C1, C2, C3);
2643 } else if (getOpcode() == Instruction::ShuffleVector) {
2644 Constant *C1 = getOperand(0);
2645 Constant *C2 = getOperand(1);
2646 Constant *C3 = getOperand(2);
2647 if (C1 == From) C1 = To;
2648 if (C2 == From) C2 = To;
2649 if (C3 == From) C3 = To;
2650 Replacement = ConstantExpr::getShuffleVector(C1, C2, C3);
Reid Spenceree3c9912006-12-04 05:19:50 +00002651 } else if (isCompare()) {
2652 Constant *C1 = getOperand(0);
2653 Constant *C2 = getOperand(1);
2654 if (C1 == From) C1 = To;
2655 if (C2 == From) C2 = To;
2656 if (getOpcode() == Instruction::ICmp)
2657 Replacement = ConstantExpr::getICmp(getPredicate(), C1, C2);
Chris Lattnereab49262008-07-14 05:17:31 +00002658 else {
Nick Lewyckya21d3da2009-07-08 03:04:38 +00002659 assert(getOpcode() == Instruction::FCmp);
2660 Replacement = ConstantExpr::getFCmp(getPredicate(), C1, C2);
Chris Lattnereab49262008-07-14 05:17:31 +00002661 }
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002662 } else if (getNumOperands() == 2) {
2663 Constant *C1 = getOperand(0);
2664 Constant *C2 = getOperand(1);
2665 if (C1 == From) C1 = To;
2666 if (C2 == From) C2 = To;
2667 Replacement = ConstantExpr::get(getOpcode(), C1, C2);
2668 } else {
Torok Edwinfbcc6632009-07-14 16:55:14 +00002669 llvm_unreachable("Unknown ConstantExpr type!");
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002670 return;
2671 }
2672
2673 assert(Replacement != this && "I didn't contain From!");
2674
Chris Lattner7a1450d2005-10-04 18:13:04 +00002675 // Everyone using this now uses the replacement.
2676 uncheckedReplaceAllUsesWith(Replacement);
Chris Lattnerc4062ba2005-10-03 21:58:36 +00002677
2678 // Delete the old constant!
2679 destroyConstant();
Matthijs Kooijmanba5d7ef2008-07-03 07:46:41 +00002680}
Nick Lewycky49f89192009-04-04 07:22:01 +00002681
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00002682void MDNode::replaceElement(Value *From, Value *To) {
2683 SmallVector<Value*, 4> Values;
2684 Values.reserve(getNumElements()); // Build replacement array...
2685 for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
2686 Value *Val = getElement(i);
2687 if (Val == From) Val = To;
Nick Lewycky49f89192009-04-04 07:22:01 +00002688 Values.push_back(Val);
2689 }
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00002690
2691 MDNode *Replacement = MDNode::get(&Values[0], Values.size());
Nick Lewycky49f89192009-04-04 07:22:01 +00002692 assert(Replacement != this && "I didn't contain From!");
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00002693
Nick Lewycky49f89192009-04-04 07:22:01 +00002694 uncheckedReplaceAllUsesWith(Replacement);
Nick Lewyckyb8f9b7a2009-05-10 20:57:05 +00002695
Nick Lewycky49f89192009-04-04 07:22:01 +00002696 destroyConstant();
2697}