blob: 812692f3fae9680a22e2df64b61be257c1d537a1 [file] [log] [blame]
Chris Lattner9bc02a42003-05-13 21:37:02 +00001//===-- Constants.cpp - Implement Constant nodes --------------------------===//
Misha Brukmanfd939082005-04-21 23:48:37 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-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 Brukmanfd939082005-04-21 23:48:37 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner00950542001-06-06 20:29:01 +00009//
Chris Lattnereb59ca92011-02-07 20:03:14 +000010// This file implements the Constant* classes.
Chris Lattner00950542001-06-06 20:29:01 +000011//
12//===----------------------------------------------------------------------===//
13
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000014#include "llvm/IR/Constants.h"
Chris Lattner92f6fea2007-02-27 03:05:06 +000015#include "ConstantFold.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000016#include "LLVMContextImpl.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/FoldingSet.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SmallVector.h"
21#include "llvm/ADT/StringExtras.h"
22#include "llvm/ADT/StringMap.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000023#include "llvm/IR/DerivedTypes.h"
24#include "llvm/IR/GlobalValue.h"
25#include "llvm/IR/Instructions.h"
26#include "llvm/IR/Module.h"
27#include "llvm/IR/Operator.h"
Chris Lattnera4f0b3a2006-08-27 12:54:02 +000028#include "llvm/Support/Compiler.h"
Bill Wendling2e3def12006-11-17 08:03:48 +000029#include "llvm/Support/Debug.h"
Torok Edwin7d696d82009-07-11 13:10:19 +000030#include "llvm/Support/ErrorHandling.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000031#include "llvm/Support/GetElementPtrTypeIterator.h"
Chris Lattner8a94bf12006-09-28 00:35:06 +000032#include "llvm/Support/ManagedStatic.h"
Bill Wendling2e3def12006-11-17 08:03:48 +000033#include "llvm/Support/MathExtras.h"
Chris Lattner37f077a2009-08-23 04:02:03 +000034#include "llvm/Support/raw_ostream.h"
Chris Lattner00950542001-06-06 20:29:01 +000035#include <algorithm>
Talin41ee4e52011-02-28 23:53:27 +000036#include <cstdarg>
Chris Lattner31f84992003-11-21 20:23:48 +000037using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000038
Chris Lattner00950542001-06-06 20:29:01 +000039//===----------------------------------------------------------------------===//
Chris Lattnere9bb2df2001-12-03 22:26:30 +000040// Constant Class
Chris Lattner00950542001-06-06 20:29:01 +000041//===----------------------------------------------------------------------===//
42
David Blaikie2d24e2a2011-12-20 02:50:00 +000043void Constant::anchor() { }
44
Chris Lattnerb4473872011-07-15 05:58:04 +000045bool Constant::isNegativeZeroValue() const {
46 // Floating point values have an explicit -0.0 value.
47 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
48 return CFP->isZero() && CFP->isNegative();
Galina Kistanovaa46517e2012-07-13 01:25:27 +000049
Chris Lattnerb4473872011-07-15 05:58:04 +000050 // Otherwise, just use +0.0.
51 return isNullValue();
52}
53
Shuxin Yang935e35d2013-01-09 00:13:41 +000054bool Constant::isZeroValue() const {
55 // Floating point values have an explicit -0.0 value.
56 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
57 return CFP->isZero();
58
59 // Otherwise, just use +0.0.
60 return isNullValue();
61}
62
Chris Lattner032c6eb2011-07-15 06:14:08 +000063bool Constant::isNullValue() const {
64 // 0 is null.
65 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
66 return CI->isZero();
Galina Kistanovaa46517e2012-07-13 01:25:27 +000067
Chris Lattner032c6eb2011-07-15 06:14:08 +000068 // +0.0 is null.
69 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
70 return CFP->isZero() && !CFP->isNegative();
71
72 // constant zero is zero for aggregates and cpnull is null for pointers.
73 return isa<ConstantAggregateZero>(this) || isa<ConstantPointerNull>(this);
74}
75
Nadav Rotem4c7c0f22011-08-24 20:18:38 +000076bool Constant::isAllOnesValue() const {
77 // Check for -1 integers
78 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
79 return CI->isMinusOne();
80
81 // Check for FP which are bitcasted from -1 integers
82 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(this))
83 return CFP->getValueAPF().bitcastToAPInt().isAllOnesValue();
84
Benjamin Kramerb518cae2011-11-14 19:12:20 +000085 // Check for constant vectors which are splats of -1 values.
Nadav Rotem4c7c0f22011-08-24 20:18:38 +000086 if (const ConstantVector *CV = dyn_cast<ConstantVector>(this))
Benjamin Kramerb518cae2011-11-14 19:12:20 +000087 if (Constant *Splat = CV->getSplatValue())
88 return Splat->isAllOnesValue();
Nadav Rotem4c7c0f22011-08-24 20:18:38 +000089
Chris Lattnere150e2d2012-01-26 02:31:22 +000090 // Check for constant vectors which are splats of -1 values.
91 if (const ConstantDataVector *CV = dyn_cast<ConstantDataVector>(this))
92 if (Constant *Splat = CV->getSplatValue())
93 return Splat->isAllOnesValue();
94
Nadav Rotem4c7c0f22011-08-24 20:18:38 +000095 return false;
96}
Benjamin Kramerb518cae2011-11-14 19:12:20 +000097
Owen Andersona7235ea2009-07-31 20:28:14 +000098// Constructor to create a '0' constant of arbitrary type...
Chris Lattnerdb125cf2011-07-18 04:54:35 +000099Constant *Constant::getNullValue(Type *Ty) {
Owen Andersona7235ea2009-07-31 20:28:14 +0000100 switch (Ty->getTypeID()) {
101 case Type::IntegerTyID:
102 return ConstantInt::get(Ty, 0);
Dan Gohmance163392011-12-17 00:04:22 +0000103 case Type::HalfTyID:
104 return ConstantFP::get(Ty->getContext(),
105 APFloat::getZero(APFloat::IEEEhalf));
Owen Andersona7235ea2009-07-31 20:28:14 +0000106 case Type::FloatTyID:
Benjamin Kramer98383962010-12-04 14:22:24 +0000107 return ConstantFP::get(Ty->getContext(),
108 APFloat::getZero(APFloat::IEEEsingle));
Owen Andersona7235ea2009-07-31 20:28:14 +0000109 case Type::DoubleTyID:
Benjamin Kramer98383962010-12-04 14:22:24 +0000110 return ConstantFP::get(Ty->getContext(),
111 APFloat::getZero(APFloat::IEEEdouble));
Owen Andersona7235ea2009-07-31 20:28:14 +0000112 case Type::X86_FP80TyID:
Benjamin Kramer98383962010-12-04 14:22:24 +0000113 return ConstantFP::get(Ty->getContext(),
114 APFloat::getZero(APFloat::x87DoubleExtended));
Owen Andersona7235ea2009-07-31 20:28:14 +0000115 case Type::FP128TyID:
116 return ConstantFP::get(Ty->getContext(),
Benjamin Kramer98383962010-12-04 14:22:24 +0000117 APFloat::getZero(APFloat::IEEEquad));
Owen Andersona7235ea2009-07-31 20:28:14 +0000118 case Type::PPC_FP128TyID:
Benjamin Kramer98383962010-12-04 14:22:24 +0000119 return ConstantFP::get(Ty->getContext(),
Benjamin Kramer299ee182010-12-04 14:43:08 +0000120 APFloat(APInt::getNullValue(128)));
Owen Andersona7235ea2009-07-31 20:28:14 +0000121 case Type::PointerTyID:
122 return ConstantPointerNull::get(cast<PointerType>(Ty));
123 case Type::StructTyID:
124 case Type::ArrayTyID:
125 case Type::VectorTyID:
126 return ConstantAggregateZero::get(Ty);
127 default:
128 // Function, Label, or Opaque type?
Craig Topper50bee422012-02-05 22:14:15 +0000129 llvm_unreachable("Cannot create a null constant of that type!");
Owen Andersona7235ea2009-07-31 20:28:14 +0000130 }
131}
132
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000133Constant *Constant::getIntegerValue(Type *Ty, const APInt &V) {
134 Type *ScalarTy = Ty->getScalarType();
Dan Gohman43ee5f72009-08-03 22:07:33 +0000135
136 // Create the base integer constant.
137 Constant *C = ConstantInt::get(Ty->getContext(), V);
138
139 // Convert an integer to a pointer, if necessary.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000140 if (PointerType *PTy = dyn_cast<PointerType>(ScalarTy))
Dan Gohman43ee5f72009-08-03 22:07:33 +0000141 C = ConstantExpr::getIntToPtr(C, PTy);
142
143 // Broadcast a scalar to a vector, if necessary.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000144 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
Chris Lattner3c2c9542012-01-25 05:19:54 +0000145 C = ConstantVector::getSplat(VTy->getNumElements(), C);
Dan Gohman43ee5f72009-08-03 22:07:33 +0000146
147 return C;
148}
149
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000150Constant *Constant::getAllOnesValue(Type *Ty) {
151 if (IntegerType *ITy = dyn_cast<IntegerType>(Ty))
Owen Andersona7235ea2009-07-31 20:28:14 +0000152 return ConstantInt::get(Ty->getContext(),
153 APInt::getAllOnesValue(ITy->getBitWidth()));
Nadav Rotem093399c2011-02-17 21:22:27 +0000154
155 if (Ty->isFloatingPointTy()) {
156 APFloat FL = APFloat::getAllOnesValue(Ty->getPrimitiveSizeInBits(),
157 !Ty->isPPC_FP128Ty());
158 return ConstantFP::get(Ty->getContext(), FL);
159 }
160
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000161 VectorType *VTy = cast<VectorType>(Ty);
Chris Lattner3c2c9542012-01-25 05:19:54 +0000162 return ConstantVector::getSplat(VTy->getNumElements(),
163 getAllOnesValue(VTy->getElementType()));
Owen Andersona7235ea2009-07-31 20:28:14 +0000164}
165
Chris Lattner3d5ed222012-01-25 06:16:32 +0000166/// getAggregateElement - For aggregates (struct/array/vector) return the
167/// constant that corresponds to the specified element if possible, or null if
168/// not. This can return null if the element index is a ConstantExpr, or if
169/// 'this' is a constant expr.
170Constant *Constant::getAggregateElement(unsigned Elt) const {
171 if (const ConstantStruct *CS = dyn_cast<ConstantStruct>(this))
172 return Elt < CS->getNumOperands() ? CS->getOperand(Elt) : 0;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000173
Chris Lattner3d5ed222012-01-25 06:16:32 +0000174 if (const ConstantArray *CA = dyn_cast<ConstantArray>(this))
175 return Elt < CA->getNumOperands() ? CA->getOperand(Elt) : 0;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000176
Chris Lattner3d5ed222012-01-25 06:16:32 +0000177 if (const ConstantVector *CV = dyn_cast<ConstantVector>(this))
178 return Elt < CV->getNumOperands() ? CV->getOperand(Elt) : 0;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000179
Chris Lattner3d5ed222012-01-25 06:16:32 +0000180 if (const ConstantAggregateZero *CAZ =dyn_cast<ConstantAggregateZero>(this))
181 return CAZ->getElementValue(Elt);
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000182
Chris Lattner3d5ed222012-01-25 06:16:32 +0000183 if (const UndefValue *UV = dyn_cast<UndefValue>(this))
184 return UV->getElementValue(Elt);
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000185
Chris Lattner230cdab2012-01-26 00:42:34 +0000186 if (const ConstantDataSequential *CDS =dyn_cast<ConstantDataSequential>(this))
Chris Lattner18c7f802012-02-05 02:29:43 +0000187 return Elt < CDS->getNumElements() ? CDS->getElementAsConstant(Elt) : 0;
Chris Lattner3d5ed222012-01-25 06:16:32 +0000188 return 0;
189}
190
191Constant *Constant::getAggregateElement(Constant *Elt) const {
192 assert(isa<IntegerType>(Elt->getType()) && "Index must be an integer");
193 if (ConstantInt *CI = dyn_cast<ConstantInt>(Elt))
194 return getAggregateElement(CI->getZExtValue());
195 return 0;
196}
197
198
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000199void Constant::destroyConstantImpl() {
200 // When a Constant is destroyed, there may be lingering
Chris Lattnerf5ec48d2001-10-13 06:57:33 +0000201 // references to the constant by other constants in the constant pool. These
Misha Brukmanef6a6a62003-08-21 22:14:26 +0000202 // constants are implicitly dependent on the module that is being deleted,
Chris Lattnerf5ec48d2001-10-13 06:57:33 +0000203 // but they don't know that. Because we only find out when the CPV is
204 // deleted, we must now notify all of our users (that should only be
Chris Lattnere9bb2df2001-12-03 22:26:30 +0000205 // Constants) that they are, in fact, invalid now and should be deleted.
Chris Lattnerf5ec48d2001-10-13 06:57:33 +0000206 //
207 while (!use_empty()) {
208 Value *V = use_back();
209#ifndef NDEBUG // Only in -g mode...
Chris Lattner37f077a2009-08-23 04:02:03 +0000210 if (!isa<Constant>(V)) {
David Greened2e63b72010-01-05 01:29:19 +0000211 dbgs() << "While deleting: " << *this
Chris Lattner37f077a2009-08-23 04:02:03 +0000212 << "\n\nUse still stuck around after Def is destroyed: "
213 << *V << "\n\n";
214 }
Chris Lattnerf5ec48d2001-10-13 06:57:33 +0000215#endif
Vikram S. Adve345e0cf2002-07-14 23:13:17 +0000216 assert(isa<Constant>(V) && "References remain to Constant being destroyed");
Chris Lattner230cdab2012-01-26 00:42:34 +0000217 cast<Constant>(V)->destroyConstant();
Chris Lattnerf5ec48d2001-10-13 06:57:33 +0000218
219 // The constant should remove itself from our use list...
Vikram S. Adve345e0cf2002-07-14 23:13:17 +0000220 assert((use_empty() || use_back() != V) && "Constant not removed!");
Chris Lattnerf5ec48d2001-10-13 06:57:33 +0000221 }
222
223 // Value has no outstanding references it is safe to delete it now...
224 delete this;
Chris Lattner1d87bcf2001-10-01 20:11:19 +0000225}
Chris Lattner00950542001-06-06 20:29:01 +0000226
Chris Lattner35b89fa2006-10-20 00:27:06 +0000227/// canTrap - Return true if evaluation of this constant could trap. This is
228/// true for things like constant expressions that could divide by zero.
229bool Constant::canTrap() const {
230 assert(getType()->isFirstClassType() && "Cannot evaluate aggregate vals!");
231 // The only thing that could possibly trap are constant exprs.
232 const ConstantExpr *CE = dyn_cast<ConstantExpr>(this);
233 if (!CE) return false;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000234
235 // ConstantExpr traps if any operands can trap.
Chris Lattner35b89fa2006-10-20 00:27:06 +0000236 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000237 if (CE->getOperand(i)->canTrap())
Chris Lattner35b89fa2006-10-20 00:27:06 +0000238 return true;
239
240 // Otherwise, only specific operations can trap.
241 switch (CE->getOpcode()) {
242 default:
243 return false;
Reid Spencer1628cec2006-10-26 06:15:43 +0000244 case Instruction::UDiv:
245 case Instruction::SDiv:
246 case Instruction::FDiv:
Reid Spencer0a783f72006-11-02 01:53:59 +0000247 case Instruction::URem:
248 case Instruction::SRem:
249 case Instruction::FRem:
Chris Lattner35b89fa2006-10-20 00:27:06 +0000250 // Div and rem can trap if the RHS is not known to be non-zero.
Chris Lattner0eeb9132009-10-28 05:14:34 +0000251 if (!isa<ConstantInt>(CE->getOperand(1)) ||CE->getOperand(1)->isNullValue())
Chris Lattner35b89fa2006-10-20 00:27:06 +0000252 return true;
253 return false;
254 }
255}
256
Hans Wennborg18398582012-11-15 11:40:00 +0000257/// isThreadDependent - Return true if the value can vary between threads.
258bool Constant::isThreadDependent() const {
259 SmallPtrSet<const Constant*, 64> Visited;
260 SmallVector<const Constant*, 64> WorkList;
261 WorkList.push_back(this);
262 Visited.insert(this);
263
264 while (!WorkList.empty()) {
265 const Constant *C = WorkList.pop_back_val();
266
267 if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) {
268 if (GV->isThreadLocal())
269 return true;
270 }
271
272 for (unsigned I = 0, E = C->getNumOperands(); I != E; ++I) {
Hans Wennborgfbeb9562012-11-16 10:33:25 +0000273 const Constant *D = dyn_cast<Constant>(C->getOperand(I));
274 if (!D)
275 continue;
Hans Wennborg18398582012-11-15 11:40:00 +0000276 if (Visited.insert(D))
277 WorkList.push_back(D);
278 }
279 }
280
281 return false;
282}
283
Chris Lattner4a7642e2009-11-01 18:11:50 +0000284/// isConstantUsed - Return true if the constant has users other than constant
285/// exprs and other dangling things.
286bool Constant::isConstantUsed() const {
Gabor Greif60ad7812010-03-25 23:06:16 +0000287 for (const_use_iterator UI = use_begin(), E = use_end(); UI != E; ++UI) {
Chris Lattner4a7642e2009-11-01 18:11:50 +0000288 const Constant *UC = dyn_cast<Constant>(*UI);
289 if (UC == 0 || isa<GlobalValue>(UC))
290 return true;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000291
Chris Lattner4a7642e2009-11-01 18:11:50 +0000292 if (UC->isConstantUsed())
293 return true;
294 }
295 return false;
296}
297
298
Chris Lattner7cf12c72009-07-22 00:05:44 +0000299
300/// getRelocationInfo - This method classifies the entry according to
301/// whether or not it may generate a relocation entry. This must be
302/// conservative, so if it might codegen to a relocatable entry, it should say
303/// so. The return values are:
304///
Chris Lattner083a1e02009-07-24 03:27:21 +0000305/// NoRelocation: This constant pool entry is guaranteed to never have a
306/// relocation applied to it (because it holds a simple constant like
307/// '4').
308/// LocalRelocation: This entry has relocations, but the entries are
309/// guaranteed to be resolvable by the static linker, so the dynamic
310/// linker will never see them.
311/// GlobalRelocations: This entry may have arbitrary relocations.
Chris Lattner7cf12c72009-07-22 00:05:44 +0000312///
Chandler Carruthc2c50cd2013-01-02 09:10:48 +0000313/// FIXME: This really should not be in IR.
Chris Lattner083a1e02009-07-24 03:27:21 +0000314Constant::PossibleRelocationsTy Constant::getRelocationInfo() const {
315 if (const GlobalValue *GV = dyn_cast<GlobalValue>(this)) {
Chris Lattner7cf12c72009-07-22 00:05:44 +0000316 if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
Chris Lattner083a1e02009-07-24 03:27:21 +0000317 return LocalRelocation; // Local to this file/library.
318 return GlobalRelocations; // Global reference.
Anton Korobeynikovab267a22009-03-29 17:13:18 +0000319 }
Chris Lattner7cf12c72009-07-22 00:05:44 +0000320
Chris Lattner5d81bef2009-10-28 04:12:16 +0000321 if (const BlockAddress *BA = dyn_cast<BlockAddress>(this))
322 return BA->getFunction()->getRelocationInfo();
323
Chris Lattner5099b312010-01-03 18:09:40 +0000324 // While raw uses of blockaddress need to be relocated, differences between
325 // two of them don't when they are for labels in the same function. This is a
326 // common idiom when creating a table for the indirect goto extension, so we
327 // handle it efficiently here.
328 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(this))
329 if (CE->getOpcode() == Instruction::Sub) {
330 ConstantExpr *LHS = dyn_cast<ConstantExpr>(CE->getOperand(0));
331 ConstantExpr *RHS = dyn_cast<ConstantExpr>(CE->getOperand(1));
332 if (LHS && RHS &&
333 LHS->getOpcode() == Instruction::PtrToInt &&
334 RHS->getOpcode() == Instruction::PtrToInt &&
335 isa<BlockAddress>(LHS->getOperand(0)) &&
336 isa<BlockAddress>(RHS->getOperand(0)) &&
337 cast<BlockAddress>(LHS->getOperand(0))->getFunction() ==
338 cast<BlockAddress>(RHS->getOperand(0))->getFunction())
339 return NoRelocation;
340 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000341
Chris Lattner083a1e02009-07-24 03:27:21 +0000342 PossibleRelocationsTy Result = NoRelocation;
Evan Chengafe15812007-03-08 00:59:12 +0000343 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
Chris Lattner0eeb9132009-10-28 05:14:34 +0000344 Result = std::max(Result,
345 cast<Constant>(getOperand(i))->getRelocationInfo());
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000346
Chris Lattner7cf12c72009-07-22 00:05:44 +0000347 return Result;
Evan Chengafe15812007-03-08 00:59:12 +0000348}
349
Chris Lattner13fb0db2011-02-18 04:41:42 +0000350/// removeDeadUsersOfConstant - If the specified constantexpr is dead, remove
351/// it. This involves recursively eliminating any dead users of the
352/// constantexpr.
353static bool removeDeadUsersOfConstant(const Constant *C) {
354 if (isa<GlobalValue>(C)) return false; // Cannot remove this
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000355
Chris Lattner13fb0db2011-02-18 04:41:42 +0000356 while (!C->use_empty()) {
357 const Constant *User = dyn_cast<Constant>(C->use_back());
358 if (!User) return false; // Non-constant usage;
359 if (!removeDeadUsersOfConstant(User))
360 return false; // Constant wasn't dead
361 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000362
Chris Lattner13fb0db2011-02-18 04:41:42 +0000363 const_cast<Constant*>(C)->destroyConstant();
364 return true;
365}
366
367
368/// removeDeadConstantUsers - If there are any dead constant users dangling
369/// off of this constant, remove them. This method is useful for clients
370/// that want to check to see if a global is unused, but don't want to deal
371/// with potentially dead constants hanging off of the globals.
372void Constant::removeDeadConstantUsers() const {
373 Value::const_use_iterator I = use_begin(), E = use_end();
374 Value::const_use_iterator LastNonDeadUser = E;
375 while (I != E) {
376 const Constant *User = dyn_cast<Constant>(*I);
377 if (User == 0) {
378 LastNonDeadUser = I;
379 ++I;
380 continue;
381 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000382
Chris Lattner13fb0db2011-02-18 04:41:42 +0000383 if (!removeDeadUsersOfConstant(User)) {
384 // If the constant wasn't dead, remember that this was the last live use
385 // and move on to the next constant.
386 LastNonDeadUser = I;
387 ++I;
388 continue;
389 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000390
Chris Lattner13fb0db2011-02-18 04:41:42 +0000391 // If the constant was dead, then the iterator is invalidated.
392 if (LastNonDeadUser == E) {
393 I = use_begin();
394 if (I == E) break;
395 } else {
396 I = LastNonDeadUser;
397 ++I;
398 }
399 }
400}
401
402
Chris Lattner86381442008-07-10 00:28:11 +0000403
Chris Lattner00950542001-06-06 20:29:01 +0000404//===----------------------------------------------------------------------===//
Chris Lattner6b6f6ba2007-02-20 06:39:57 +0000405// ConstantInt
Chris Lattner00950542001-06-06 20:29:01 +0000406//===----------------------------------------------------------------------===//
407
David Blaikie2d24e2a2011-12-20 02:50:00 +0000408void ConstantInt::anchor() { }
409
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000410ConstantInt::ConstantInt(IntegerType *Ty, const APInt& V)
Chris Lattnereb41bdd2007-02-20 05:55:46 +0000411 : Constant(Ty, ConstantIntVal, 0, 0), Val(V) {
Reid Spencer532d0ce2007-02-26 23:54:03 +0000412 assert(V.getBitWidth() == Ty->getBitWidth() && "Invalid constant for type");
Chris Lattner00950542001-06-06 20:29:01 +0000413}
414
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000415ConstantInt *ConstantInt::getTrue(LLVMContext &Context) {
Owen Anderson5defacc2009-07-31 17:39:07 +0000416 LLVMContextImpl *pImpl = Context.pImpl;
Benjamin Kramerf601d6d2010-11-20 18:43:35 +0000417 if (!pImpl->TheTrueVal)
418 pImpl->TheTrueVal = ConstantInt::get(Type::getInt1Ty(Context), 1);
419 return pImpl->TheTrueVal;
Owen Anderson5defacc2009-07-31 17:39:07 +0000420}
421
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000422ConstantInt *ConstantInt::getFalse(LLVMContext &Context) {
Owen Anderson5defacc2009-07-31 17:39:07 +0000423 LLVMContextImpl *pImpl = Context.pImpl;
Benjamin Kramerf601d6d2010-11-20 18:43:35 +0000424 if (!pImpl->TheFalseVal)
425 pImpl->TheFalseVal = ConstantInt::get(Type::getInt1Ty(Context), 0);
426 return pImpl->TheFalseVal;
Owen Anderson5defacc2009-07-31 17:39:07 +0000427}
428
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000429Constant *ConstantInt::getTrue(Type *Ty) {
430 VectorType *VTy = dyn_cast<VectorType>(Ty);
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000431 if (!VTy) {
432 assert(Ty->isIntegerTy(1) && "True must be i1 or vector of i1.");
433 return ConstantInt::getTrue(Ty->getContext());
434 }
435 assert(VTy->getElementType()->isIntegerTy(1) &&
436 "True must be vector of i1 or i1.");
Chris Lattner3c2c9542012-01-25 05:19:54 +0000437 return ConstantVector::getSplat(VTy->getNumElements(),
438 ConstantInt::getTrue(Ty->getContext()));
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000439}
440
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000441Constant *ConstantInt::getFalse(Type *Ty) {
442 VectorType *VTy = dyn_cast<VectorType>(Ty);
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000443 if (!VTy) {
444 assert(Ty->isIntegerTy(1) && "False must be i1 or vector of i1.");
445 return ConstantInt::getFalse(Ty->getContext());
446 }
447 assert(VTy->getElementType()->isIntegerTy(1) &&
448 "False must be vector of i1 or i1.");
Chris Lattner3c2c9542012-01-25 05:19:54 +0000449 return ConstantVector::getSplat(VTy->getNumElements(),
450 ConstantInt::getFalse(Ty->getContext()));
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000451}
452
Owen Anderson5defacc2009-07-31 17:39:07 +0000453
Owen Andersoneed707b2009-07-24 23:12:02 +0000454// Get a ConstantInt from an APInt. Note that the value stored in the DenseMap
455// as the key, is a DenseMapAPIntKeyInfo::KeyTy which has provided the
456// operator== and operator!= to ensure that the DenseMap doesn't attempt to
457// compare APInt's of different widths, which would violate an APInt class
458// invariant which generates an assertion.
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000459ConstantInt *ConstantInt::get(LLVMContext &Context, const APInt &V) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000460 // Get the corresponding integer type for the bit width of the value.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000461 IntegerType *ITy = IntegerType::get(Context, V.getBitWidth());
Owen Andersoneed707b2009-07-24 23:12:02 +0000462 // get an existing value or the insertion position
463 DenseMapAPIntKeyInfo::KeyTy Key(V, ITy);
Owen Andersoneed707b2009-07-24 23:12:02 +0000464 ConstantInt *&Slot = Context.pImpl->IntConstants[Key];
Owen Anderson59d5aac2009-10-19 20:11:52 +0000465 if (!Slot) Slot = new ConstantInt(ITy, V);
466 return Slot;
Owen Andersoneed707b2009-07-24 23:12:02 +0000467}
468
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000469Constant *ConstantInt::get(Type *Ty, uint64_t V, bool isSigned) {
Nick Lewyckyd01f50f2011-03-06 03:36:19 +0000470 Constant *C = get(cast<IntegerType>(Ty->getScalarType()), V, isSigned);
Owen Andersoneed707b2009-07-24 23:12:02 +0000471
472 // For vectors, broadcast the value.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000473 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
Chris Lattner3c2c9542012-01-25 05:19:54 +0000474 return ConstantVector::getSplat(VTy->getNumElements(), C);
Owen Andersoneed707b2009-07-24 23:12:02 +0000475
476 return C;
477}
478
Chris Lattnera78fa8c2012-01-27 03:08:05 +0000479ConstantInt *ConstantInt::get(IntegerType *Ty, uint64_t V,
Owen Andersoneed707b2009-07-24 23:12:02 +0000480 bool isSigned) {
481 return get(Ty->getContext(), APInt(Ty->getBitWidth(), V, isSigned));
482}
483
Chris Lattnera78fa8c2012-01-27 03:08:05 +0000484ConstantInt *ConstantInt::getSigned(IntegerType *Ty, int64_t V) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000485 return get(Ty, V, true);
486}
487
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000488Constant *ConstantInt::getSigned(Type *Ty, int64_t V) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000489 return get(Ty, V, true);
490}
491
Chris Lattnera78fa8c2012-01-27 03:08:05 +0000492Constant *ConstantInt::get(Type *Ty, const APInt& V) {
Owen Andersoneed707b2009-07-24 23:12:02 +0000493 ConstantInt *C = get(Ty->getContext(), V);
494 assert(C->getType() == Ty->getScalarType() &&
495 "ConstantInt type doesn't match the type implied by its value!");
496
497 // For vectors, broadcast the value.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000498 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
Chris Lattner3c2c9542012-01-25 05:19:54 +0000499 return ConstantVector::getSplat(VTy->getNumElements(), C);
Owen Andersoneed707b2009-07-24 23:12:02 +0000500
501 return C;
502}
503
Chris Lattnera78fa8c2012-01-27 03:08:05 +0000504ConstantInt *ConstantInt::get(IntegerType* Ty, StringRef Str,
Erick Tryzelaar0e81f662009-08-16 23:36:33 +0000505 uint8_t radix) {
506 return get(Ty->getContext(), APInt(Ty->getBitWidth(), Str, radix));
507}
508
Chris Lattner6b6f6ba2007-02-20 06:39:57 +0000509//===----------------------------------------------------------------------===//
Chris Lattner9b4ee0c2007-02-20 07:17:17 +0000510// ConstantFP
Chris Lattner6b6f6ba2007-02-20 06:39:57 +0000511//===----------------------------------------------------------------------===//
512
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000513static const fltSemantics *TypeToFloatSemantics(Type *Ty) {
Dan Gohmance163392011-12-17 00:04:22 +0000514 if (Ty->isHalfTy())
515 return &APFloat::IEEEhalf;
Chris Lattnercf0fe8d2009-10-05 05:54:46 +0000516 if (Ty->isFloatTy())
Rafael Espindola87d1f472009-07-15 17:40:42 +0000517 return &APFloat::IEEEsingle;
Chris Lattnercf0fe8d2009-10-05 05:54:46 +0000518 if (Ty->isDoubleTy())
Rafael Espindola87d1f472009-07-15 17:40:42 +0000519 return &APFloat::IEEEdouble;
Chris Lattnercf0fe8d2009-10-05 05:54:46 +0000520 if (Ty->isX86_FP80Ty())
Rafael Espindola87d1f472009-07-15 17:40:42 +0000521 return &APFloat::x87DoubleExtended;
Chris Lattnercf0fe8d2009-10-05 05:54:46 +0000522 else if (Ty->isFP128Ty())
Rafael Espindola87d1f472009-07-15 17:40:42 +0000523 return &APFloat::IEEEquad;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000524
Chris Lattnercf0fe8d2009-10-05 05:54:46 +0000525 assert(Ty->isPPC_FP128Ty() && "Unknown FP format");
Rafael Espindola87d1f472009-07-15 17:40:42 +0000526 return &APFloat::PPCDoubleDouble;
527}
528
David Blaikie2d24e2a2011-12-20 02:50:00 +0000529void ConstantFP::anchor() { }
530
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000531/// get() - This returns a constant fp for the specified value in the
532/// specified type. This should only be used for simple constant values like
533/// 2.0/1.0 etc, that are known-valid both as double and as the target format.
Chris Lattnera78fa8c2012-01-27 03:08:05 +0000534Constant *ConstantFP::get(Type *Ty, double V) {
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000535 LLVMContext &Context = Ty->getContext();
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000536
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000537 APFloat FV(V);
538 bool ignored;
539 FV.convert(*TypeToFloatSemantics(Ty->getScalarType()),
540 APFloat::rmNearestTiesToEven, &ignored);
541 Constant *C = get(Context, FV);
542
543 // For vectors, broadcast the value.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000544 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
Chris Lattner3c2c9542012-01-25 05:19:54 +0000545 return ConstantVector::getSplat(VTy->getNumElements(), C);
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000546
547 return C;
548}
549
Erick Tryzelaar0e81f662009-08-16 23:36:33 +0000550
Chris Lattnera78fa8c2012-01-27 03:08:05 +0000551Constant *ConstantFP::get(Type *Ty, StringRef Str) {
Erick Tryzelaar0e81f662009-08-16 23:36:33 +0000552 LLVMContext &Context = Ty->getContext();
553
554 APFloat FV(*TypeToFloatSemantics(Ty->getScalarType()), Str);
555 Constant *C = get(Context, FV);
556
557 // For vectors, broadcast the value.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000558 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
Chris Lattner3c2c9542012-01-25 05:19:54 +0000559 return ConstantVector::getSplat(VTy->getNumElements(), C);
Erick Tryzelaar0e81f662009-08-16 23:36:33 +0000560
561 return C;
562}
563
564
Chris Lattner3c2c9542012-01-25 05:19:54 +0000565ConstantFP *ConstantFP::getNegativeZero(Type *Ty) {
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000566 LLVMContext &Context = Ty->getContext();
Chris Lattner3c2c9542012-01-25 05:19:54 +0000567 APFloat apf = cast<ConstantFP>(Constant::getNullValue(Ty))->getValueAPF();
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000568 apf.changeSign();
569 return get(Context, apf);
570}
571
572
Chris Lattner3c2c9542012-01-25 05:19:54 +0000573Constant *ConstantFP::getZeroValueForNegation(Type *Ty) {
574 Type *ScalarTy = Ty->getScalarType();
575 if (ScalarTy->isFloatingPointTy()) {
576 Constant *C = getNegativeZero(ScalarTy);
577 if (VectorType *VTy = dyn_cast<VectorType>(Ty))
578 return ConstantVector::getSplat(VTy->getNumElements(), C);
579 return C;
580 }
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000581
Owen Andersona7235ea2009-07-31 20:28:14 +0000582 return Constant::getNullValue(Ty);
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000583}
584
585
586// ConstantFP accessors.
587ConstantFP* ConstantFP::get(LLVMContext &Context, const APFloat& V) {
588 DenseMapAPFloatKeyInfo::KeyTy Key(V);
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000589
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000590 LLVMContextImpl* pImpl = Context.pImpl;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000591
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000592 ConstantFP *&Slot = pImpl->FPConstants[Key];
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000593
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000594 if (!Slot) {
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000595 Type *Ty;
Dan Gohmance163392011-12-17 00:04:22 +0000596 if (&V.getSemantics() == &APFloat::IEEEhalf)
597 Ty = Type::getHalfTy(Context);
598 else if (&V.getSemantics() == &APFloat::IEEEsingle)
Owen Anderson59d5aac2009-10-19 20:11:52 +0000599 Ty = Type::getFloatTy(Context);
600 else if (&V.getSemantics() == &APFloat::IEEEdouble)
601 Ty = Type::getDoubleTy(Context);
602 else if (&V.getSemantics() == &APFloat::x87DoubleExtended)
603 Ty = Type::getX86_FP80Ty(Context);
604 else if (&V.getSemantics() == &APFloat::IEEEquad)
605 Ty = Type::getFP128Ty(Context);
606 else {
607 assert(&V.getSemantics() == &APFloat::PPCDoubleDouble &&
608 "Unknown FP format");
609 Ty = Type::getPPC_FP128Ty(Context);
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000610 }
Owen Anderson59d5aac2009-10-19 20:11:52 +0000611 Slot = new ConstantFP(Ty, V);
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000612 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000613
Owen Anderson6f83c9c2009-07-27 20:59:43 +0000614 return Slot;
615}
616
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000617ConstantFP *ConstantFP::getInfinity(Type *Ty, bool Negative) {
Dan Gohmanf344f7f2009-09-25 23:00:48 +0000618 const fltSemantics &Semantics = *TypeToFloatSemantics(Ty);
619 return ConstantFP::get(Ty->getContext(),
620 APFloat::getInf(Semantics, Negative));
621}
622
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000623ConstantFP::ConstantFP(Type *Ty, const APFloat& V)
Dale Johannesenf04afdb2007-08-30 00:23:21 +0000624 : Constant(Ty, ConstantFPVal, 0, 0), Val(V) {
Chris Lattner288e78f2008-04-09 06:38:30 +0000625 assert(&V.getSemantics() == TypeToFloatSemantics(Ty) &&
626 "FP type Mismatch");
Chris Lattner00950542001-06-06 20:29:01 +0000627}
628
Chris Lattner032c6eb2011-07-15 06:14:08 +0000629bool ConstantFP::isExactlyValue(const APFloat &V) const {
Dale Johannesenf04afdb2007-08-30 00:23:21 +0000630 return Val.bitwiseIsEqual(V);
Chris Lattner9b4ee0c2007-02-20 07:17:17 +0000631}
632
Chris Lattner9b4ee0c2007-02-20 07:17:17 +0000633//===----------------------------------------------------------------------===//
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000634// ConstantAggregateZero Implementation
635//===----------------------------------------------------------------------===//
636
637/// getSequentialElement - If this CAZ has array or vector type, return a zero
638/// with the right element type.
Chris Lattner3d5ed222012-01-25 06:16:32 +0000639Constant *ConstantAggregateZero::getSequentialElement() const {
Chris Lattner230cdab2012-01-26 00:42:34 +0000640 return Constant::getNullValue(getType()->getSequentialElementType());
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000641}
642
643/// getStructElement - If this CAZ has struct type, return a zero with the
644/// right element type for the specified element.
Chris Lattner3d5ed222012-01-25 06:16:32 +0000645Constant *ConstantAggregateZero::getStructElement(unsigned Elt) const {
Chris Lattner230cdab2012-01-26 00:42:34 +0000646 return Constant::getNullValue(getType()->getStructElementType(Elt));
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000647}
648
649/// getElementValue - Return a zero of the right value for the specified GEP
650/// index if we can, otherwise return null (e.g. if C is a ConstantExpr).
Chris Lattner3d5ed222012-01-25 06:16:32 +0000651Constant *ConstantAggregateZero::getElementValue(Constant *C) const {
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000652 if (isa<SequentialType>(getType()))
653 return getSequentialElement();
654 return getStructElement(cast<ConstantInt>(C)->getZExtValue());
655}
656
Chris Lattnerdf390282012-01-24 07:54:10 +0000657/// getElementValue - Return a zero of the right value for the specified GEP
658/// index.
Chris Lattner3d5ed222012-01-25 06:16:32 +0000659Constant *ConstantAggregateZero::getElementValue(unsigned Idx) const {
Chris Lattnerdf390282012-01-24 07:54:10 +0000660 if (isa<SequentialType>(getType()))
661 return getSequentialElement();
662 return getStructElement(Idx);
663}
664
665
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000666//===----------------------------------------------------------------------===//
667// UndefValue Implementation
668//===----------------------------------------------------------------------===//
669
670/// getSequentialElement - If this undef has array or vector type, return an
671/// undef with the right element type.
Chris Lattner3d5ed222012-01-25 06:16:32 +0000672UndefValue *UndefValue::getSequentialElement() const {
Chris Lattner230cdab2012-01-26 00:42:34 +0000673 return UndefValue::get(getType()->getSequentialElementType());
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000674}
675
676/// getStructElement - If this undef has struct type, return a zero with the
677/// right element type for the specified element.
Chris Lattner3d5ed222012-01-25 06:16:32 +0000678UndefValue *UndefValue::getStructElement(unsigned Elt) const {
Chris Lattner230cdab2012-01-26 00:42:34 +0000679 return UndefValue::get(getType()->getStructElementType(Elt));
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000680}
681
682/// getElementValue - Return an undef of the right value for the specified GEP
683/// index if we can, otherwise return null (e.g. if C is a ConstantExpr).
Chris Lattner3d5ed222012-01-25 06:16:32 +0000684UndefValue *UndefValue::getElementValue(Constant *C) const {
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000685 if (isa<SequentialType>(getType()))
686 return getSequentialElement();
687 return getStructElement(cast<ConstantInt>(C)->getZExtValue());
688}
689
Chris Lattnerdf390282012-01-24 07:54:10 +0000690/// getElementValue - Return an undef of the right value for the specified GEP
691/// index.
Chris Lattner3d5ed222012-01-25 06:16:32 +0000692UndefValue *UndefValue::getElementValue(unsigned Idx) const {
Chris Lattnerdf390282012-01-24 07:54:10 +0000693 if (isa<SequentialType>(getType()))
694 return getSequentialElement();
695 return getStructElement(Idx);
696}
697
698
Chris Lattnerff2b7f32012-01-24 05:42:11 +0000699
700//===----------------------------------------------------------------------===//
Chris Lattner9b4ee0c2007-02-20 07:17:17 +0000701// ConstantXXX Classes
702//===----------------------------------------------------------------------===//
703
Chris Lattner18c7f802012-02-05 02:29:43 +0000704template <typename ItTy, typename EltTy>
705static bool rangeOnlyContains(ItTy Start, ItTy End, EltTy Elt) {
706 for (; Start != End; ++Start)
707 if (*Start != Elt)
708 return false;
709 return true;
710}
Chris Lattner9b4ee0c2007-02-20 07:17:17 +0000711
Jay Foad166579e2011-07-25 10:14:44 +0000712ConstantArray::ConstantArray(ArrayType *T, ArrayRef<Constant *> V)
Gabor Greifefe65362008-05-10 08:32:32 +0000713 : Constant(T, ConstantArrayVal,
714 OperandTraits<ConstantArray>::op_end(this) - V.size(),
715 V.size()) {
Alkis Evlogimenose0de1d62004-09-15 02:32:15 +0000716 assert(V.size() == T->getNumElements() &&
717 "Invalid initializer vector for constant array");
Jay Foad166579e2011-07-25 10:14:44 +0000718 for (unsigned i = 0, e = V.size(); i != e; ++i)
719 assert(V[i]->getType() == T->getElementType() &&
Alkis Evlogimenoscad90ad2004-09-10 04:16:59 +0000720 "Initializer for array element doesn't match array element type!");
Jay Foad166579e2011-07-25 10:14:44 +0000721 std::copy(V.begin(), V.end(), op_begin());
Chris Lattner00950542001-06-06 20:29:01 +0000722}
723
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000724Constant *ConstantArray::get(ArrayType *Ty, ArrayRef<Constant*> V) {
Chris Lattner18c7f802012-02-05 02:29:43 +0000725 // Empty arrays are canonicalized to ConstantAggregateZero.
726 if (V.empty())
727 return ConstantAggregateZero::get(Ty);
728
Jeffrey Yasskin1fb613c2009-09-30 21:08:08 +0000729 for (unsigned i = 0, e = V.size(); i != e; ++i) {
730 assert(V[i]->getType() == Ty->getElementType() &&
731 "Wrong type in array element initializer");
732 }
Owen Anderson1fd70962009-07-28 18:32:17 +0000733 LLVMContextImpl *pImpl = Ty->getContext().pImpl;
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000734
Chris Lattner18c7f802012-02-05 02:29:43 +0000735 // If this is an all-zero array, return a ConstantAggregateZero object. If
736 // all undef, return an UndefValue, if "all simple", then return a
737 // ConstantDataArray.
738 Constant *C = V[0];
739 if (isa<UndefValue>(C) && rangeOnlyContains(V.begin(), V.end(), C))
740 return UndefValue::get(Ty);
Chris Lattnere150e2d2012-01-26 02:31:22 +0000741
Chris Lattner18c7f802012-02-05 02:29:43 +0000742 if (C->isNullValue() && rangeOnlyContains(V.begin(), V.end(), C))
743 return ConstantAggregateZero::get(Ty);
744
745 // Check to see if all of the elements are ConstantFP or ConstantInt and if
746 // the element type is compatible with ConstantDataVector. If so, use it.
747 if (ConstantDataSequential::isElementTypeCompatible(C->getType())) {
748 // We speculatively build the elements here even if it turns out that there
749 // is a constantexpr or something else weird in the array, since it is so
750 // uncommon for that to happen.
751 if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
752 if (CI->getType()->isIntegerTy(8)) {
753 SmallVector<uint8_t, 16> Elts;
754 for (unsigned i = 0, e = V.size(); i != e; ++i)
755 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
756 Elts.push_back(CI->getZExtValue());
757 else
758 break;
759 if (Elts.size() == V.size())
760 return ConstantDataArray::get(C->getContext(), Elts);
761 } else if (CI->getType()->isIntegerTy(16)) {
762 SmallVector<uint16_t, 16> Elts;
763 for (unsigned i = 0, e = V.size(); i != e; ++i)
764 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
765 Elts.push_back(CI->getZExtValue());
766 else
767 break;
768 if (Elts.size() == V.size())
769 return ConstantDataArray::get(C->getContext(), Elts);
770 } else if (CI->getType()->isIntegerTy(32)) {
771 SmallVector<uint32_t, 16> Elts;
772 for (unsigned i = 0, e = V.size(); i != e; ++i)
773 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
774 Elts.push_back(CI->getZExtValue());
775 else
776 break;
777 if (Elts.size() == V.size())
778 return ConstantDataArray::get(C->getContext(), Elts);
779 } else if (CI->getType()->isIntegerTy(64)) {
780 SmallVector<uint64_t, 16> Elts;
781 for (unsigned i = 0, e = V.size(); i != e; ++i)
782 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
783 Elts.push_back(CI->getZExtValue());
784 else
785 break;
786 if (Elts.size() == V.size())
787 return ConstantDataArray::get(C->getContext(), Elts);
788 }
789 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000790
Chris Lattner18c7f802012-02-05 02:29:43 +0000791 if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
792 if (CFP->getType()->isFloatTy()) {
793 SmallVector<float, 16> Elts;
794 for (unsigned i = 0, e = V.size(); i != e; ++i)
795 if (ConstantFP *CFP = dyn_cast<ConstantFP>(V[i]))
796 Elts.push_back(CFP->getValueAPF().convertToFloat());
797 else
798 break;
799 if (Elts.size() == V.size())
800 return ConstantDataArray::get(C->getContext(), Elts);
801 } else if (CFP->getType()->isDoubleTy()) {
802 SmallVector<double, 16> Elts;
803 for (unsigned i = 0, e = V.size(); i != e; ++i)
804 if (ConstantFP *CFP = dyn_cast<ConstantFP>(V[i]))
805 Elts.push_back(CFP->getValueAPF().convertToDouble());
806 else
807 break;
808 if (Elts.size() == V.size())
809 return ConstantDataArray::get(C->getContext(), Elts);
810 }
811 }
Owen Anderson1fd70962009-07-28 18:32:17 +0000812 }
Chris Lattnere150e2d2012-01-26 02:31:22 +0000813
Chris Lattner18c7f802012-02-05 02:29:43 +0000814 // Otherwise, we really do want to create a ConstantArray.
Chris Lattnere150e2d2012-01-26 02:31:22 +0000815 return pImpl->ArrayConstants.getOrCreate(Ty, V);
Owen Anderson1fd70962009-07-28 18:32:17 +0000816}
817
Chris Lattnerb065b062011-06-20 04:01:31 +0000818/// getTypeForElements - Return an anonymous struct type to use for a constant
819/// with the specified set of elements. The list must not be empty.
820StructType *ConstantStruct::getTypeForElements(LLVMContext &Context,
821 ArrayRef<Constant*> V,
822 bool Packed) {
Bill Wendlinga7a3f042012-02-07 01:27:51 +0000823 unsigned VecSize = V.size();
824 SmallVector<Type*, 16> EltTypes(VecSize);
825 for (unsigned i = 0; i != VecSize; ++i)
826 EltTypes[i] = V[i]->getType();
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000827
Chris Lattnerb065b062011-06-20 04:01:31 +0000828 return StructType::get(Context, EltTypes, Packed);
829}
830
831
832StructType *ConstantStruct::getTypeForElements(ArrayRef<Constant*> V,
833 bool Packed) {
834 assert(!V.empty() &&
835 "ConstantStruct::getTypeForElements cannot be called on empty list");
836 return getTypeForElements(V[0]->getContext(), V, Packed);
837}
838
839
Jay Foad166579e2011-07-25 10:14:44 +0000840ConstantStruct::ConstantStruct(StructType *T, ArrayRef<Constant *> V)
Gabor Greifefe65362008-05-10 08:32:32 +0000841 : Constant(T, ConstantStructVal,
842 OperandTraits<ConstantStruct>::op_end(this) - V.size(),
843 V.size()) {
Chris Lattnerf4ef8db2011-08-07 04:18:48 +0000844 assert(V.size() == T->getNumElements() &&
Vikram S. Adve345e0cf2002-07-14 23:13:17 +0000845 "Invalid initializer vector for constant structure");
Jay Foad166579e2011-07-25 10:14:44 +0000846 for (unsigned i = 0, e = V.size(); i != e; ++i)
847 assert((T->isOpaque() || V[i]->getType() == T->getElementType(i)) &&
Chris Lattnerb8438892003-06-02 17:42:47 +0000848 "Initializer for struct element doesn't match struct element type!");
Jay Foad166579e2011-07-25 10:14:44 +0000849 std::copy(V.begin(), V.end(), op_begin());
Chris Lattner00950542001-06-06 20:29:01 +0000850}
851
Owen Anderson8fa33382009-07-27 22:29:26 +0000852// ConstantStruct accessors.
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000853Constant *ConstantStruct::get(StructType *ST, ArrayRef<Constant*> V) {
Chris Lattner1afcace2011-07-09 17:41:24 +0000854 assert((ST->isOpaque() || ST->getNumElements() == V.size()) &&
855 "Incorrect # elements specified to ConstantStruct::get");
Chris Lattnere150e2d2012-01-26 02:31:22 +0000856
857 // Create a ConstantAggregateZero value if all elements are zeros.
858 bool isZero = true;
859 bool isUndef = false;
860
861 if (!V.empty()) {
862 isUndef = isa<UndefValue>(V[0]);
863 isZero = V[0]->isNullValue();
864 if (isUndef || isZero) {
865 for (unsigned i = 0, e = V.size(); i != e; ++i) {
866 if (!V[i]->isNullValue())
867 isZero = false;
868 if (!isa<UndefValue>(V[i]))
869 isUndef = false;
870 }
871 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000872 }
Chris Lattnere150e2d2012-01-26 02:31:22 +0000873 if (isZero)
874 return ConstantAggregateZero::get(ST);
875 if (isUndef)
876 return UndefValue::get(ST);
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000877
Chris Lattnere150e2d2012-01-26 02:31:22 +0000878 return ST->getContext().pImpl->StructConstants.getOrCreate(ST, V);
Owen Anderson8fa33382009-07-27 22:29:26 +0000879}
880
Chris Lattnerf4ef8db2011-08-07 04:18:48 +0000881Constant *ConstantStruct::get(StructType *T, ...) {
Talin41ee4e52011-02-28 23:53:27 +0000882 va_list ap;
Chris Lattnerb065b062011-06-20 04:01:31 +0000883 SmallVector<Constant*, 8> Values;
884 va_start(ap, T);
885 while (Constant *Val = va_arg(ap, llvm::Constant*))
Talin41ee4e52011-02-28 23:53:27 +0000886 Values.push_back(Val);
Talinbdcd7662011-03-01 18:00:49 +0000887 va_end(ap);
Chris Lattnerb065b062011-06-20 04:01:31 +0000888 return get(T, Values);
Talin41ee4e52011-02-28 23:53:27 +0000889}
890
Jay Foad166579e2011-07-25 10:14:44 +0000891ConstantVector::ConstantVector(VectorType *T, ArrayRef<Constant *> V)
Gabor Greifefe65362008-05-10 08:32:32 +0000892 : Constant(T, ConstantVectorVal,
893 OperandTraits<ConstantVector>::op_end(this) - V.size(),
894 V.size()) {
Jay Foad166579e2011-07-25 10:14:44 +0000895 for (size_t i = 0, e = V.size(); i != e; i++)
896 assert(V[i]->getType() == T->getElementType() &&
Dan Gohmanfa73ea22007-05-24 14:36:04 +0000897 "Initializer for vector element doesn't match vector element type!");
Jay Foad166579e2011-07-25 10:14:44 +0000898 std::copy(V.begin(), V.end(), op_begin());
Brian Gaeke715c90b2004-08-20 06:00:58 +0000899}
900
Owen Andersonaf7ec972009-07-28 21:19:26 +0000901// ConstantVector accessors.
Jay Foada0c13842011-06-22 09:10:19 +0000902Constant *ConstantVector::get(ArrayRef<Constant*> V) {
Jay Foad9afc5272011-01-27 14:44:55 +0000903 assert(!V.empty() && "Vectors can't be empty");
Chris Lattnerdb125cf2011-07-18 04:54:35 +0000904 VectorType *T = VectorType::get(V.front()->getType(), V.size());
Chris Lattner2ca5c862011-02-15 00:14:00 +0000905 LLVMContextImpl *pImpl = T->getContext().pImpl;
Jay Foad9afc5272011-01-27 14:44:55 +0000906
Chris Lattner2ca5c862011-02-15 00:14:00 +0000907 // If this is an all-undef or all-zero vector, return a
Owen Andersonaf7ec972009-07-28 21:19:26 +0000908 // ConstantAggregateZero or UndefValue.
909 Constant *C = V[0];
910 bool isZero = C->isNullValue();
911 bool isUndef = isa<UndefValue>(C);
912
913 if (isZero || isUndef) {
914 for (unsigned i = 1, e = V.size(); i != e; ++i)
915 if (V[i] != C) {
916 isZero = isUndef = false;
917 break;
918 }
919 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000920
Owen Andersonaf7ec972009-07-28 21:19:26 +0000921 if (isZero)
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000922 return ConstantAggregateZero::get(T);
Owen Andersonaf7ec972009-07-28 21:19:26 +0000923 if (isUndef)
Owen Anderson9e9a0d52009-07-30 23:03:37 +0000924 return UndefValue::get(T);
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000925
Chris Lattner36c744f2012-01-30 06:21:21 +0000926 // Check to see if all of the elements are ConstantFP or ConstantInt and if
927 // the element type is compatible with ConstantDataVector. If so, use it.
Chris Lattner18c7f802012-02-05 02:29:43 +0000928 if (ConstantDataSequential::isElementTypeCompatible(C->getType())) {
Chris Lattner36c744f2012-01-30 06:21:21 +0000929 // We speculatively build the elements here even if it turns out that there
930 // is a constantexpr or something else weird in the array, since it is so
931 // uncommon for that to happen.
932 if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) {
933 if (CI->getType()->isIntegerTy(8)) {
934 SmallVector<uint8_t, 16> Elts;
935 for (unsigned i = 0, e = V.size(); i != e; ++i)
936 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
937 Elts.push_back(CI->getZExtValue());
938 else
939 break;
940 if (Elts.size() == V.size())
941 return ConstantDataVector::get(C->getContext(), Elts);
942 } else if (CI->getType()->isIntegerTy(16)) {
943 SmallVector<uint16_t, 16> Elts;
944 for (unsigned i = 0, e = V.size(); i != e; ++i)
945 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
946 Elts.push_back(CI->getZExtValue());
947 else
948 break;
949 if (Elts.size() == V.size())
950 return ConstantDataVector::get(C->getContext(), Elts);
951 } else if (CI->getType()->isIntegerTy(32)) {
952 SmallVector<uint32_t, 16> Elts;
953 for (unsigned i = 0, e = V.size(); i != e; ++i)
954 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
955 Elts.push_back(CI->getZExtValue());
956 else
957 break;
958 if (Elts.size() == V.size())
959 return ConstantDataVector::get(C->getContext(), Elts);
960 } else if (CI->getType()->isIntegerTy(64)) {
961 SmallVector<uint64_t, 16> Elts;
962 for (unsigned i = 0, e = V.size(); i != e; ++i)
963 if (ConstantInt *CI = dyn_cast<ConstantInt>(V[i]))
964 Elts.push_back(CI->getZExtValue());
965 else
966 break;
967 if (Elts.size() == V.size())
968 return ConstantDataVector::get(C->getContext(), Elts);
969 }
970 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000971
Chris Lattner36c744f2012-01-30 06:21:21 +0000972 if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
973 if (CFP->getType()->isFloatTy()) {
974 SmallVector<float, 16> Elts;
975 for (unsigned i = 0, e = V.size(); i != e; ++i)
976 if (ConstantFP *CFP = dyn_cast<ConstantFP>(V[i]))
977 Elts.push_back(CFP->getValueAPF().convertToFloat());
978 else
979 break;
980 if (Elts.size() == V.size())
981 return ConstantDataVector::get(C->getContext(), Elts);
982 } else if (CFP->getType()->isDoubleTy()) {
983 SmallVector<double, 16> Elts;
984 for (unsigned i = 0, e = V.size(); i != e; ++i)
985 if (ConstantFP *CFP = dyn_cast<ConstantFP>(V[i]))
986 Elts.push_back(CFP->getValueAPF().convertToDouble());
987 else
988 break;
989 if (Elts.size() == V.size())
990 return ConstantDataVector::get(C->getContext(), Elts);
991 }
992 }
993 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +0000994
Chris Lattner36c744f2012-01-30 06:21:21 +0000995 // Otherwise, the element type isn't compatible with ConstantDataVector, or
996 // the operand list constants a ConstantExpr or something else strange.
Owen Andersonaf7ec972009-07-28 21:19:26 +0000997 return pImpl->VectorConstants.getOrCreate(T, V);
998}
999
Chris Lattner3c2c9542012-01-25 05:19:54 +00001000Constant *ConstantVector::getSplat(unsigned NumElts, Constant *V) {
Chris Lattner36c744f2012-01-30 06:21:21 +00001001 // If this splat is compatible with ConstantDataVector, use it instead of
1002 // ConstantVector.
1003 if ((isa<ConstantFP>(V) || isa<ConstantInt>(V)) &&
1004 ConstantDataSequential::isElementTypeCompatible(V->getType()))
1005 return ConstantDataVector::getSplat(NumElts, V);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001006
Chris Lattner3c2c9542012-01-25 05:19:54 +00001007 SmallVector<Constant*, 32> Elts(NumElts, V);
1008 return get(Elts);
1009}
1010
1011
Reid Spencer3da59db2006-11-27 01:05:10 +00001012// Utility function for determining if a ConstantExpr is a CastOp or not. This
1013// can't be inline because we don't want to #include Instruction.h into
1014// Constant.h
1015bool ConstantExpr::isCast() const {
1016 return Instruction::isCast(getOpcode());
1017}
1018
Reid Spencer077d0eb2006-12-04 05:19:50 +00001019bool ConstantExpr::isCompare() const {
Nick Lewycky7f6aa2b2009-07-08 03:04:38 +00001020 return getOpcode() == Instruction::ICmp || getOpcode() == Instruction::FCmp;
Reid Spencer077d0eb2006-12-04 05:19:50 +00001021}
1022
Dan Gohmane6992f72009-09-10 23:37:55 +00001023bool ConstantExpr::isGEPWithNoNotionalOverIndexing() const {
1024 if (getOpcode() != Instruction::GetElementPtr) return false;
1025
1026 gep_type_iterator GEPI = gep_type_begin(this), E = gep_type_end(this);
Oscar Fuentesee56c422010-08-02 06:00:15 +00001027 User::const_op_iterator OI = llvm::next(this->op_begin());
Dan Gohmane6992f72009-09-10 23:37:55 +00001028
1029 // Skip the first index, as it has no static limit.
1030 ++GEPI;
1031 ++OI;
1032
1033 // The remaining indices must be compile-time known integers within the
1034 // bounds of the corresponding notional static array types.
1035 for (; GEPI != E; ++GEPI, ++OI) {
1036 ConstantInt *CI = dyn_cast<ConstantInt>(*OI);
1037 if (!CI) return false;
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001038 if (ArrayType *ATy = dyn_cast<ArrayType>(*GEPI))
Dan Gohmane6992f72009-09-10 23:37:55 +00001039 if (CI->getValue().getActiveBits() > 64 ||
1040 CI->getZExtValue() >= ATy->getNumElements())
1041 return false;
1042 }
1043
1044 // All the indices checked out.
1045 return true;
1046}
1047
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001048bool ConstantExpr::hasIndices() const {
1049 return getOpcode() == Instruction::ExtractValue ||
1050 getOpcode() == Instruction::InsertValue;
1051}
1052
Jay Foadd30aa5a2011-04-13 15:22:40 +00001053ArrayRef<unsigned> ConstantExpr::getIndices() const {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001054 if (const ExtractValueConstantExpr *EVCE =
1055 dyn_cast<ExtractValueConstantExpr>(this))
1056 return EVCE->Indices;
Dan Gohman1a203572008-06-23 16:39:44 +00001057
1058 return cast<InsertValueConstantExpr>(this)->Indices;
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001059}
1060
Reid Spencer728b6db2006-12-03 05:48:19 +00001061unsigned ConstantExpr::getPredicate() const {
Chris Lattner3e194732011-07-17 06:01:30 +00001062 assert(isCompare());
Chris Lattnerb7daa842007-10-18 16:26:24 +00001063 return ((const CompareConstantExpr*)this)->predicate;
Reid Spencer728b6db2006-12-03 05:48:19 +00001064}
Chris Lattnerf4ba6c72001-10-03 06:12:09 +00001065
Chris Lattner1fe8f6b2006-07-14 19:37:40 +00001066/// getWithOperandReplaced - Return a constant expression identical to this
1067/// one, but with the specified operand set to the specified value.
Reid Spencer3da59db2006-11-27 01:05:10 +00001068Constant *
1069ConstantExpr::getWithOperandReplaced(unsigned OpNo, Constant *Op) const {
Chris Lattner1fe8f6b2006-07-14 19:37:40 +00001070 assert(Op->getType() == getOperand(OpNo)->getType() &&
1071 "Replacing operand with value of different type!");
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001072 if (getOperand(OpNo) == Op)
1073 return const_cast<ConstantExpr*>(this);
Chris Lattner1a8def62012-01-26 20:37:11 +00001074
1075 SmallVector<Constant*, 8> NewOps;
1076 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
1077 NewOps.push_back(i == OpNo ? Op : getOperand(i));
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001078
Chris Lattner1a8def62012-01-26 20:37:11 +00001079 return getWithOperands(NewOps);
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001080}
1081
1082/// getWithOperands - This returns the current constant expression with the
Chris Lattner1afcace2011-07-09 17:41:24 +00001083/// operands replaced with the specified values. The specified array must
1084/// have the same number of operands as our current one.
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001085Constant *ConstantExpr::
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001086getWithOperands(ArrayRef<Constant*> Ops, Type *Ty) const {
Jay Foadb81e4572011-04-13 13:46:01 +00001087 assert(Ops.size() == getNumOperands() && "Operand count mismatch!");
Chris Lattner1afcace2011-07-09 17:41:24 +00001088 bool AnyChange = Ty != getType();
1089 for (unsigned i = 0; i != Ops.size(); ++i)
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001090 AnyChange |= Ops[i] != getOperand(i);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001091
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001092 if (!AnyChange) // No operands changed, return self.
1093 return const_cast<ConstantExpr*>(this);
1094
1095 switch (getOpcode()) {
Reid Spencer3da59db2006-11-27 01:05:10 +00001096 case Instruction::Trunc:
1097 case Instruction::ZExt:
1098 case Instruction::SExt:
1099 case Instruction::FPTrunc:
1100 case Instruction::FPExt:
1101 case Instruction::UIToFP:
1102 case Instruction::SIToFP:
1103 case Instruction::FPToUI:
1104 case Instruction::FPToSI:
1105 case Instruction::PtrToInt:
1106 case Instruction::IntToPtr:
1107 case Instruction::BitCast:
Chris Lattner1afcace2011-07-09 17:41:24 +00001108 return ConstantExpr::getCast(getOpcode(), Ops[0], Ty);
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001109 case Instruction::Select:
1110 return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
1111 case Instruction::InsertElement:
1112 return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]);
1113 case Instruction::ExtractElement:
1114 return ConstantExpr::getExtractElement(Ops[0], Ops[1]);
Chris Lattner1a8def62012-01-26 20:37:11 +00001115 case Instruction::InsertValue:
1116 return ConstantExpr::getInsertValue(Ops[0], Ops[1], getIndices());
1117 case Instruction::ExtractValue:
1118 return ConstantExpr::getExtractValue(Ops[0], getIndices());
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001119 case Instruction::ShuffleVector:
1120 return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
Chris Lattnerf9021ff2007-02-19 20:01:23 +00001121 case Instruction::GetElementPtr:
Chris Lattner1a8def62012-01-26 20:37:11 +00001122 return ConstantExpr::getGetElementPtr(Ops[0], Ops.slice(1),
1123 cast<GEPOperator>(this)->isInBounds());
Reid Spencere4d87aa2006-12-23 06:05:41 +00001124 case Instruction::ICmp:
1125 case Instruction::FCmp:
1126 return ConstantExpr::getCompare(getPredicate(), Ops[0], Ops[1]);
Chris Lattnerb88a7fb2006-07-14 22:20:01 +00001127 default:
1128 assert(getNumOperands() == 2 && "Must be binary operator?");
Chris Lattnercafe9bb2009-12-29 02:14:09 +00001129 return ConstantExpr::get(getOpcode(), Ops[0], Ops[1], SubclassOptionalData);
Chris Lattner1fe8f6b2006-07-14 19:37:40 +00001130 }
1131}
1132
Chris Lattner00950542001-06-06 20:29:01 +00001133
1134//===----------------------------------------------------------------------===//
Chris Lattner00950542001-06-06 20:29:01 +00001135// isValueValidForType implementations
1136
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001137bool ConstantInt::isValueValidForType(Type *Ty, uint64_t Val) {
Chris Lattner230cdab2012-01-26 00:42:34 +00001138 unsigned NumBits = Ty->getIntegerBitWidth(); // assert okay
1139 if (Ty->isIntegerTy(1))
Reid Spencera54b7cb2007-01-12 07:05:14 +00001140 return Val == 0 || Val == 1;
Reid Spencer554cec62007-02-05 23:47:56 +00001141 if (NumBits >= 64)
Reid Spencera54b7cb2007-01-12 07:05:14 +00001142 return true; // always true, has to fit in largest type
1143 uint64_t Max = (1ll << NumBits) - 1;
1144 return Val <= Max;
Reid Spencer9b11d512006-12-19 01:28:19 +00001145}
1146
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001147bool ConstantInt::isValueValidForType(Type *Ty, int64_t Val) {
Chris Lattner230cdab2012-01-26 00:42:34 +00001148 unsigned NumBits = Ty->getIntegerBitWidth();
1149 if (Ty->isIntegerTy(1))
Reid Spencerc1030572007-01-19 21:13:56 +00001150 return Val == 0 || Val == 1 || Val == -1;
Reid Spencer554cec62007-02-05 23:47:56 +00001151 if (NumBits >= 64)
Reid Spencera54b7cb2007-01-12 07:05:14 +00001152 return true; // always true, has to fit in largest type
1153 int64_t Min = -(1ll << (NumBits-1));
1154 int64_t Max = (1ll << (NumBits-1)) - 1;
1155 return (Val >= Min && Val <= Max);
Chris Lattner00950542001-06-06 20:29:01 +00001156}
1157
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001158bool ConstantFP::isValueValidForType(Type *Ty, const APFloat& Val) {
Dale Johannesenf04afdb2007-08-30 00:23:21 +00001159 // convert modifies in place, so make a copy.
1160 APFloat Val2 = APFloat(Val);
Dale Johannesen23a98552008-10-09 23:00:39 +00001161 bool losesInfo;
Chris Lattnerf70c22b2004-06-17 18:19:28 +00001162 switch (Ty->getTypeID()) {
Chris Lattner00950542001-06-06 20:29:01 +00001163 default:
1164 return false; // These can't be represented as floating point!
1165
Dale Johannesenf04afdb2007-08-30 00:23:21 +00001166 // FIXME rounding mode needs to be more flexible
Dan Gohmance163392011-12-17 00:04:22 +00001167 case Type::HalfTyID: {
1168 if (&Val2.getSemantics() == &APFloat::IEEEhalf)
1169 return true;
1170 Val2.convert(APFloat::IEEEhalf, APFloat::rmNearestTiesToEven, &losesInfo);
1171 return !losesInfo;
1172 }
Dale Johannesen23a98552008-10-09 23:00:39 +00001173 case Type::FloatTyID: {
1174 if (&Val2.getSemantics() == &APFloat::IEEEsingle)
1175 return true;
1176 Val2.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
1177 return !losesInfo;
1178 }
1179 case Type::DoubleTyID: {
Dan Gohmance163392011-12-17 00:04:22 +00001180 if (&Val2.getSemantics() == &APFloat::IEEEhalf ||
1181 &Val2.getSemantics() == &APFloat::IEEEsingle ||
Dale Johannesen23a98552008-10-09 23:00:39 +00001182 &Val2.getSemantics() == &APFloat::IEEEdouble)
1183 return true;
1184 Val2.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
1185 return !losesInfo;
1186 }
Dale Johannesenebbc95d2007-08-09 22:51:36 +00001187 case Type::X86_FP80TyID:
Dan Gohmance163392011-12-17 00:04:22 +00001188 return &Val2.getSemantics() == &APFloat::IEEEhalf ||
1189 &Val2.getSemantics() == &APFloat::IEEEsingle ||
Dale Johannesen9d5f4562007-09-12 03:30:33 +00001190 &Val2.getSemantics() == &APFloat::IEEEdouble ||
1191 &Val2.getSemantics() == &APFloat::x87DoubleExtended;
Dale Johannesenebbc95d2007-08-09 22:51:36 +00001192 case Type::FP128TyID:
Dan Gohmance163392011-12-17 00:04:22 +00001193 return &Val2.getSemantics() == &APFloat::IEEEhalf ||
1194 &Val2.getSemantics() == &APFloat::IEEEsingle ||
Dale Johannesen9d5f4562007-09-12 03:30:33 +00001195 &Val2.getSemantics() == &APFloat::IEEEdouble ||
1196 &Val2.getSemantics() == &APFloat::IEEEquad;
Dale Johannesena471c2e2007-10-11 18:07:22 +00001197 case Type::PPC_FP128TyID:
Dan Gohmance163392011-12-17 00:04:22 +00001198 return &Val2.getSemantics() == &APFloat::IEEEhalf ||
1199 &Val2.getSemantics() == &APFloat::IEEEsingle ||
Dale Johannesena471c2e2007-10-11 18:07:22 +00001200 &Val2.getSemantics() == &APFloat::IEEEdouble ||
1201 &Val2.getSemantics() == &APFloat::PPCDoubleDouble;
Chris Lattner00950542001-06-06 20:29:01 +00001202 }
Chris Lattnerd74ea2b2006-05-24 17:04:05 +00001203}
Chris Lattner37bf6302001-07-20 19:16:02 +00001204
Chris Lattnerff2b7f32012-01-24 05:42:11 +00001205
Chris Lattner531daef2001-09-07 16:46:31 +00001206//===----------------------------------------------------------------------===//
Chris Lattner531daef2001-09-07 16:46:31 +00001207// Factory Function Implementation
1208
Chris Lattner9df0fb42012-01-23 15:20:12 +00001209ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) {
Chris Lattner61c70e92010-08-28 04:09:24 +00001210 assert((Ty->isStructTy() || Ty->isArrayTy() || Ty->isVectorTy()) &&
Owen Anderson9e9a0d52009-07-30 23:03:37 +00001211 "Cannot create an aggregate zero of non-aggregate type!");
1212
Chris Lattner9df0fb42012-01-23 15:20:12 +00001213 ConstantAggregateZero *&Entry = Ty->getContext().pImpl->CAZConstants[Ty];
1214 if (Entry == 0)
1215 Entry = new ConstantAggregateZero(Ty);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001216
Chris Lattner9df0fb42012-01-23 15:20:12 +00001217 return Entry;
Owen Anderson9e9a0d52009-07-30 23:03:37 +00001218}
1219
Chris Lattnerff2b7f32012-01-24 05:42:11 +00001220/// destroyConstant - Remove the constant from the constant table.
Dan Gohman0f8b53f2009-03-03 02:55:14 +00001221///
Owen Anderson04fb7c32009-06-20 00:24:58 +00001222void ConstantAggregateZero::destroyConstant() {
Chris Lattner9df0fb42012-01-23 15:20:12 +00001223 getContext().pImpl->CAZConstants.erase(getType());
Chris Lattner40bbeb52004-02-15 05:53:04 +00001224 destroyConstantImpl();
1225}
1226
Dan Gohman0f8b53f2009-03-03 02:55:14 +00001227/// destroyConstant - Remove the constant from the constant table...
1228///
Owen Anderson04fb7c32009-06-20 00:24:58 +00001229void ConstantArray::destroyConstant() {
Chris Lattner1afcace2011-07-09 17:41:24 +00001230 getType()->getContext().pImpl->ArrayConstants.remove(this);
Chris Lattner02ec5ed2003-05-23 20:03:32 +00001231 destroyConstantImpl();
1232}
1233
Chris Lattner93aeea32002-08-26 17:53:56 +00001234
Chris Lattnere9bb2df2001-12-03 22:26:30 +00001235//---- ConstantStruct::get() implementation...
Chris Lattner531daef2001-09-07 16:46:31 +00001236//
Chris Lattnered468e372003-10-05 00:17:43 +00001237
Chris Lattnerf5ec48d2001-10-13 06:57:33 +00001238// destroyConstant - Remove the constant from the constant table...
Chris Lattner6a57baa2001-10-03 15:39:36 +00001239//
Owen Anderson04fb7c32009-06-20 00:24:58 +00001240void ConstantStruct::destroyConstant() {
Chris Lattner1afcace2011-07-09 17:41:24 +00001241 getType()->getContext().pImpl->StructConstants.remove(this);
Chris Lattnerf5ec48d2001-10-13 06:57:33 +00001242 destroyConstantImpl();
1243}
Chris Lattner6a57baa2001-10-03 15:39:36 +00001244
Brian Gaeke715c90b2004-08-20 06:00:58 +00001245// destroyConstant - Remove the constant from the constant table...
1246//
Owen Anderson04fb7c32009-06-20 00:24:58 +00001247void ConstantVector::destroyConstant() {
Chris Lattner1afcace2011-07-09 17:41:24 +00001248 getType()->getContext().pImpl->VectorConstants.remove(this);
Brian Gaeke715c90b2004-08-20 06:00:58 +00001249 destroyConstantImpl();
1250}
1251
Duncan Sands2333e292012-11-13 12:59:33 +00001252/// getSplatValue - If this is a splat vector constant, meaning that all of
1253/// the elements have the same value, return that value. Otherwise return 0.
1254Constant *Constant::getSplatValue() const {
1255 assert(this->getType()->isVectorTy() && "Only valid for vectors!");
1256 if (isa<ConstantAggregateZero>(this))
1257 return getNullValue(this->getType()->getVectorElementType());
1258 if (const ConstantDataVector *CV = dyn_cast<ConstantDataVector>(this))
1259 return CV->getSplatValue();
1260 if (const ConstantVector *CV = dyn_cast<ConstantVector>(this))
1261 return CV->getSplatValue();
1262 return 0;
1263}
1264
Dan Gohman3b7cf0a2007-10-17 17:51:30 +00001265/// getSplatValue - If this is a splat constant, where all of the
1266/// elements have the same value, return that value. Otherwise return null.
Duncan Sands7681c6d2011-02-01 08:39:12 +00001267Constant *ConstantVector::getSplatValue() const {
Dan Gohman3b7cf0a2007-10-17 17:51:30 +00001268 // Check out first element.
1269 Constant *Elt = getOperand(0);
1270 // Then make sure all remaining elements point to the same value.
1271 for (unsigned I = 1, E = getNumOperands(); I < E; ++I)
Chris Lattner3e194732011-07-17 06:01:30 +00001272 if (getOperand(I) != Elt)
1273 return 0;
Dan Gohman3b7cf0a2007-10-17 17:51:30 +00001274 return Elt;
1275}
1276
Duncan Sands2333e292012-11-13 12:59:33 +00001277/// If C is a constant integer then return its value, otherwise C must be a
1278/// vector of constant integers, all equal, and the common value is returned.
1279const APInt &Constant::getUniqueInteger() const {
1280 if (const ConstantInt *CI = dyn_cast<ConstantInt>(this))
1281 return CI->getValue();
1282 assert(this->getSplatValue() && "Doesn't contain a unique integer!");
1283 const Constant *C = this->getAggregateElement(0U);
1284 assert(C && isa<ConstantInt>(C) && "Not a vector of numbers!");
1285 return cast<ConstantInt>(C)->getValue();
1286}
1287
1288
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001289//---- ConstantPointerNull::get() implementation.
Chris Lattnerf5ec48d2001-10-13 06:57:33 +00001290//
Chris Lattner02ec5ed2003-05-23 20:03:32 +00001291
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001292ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) {
Chris Lattner9df0fb42012-01-23 15:20:12 +00001293 ConstantPointerNull *&Entry = Ty->getContext().pImpl->CPNConstants[Ty];
1294 if (Entry == 0)
1295 Entry = new ConstantPointerNull(Ty);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001296
Chris Lattner9df0fb42012-01-23 15:20:12 +00001297 return Entry;
Chris Lattner6a57baa2001-10-03 15:39:36 +00001298}
1299
Chris Lattner41661fd2002-08-18 00:40:04 +00001300// destroyConstant - Remove the constant from the constant table...
1301//
Owen Anderson04fb7c32009-06-20 00:24:58 +00001302void ConstantPointerNull::destroyConstant() {
Chris Lattner9df0fb42012-01-23 15:20:12 +00001303 getContext().pImpl->CPNConstants.erase(getType());
1304 // Free the constant and any dangling references to it.
Chris Lattner41661fd2002-08-18 00:40:04 +00001305 destroyConstantImpl();
1306}
1307
1308
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001309//---- UndefValue::get() implementation.
Chris Lattnerb9f18592004-10-16 18:07:16 +00001310//
1311
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001312UndefValue *UndefValue::get(Type *Ty) {
Chris Lattner9df0fb42012-01-23 15:20:12 +00001313 UndefValue *&Entry = Ty->getContext().pImpl->UVConstants[Ty];
1314 if (Entry == 0)
1315 Entry = new UndefValue(Ty);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001316
Chris Lattner9df0fb42012-01-23 15:20:12 +00001317 return Entry;
Chris Lattnerb9f18592004-10-16 18:07:16 +00001318}
1319
1320// destroyConstant - Remove the constant from the constant table.
1321//
Owen Anderson04fb7c32009-06-20 00:24:58 +00001322void UndefValue::destroyConstant() {
Chris Lattner9df0fb42012-01-23 15:20:12 +00001323 // Free the constant and any dangling references to it.
1324 getContext().pImpl->UVConstants.erase(getType());
Chris Lattnerb9f18592004-10-16 18:07:16 +00001325 destroyConstantImpl();
1326}
1327
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001328//---- BlockAddress::get() implementation.
1329//
1330
1331BlockAddress *BlockAddress::get(BasicBlock *BB) {
1332 assert(BB->getParent() != 0 && "Block must have a parent");
1333 return get(BB->getParent(), BB);
1334}
1335
1336BlockAddress *BlockAddress::get(Function *F, BasicBlock *BB) {
1337 BlockAddress *&BA =
1338 F->getContext().pImpl->BlockAddresses[std::make_pair(F, BB)];
1339 if (BA == 0)
1340 BA = new BlockAddress(F, BB);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001341
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001342 assert(BA->getFunction() == F && "Basic block moved between functions");
1343 return BA;
1344}
1345
1346BlockAddress::BlockAddress(Function *F, BasicBlock *BB)
1347: Constant(Type::getInt8PtrTy(F->getContext()), Value::BlockAddressVal,
1348 &Op<0>(), 2) {
Chris Lattnerd0ec2352009-11-01 03:03:03 +00001349 setOperand(0, F);
1350 setOperand(1, BB);
Chris Lattnercdfc9402009-11-01 01:27:45 +00001351 BB->AdjustBlockAddressRefCount(1);
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001352}
1353
1354
1355// destroyConstant - Remove the constant from the constant table.
1356//
1357void BlockAddress::destroyConstant() {
Chris Lattner1afcace2011-07-09 17:41:24 +00001358 getFunction()->getType()->getContext().pImpl
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001359 ->BlockAddresses.erase(std::make_pair(getFunction(), getBasicBlock()));
Chris Lattnercdfc9402009-11-01 01:27:45 +00001360 getBasicBlock()->AdjustBlockAddressRefCount(-1);
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001361 destroyConstantImpl();
1362}
1363
1364void BlockAddress::replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U) {
1365 // This could be replacing either the Basic Block or the Function. In either
1366 // case, we have to remove the map entry.
1367 Function *NewF = getFunction();
1368 BasicBlock *NewBB = getBasicBlock();
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001369
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001370 if (U == &Op<0>())
1371 NewF = cast<Function>(To);
1372 else
1373 NewBB = cast<BasicBlock>(To);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001374
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001375 // See if the 'new' entry already exists, if not, just update this in place
1376 // and return early.
1377 BlockAddress *&NewBA =
1378 getContext().pImpl->BlockAddresses[std::make_pair(NewF, NewBB)];
1379 if (NewBA == 0) {
Chris Lattnerd0ec2352009-11-01 03:03:03 +00001380 getBasicBlock()->AdjustBlockAddressRefCount(-1);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001381
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001382 // Remove the old entry, this can't cause the map to rehash (just a
1383 // tombstone will get added).
1384 getContext().pImpl->BlockAddresses.erase(std::make_pair(getFunction(),
1385 getBasicBlock()));
1386 NewBA = this;
Chris Lattnerd0ec2352009-11-01 03:03:03 +00001387 setOperand(0, NewF);
1388 setOperand(1, NewBB);
1389 getBasicBlock()->AdjustBlockAddressRefCount(1);
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001390 return;
1391 }
1392
1393 // Otherwise, I do need to replace this with an existing value.
1394 assert(NewBA != this && "I didn't contain From!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001395
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001396 // Everyone using this now uses the replacement.
Chris Lattner678f9e02011-07-15 06:18:52 +00001397 replaceAllUsesWith(NewBA);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001398
Chris Lattner2ee11ec2009-10-28 00:01:44 +00001399 destroyConstant();
1400}
1401
1402//---- ConstantExpr::get() implementations.
Vikram S. Adve345e0cf2002-07-14 23:13:17 +00001403//
Reid Spencer79e21d32006-12-31 05:26:44 +00001404
Reid Spencer3da59db2006-11-27 01:05:10 +00001405/// This is a utility function to handle folding of casts and lookup of the
Duncan Sands66a1a052008-03-30 19:38:55 +00001406/// cast in the ExprConstants map. It is used by the various get* methods below.
Reid Spencer3da59db2006-11-27 01:05:10 +00001407static inline Constant *getFoldedCast(
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001408 Instruction::CastOps opc, Constant *C, Type *Ty) {
Chris Lattner9eacf8a2003-10-07 22:19:19 +00001409 assert(Ty->isFirstClassType() && "Cannot cast to an aggregate type!");
Reid Spencer3da59db2006-11-27 01:05:10 +00001410 // Fold a few common cases
Chris Lattnerb29d5962010-02-01 20:48:08 +00001411 if (Constant *FC = ConstantFoldCastInstruction(opc, C, Ty))
Reid Spencer3da59db2006-11-27 01:05:10 +00001412 return FC;
Chris Lattnerd628f6a2003-04-17 19:24:48 +00001413
Owen Andersond03eecd2009-08-04 20:25:11 +00001414 LLVMContextImpl *pImpl = Ty->getContext().pImpl;
1415
Vikram S. Adved0b1bb02002-07-15 18:19:33 +00001416 // Look up the constant in the table first to ensure uniqueness
Chris Lattner9bc02a42003-05-13 21:37:02 +00001417 std::vector<Constant*> argVec(1, C);
Reid Spencer077d0eb2006-12-04 05:19:50 +00001418 ExprMapKeyType Key(opc, argVec);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001419
Owen Andersond03eecd2009-08-04 20:25:11 +00001420 return pImpl->ExprConstants.getOrCreate(Ty, Key);
Vikram S. Adve345e0cf2002-07-14 23:13:17 +00001421}
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001422
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001423Constant *ConstantExpr::getCast(unsigned oc, Constant *C, Type *Ty) {
Reid Spencer3da59db2006-11-27 01:05:10 +00001424 Instruction::CastOps opc = Instruction::CastOps(oc);
1425 assert(Instruction::isCast(opc) && "opcode out of range");
1426 assert(C && Ty && "Null arguments to getCast");
Chris Lattner0b68a002010-01-26 21:51:43 +00001427 assert(CastInst::castIsValid(opc, C, Ty) && "Invalid constantexpr cast!");
Reid Spencer3da59db2006-11-27 01:05:10 +00001428
1429 switch (opc) {
Chris Lattner0b68a002010-01-26 21:51:43 +00001430 default:
1431 llvm_unreachable("Invalid cast opcode");
Chris Lattner0b68a002010-01-26 21:51:43 +00001432 case Instruction::Trunc: return getTrunc(C, Ty);
1433 case Instruction::ZExt: return getZExt(C, Ty);
1434 case Instruction::SExt: return getSExt(C, Ty);
1435 case Instruction::FPTrunc: return getFPTrunc(C, Ty);
1436 case Instruction::FPExt: return getFPExtend(C, Ty);
1437 case Instruction::UIToFP: return getUIToFP(C, Ty);
1438 case Instruction::SIToFP: return getSIToFP(C, Ty);
1439 case Instruction::FPToUI: return getFPToUI(C, Ty);
1440 case Instruction::FPToSI: return getFPToSI(C, Ty);
1441 case Instruction::PtrToInt: return getPtrToInt(C, Ty);
1442 case Instruction::IntToPtr: return getIntToPtr(C, Ty);
1443 case Instruction::BitCast: return getBitCast(C, Ty);
Chris Lattnerf5ac6c22005-01-01 15:59:57 +00001444 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001445}
Reid Spencer7858b332006-12-05 19:14:13 +00001446
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001447Constant *ConstantExpr::getZExtOrBitCast(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001448 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
Dan Gohman3b490632010-04-12 22:12:29 +00001449 return getBitCast(C, Ty);
1450 return getZExt(C, Ty);
Reid Spencer848414e2006-12-04 20:17:56 +00001451}
1452
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001453Constant *ConstantExpr::getSExtOrBitCast(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001454 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
Dan Gohman3b490632010-04-12 22:12:29 +00001455 return getBitCast(C, Ty);
1456 return getSExt(C, Ty);
Reid Spencer848414e2006-12-04 20:17:56 +00001457}
1458
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001459Constant *ConstantExpr::getTruncOrBitCast(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001460 if (C->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
Dan Gohman3b490632010-04-12 22:12:29 +00001461 return getBitCast(C, Ty);
1462 return getTrunc(C, Ty);
Reid Spencer848414e2006-12-04 20:17:56 +00001463}
1464
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001465Constant *ConstantExpr::getPointerCast(Constant *S, Type *Ty) {
Duncan Sands1df98592010-02-16 11:11:14 +00001466 assert(S->getType()->isPointerTy() && "Invalid cast");
1467 assert((Ty->isIntegerTy() || Ty->isPointerTy()) && "Invalid cast");
Reid Spencerc0459fb2006-12-05 03:25:26 +00001468
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001469 if (Ty->isIntegerTy())
Dan Gohman3b490632010-04-12 22:12:29 +00001470 return getPtrToInt(S, Ty);
1471 return getBitCast(S, Ty);
Reid Spencerc0459fb2006-12-05 03:25:26 +00001472}
1473
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001474Constant *ConstantExpr::getIntegerCast(Constant *C, Type *Ty,
Reid Spencer84f3eab2006-12-12 00:51:07 +00001475 bool isSigned) {
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001476 assert(C->getType()->isIntOrIntVectorTy() &&
1477 Ty->isIntOrIntVectorTy() && "Invalid cast");
Dan Gohman6de29f82009-06-15 22:12:54 +00001478 unsigned SrcBits = C->getType()->getScalarSizeInBits();
1479 unsigned DstBits = Ty->getScalarSizeInBits();
Reid Spencer84f3eab2006-12-12 00:51:07 +00001480 Instruction::CastOps opcode =
1481 (SrcBits == DstBits ? Instruction::BitCast :
1482 (SrcBits > DstBits ? Instruction::Trunc :
1483 (isSigned ? Instruction::SExt : Instruction::ZExt)));
1484 return getCast(opcode, C, Ty);
1485}
1486
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001487Constant *ConstantExpr::getFPCast(Constant *C, Type *Ty) {
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001488 assert(C->getType()->isFPOrFPVectorTy() && Ty->isFPOrFPVectorTy() &&
Reid Spencer84f3eab2006-12-12 00:51:07 +00001489 "Invalid cast");
Dan Gohman6de29f82009-06-15 22:12:54 +00001490 unsigned SrcBits = C->getType()->getScalarSizeInBits();
1491 unsigned DstBits = Ty->getScalarSizeInBits();
Reid Spencerf25212a2006-12-12 05:38:50 +00001492 if (SrcBits == DstBits)
1493 return C; // Avoid a useless cast
Reid Spencer84f3eab2006-12-12 00:51:07 +00001494 Instruction::CastOps opcode =
Jay Foad9afc5272011-01-27 14:44:55 +00001495 (SrcBits > DstBits ? Instruction::FPTrunc : Instruction::FPExt);
Reid Spencer84f3eab2006-12-12 00:51:07 +00001496 return getCast(opcode, C, Ty);
1497}
1498
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001499Constant *ConstantExpr::getTrunc(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001500#ifndef NDEBUG
1501 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1502 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1503#endif
1504 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001505 assert(C->getType()->isIntOrIntVectorTy() && "Trunc operand must be integer");
1506 assert(Ty->isIntOrIntVectorTy() && "Trunc produces only integral");
Dan Gohman6de29f82009-06-15 22:12:54 +00001507 assert(C->getType()->getScalarSizeInBits() > Ty->getScalarSizeInBits()&&
Reid Spencer3da59db2006-11-27 01:05:10 +00001508 "SrcTy must be larger than DestTy for Trunc!");
1509
Owen Anderson04fb7c32009-06-20 00:24:58 +00001510 return getFoldedCast(Instruction::Trunc, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001511}
1512
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001513Constant *ConstantExpr::getSExt(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001514#ifndef NDEBUG
1515 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1516 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1517#endif
1518 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001519 assert(C->getType()->isIntOrIntVectorTy() && "SExt operand must be integral");
1520 assert(Ty->isIntOrIntVectorTy() && "SExt produces only integer");
Dan Gohman6de29f82009-06-15 22:12:54 +00001521 assert(C->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits()&&
Reid Spencer3da59db2006-11-27 01:05:10 +00001522 "SrcTy must be smaller than DestTy for SExt!");
1523
Owen Anderson04fb7c32009-06-20 00:24:58 +00001524 return getFoldedCast(Instruction::SExt, C, Ty);
Chris Lattnerd144f422004-04-04 23:20:30 +00001525}
1526
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001527Constant *ConstantExpr::getZExt(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001528#ifndef NDEBUG
1529 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1530 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1531#endif
1532 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001533 assert(C->getType()->isIntOrIntVectorTy() && "ZEXt operand must be integral");
1534 assert(Ty->isIntOrIntVectorTy() && "ZExt produces only integer");
Dan Gohman6de29f82009-06-15 22:12:54 +00001535 assert(C->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits()&&
Reid Spencer3da59db2006-11-27 01:05:10 +00001536 "SrcTy must be smaller than DestTy for ZExt!");
1537
Owen Anderson04fb7c32009-06-20 00:24:58 +00001538 return getFoldedCast(Instruction::ZExt, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001539}
1540
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001541Constant *ConstantExpr::getFPTrunc(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001542#ifndef NDEBUG
1543 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1544 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1545#endif
1546 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001547 assert(C->getType()->isFPOrFPVectorTy() && Ty->isFPOrFPVectorTy() &&
Dan Gohman6de29f82009-06-15 22:12:54 +00001548 C->getType()->getScalarSizeInBits() > Ty->getScalarSizeInBits()&&
Reid Spencer3da59db2006-11-27 01:05:10 +00001549 "This is an illegal floating point truncation!");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001550 return getFoldedCast(Instruction::FPTrunc, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001551}
1552
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001553Constant *ConstantExpr::getFPExtend(Constant *C, Type *Ty) {
Dan Gohman6de29f82009-06-15 22:12:54 +00001554#ifndef NDEBUG
1555 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1556 bool toVec = Ty->getTypeID() == Type::VectorTyID;
1557#endif
1558 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001559 assert(C->getType()->isFPOrFPVectorTy() && Ty->isFPOrFPVectorTy() &&
Dan Gohman6de29f82009-06-15 22:12:54 +00001560 C->getType()->getScalarSizeInBits() < Ty->getScalarSizeInBits()&&
Reid Spencer3da59db2006-11-27 01:05:10 +00001561 "This is an illegal floating point extension!");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001562 return getFoldedCast(Instruction::FPExt, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001563}
1564
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001565Constant *ConstantExpr::getUIToFP(Constant *C, Type *Ty) {
Devang Patelb6dc9352008-11-03 23:20:04 +00001566#ifndef NDEBUG
Nate Begemanb348d182007-11-17 03:58:34 +00001567 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1568 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Patelb6dc9352008-11-03 23:20:04 +00001569#endif
Nate Begemanb348d182007-11-17 03:58:34 +00001570 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001571 assert(C->getType()->isIntOrIntVectorTy() && Ty->isFPOrFPVectorTy() &&
Nate Begemanb348d182007-11-17 03:58:34 +00001572 "This is an illegal uint to floating point cast!");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001573 return getFoldedCast(Instruction::UIToFP, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001574}
1575
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001576Constant *ConstantExpr::getSIToFP(Constant *C, Type *Ty) {
Devang Patelb6dc9352008-11-03 23:20:04 +00001577#ifndef NDEBUG
Nate Begemanb348d182007-11-17 03:58:34 +00001578 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1579 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Patelb6dc9352008-11-03 23:20:04 +00001580#endif
Nate Begemanb348d182007-11-17 03:58:34 +00001581 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001582 assert(C->getType()->isIntOrIntVectorTy() && Ty->isFPOrFPVectorTy() &&
Reid Spencer3da59db2006-11-27 01:05:10 +00001583 "This is an illegal sint to floating point cast!");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001584 return getFoldedCast(Instruction::SIToFP, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001585}
1586
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001587Constant *ConstantExpr::getFPToUI(Constant *C, Type *Ty) {
Devang Patelb6dc9352008-11-03 23:20:04 +00001588#ifndef NDEBUG
Nate Begemanb348d182007-11-17 03:58:34 +00001589 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1590 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Patelb6dc9352008-11-03 23:20:04 +00001591#endif
Nate Begemanb348d182007-11-17 03:58:34 +00001592 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001593 assert(C->getType()->isFPOrFPVectorTy() && Ty->isIntOrIntVectorTy() &&
Nate Begemanb348d182007-11-17 03:58:34 +00001594 "This is an illegal floating point to uint cast!");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001595 return getFoldedCast(Instruction::FPToUI, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001596}
1597
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001598Constant *ConstantExpr::getFPToSI(Constant *C, Type *Ty) {
Devang Patelb6dc9352008-11-03 23:20:04 +00001599#ifndef NDEBUG
Nate Begemanb348d182007-11-17 03:58:34 +00001600 bool fromVec = C->getType()->getTypeID() == Type::VectorTyID;
1601 bool toVec = Ty->getTypeID() == Type::VectorTyID;
Devang Patelb6dc9352008-11-03 23:20:04 +00001602#endif
Nate Begemanb348d182007-11-17 03:58:34 +00001603 assert((fromVec == toVec) && "Cannot convert from scalar to/from vector");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001604 assert(C->getType()->isFPOrFPVectorTy() && Ty->isIntOrIntVectorTy() &&
Nate Begemanb348d182007-11-17 03:58:34 +00001605 "This is an illegal floating point to sint cast!");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001606 return getFoldedCast(Instruction::FPToSI, C, Ty);
Reid Spencer3da59db2006-11-27 01:05:10 +00001607}
1608
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001609Constant *ConstantExpr::getPtrToInt(Constant *C, Type *DstTy) {
Nadav Rotem16087692011-12-05 06:29:09 +00001610 assert(C->getType()->getScalarType()->isPointerTy() &&
1611 "PtrToInt source must be pointer or pointer vector");
1612 assert(DstTy->getScalarType()->isIntegerTy() &&
1613 "PtrToInt destination must be integer or integer vector");
Chris Lattneraf7b4fb2012-01-25 01:32:59 +00001614 assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy));
Nick Lewycky1486ae62012-01-25 03:20:12 +00001615 if (isa<VectorType>(C->getType()))
Chris Lattner230cdab2012-01-26 00:42:34 +00001616 assert(C->getType()->getVectorNumElements()==DstTy->getVectorNumElements()&&
Chris Lattneraf7b4fb2012-01-25 01:32:59 +00001617 "Invalid cast between a different number of vector elements");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001618 return getFoldedCast(Instruction::PtrToInt, C, DstTy);
Reid Spencer3da59db2006-11-27 01:05:10 +00001619}
1620
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001621Constant *ConstantExpr::getIntToPtr(Constant *C, Type *DstTy) {
Nadav Rotem16087692011-12-05 06:29:09 +00001622 assert(C->getType()->getScalarType()->isIntegerTy() &&
1623 "IntToPtr source must be integer or integer vector");
1624 assert(DstTy->getScalarType()->isPointerTy() &&
1625 "IntToPtr destination must be a pointer or pointer vector");
Chris Lattneraf7b4fb2012-01-25 01:32:59 +00001626 assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy));
Nick Lewycky1486ae62012-01-25 03:20:12 +00001627 if (isa<VectorType>(C->getType()))
Chris Lattner230cdab2012-01-26 00:42:34 +00001628 assert(C->getType()->getVectorNumElements()==DstTy->getVectorNumElements()&&
Chris Lattneraf7b4fb2012-01-25 01:32:59 +00001629 "Invalid cast between a different number of vector elements");
Owen Anderson04fb7c32009-06-20 00:24:58 +00001630 return getFoldedCast(Instruction::IntToPtr, C, DstTy);
Reid Spencer3da59db2006-11-27 01:05:10 +00001631}
1632
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001633Constant *ConstantExpr::getBitCast(Constant *C, Type *DstTy) {
Chris Lattner0b68a002010-01-26 21:51:43 +00001634 assert(CastInst::castIsValid(Instruction::BitCast, C, DstTy) &&
1635 "Invalid constantexpr bitcast!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001636
Chris Lattner8c7f24a2009-03-21 06:55:54 +00001637 // It is common to ask for a bitcast of a value to its own type, handle this
1638 // speedily.
1639 if (C->getType() == DstTy) return C;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001640
Owen Anderson04fb7c32009-06-20 00:24:58 +00001641 return getFoldedCast(Instruction::BitCast, C, DstTy);
Chris Lattnerd144f422004-04-04 23:20:30 +00001642}
1643
Chris Lattnereaf79802011-07-09 18:23:52 +00001644Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2,
1645 unsigned Flags) {
1646 // Check the operands for consistency first.
Reid Spencer0a783f72006-11-02 01:53:59 +00001647 assert(Opcode >= Instruction::BinaryOpsBegin &&
1648 Opcode < Instruction::BinaryOpsEnd &&
Chris Lattnerf31f5832003-05-21 17:49:25 +00001649 "Invalid opcode in binary constant expression");
1650 assert(C1->getType() == C2->getType() &&
1651 "Operand types in binary constant expression should match");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001652
Chris Lattner91b362b2004-08-17 17:28:46 +00001653#ifndef NDEBUG
1654 switch (Opcode) {
Dan Gohmanae3a0be2009-06-04 22:49:04 +00001655 case Instruction::Add:
Reid Spencer0a783f72006-11-02 01:53:59 +00001656 case Instruction::Sub:
Dan Gohmanae3a0be2009-06-04 22:49:04 +00001657 case Instruction::Mul:
Chris Lattner91b362b2004-08-17 17:28:46 +00001658 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001659 assert(C1->getType()->isIntOrIntVectorTy() &&
Dan Gohmanae3a0be2009-06-04 22:49:04 +00001660 "Tried to create an integer operation on a non-integer type!");
1661 break;
1662 case Instruction::FAdd:
1663 case Instruction::FSub:
1664 case Instruction::FMul:
1665 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001666 assert(C1->getType()->isFPOrFPVectorTy() &&
Dan Gohmanae3a0be2009-06-04 22:49:04 +00001667 "Tried to create a floating-point operation on a "
1668 "non-floating-point type!");
Chris Lattner91b362b2004-08-17 17:28:46 +00001669 break;
Reid Spencer1628cec2006-10-26 06:15:43 +00001670 case Instruction::UDiv:
1671 case Instruction::SDiv:
1672 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001673 assert(C1->getType()->isIntOrIntVectorTy() &&
Reid Spencer1628cec2006-10-26 06:15:43 +00001674 "Tried to create an arithmetic operation on a non-arithmetic type!");
1675 break;
1676 case Instruction::FDiv:
1677 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001678 assert(C1->getType()->isFPOrFPVectorTy() &&
Dan Gohmanf57478f2009-06-15 22:25:12 +00001679 "Tried to create an arithmetic operation on a non-arithmetic type!");
Reid Spencer1628cec2006-10-26 06:15:43 +00001680 break;
Reid Spencer0a783f72006-11-02 01:53:59 +00001681 case Instruction::URem:
1682 case Instruction::SRem:
1683 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001684 assert(C1->getType()->isIntOrIntVectorTy() &&
Reid Spencer0a783f72006-11-02 01:53:59 +00001685 "Tried to create an arithmetic operation on a non-arithmetic type!");
1686 break;
1687 case Instruction::FRem:
1688 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001689 assert(C1->getType()->isFPOrFPVectorTy() &&
Dan Gohmanf57478f2009-06-15 22:25:12 +00001690 "Tried to create an arithmetic operation on a non-arithmetic type!");
Reid Spencer0a783f72006-11-02 01:53:59 +00001691 break;
Chris Lattner91b362b2004-08-17 17:28:46 +00001692 case Instruction::And:
1693 case Instruction::Or:
1694 case Instruction::Xor:
1695 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001696 assert(C1->getType()->isIntOrIntVectorTy() &&
Misha Brukman1bae2912005-01-27 06:46:38 +00001697 "Tried to create a logical operation on a non-integral type!");
Chris Lattner91b362b2004-08-17 17:28:46 +00001698 break;
Chris Lattner91b362b2004-08-17 17:28:46 +00001699 case Instruction::Shl:
Reid Spencer3822ff52006-11-08 06:47:33 +00001700 case Instruction::LShr:
1701 case Instruction::AShr:
Reid Spencer832254e2007-02-02 02:16:23 +00001702 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001703 assert(C1->getType()->isIntOrIntVectorTy() &&
Chris Lattner91b362b2004-08-17 17:28:46 +00001704 "Tried to create a shift operation on a non-integer type!");
1705 break;
1706 default:
1707 break;
1708 }
1709#endif
1710
Chris Lattnereaf79802011-07-09 18:23:52 +00001711 if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2))
1712 return FC; // Fold a few common cases.
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001713
Chris Lattnereaf79802011-07-09 18:23:52 +00001714 std::vector<Constant*> argVec(1, C1);
1715 argVec.push_back(C2);
1716 ExprMapKeyType Key(Opcode, argVec, 0, Flags);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001717
Chris Lattnereaf79802011-07-09 18:23:52 +00001718 LLVMContextImpl *pImpl = C1->getContext().pImpl;
1719 return pImpl->ExprConstants.getOrCreate(C1->getType(), Key);
Reid Spencer67263fe2006-12-04 21:35:24 +00001720}
1721
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001722Constant *ConstantExpr::getSizeOf(Type* Ty) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00001723 // sizeof is implemented as: (i64) gep (Ty*)null, 1
1724 // Note that a non-inbounds gep is used, as null isn't within any object.
Owen Anderson1d0be152009-08-13 21:58:54 +00001725 Constant *GEPIdx = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
Owen Andersonbaf3c402009-07-29 18:55:55 +00001726 Constant *GEP = getGetElementPtr(
Jay Foaddab3d292011-07-21 14:31:17 +00001727 Constant::getNullValue(PointerType::getUnqual(Ty)), GEPIdx);
Dan Gohman3b490632010-04-12 22:12:29 +00001728 return getPtrToInt(GEP,
1729 Type::getInt64Ty(Ty->getContext()));
Owen Andersonbaf3c402009-07-29 18:55:55 +00001730}
1731
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001732Constant *ConstantExpr::getAlignOf(Type* Ty) {
Dan Gohman0f5efe52010-01-28 02:15:55 +00001733 // alignof is implemented as: (i64) gep ({i1,Ty}*)null, 0, 1
Dan Gohmane2574d32009-08-11 17:57:01 +00001734 // Note that a non-inbounds gep is used, as null isn't within any object.
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001735 Type *AligningTy =
Chris Lattnerb2318662011-06-18 22:48:56 +00001736 StructType::get(Type::getInt1Ty(Ty->getContext()), Ty, NULL);
Micah Villmowb8bce922012-10-24 17:25:11 +00001737 Constant *NullPtr = Constant::getNullValue(AligningTy->getPointerTo());
Dan Gohman06ed3e72010-01-28 02:43:22 +00001738 Constant *Zero = ConstantInt::get(Type::getInt64Ty(Ty->getContext()), 0);
Owen Anderson1d0be152009-08-13 21:58:54 +00001739 Constant *One = ConstantInt::get(Type::getInt32Ty(Ty->getContext()), 1);
Owen Andersonbaf3c402009-07-29 18:55:55 +00001740 Constant *Indices[2] = { Zero, One };
Jay Foaddab3d292011-07-21 14:31:17 +00001741 Constant *GEP = getGetElementPtr(NullPtr, Indices);
Dan Gohman3b490632010-04-12 22:12:29 +00001742 return getPtrToInt(GEP,
1743 Type::getInt64Ty(Ty->getContext()));
Owen Andersonbaf3c402009-07-29 18:55:55 +00001744}
1745
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001746Constant *ConstantExpr::getOffsetOf(StructType* STy, unsigned FieldNo) {
Dan Gohman2544a1d2010-02-01 16:37:38 +00001747 return getOffsetOf(STy, ConstantInt::get(Type::getInt32Ty(STy->getContext()),
1748 FieldNo));
1749}
1750
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001751Constant *ConstantExpr::getOffsetOf(Type* Ty, Constant *FieldNo) {
Dan Gohman3778f212009-08-16 21:26:11 +00001752 // offsetof is implemented as: (i64) gep (Ty*)null, 0, FieldNo
1753 // Note that a non-inbounds gep is used, as null isn't within any object.
1754 Constant *GEPIdx[] = {
Dan Gohman2544a1d2010-02-01 16:37:38 +00001755 ConstantInt::get(Type::getInt64Ty(Ty->getContext()), 0),
1756 FieldNo
Dan Gohman3778f212009-08-16 21:26:11 +00001757 };
1758 Constant *GEP = getGetElementPtr(
Jay Foaddab3d292011-07-21 14:31:17 +00001759 Constant::getNullValue(PointerType::getUnqual(Ty)), GEPIdx);
Dan Gohman3b490632010-04-12 22:12:29 +00001760 return getPtrToInt(GEP,
1761 Type::getInt64Ty(Ty->getContext()));
Dan Gohman3778f212009-08-16 21:26:11 +00001762}
Owen Andersonbaf3c402009-07-29 18:55:55 +00001763
Chris Lattnereaf79802011-07-09 18:23:52 +00001764Constant *ConstantExpr::getCompare(unsigned short Predicate,
1765 Constant *C1, Constant *C2) {
Reid Spencer67263fe2006-12-04 21:35:24 +00001766 assert(C1->getType() == C2->getType() && "Op types should be identical!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001767
Chris Lattnereaf79802011-07-09 18:23:52 +00001768 switch (Predicate) {
1769 default: llvm_unreachable("Invalid CmpInst predicate");
1770 case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT:
1771 case CmpInst::FCMP_OGE: case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE:
1772 case CmpInst::FCMP_ONE: case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO:
1773 case CmpInst::FCMP_UEQ: case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE:
1774 case CmpInst::FCMP_ULT: case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE:
1775 case CmpInst::FCMP_TRUE:
1776 return getFCmp(Predicate, C1, C2);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001777
Chris Lattnereaf79802011-07-09 18:23:52 +00001778 case CmpInst::ICMP_EQ: case CmpInst::ICMP_NE: case CmpInst::ICMP_UGT:
1779 case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE:
1780 case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT:
1781 case CmpInst::ICMP_SLE:
1782 return getICmp(Predicate, C1, C2);
1783 }
Chris Lattnerc3d12f02004-08-04 18:50:09 +00001784}
1785
Chris Lattnereaf79802011-07-09 18:23:52 +00001786Constant *ConstantExpr::getSelect(Constant *C, Constant *V1, Constant *V2) {
Chris Lattner9ace0cd2008-12-29 00:16:12 +00001787 assert(!SelectInst::areInvalidOperands(C, V1, V2)&&"Invalid select operands");
Chris Lattner08a45cc2004-03-12 05:54:04 +00001788
Chris Lattnereaf79802011-07-09 18:23:52 +00001789 if (Constant *SC = ConstantFoldSelectInstruction(C, V1, V2))
1790 return SC; // Fold common cases
Chris Lattner08a45cc2004-03-12 05:54:04 +00001791
1792 std::vector<Constant*> argVec(3, C);
1793 argVec[1] = V1;
1794 argVec[2] = V2;
Reid Spencer077d0eb2006-12-04 05:19:50 +00001795 ExprMapKeyType Key(Instruction::Select, argVec);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001796
Chris Lattnereaf79802011-07-09 18:23:52 +00001797 LLVMContextImpl *pImpl = C->getContext().pImpl;
1798 return pImpl->ExprConstants.getOrCreate(V1->getType(), Key);
Chris Lattner08a45cc2004-03-12 05:54:04 +00001799}
1800
Jay Foaddab3d292011-07-21 14:31:17 +00001801Constant *ConstantExpr::getGetElementPtr(Constant *C, ArrayRef<Value *> Idxs,
1802 bool InBounds) {
Duncan Sands2333e292012-11-13 12:59:33 +00001803 assert(C->getType()->isPtrOrPtrVectorTy() &&
1804 "Non-pointer type for constant GetElementPtr expression");
1805
Jay Foaddab3d292011-07-21 14:31:17 +00001806 if (Constant *FC = ConstantFoldGetElementPtr(C, InBounds, Idxs))
Chris Lattner1f78d512011-02-11 05:34:33 +00001807 return FC; // Fold a few common cases.
Dan Gohmanf8dbee72009-09-07 23:54:19 +00001808
Chris Lattnereaf79802011-07-09 18:23:52 +00001809 // Get the result type of the getelementptr!
Jay Foada9203102011-07-25 09:48:08 +00001810 Type *Ty = GetElementPtrInst::getIndexedType(C->getType(), Idxs);
Chris Lattnereaf79802011-07-09 18:23:52 +00001811 assert(Ty && "GEP indices invalid!");
Chris Lattner230cdab2012-01-26 00:42:34 +00001812 unsigned AS = C->getType()->getPointerAddressSpace();
Chris Lattnereaf79802011-07-09 18:23:52 +00001813 Type *ReqTy = Ty->getPointerTo(AS);
Duncan Sands2333e292012-11-13 12:59:33 +00001814 if (VectorType *VecTy = dyn_cast<VectorType>(C->getType()))
1815 ReqTy = VectorType::get(ReqTy, VecTy->getNumElements());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001816
Dan Gohmanf8dbee72009-09-07 23:54:19 +00001817 // Look up the constant in the table first to ensure uniqueness
1818 std::vector<Constant*> ArgVec;
Jay Foaddab3d292011-07-21 14:31:17 +00001819 ArgVec.reserve(1 + Idxs.size());
Dan Gohmanf8dbee72009-09-07 23:54:19 +00001820 ArgVec.push_back(C);
Duncan Sands2333e292012-11-13 12:59:33 +00001821 for (unsigned i = 0, e = Idxs.size(); i != e; ++i) {
1822 assert(Idxs[i]->getType()->isVectorTy() == ReqTy->isVectorTy() &&
1823 "getelementptr index type missmatch");
1824 assert((!Idxs[i]->getType()->isVectorTy() ||
1825 ReqTy->getVectorNumElements() ==
1826 Idxs[i]->getType()->getVectorNumElements()) &&
1827 "getelementptr index type missmatch");
Dan Gohmanf8dbee72009-09-07 23:54:19 +00001828 ArgVec.push_back(cast<Constant>(Idxs[i]));
Duncan Sands2333e292012-11-13 12:59:33 +00001829 }
Dan Gohmanf8dbee72009-09-07 23:54:19 +00001830 const ExprMapKeyType Key(Instruction::GetElementPtr, ArgVec, 0,
Chris Lattner1f78d512011-02-11 05:34:33 +00001831 InBounds ? GEPOperator::IsInBounds : 0);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001832
Chris Lattnereaf79802011-07-09 18:23:52 +00001833 LLVMContextImpl *pImpl = C->getContext().pImpl;
Dan Gohmanf8dbee72009-09-07 23:54:19 +00001834 return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
1835}
1836
Reid Spencer077d0eb2006-12-04 05:19:50 +00001837Constant *
Nick Lewycky401f3252010-01-21 07:03:21 +00001838ConstantExpr::getICmp(unsigned short pred, Constant *LHS, Constant *RHS) {
Reid Spencer077d0eb2006-12-04 05:19:50 +00001839 assert(LHS->getType() == RHS->getType());
1840 assert(pred >= ICmpInst::FIRST_ICMP_PREDICATE &&
1841 pred <= ICmpInst::LAST_ICMP_PREDICATE && "Invalid ICmp Predicate");
1842
Chris Lattnerb29d5962010-02-01 20:48:08 +00001843 if (Constant *FC = ConstantFoldCompareInstruction(pred, LHS, RHS))
Reid Spencer077d0eb2006-12-04 05:19:50 +00001844 return FC; // Fold a few common cases...
1845
1846 // Look up the constant in the table first to ensure uniqueness
1847 std::vector<Constant*> ArgVec;
1848 ArgVec.push_back(LHS);
1849 ArgVec.push_back(RHS);
Reid Spencer4fa021a2006-12-24 18:42:29 +00001850 // Get the key type with both the opcode and predicate
Reid Spencer077d0eb2006-12-04 05:19:50 +00001851 const ExprMapKeyType Key(Instruction::ICmp, ArgVec, pred);
Owen Anderson31c36f02009-06-17 20:10:08 +00001852
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001853 Type *ResultTy = Type::getInt1Ty(LHS->getContext());
1854 if (VectorType *VT = dyn_cast<VectorType>(LHS->getType()))
Nick Lewycky401f3252010-01-21 07:03:21 +00001855 ResultTy = VectorType::get(ResultTy, VT->getNumElements());
1856
Owen Andersond03eecd2009-08-04 20:25:11 +00001857 LLVMContextImpl *pImpl = LHS->getType()->getContext().pImpl;
Nick Lewycky401f3252010-01-21 07:03:21 +00001858 return pImpl->ExprConstants.getOrCreate(ResultTy, Key);
Reid Spencer077d0eb2006-12-04 05:19:50 +00001859}
1860
1861Constant *
Nick Lewycky401f3252010-01-21 07:03:21 +00001862ConstantExpr::getFCmp(unsigned short pred, Constant *LHS, Constant *RHS) {
Reid Spencer077d0eb2006-12-04 05:19:50 +00001863 assert(LHS->getType() == RHS->getType());
1864 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE && "Invalid FCmp Predicate");
1865
Chris Lattnerb29d5962010-02-01 20:48:08 +00001866 if (Constant *FC = ConstantFoldCompareInstruction(pred, LHS, RHS))
Reid Spencer077d0eb2006-12-04 05:19:50 +00001867 return FC; // Fold a few common cases...
1868
1869 // Look up the constant in the table first to ensure uniqueness
1870 std::vector<Constant*> ArgVec;
1871 ArgVec.push_back(LHS);
1872 ArgVec.push_back(RHS);
Reid Spencer4fa021a2006-12-24 18:42:29 +00001873 // Get the key type with both the opcode and predicate
Reid Spencer077d0eb2006-12-04 05:19:50 +00001874 const ExprMapKeyType Key(Instruction::FCmp, ArgVec, pred);
Nick Lewycky401f3252010-01-21 07:03:21 +00001875
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001876 Type *ResultTy = Type::getInt1Ty(LHS->getContext());
1877 if (VectorType *VT = dyn_cast<VectorType>(LHS->getType()))
Nick Lewycky401f3252010-01-21 07:03:21 +00001878 ResultTy = VectorType::get(ResultTy, VT->getNumElements());
1879
Owen Andersond03eecd2009-08-04 20:25:11 +00001880 LLVMContextImpl *pImpl = LHS->getType()->getContext().pImpl;
Nick Lewycky401f3252010-01-21 07:03:21 +00001881 return pImpl->ExprConstants.getOrCreate(ResultTy, Key);
Reid Spencer077d0eb2006-12-04 05:19:50 +00001882}
1883
Robert Bocchinob52ee7f2006-01-10 19:05:34 +00001884Constant *ConstantExpr::getExtractElement(Constant *Val, Constant *Idx) {
Duncan Sands1df98592010-02-16 11:11:14 +00001885 assert(Val->getType()->isVectorTy() &&
Reid Spencerac9dcb92007-02-15 03:39:18 +00001886 "Tried to create extractelement operation on non-vector type!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001887 assert(Idx->getType()->isIntegerTy(32) &&
Reid Spencer3d10b0b2007-01-26 07:37:34 +00001888 "Extractelement index must be i32 type!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001889
Chris Lattnereaf79802011-07-09 18:23:52 +00001890 if (Constant *FC = ConstantFoldExtractElementInstruction(Val, Idx))
Chris Lattner83738a22009-12-30 20:25:09 +00001891 return FC; // Fold a few common cases.
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001892
Robert Bocchinoc152f9c2006-01-17 20:07:22 +00001893 // Look up the constant in the table first to ensure uniqueness
1894 std::vector<Constant*> ArgVec(1, Val);
Robert Bocchinoc152f9c2006-01-17 20:07:22 +00001895 ArgVec.push_back(Idx);
Chris Lattnereaf79802011-07-09 18:23:52 +00001896 const ExprMapKeyType Key(Instruction::ExtractElement,ArgVec);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001897
Chris Lattnereaf79802011-07-09 18:23:52 +00001898 LLVMContextImpl *pImpl = Val->getContext().pImpl;
Chris Lattner230cdab2012-01-26 00:42:34 +00001899 Type *ReqTy = Val->getType()->getVectorElementType();
Owen Andersond03eecd2009-08-04 20:25:11 +00001900 return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
Robert Bocchinoc152f9c2006-01-17 20:07:22 +00001901}
1902
1903Constant *ConstantExpr::getInsertElement(Constant *Val, Constant *Elt,
1904 Constant *Idx) {
Duncan Sands1df98592010-02-16 11:11:14 +00001905 assert(Val->getType()->isVectorTy() &&
Reid Spencerac9dcb92007-02-15 03:39:18 +00001906 "Tried to create insertelement operation on non-vector type!");
Chris Lattner230cdab2012-01-26 00:42:34 +00001907 assert(Elt->getType() == Val->getType()->getVectorElementType() &&
1908 "Insertelement types must match!");
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001909 assert(Idx->getType()->isIntegerTy(32) &&
Reid Spencer3d10b0b2007-01-26 07:37:34 +00001910 "Insertelement index must be i32 type!");
Robert Bocchinoc152f9c2006-01-17 20:07:22 +00001911
Chris Lattnereaf79802011-07-09 18:23:52 +00001912 if (Constant *FC = ConstantFoldInsertElementInstruction(Val, Elt, Idx))
1913 return FC; // Fold a few common cases.
Chris Lattner00f10232006-04-08 01:18:18 +00001914 // Look up the constant in the table first to ensure uniqueness
Chris Lattnereaf79802011-07-09 18:23:52 +00001915 std::vector<Constant*> ArgVec(1, Val);
1916 ArgVec.push_back(Elt);
1917 ArgVec.push_back(Idx);
1918 const ExprMapKeyType Key(Instruction::InsertElement,ArgVec);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001919
Chris Lattnereaf79802011-07-09 18:23:52 +00001920 LLVMContextImpl *pImpl = Val->getContext().pImpl;
1921 return pImpl->ExprConstants.getOrCreate(Val->getType(), Key);
Chris Lattner00f10232006-04-08 01:18:18 +00001922}
1923
1924Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,
1925 Constant *Mask) {
1926 assert(ShuffleVectorInst::isValidOperands(V1, V2, Mask) &&
1927 "Invalid shuffle vector constant expr operands!");
Nate Begeman0f123cf2009-02-12 21:28:33 +00001928
Chris Lattnereaf79802011-07-09 18:23:52 +00001929 if (Constant *FC = ConstantFoldShuffleVectorInstruction(V1, V2, Mask))
1930 return FC; // Fold a few common cases.
1931
Chris Lattner230cdab2012-01-26 00:42:34 +00001932 unsigned NElts = Mask->getType()->getVectorNumElements();
1933 Type *EltTy = V1->getType()->getVectorElementType();
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001934 Type *ShufTy = VectorType::get(EltTy, NElts);
Chris Lattnereaf79802011-07-09 18:23:52 +00001935
1936 // Look up the constant in the table first to ensure uniqueness
1937 std::vector<Constant*> ArgVec(1, V1);
1938 ArgVec.push_back(V2);
1939 ArgVec.push_back(Mask);
1940 const ExprMapKeyType Key(Instruction::ShuffleVector,ArgVec);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001941
Chris Lattnereaf79802011-07-09 18:23:52 +00001942 LLVMContextImpl *pImpl = ShufTy->getContext().pImpl;
1943 return pImpl->ExprConstants.getOrCreate(ShufTy, Key);
Chris Lattner00f10232006-04-08 01:18:18 +00001944}
1945
Chris Lattnereaf79802011-07-09 18:23:52 +00001946Constant *ConstantExpr::getInsertValue(Constant *Agg, Constant *Val,
Jay Foadfc6d3a42011-07-13 10:26:04 +00001947 ArrayRef<unsigned> Idxs) {
1948 assert(ExtractValueInst::getIndexedType(Agg->getType(),
1949 Idxs) == Val->getType() &&
Dan Gohman041e2eb2008-05-15 19:50:34 +00001950 "insertvalue indices invalid!");
Dan Gohmane4569942008-05-23 00:36:11 +00001951 assert(Agg->getType()->isFirstClassType() &&
Chris Lattner4e47aad2011-07-12 05:26:21 +00001952 "Non-first-class type for constant insertvalue expression");
Jay Foadfc6d3a42011-07-13 10:26:04 +00001953 Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs);
Chris Lattner4e47aad2011-07-12 05:26:21 +00001954 assert(FC && "insertvalue constant expr couldn't be folded!");
Dan Gohmane0891602008-07-21 23:30:30 +00001955 return FC;
Dan Gohman041e2eb2008-05-15 19:50:34 +00001956}
1957
Chris Lattnereaf79802011-07-09 18:23:52 +00001958Constant *ConstantExpr::getExtractValue(Constant *Agg,
Jay Foadfc6d3a42011-07-13 10:26:04 +00001959 ArrayRef<unsigned> Idxs) {
Dan Gohmane4569942008-05-23 00:36:11 +00001960 assert(Agg->getType()->isFirstClassType() &&
Chris Lattnereaf79802011-07-09 18:23:52 +00001961 "Tried to create extractelement operation on non-first-class type!");
Dan Gohman041e2eb2008-05-15 19:50:34 +00001962
Chris Lattnerdb125cf2011-07-18 04:54:35 +00001963 Type *ReqTy = ExtractValueInst::getIndexedType(Agg->getType(), Idxs);
Chandler Carruthdc770fc2011-07-10 09:45:35 +00001964 (void)ReqTy;
Chris Lattnereaf79802011-07-09 18:23:52 +00001965 assert(ReqTy && "extractvalue indices invalid!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00001966
Dan Gohmane4569942008-05-23 00:36:11 +00001967 assert(Agg->getType()->isFirstClassType() &&
1968 "Non-first-class type for constant extractvalue expression");
Jay Foadfc6d3a42011-07-13 10:26:04 +00001969 Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs);
Dan Gohmane0891602008-07-21 23:30:30 +00001970 assert(FC && "ExtractValue constant expr couldn't be folded!");
1971 return FC;
Dan Gohman041e2eb2008-05-15 19:50:34 +00001972}
1973
Chris Lattner81baf142011-02-10 07:01:55 +00001974Constant *ConstantExpr::getNeg(Constant *C, bool HasNUW, bool HasNSW) {
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001975 assert(C->getType()->isIntOrIntVectorTy() &&
Owen Andersonbaf3c402009-07-29 18:55:55 +00001976 "Cannot NEG a nonintegral value!");
Chris Lattner81baf142011-02-10 07:01:55 +00001977 return getSub(ConstantFP::getZeroValueForNegation(C->getType()),
1978 C, HasNUW, HasNSW);
Owen Andersonbaf3c402009-07-29 18:55:55 +00001979}
1980
Chris Lattnerf067d582011-02-07 16:40:21 +00001981Constant *ConstantExpr::getFNeg(Constant *C) {
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001982 assert(C->getType()->isFPOrFPVectorTy() &&
Owen Andersonbaf3c402009-07-29 18:55:55 +00001983 "Cannot FNEG a non-floating-point value!");
Chris Lattner81baf142011-02-10 07:01:55 +00001984 return getFSub(ConstantFP::getZeroValueForNegation(C->getType()), C);
Owen Andersonbaf3c402009-07-29 18:55:55 +00001985}
1986
Chris Lattnerf067d582011-02-07 16:40:21 +00001987Constant *ConstantExpr::getNot(Constant *C) {
Duncan Sandsb0bc6c32010-02-15 16:12:20 +00001988 assert(C->getType()->isIntOrIntVectorTy() &&
Owen Andersonbaf3c402009-07-29 18:55:55 +00001989 "Cannot NOT a nonintegral value!");
Owen Andersona7235ea2009-07-31 20:28:14 +00001990 return get(Instruction::Xor, C, Constant::getAllOnesValue(C->getType()));
Owen Andersonbaf3c402009-07-29 18:55:55 +00001991}
1992
Chris Lattner81baf142011-02-10 07:01:55 +00001993Constant *ConstantExpr::getAdd(Constant *C1, Constant *C2,
1994 bool HasNUW, bool HasNSW) {
1995 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
1996 (HasNSW ? OverflowingBinaryOperator::NoSignedWrap : 0);
1997 return get(Instruction::Add, C1, C2, Flags);
Owen Andersonbaf3c402009-07-29 18:55:55 +00001998}
1999
Chris Lattnerf067d582011-02-07 16:40:21 +00002000Constant *ConstantExpr::getFAdd(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002001 return get(Instruction::FAdd, C1, C2);
2002}
2003
Chris Lattner81baf142011-02-10 07:01:55 +00002004Constant *ConstantExpr::getSub(Constant *C1, Constant *C2,
2005 bool HasNUW, bool HasNSW) {
2006 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
2007 (HasNSW ? OverflowingBinaryOperator::NoSignedWrap : 0);
2008 return get(Instruction::Sub, C1, C2, Flags);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002009}
2010
Chris Lattnerf067d582011-02-07 16:40:21 +00002011Constant *ConstantExpr::getFSub(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002012 return get(Instruction::FSub, C1, C2);
2013}
2014
Chris Lattner81baf142011-02-10 07:01:55 +00002015Constant *ConstantExpr::getMul(Constant *C1, Constant *C2,
2016 bool HasNUW, bool HasNSW) {
2017 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
2018 (HasNSW ? OverflowingBinaryOperator::NoSignedWrap : 0);
2019 return get(Instruction::Mul, C1, C2, Flags);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002020}
2021
Chris Lattnerf067d582011-02-07 16:40:21 +00002022Constant *ConstantExpr::getFMul(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002023 return get(Instruction::FMul, C1, C2);
2024}
2025
Chris Lattner74f5c5a2011-02-09 16:43:07 +00002026Constant *ConstantExpr::getUDiv(Constant *C1, Constant *C2, bool isExact) {
2027 return get(Instruction::UDiv, C1, C2,
2028 isExact ? PossiblyExactOperator::IsExact : 0);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002029}
2030
Chris Lattner74f5c5a2011-02-09 16:43:07 +00002031Constant *ConstantExpr::getSDiv(Constant *C1, Constant *C2, bool isExact) {
2032 return get(Instruction::SDiv, C1, C2,
2033 isExact ? PossiblyExactOperator::IsExact : 0);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002034}
2035
Chris Lattnerf067d582011-02-07 16:40:21 +00002036Constant *ConstantExpr::getFDiv(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002037 return get(Instruction::FDiv, C1, C2);
2038}
2039
Chris Lattnerf067d582011-02-07 16:40:21 +00002040Constant *ConstantExpr::getURem(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002041 return get(Instruction::URem, C1, C2);
2042}
2043
Chris Lattnerf067d582011-02-07 16:40:21 +00002044Constant *ConstantExpr::getSRem(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002045 return get(Instruction::SRem, C1, C2);
2046}
2047
Chris Lattnerf067d582011-02-07 16:40:21 +00002048Constant *ConstantExpr::getFRem(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002049 return get(Instruction::FRem, C1, C2);
2050}
2051
Chris Lattnerf067d582011-02-07 16:40:21 +00002052Constant *ConstantExpr::getAnd(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002053 return get(Instruction::And, C1, C2);
2054}
2055
Chris Lattnerf067d582011-02-07 16:40:21 +00002056Constant *ConstantExpr::getOr(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002057 return get(Instruction::Or, C1, C2);
2058}
2059
Chris Lattnerf067d582011-02-07 16:40:21 +00002060Constant *ConstantExpr::getXor(Constant *C1, Constant *C2) {
Owen Andersonbaf3c402009-07-29 18:55:55 +00002061 return get(Instruction::Xor, C1, C2);
2062}
2063
Chris Lattner81baf142011-02-10 07:01:55 +00002064Constant *ConstantExpr::getShl(Constant *C1, Constant *C2,
2065 bool HasNUW, bool HasNSW) {
2066 unsigned Flags = (HasNUW ? OverflowingBinaryOperator::NoUnsignedWrap : 0) |
2067 (HasNSW ? OverflowingBinaryOperator::NoSignedWrap : 0);
2068 return get(Instruction::Shl, C1, C2, Flags);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002069}
2070
Chris Lattner74f5c5a2011-02-09 16:43:07 +00002071Constant *ConstantExpr::getLShr(Constant *C1, Constant *C2, bool isExact) {
2072 return get(Instruction::LShr, C1, C2,
2073 isExact ? PossiblyExactOperator::IsExact : 0);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002074}
2075
Chris Lattner74f5c5a2011-02-09 16:43:07 +00002076Constant *ConstantExpr::getAShr(Constant *C1, Constant *C2, bool isExact) {
2077 return get(Instruction::AShr, C1, C2,
2078 isExact ? PossiblyExactOperator::IsExact : 0);
Owen Andersonbaf3c402009-07-29 18:55:55 +00002079}
2080
Duncan Sandsc038a782012-06-12 14:33:56 +00002081/// getBinOpIdentity - Return the identity for the given binary operation,
2082/// i.e. a constant C such that X op C = X and C op X = X for every X. It
Duncan Sandsee5a0942012-06-13 09:42:13 +00002083/// returns null if the operator doesn't have an identity.
Duncan Sandsc038a782012-06-12 14:33:56 +00002084Constant *ConstantExpr::getBinOpIdentity(unsigned Opcode, Type *Ty) {
2085 switch (Opcode) {
2086 default:
Duncan Sandsee5a0942012-06-13 09:42:13 +00002087 // Doesn't have an identity.
2088 return 0;
2089
Duncan Sandsc038a782012-06-12 14:33:56 +00002090 case Instruction::Add:
2091 case Instruction::Or:
2092 case Instruction::Xor:
2093 return Constant::getNullValue(Ty);
2094
2095 case Instruction::Mul:
2096 return ConstantInt::get(Ty, 1);
2097
2098 case Instruction::And:
2099 return Constant::getAllOnesValue(Ty);
2100 }
2101}
2102
Duncan Sandsee5a0942012-06-13 09:42:13 +00002103/// getBinOpAbsorber - Return the absorbing element for the given binary
2104/// operation, i.e. a constant C such that X op C = C and C op X = C for
2105/// every X. For example, this returns zero for integer multiplication.
2106/// It returns null if the operator doesn't have an absorbing element.
2107Constant *ConstantExpr::getBinOpAbsorber(unsigned Opcode, Type *Ty) {
2108 switch (Opcode) {
2109 default:
2110 // Doesn't have an absorber.
2111 return 0;
2112
2113 case Instruction::Or:
2114 return Constant::getAllOnesValue(Ty);
2115
2116 case Instruction::And:
2117 case Instruction::Mul:
2118 return Constant::getNullValue(Ty);
2119 }
2120}
2121
Vikram S. Adved0b1bb02002-07-15 18:19:33 +00002122// destroyConstant - Remove the constant from the constant table...
2123//
Owen Anderson04fb7c32009-06-20 00:24:58 +00002124void ConstantExpr::destroyConstant() {
Chris Lattner1afcace2011-07-09 17:41:24 +00002125 getType()->getContext().pImpl->ExprConstants.remove(this);
Vikram S. Adved0b1bb02002-07-15 18:19:33 +00002126 destroyConstantImpl();
Vikram S. Adve345e0cf2002-07-14 23:13:17 +00002127}
2128
Chris Lattnerc188eeb2002-07-30 18:54:25 +00002129const char *ConstantExpr::getOpcodeName() const {
2130 return Instruction::getOpcodeName(getOpcode());
Vikram S. Adve345e0cf2002-07-14 23:13:17 +00002131}
Reid Spencer1c9c8e62004-07-17 23:48:33 +00002132
Chris Lattner04e3b1e2010-03-30 20:48:48 +00002133
2134
2135GetElementPtrConstantExpr::
Chris Lattnera7c69882012-01-26 20:40:56 +00002136GetElementPtrConstantExpr(Constant *C, ArrayRef<Constant*> IdxList,
Chris Lattnerdb125cf2011-07-18 04:54:35 +00002137 Type *DestTy)
Chris Lattner04e3b1e2010-03-30 20:48:48 +00002138 : ConstantExpr(DestTy, Instruction::GetElementPtr,
2139 OperandTraits<GetElementPtrConstantExpr>::op_end(this)
2140 - (IdxList.size()+1), IdxList.size()+1) {
2141 OperandList[0] = C;
2142 for (unsigned i = 0, E = IdxList.size(); i != E; ++i)
2143 OperandList[i+1] = IdxList[i];
2144}
2145
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002146//===----------------------------------------------------------------------===//
2147// ConstantData* implementations
2148
2149void ConstantDataArray::anchor() {}
2150void ConstantDataVector::anchor() {}
2151
Chris Lattner45bb5c52012-01-24 04:43:41 +00002152/// getElementType - Return the element type of the array/vector.
2153Type *ConstantDataSequential::getElementType() const {
2154 return getType()->getElementType();
2155}
2156
Chris Lattner9e631da2012-01-24 09:31:43 +00002157StringRef ConstantDataSequential::getRawDataValues() const {
Chris Lattner1ee0ecf2012-01-24 13:41:11 +00002158 return StringRef(DataElements, getNumElements()*getElementByteSize());
Chris Lattner9e631da2012-01-24 09:31:43 +00002159}
2160
Chris Lattnerff2b7f32012-01-24 05:42:11 +00002161/// isElementTypeCompatible - Return true if a ConstantDataSequential can be
2162/// formed with a vector or array of the specified element type.
2163/// ConstantDataArray only works with normal float and int types that are
2164/// stored densely in memory, not with things like i42 or x86_f80.
2165bool ConstantDataSequential::isElementTypeCompatible(const Type *Ty) {
Chris Lattner45bb5c52012-01-24 04:43:41 +00002166 if (Ty->isFloatTy() || Ty->isDoubleTy()) return true;
2167 if (const IntegerType *IT = dyn_cast<IntegerType>(Ty)) {
2168 switch (IT->getBitWidth()) {
2169 case 8:
2170 case 16:
2171 case 32:
2172 case 64:
2173 return true;
2174 default: break;
2175 }
2176 }
2177 return false;
2178}
2179
Chris Lattner1ee0ecf2012-01-24 13:41:11 +00002180/// getNumElements - Return the number of elements in the array or vector.
2181unsigned ConstantDataSequential::getNumElements() const {
Chris Lattneraf7b4fb2012-01-25 01:32:59 +00002182 if (ArrayType *AT = dyn_cast<ArrayType>(getType()))
2183 return AT->getNumElements();
Chris Lattner230cdab2012-01-26 00:42:34 +00002184 return getType()->getVectorNumElements();
Chris Lattner1ee0ecf2012-01-24 13:41:11 +00002185}
2186
2187
Chris Lattner45bb5c52012-01-24 04:43:41 +00002188/// getElementByteSize - Return the size in bytes of the elements in the data.
2189uint64_t ConstantDataSequential::getElementByteSize() const {
2190 return getElementType()->getPrimitiveSizeInBits()/8;
2191}
2192
2193/// getElementPointer - Return the start of the specified element.
2194const char *ConstantDataSequential::getElementPointer(unsigned Elt) const {
Chris Lattner1ee0ecf2012-01-24 13:41:11 +00002195 assert(Elt < getNumElements() && "Invalid Elt");
Chris Lattner45bb5c52012-01-24 04:43:41 +00002196 return DataElements+Elt*getElementByteSize();
2197}
2198
2199
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002200/// isAllZeros - return true if the array is empty or all zeros.
2201static bool isAllZeros(StringRef Arr) {
2202 for (StringRef::iterator I = Arr.begin(), E = Arr.end(); I != E; ++I)
2203 if (*I != 0)
2204 return false;
2205 return true;
2206}
Chris Lattnerff2b7f32012-01-24 05:42:11 +00002207
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002208/// getImpl - This is the underlying implementation of all of the
2209/// ConstantDataSequential::get methods. They all thunk down to here, providing
Chris Lattner8cf27ef2012-01-30 18:19:30 +00002210/// the correct element type. We take the bytes in as a StringRef because
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002211/// we *want* an underlying "char*" to avoid TBAA type punning violations.
2212Constant *ConstantDataSequential::getImpl(StringRef Elements, Type *Ty) {
Chris Lattner230cdab2012-01-26 00:42:34 +00002213 assert(isElementTypeCompatible(Ty->getSequentialElementType()));
Chris Lattner29cc6cb2012-01-24 14:17:05 +00002214 // If the elements are all zero or there are no elements, return a CAZ, which
2215 // is more dense and canonical.
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002216 if (isAllZeros(Elements))
2217 return ConstantAggregateZero::get(Ty);
2218
2219 // Do a lookup to see if we have already formed one of these.
2220 StringMap<ConstantDataSequential*>::MapEntryTy &Slot =
2221 Ty->getContext().pImpl->CDSConstants.GetOrCreateValue(Elements);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002222
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002223 // The bucket can point to a linked list of different CDS's that have the same
2224 // body but different types. For example, 0,0,0,1 could be a 4 element array
2225 // of i8, or a 1-element array of i32. They'll both end up in the same
2226 /// StringMap bucket, linked up by their Next pointers. Walk the list.
2227 ConstantDataSequential **Entry = &Slot.getValue();
2228 for (ConstantDataSequential *Node = *Entry; Node != 0;
2229 Entry = &Node->Next, Node = *Entry)
2230 if (Node->getType() == Ty)
2231 return Node;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002232
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002233 // Okay, we didn't get a hit. Create a node of the right class, link it in,
2234 // and return it.
2235 if (isa<ArrayType>(Ty))
2236 return *Entry = new ConstantDataArray(Ty, Slot.getKeyData());
2237
2238 assert(isa<VectorType>(Ty));
2239 return *Entry = new ConstantDataVector(Ty, Slot.getKeyData());
2240}
2241
2242void ConstantDataSequential::destroyConstant() {
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002243 // Remove the constant from the StringMap.
2244 StringMap<ConstantDataSequential*> &CDSConstants =
2245 getType()->getContext().pImpl->CDSConstants;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002246
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002247 StringMap<ConstantDataSequential*>::iterator Slot =
Chris Lattner9e631da2012-01-24 09:31:43 +00002248 CDSConstants.find(getRawDataValues());
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002249
2250 assert(Slot != CDSConstants.end() && "CDS not found in uniquing table");
2251
2252 ConstantDataSequential **Entry = &Slot->getValue();
2253
2254 // Remove the entry from the hash table.
2255 if ((*Entry)->Next == 0) {
2256 // If there is only one value in the bucket (common case) it must be this
2257 // entry, and removing the entry should remove the bucket completely.
2258 assert((*Entry) == this && "Hash mismatch in ConstantDataSequential");
2259 getContext().pImpl->CDSConstants.erase(Slot);
2260 } else {
2261 // Otherwise, there are multiple entries linked off the bucket, unlink the
2262 // node we care about but keep the bucket around.
2263 for (ConstantDataSequential *Node = *Entry; ;
2264 Entry = &Node->Next, Node = *Entry) {
2265 assert(Node && "Didn't find entry in its uniquing hash table!");
2266 // If we found our entry, unlink it from the list and we're done.
2267 if (Node == this) {
2268 *Entry = Node->Next;
2269 break;
2270 }
2271 }
2272 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002273
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002274 // If we were part of a list, make sure that we don't delete the list that is
2275 // still owned by the uniquing map.
2276 Next = 0;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002277
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002278 // Finally, actually delete it.
2279 destroyConstantImpl();
2280}
2281
2282/// get() constructors - Return a constant with array type with an element
2283/// count and element type matching the ArrayRef passed in. Note that this
2284/// can return a ConstantAggregateZero object.
Chris Lattner32100602012-01-24 14:04:40 +00002285Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint8_t> Elts) {
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002286 Type *Ty = ArrayType::get(Type::getInt8Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002287 const char *Data = reinterpret_cast<const char *>(Elts.data());
2288 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*1), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002289}
Chris Lattner32100602012-01-24 14:04:40 +00002290Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint16_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002291 Type *Ty = ArrayType::get(Type::getInt16Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002292 const char *Data = reinterpret_cast<const char *>(Elts.data());
2293 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*2), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002294}
Chris Lattner32100602012-01-24 14:04:40 +00002295Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint32_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002296 Type *Ty = ArrayType::get(Type::getInt32Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002297 const char *Data = reinterpret_cast<const char *>(Elts.data());
2298 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*4), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002299}
Chris Lattner32100602012-01-24 14:04:40 +00002300Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint64_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002301 Type *Ty = ArrayType::get(Type::getInt64Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002302 const char *Data = reinterpret_cast<const char *>(Elts.data());
2303 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*8), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002304}
Chris Lattner32100602012-01-24 14:04:40 +00002305Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<float> Elts) {
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002306 Type *Ty = ArrayType::get(Type::getFloatTy(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002307 const char *Data = reinterpret_cast<const char *>(Elts.data());
2308 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*4), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002309}
Chris Lattner32100602012-01-24 14:04:40 +00002310Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<double> Elts) {
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002311 Type *Ty = ArrayType::get(Type::getDoubleTy(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002312 const char *Data = reinterpret_cast<const char *>(Elts.data());
2313 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*8), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002314}
2315
Chris Lattner32100602012-01-24 14:04:40 +00002316/// getString - This method constructs a CDS and initializes it with a text
2317/// string. The default behavior (AddNull==true) causes a null terminator to
2318/// be placed at the end of the array (increasing the length of the string by
2319/// one more than the StringRef would normally indicate. Pass AddNull=false
2320/// to disable this behavior.
2321Constant *ConstantDataArray::getString(LLVMContext &Context,
2322 StringRef Str, bool AddNull) {
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002323 if (!AddNull) {
2324 const uint8_t *Data = reinterpret_cast<const uint8_t *>(Str.data());
2325 return get(Context, ArrayRef<uint8_t>(const_cast<uint8_t *>(Data),
2326 Str.size()));
2327 }
2328
Chris Lattner32100602012-01-24 14:04:40 +00002329 SmallVector<uint8_t, 64> ElementVals;
2330 ElementVals.append(Str.begin(), Str.end());
2331 ElementVals.push_back(0);
2332 return get(Context, ElementVals);
2333}
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002334
2335/// get() constructors - Return a constant with vector type with an element
2336/// count and element type matching the ArrayRef passed in. Note that this
2337/// can return a ConstantAggregateZero object.
Chris Lattner32100602012-01-24 14:04:40 +00002338Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint8_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002339 Type *Ty = VectorType::get(Type::getInt8Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002340 const char *Data = reinterpret_cast<const char *>(Elts.data());
2341 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*1), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002342}
Chris Lattner32100602012-01-24 14:04:40 +00002343Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint16_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002344 Type *Ty = VectorType::get(Type::getInt16Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002345 const char *Data = reinterpret_cast<const char *>(Elts.data());
2346 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*2), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002347}
Chris Lattner32100602012-01-24 14:04:40 +00002348Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint32_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002349 Type *Ty = VectorType::get(Type::getInt32Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002350 const char *Data = reinterpret_cast<const char *>(Elts.data());
2351 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*4), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002352}
Chris Lattner32100602012-01-24 14:04:40 +00002353Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint64_t> Elts){
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002354 Type *Ty = VectorType::get(Type::getInt64Ty(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002355 const char *Data = reinterpret_cast<const char *>(Elts.data());
2356 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*8), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002357}
Chris Lattner32100602012-01-24 14:04:40 +00002358Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<float> Elts) {
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002359 Type *Ty = VectorType::get(Type::getFloatTy(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002360 const char *Data = reinterpret_cast<const char *>(Elts.data());
2361 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*4), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002362}
Chris Lattner32100602012-01-24 14:04:40 +00002363Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<double> Elts) {
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002364 Type *Ty = VectorType::get(Type::getDoubleTy(Context), Elts.size());
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002365 const char *Data = reinterpret_cast<const char *>(Elts.data());
2366 return getImpl(StringRef(const_cast<char *>(Data), Elts.size()*8), Ty);
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002367}
2368
Chris Lattner3c2c9542012-01-25 05:19:54 +00002369Constant *ConstantDataVector::getSplat(unsigned NumElts, Constant *V) {
2370 assert(isElementTypeCompatible(V->getType()) &&
2371 "Element type not compatible with ConstantData");
2372 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
2373 if (CI->getType()->isIntegerTy(8)) {
2374 SmallVector<uint8_t, 16> Elts(NumElts, CI->getZExtValue());
2375 return get(V->getContext(), Elts);
2376 }
2377 if (CI->getType()->isIntegerTy(16)) {
2378 SmallVector<uint16_t, 16> Elts(NumElts, CI->getZExtValue());
2379 return get(V->getContext(), Elts);
2380 }
2381 if (CI->getType()->isIntegerTy(32)) {
2382 SmallVector<uint32_t, 16> Elts(NumElts, CI->getZExtValue());
2383 return get(V->getContext(), Elts);
2384 }
2385 assert(CI->getType()->isIntegerTy(64) && "Unsupported ConstantData type");
2386 SmallVector<uint64_t, 16> Elts(NumElts, CI->getZExtValue());
2387 return get(V->getContext(), Elts);
2388 }
2389
Chris Lattner36c744f2012-01-30 06:21:21 +00002390 if (ConstantFP *CFP = dyn_cast<ConstantFP>(V)) {
2391 if (CFP->getType()->isFloatTy()) {
2392 SmallVector<float, 16> Elts(NumElts, CFP->getValueAPF().convertToFloat());
2393 return get(V->getContext(), Elts);
2394 }
2395 if (CFP->getType()->isDoubleTy()) {
2396 SmallVector<double, 16> Elts(NumElts,
2397 CFP->getValueAPF().convertToDouble());
2398 return get(V->getContext(), Elts);
2399 }
Chris Lattner3c2c9542012-01-25 05:19:54 +00002400 }
Chris Lattner36c744f2012-01-30 06:21:21 +00002401 return ConstantVector::getSplat(NumElts, V);
Chris Lattner3c2c9542012-01-25 05:19:54 +00002402}
2403
2404
Chris Lattner45bb5c52012-01-24 04:43:41 +00002405/// getElementAsInteger - If this is a sequential container of integers (of
2406/// any size), return the specified element in the low bits of a uint64_t.
2407uint64_t ConstantDataSequential::getElementAsInteger(unsigned Elt) const {
2408 assert(isa<IntegerType>(getElementType()) &&
2409 "Accessor can only be used when element is an integer");
2410 const char *EltPtr = getElementPointer(Elt);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002411
Chris Lattner45bb5c52012-01-24 04:43:41 +00002412 // The data is stored in host byte order, make sure to cast back to the right
2413 // type to load with the right endianness.
Chris Lattner230cdab2012-01-26 00:42:34 +00002414 switch (getElementType()->getIntegerBitWidth()) {
Craig Topper50bee422012-02-05 22:14:15 +00002415 default: llvm_unreachable("Invalid bitwidth for CDS");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002416 case 8:
2417 return *const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(EltPtr));
2418 case 16:
2419 return *const_cast<uint16_t *>(reinterpret_cast<const uint16_t *>(EltPtr));
2420 case 32:
2421 return *const_cast<uint32_t *>(reinterpret_cast<const uint32_t *>(EltPtr));
2422 case 64:
2423 return *const_cast<uint64_t *>(reinterpret_cast<const uint64_t *>(EltPtr));
Chris Lattner45bb5c52012-01-24 04:43:41 +00002424 }
2425}
2426
2427/// getElementAsAPFloat - If this is a sequential container of floating point
2428/// type, return the specified element as an APFloat.
2429APFloat ConstantDataSequential::getElementAsAPFloat(unsigned Elt) const {
2430 const char *EltPtr = getElementPointer(Elt);
2431
2432 switch (getElementType()->getTypeID()) {
Nick Lewycky1486ae62012-01-25 03:20:12 +00002433 default:
Craig Topper50bee422012-02-05 22:14:15 +00002434 llvm_unreachable("Accessor can only be used when element is float/double!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002435 case Type::FloatTyID: {
2436 const float *FloatPrt = reinterpret_cast<const float *>(EltPtr);
2437 return APFloat(*const_cast<float *>(FloatPrt));
2438 }
2439 case Type::DoubleTyID: {
2440 const double *DoublePtr = reinterpret_cast<const double *>(EltPtr);
2441 return APFloat(*const_cast<double *>(DoublePtr));
2442 }
Chris Lattner45bb5c52012-01-24 04:43:41 +00002443 }
2444}
2445
2446/// getElementAsFloat - If this is an sequential container of floats, return
2447/// the specified element as a float.
2448float ConstantDataSequential::getElementAsFloat(unsigned Elt) const {
2449 assert(getElementType()->isFloatTy() &&
2450 "Accessor can only be used when element is a 'float'");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002451 const float *EltPtr = reinterpret_cast<const float *>(getElementPointer(Elt));
2452 return *const_cast<float *>(EltPtr);
Chris Lattner45bb5c52012-01-24 04:43:41 +00002453}
2454
2455/// getElementAsDouble - If this is an sequential container of doubles, return
2456/// the specified element as a float.
2457double ConstantDataSequential::getElementAsDouble(unsigned Elt) const {
2458 assert(getElementType()->isDoubleTy() &&
2459 "Accessor can only be used when element is a 'float'");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002460 const double *EltPtr =
2461 reinterpret_cast<const double *>(getElementPointer(Elt));
2462 return *const_cast<double *>(EltPtr);
Chris Lattner45bb5c52012-01-24 04:43:41 +00002463}
2464
2465/// getElementAsConstant - Return a Constant for a specified index's element.
2466/// Note that this has to compute a new constant to return, so it isn't as
2467/// efficient as getElementAsInteger/Float/Double.
2468Constant *ConstantDataSequential::getElementAsConstant(unsigned Elt) const {
2469 if (getElementType()->isFloatTy() || getElementType()->isDoubleTy())
2470 return ConstantFP::get(getContext(), getElementAsAPFloat(Elt));
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002471
Chris Lattner45bb5c52012-01-24 04:43:41 +00002472 return ConstantInt::get(getElementType(), getElementAsInteger(Elt));
2473}
2474
Chris Lattner62339072012-01-24 09:01:07 +00002475/// isString - This method returns true if this is an array of i8.
2476bool ConstantDataSequential::isString() const {
2477 return isa<ArrayType>(getType()) && getElementType()->isIntegerTy(8);
2478}
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002479
Chris Lattner62339072012-01-24 09:01:07 +00002480/// isCString - This method returns true if the array "isString", ends with a
2481/// nul byte, and does not contains any other nul bytes.
2482bool ConstantDataSequential::isCString() const {
2483 if (!isString())
2484 return false;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002485
Chris Lattner62339072012-01-24 09:01:07 +00002486 StringRef Str = getAsString();
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002487
Chris Lattner62339072012-01-24 09:01:07 +00002488 // The last value must be nul.
2489 if (Str.back() != 0) return false;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002490
Chris Lattner62339072012-01-24 09:01:07 +00002491 // Other elements must be non-nul.
2492 return Str.drop_back().find(0) == StringRef::npos;
2493}
Chris Lattner27dd9cf2012-01-23 22:57:10 +00002494
Chris Lattnere150e2d2012-01-26 02:31:22 +00002495/// getSplatValue - If this is a splat constant, meaning that all of the
2496/// elements have the same value, return that value. Otherwise return NULL.
2497Constant *ConstantDataVector::getSplatValue() const {
2498 const char *Base = getRawDataValues().data();
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002499
Chris Lattnere150e2d2012-01-26 02:31:22 +00002500 // Compare elements 1+ to the 0'th element.
2501 unsigned EltSize = getElementByteSize();
2502 for (unsigned i = 1, e = getNumElements(); i != e; ++i)
2503 if (memcmp(Base, Base+i*EltSize, EltSize))
2504 return 0;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002505
Chris Lattnere150e2d2012-01-26 02:31:22 +00002506 // If they're all the same, return the 0th one as a representative.
2507 return getElementAsConstant(0);
2508}
Chris Lattner04e3b1e2010-03-30 20:48:48 +00002509
Chris Lattner5cbade92005-10-03 21:58:36 +00002510//===----------------------------------------------------------------------===//
2511// replaceUsesOfWithOnConstant implementations
2512
Chris Lattner54984052007-08-21 00:55:23 +00002513/// replaceUsesOfWithOnConstant - Update this constant array to change uses of
2514/// 'From' to be uses of 'To'. This must update the uniquing data structures
2515/// etc.
2516///
2517/// Note that we intentionally replace all uses of From with To here. Consider
2518/// a large array that uses 'From' 1000 times. By handling this case all here,
2519/// ConstantArray::replaceUsesOfWithOnConstant is only invoked once, and that
2520/// single invocation handles all 1000 uses. Handling them one at a time would
2521/// work, but would be really slow because it would have to unique each updated
2522/// array instance.
Chris Lattner2ee11ec2009-10-28 00:01:44 +00002523///
Chris Lattner5cbade92005-10-03 21:58:36 +00002524void ConstantArray::replaceUsesOfWithOnConstant(Value *From, Value *To,
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002525 Use *U) {
Owen Anderson1fd70962009-07-28 18:32:17 +00002526 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
2527 Constant *ToC = cast<Constant>(To);
2528
Chris Lattner1afcace2011-07-09 17:41:24 +00002529 LLVMContextImpl *pImpl = getType()->getContext().pImpl;
Owen Anderson1fd70962009-07-28 18:32:17 +00002530
Talin2cb395e2012-02-05 20:54:10 +00002531 SmallVector<Constant*, 8> Values;
2532 LLVMContextImpl::ArrayConstantsTy::LookupKey Lookup;
2533 Lookup.first = cast<ArrayType>(getType());
Owen Anderson1fd70962009-07-28 18:32:17 +00002534 Values.reserve(getNumOperands()); // Build replacement array.
2535
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002536 // Fill values with the modified operands of the constant array. Also,
Owen Anderson1fd70962009-07-28 18:32:17 +00002537 // compute whether this turns into an all-zeros array.
Owen Anderson1fd70962009-07-28 18:32:17 +00002538 unsigned NumUpdated = 0;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002539
Chris Lattnere150e2d2012-01-26 02:31:22 +00002540 // Keep track of whether all the values in the array are "ToC".
2541 bool AllSame = true;
2542 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
2543 Constant *Val = cast<Constant>(O->get());
2544 if (Val == From) {
2545 Val = ToC;
2546 ++NumUpdated;
Owen Anderson1fd70962009-07-28 18:32:17 +00002547 }
Chris Lattnere150e2d2012-01-26 02:31:22 +00002548 Values.push_back(Val);
Talin2cb395e2012-02-05 20:54:10 +00002549 AllSame &= Val == ToC;
Owen Anderson1fd70962009-07-28 18:32:17 +00002550 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002551
Owen Anderson1fd70962009-07-28 18:32:17 +00002552 Constant *Replacement = 0;
Chris Lattnere150e2d2012-01-26 02:31:22 +00002553 if (AllSame && ToC->isNullValue()) {
Chris Lattner1afcace2011-07-09 17:41:24 +00002554 Replacement = ConstantAggregateZero::get(getType());
Chris Lattnere150e2d2012-01-26 02:31:22 +00002555 } else if (AllSame && isa<UndefValue>(ToC)) {
2556 Replacement = UndefValue::get(getType());
Owen Anderson1fd70962009-07-28 18:32:17 +00002557 } else {
2558 // Check to see if we have this array type already.
Talin2cb395e2012-02-05 20:54:10 +00002559 Lookup.second = makeArrayRef(Values);
Owen Anderson1fd70962009-07-28 18:32:17 +00002560 LLVMContextImpl::ArrayConstantsTy::MapTy::iterator I =
Talin2cb395e2012-02-05 20:54:10 +00002561 pImpl->ArrayConstants.find(Lookup);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002562
Talin2cb395e2012-02-05 20:54:10 +00002563 if (I != pImpl->ArrayConstants.map_end()) {
2564 Replacement = I->first;
Owen Anderson1fd70962009-07-28 18:32:17 +00002565 } else {
2566 // Okay, the new shape doesn't exist in the system yet. Instead of
2567 // creating a new constant array, inserting it, replaceallusesof'ing the
2568 // old with the new, then deleting the old... just update the current one
2569 // in place!
Talin2cb395e2012-02-05 20:54:10 +00002570 pImpl->ArrayConstants.remove(this);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002571
Owen Anderson1fd70962009-07-28 18:32:17 +00002572 // Update to the new value. Optimize for the case when we have a single
2573 // operand that we're changing, but handle bulk updates efficiently.
2574 if (NumUpdated == 1) {
2575 unsigned OperandToUpdate = U - OperandList;
2576 assert(getOperand(OperandToUpdate) == From &&
2577 "ReplaceAllUsesWith broken!");
2578 setOperand(OperandToUpdate, ToC);
2579 } else {
2580 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
2581 if (getOperand(i) == From)
2582 setOperand(i, ToC);
2583 }
Talin2cb395e2012-02-05 20:54:10 +00002584 pImpl->ArrayConstants.insert(this);
Owen Anderson1fd70962009-07-28 18:32:17 +00002585 return;
2586 }
2587 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002588
Chris Lattnercea141f2005-10-03 22:51:37 +00002589 // Otherwise, I do need to replace this with an existing value.
Chris Lattner5cbade92005-10-03 21:58:36 +00002590 assert(Replacement != this && "I didn't contain From!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002591
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002592 // Everyone using this now uses the replacement.
Chris Lattner678f9e02011-07-15 06:18:52 +00002593 replaceAllUsesWith(Replacement);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002594
Chris Lattner5cbade92005-10-03 21:58:36 +00002595 // Delete the old constant!
2596 destroyConstant();
2597}
2598
2599void ConstantStruct::replaceUsesOfWithOnConstant(Value *From, Value *To,
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002600 Use *U) {
Owen Anderson8fa33382009-07-27 22:29:26 +00002601 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
2602 Constant *ToC = cast<Constant>(To);
2603
2604 unsigned OperandToUpdate = U-OperandList;
2605 assert(getOperand(OperandToUpdate) == From && "ReplaceAllUsesWith broken!");
2606
Talin2cb395e2012-02-05 20:54:10 +00002607 SmallVector<Constant*, 8> Values;
2608 LLVMContextImpl::StructConstantsTy::LookupKey Lookup;
2609 Lookup.first = cast<StructType>(getType());
Owen Anderson8fa33382009-07-27 22:29:26 +00002610 Values.reserve(getNumOperands()); // Build replacement struct.
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002611
2612 // Fill values with the modified operands of the constant struct. Also,
Owen Anderson8fa33382009-07-27 22:29:26 +00002613 // compute whether this turns into an all-zeros struct.
2614 bool isAllZeros = false;
Chris Lattnere150e2d2012-01-26 02:31:22 +00002615 bool isAllUndef = false;
2616 if (ToC->isNullValue()) {
Owen Anderson8fa33382009-07-27 22:29:26 +00002617 isAllZeros = true;
2618 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
2619 Constant *Val = cast<Constant>(O->get());
2620 Values.push_back(Val);
2621 if (isAllZeros) isAllZeros = Val->isNullValue();
2622 }
Chris Lattnere150e2d2012-01-26 02:31:22 +00002623 } else if (isa<UndefValue>(ToC)) {
2624 isAllUndef = true;
2625 for (Use *O = OperandList, *E = OperandList+getNumOperands(); O != E; ++O) {
2626 Constant *Val = cast<Constant>(O->get());
2627 Values.push_back(Val);
2628 if (isAllUndef) isAllUndef = isa<UndefValue>(Val);
2629 }
2630 } else {
2631 for (Use *O = OperandList, *E = OperandList + getNumOperands(); O != E; ++O)
2632 Values.push_back(cast<Constant>(O->get()));
Owen Anderson8fa33382009-07-27 22:29:26 +00002633 }
2634 Values[OperandToUpdate] = ToC;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002635
Chris Lattner1afcace2011-07-09 17:41:24 +00002636 LLVMContextImpl *pImpl = getContext().pImpl;
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002637
Owen Anderson8fa33382009-07-27 22:29:26 +00002638 Constant *Replacement = 0;
2639 if (isAllZeros) {
Chris Lattner1afcace2011-07-09 17:41:24 +00002640 Replacement = ConstantAggregateZero::get(getType());
Chris Lattnere150e2d2012-01-26 02:31:22 +00002641 } else if (isAllUndef) {
2642 Replacement = UndefValue::get(getType());
Owen Anderson8fa33382009-07-27 22:29:26 +00002643 } else {
Chris Lattner93604b62010-07-17 06:13:52 +00002644 // Check to see if we have this struct type already.
Talin2cb395e2012-02-05 20:54:10 +00002645 Lookup.second = makeArrayRef(Values);
Owen Anderson8fa33382009-07-27 22:29:26 +00002646 LLVMContextImpl::StructConstantsTy::MapTy::iterator I =
Talin2cb395e2012-02-05 20:54:10 +00002647 pImpl->StructConstants.find(Lookup);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002648
Talin2cb395e2012-02-05 20:54:10 +00002649 if (I != pImpl->StructConstants.map_end()) {
2650 Replacement = I->first;
Owen Anderson8fa33382009-07-27 22:29:26 +00002651 } else {
2652 // Okay, the new shape doesn't exist in the system yet. Instead of
2653 // creating a new constant struct, inserting it, replaceallusesof'ing the
2654 // old with the new, then deleting the old... just update the current one
2655 // in place!
Talin2cb395e2012-02-05 20:54:10 +00002656 pImpl->StructConstants.remove(this);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002657
Owen Anderson8fa33382009-07-27 22:29:26 +00002658 // Update to the new value.
2659 setOperand(OperandToUpdate, ToC);
Talin2cb395e2012-02-05 20:54:10 +00002660 pImpl->StructConstants.insert(this);
Owen Anderson8fa33382009-07-27 22:29:26 +00002661 return;
2662 }
2663 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002664
Owen Anderson8fa33382009-07-27 22:29:26 +00002665 assert(Replacement != this && "I didn't contain From!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002666
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002667 // Everyone using this now uses the replacement.
Chris Lattner678f9e02011-07-15 06:18:52 +00002668 replaceAllUsesWith(Replacement);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002669
Chris Lattner5cbade92005-10-03 21:58:36 +00002670 // Delete the old constant!
2671 destroyConstant();
2672}
2673
Reid Spencer9d6565a2007-02-15 02:26:10 +00002674void ConstantVector::replaceUsesOfWithOnConstant(Value *From, Value *To,
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002675 Use *U) {
Chris Lattner5cbade92005-10-03 21:58:36 +00002676 assert(isa<Constant>(To) && "Cannot make Constant refer to non-constant!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002677
Chris Lattnera7c69882012-01-26 20:40:56 +00002678 SmallVector<Constant*, 8> Values;
Chris Lattner5cbade92005-10-03 21:58:36 +00002679 Values.reserve(getNumOperands()); // Build replacement array...
2680 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2681 Constant *Val = getOperand(i);
2682 if (Val == From) Val = cast<Constant>(To);
2683 Values.push_back(Val);
2684 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002685
Jay Foada0c13842011-06-22 09:10:19 +00002686 Constant *Replacement = get(Values);
Chris Lattner5cbade92005-10-03 21:58:36 +00002687 assert(Replacement != this && "I didn't contain From!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002688
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002689 // Everyone using this now uses the replacement.
Chris Lattner678f9e02011-07-15 06:18:52 +00002690 replaceAllUsesWith(Replacement);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002691
Chris Lattner5cbade92005-10-03 21:58:36 +00002692 // Delete the old constant!
2693 destroyConstant();
2694}
2695
2696void ConstantExpr::replaceUsesOfWithOnConstant(Value *From, Value *ToV,
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002697 Use *U) {
Chris Lattner5cbade92005-10-03 21:58:36 +00002698 assert(isa<Constant>(ToV) && "Cannot make Constant refer to non-constant!");
2699 Constant *To = cast<Constant>(ToV);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002700
Chris Lattner1a8def62012-01-26 20:37:11 +00002701 SmallVector<Constant*, 8> NewOps;
2702 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
2703 Constant *Op = getOperand(i);
2704 NewOps.push_back(Op == From ? To : Op);
Chris Lattner5cbade92005-10-03 21:58:36 +00002705 }
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002706
Chris Lattner1a8def62012-01-26 20:37:11 +00002707 Constant *Replacement = getWithOperands(NewOps);
Chris Lattner5cbade92005-10-03 21:58:36 +00002708 assert(Replacement != this && "I didn't contain From!");
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002709
Chris Lattnerd0ff1ad2005-10-04 18:13:04 +00002710 // Everyone using this now uses the replacement.
Chris Lattner678f9e02011-07-15 06:18:52 +00002711 replaceAllUsesWith(Replacement);
Galina Kistanovaa46517e2012-07-13 01:25:27 +00002712
Chris Lattner5cbade92005-10-03 21:58:36 +00002713 // Delete the old constant!
2714 destroyConstant();
Matthijs Kooijman10b9de62008-07-03 07:46:41 +00002715}
James Molloyb9478c22012-11-17 17:56:30 +00002716
2717Instruction *ConstantExpr::getAsInstruction() {
2718 SmallVector<Value*,4> ValueOperands;
2719 for (op_iterator I = op_begin(), E = op_end(); I != E; ++I)
2720 ValueOperands.push_back(cast<Value>(I));
2721
2722 ArrayRef<Value*> Ops(ValueOperands);
2723
2724 switch (getOpcode()) {
2725 case Instruction::Trunc:
2726 case Instruction::ZExt:
2727 case Instruction::SExt:
2728 case Instruction::FPTrunc:
2729 case Instruction::FPExt:
2730 case Instruction::UIToFP:
2731 case Instruction::SIToFP:
2732 case Instruction::FPToUI:
2733 case Instruction::FPToSI:
2734 case Instruction::PtrToInt:
2735 case Instruction::IntToPtr:
2736 case Instruction::BitCast:
2737 return CastInst::Create((Instruction::CastOps)getOpcode(),
2738 Ops[0], getType());
2739 case Instruction::Select:
2740 return SelectInst::Create(Ops[0], Ops[1], Ops[2]);
2741 case Instruction::InsertElement:
2742 return InsertElementInst::Create(Ops[0], Ops[1], Ops[2]);
2743 case Instruction::ExtractElement:
2744 return ExtractElementInst::Create(Ops[0], Ops[1]);
2745 case Instruction::InsertValue:
2746 return InsertValueInst::Create(Ops[0], Ops[1], getIndices());
2747 case Instruction::ExtractValue:
2748 return ExtractValueInst::Create(Ops[0], getIndices());
2749 case Instruction::ShuffleVector:
2750 return new ShuffleVectorInst(Ops[0], Ops[1], Ops[2]);
2751
2752 case Instruction::GetElementPtr:
2753 if (cast<GEPOperator>(this)->isInBounds())
2754 return GetElementPtrInst::CreateInBounds(Ops[0], Ops.slice(1));
2755 else
2756 return GetElementPtrInst::Create(Ops[0], Ops.slice(1));
2757
2758 case Instruction::ICmp:
2759 case Instruction::FCmp:
2760 return CmpInst::Create((Instruction::OtherOps)getOpcode(),
2761 getPredicate(), Ops[0], Ops[1]);
2762
2763 default:
2764 assert(getNumOperands() == 2 && "Must be binary operator?");
2765 BinaryOperator *BO =
2766 BinaryOperator::Create((Instruction::BinaryOps)getOpcode(),
2767 Ops[0], Ops[1]);
2768 if (isa<OverflowingBinaryOperator>(BO)) {
2769 BO->setHasNoUnsignedWrap(SubclassOptionalData &
2770 OverflowingBinaryOperator::NoUnsignedWrap);
2771 BO->setHasNoSignedWrap(SubclassOptionalData &
2772 OverflowingBinaryOperator::NoSignedWrap);
2773 }
2774 if (isa<PossiblyExactOperator>(BO))
2775 BO->setIsExact(SubclassOptionalData & PossiblyExactOperator::IsExact);
2776 return BO;
2777 }
2778}