blob: 5bd029644be43f6139cbfc861905d3d91b30bdce [file] [log] [blame]
Chris Lattnera892a3a2003-01-27 22:08:52 +00001//===-- llvm/Instructions.h - Instruction subclass definitions --*- C++ -*-===//
Misha Brukman9769ab22005-04-21 20:19:05 +00002//
John Criswell6fbcc262003-10-20 20:19:47 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner7ed47a12007-12-29 19:59:42 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukman9769ab22005-04-21 20:19:05 +00007//
John Criswell6fbcc262003-10-20 20:19:47 +00008//===----------------------------------------------------------------------===//
Chris Lattnera892a3a2003-01-27 22:08:52 +00009//
10// This file exposes the class definitions of all of the subclasses of the
11// Instruction class. This is meant to be an easy way to get access to all
12// instruction subclasses.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_INSTRUCTIONS_H
17#define LLVM_INSTRUCTIONS_H
18
David Greene52eec542007-08-01 03:43:44 +000019#include <iterator>
20
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000021#include "llvm/InstrTypes.h"
David Greene52eec542007-08-01 03:43:44 +000022#include "llvm/DerivedTypes.h"
Dale Johannesen0d51e7e2008-02-19 21:38:47 +000023#include "llvm/ParameterAttributes.h"
Gabor Greifefe65362008-05-10 08:32:32 +000024#include "llvm/BasicBlock.h"
Dan Gohman81a0c0b2008-05-31 00:58:22 +000025#include "llvm/ADT/SmallVector.h"
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000026
27namespace llvm {
28
Chris Lattnerd1a32602005-02-24 05:32:09 +000029class ConstantInt;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000030class PointerType;
Reid Spencer9d6565a2007-02-15 02:26:10 +000031class VectorType;
Reid Spencer3da43842007-02-28 22:00:54 +000032class ConstantRange;
33class APInt;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000034
35//===----------------------------------------------------------------------===//
36// AllocationInst Class
37//===----------------------------------------------------------------------===//
38
39/// AllocationInst - This class is the common base class of MallocInst and
40/// AllocaInst.
41///
Chris Lattner454928e2005-01-29 00:31:36 +000042class AllocationInst : public UnaryInstruction {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000043protected:
Nate Begeman14b05292005-11-05 09:21:28 +000044 AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, unsigned Align,
Misha Brukman91102862005-03-16 03:46:55 +000045 const std::string &Name = "", Instruction *InsertBefore = 0);
Nate Begeman14b05292005-11-05 09:21:28 +000046 AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, unsigned Align,
Misha Brukman91102862005-03-16 03:46:55 +000047 const std::string &Name, BasicBlock *InsertAtEnd);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000048public:
Gabor Greif051a9502008-04-06 20:25:17 +000049 // Out of line virtual method, so the vtable, etc. has a home.
Gordon Henriksenafba8fe2007-12-10 02:14:30 +000050 virtual ~AllocationInst();
51
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000052 /// isArrayAllocation - Return true if there is an allocation size parameter
53 /// to the allocation instruction that is not 1.
54 ///
55 bool isArrayAllocation() const;
56
57 /// getArraySize - Get the number of element allocated, for a simple
58 /// allocation of a single element, this will return a constant 1 value.
59 ///
Devang Patel4d4a5e02008-02-23 01:11:02 +000060 const Value *getArraySize() const { return getOperand(0); }
61 Value *getArraySize() { return getOperand(0); }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000062
63 /// getType - Overload to return most specific pointer type
64 ///
Devang Patel4d4a5e02008-02-23 01:11:02 +000065 const PointerType *getType() const {
Misha Brukman9769ab22005-04-21 20:19:05 +000066 return reinterpret_cast<const PointerType*>(Instruction::getType());
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000067 }
68
69 /// getAllocatedType - Return the type that is being allocated by the
70 /// instruction.
71 ///
72 const Type *getAllocatedType() const;
73
Nate Begeman14b05292005-11-05 09:21:28 +000074 /// getAlignment - Return the alignment of the memory that is being allocated
75 /// by the instruction.
76 ///
Dan Gohman52837072008-03-24 16:55:58 +000077 unsigned getAlignment() const { return (1u << SubclassData) >> 1; }
78 void setAlignment(unsigned Align);
Chris Lattnerf56a8db2006-10-03 17:09:12 +000079
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +000080 virtual Instruction *clone() const = 0;
81
82 // Methods for support type inquiry through isa, cast, and dyn_cast:
83 static inline bool classof(const AllocationInst *) { return true; }
84 static inline bool classof(const Instruction *I) {
85 return I->getOpcode() == Instruction::Alloca ||
86 I->getOpcode() == Instruction::Malloc;
87 }
88 static inline bool classof(const Value *V) {
89 return isa<Instruction>(V) && classof(cast<Instruction>(V));
90 }
91};
92
93
94//===----------------------------------------------------------------------===//
95// MallocInst Class
96//===----------------------------------------------------------------------===//
97
98/// MallocInst - an instruction to allocated memory on the heap
99///
100class MallocInst : public AllocationInst {
101 MallocInst(const MallocInst &MI);
102public:
103 explicit MallocInst(const Type *Ty, Value *ArraySize = 0,
104 const std::string &Name = "",
105 Instruction *InsertBefore = 0)
Nate Begeman14b05292005-11-05 09:21:28 +0000106 : AllocationInst(Ty, ArraySize, Malloc, 0, Name, InsertBefore) {}
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000107 MallocInst(const Type *Ty, Value *ArraySize, const std::string &Name,
108 BasicBlock *InsertAtEnd)
Nate Begeman14b05292005-11-05 09:21:28 +0000109 : AllocationInst(Ty, ArraySize, Malloc, 0, Name, InsertAtEnd) {}
Chris Lattnerf56a8db2006-10-03 17:09:12 +0000110
111 MallocInst(const Type *Ty, const std::string &Name,
112 Instruction *InsertBefore = 0)
Chris Lattnerb77780e2006-05-10 04:38:35 +0000113 : AllocationInst(Ty, 0, Malloc, 0, Name, InsertBefore) {}
114 MallocInst(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
115 : AllocationInst(Ty, 0, Malloc, 0, Name, InsertAtEnd) {}
Chris Lattnerf56a8db2006-10-03 17:09:12 +0000116
117 MallocInst(const Type *Ty, Value *ArraySize, unsigned Align,
Nate Begeman14b05292005-11-05 09:21:28 +0000118 const std::string &Name, BasicBlock *InsertAtEnd)
Chris Lattnerb77780e2006-05-10 04:38:35 +0000119 : AllocationInst(Ty, ArraySize, Malloc, Align, Name, InsertAtEnd) {}
120 MallocInst(const Type *Ty, Value *ArraySize, unsigned Align,
Nate Begeman14b05292005-11-05 09:21:28 +0000121 const std::string &Name = "",
122 Instruction *InsertBefore = 0)
Chris Lattnerb77780e2006-05-10 04:38:35 +0000123 : AllocationInst(Ty, ArraySize, Malloc, Align, Name, InsertBefore) {}
Chris Lattnerf56a8db2006-10-03 17:09:12 +0000124
Chris Lattnerf319e832004-10-15 23:52:05 +0000125 virtual MallocInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000126
127 // Methods for support type inquiry through isa, cast, and dyn_cast:
128 static inline bool classof(const MallocInst *) { return true; }
129 static inline bool classof(const Instruction *I) {
130 return (I->getOpcode() == Instruction::Malloc);
131 }
132 static inline bool classof(const Value *V) {
133 return isa<Instruction>(V) && classof(cast<Instruction>(V));
134 }
135};
136
137
138//===----------------------------------------------------------------------===//
139// AllocaInst Class
140//===----------------------------------------------------------------------===//
141
142/// AllocaInst - an instruction to allocate memory on the stack
143///
144class AllocaInst : public AllocationInst {
145 AllocaInst(const AllocaInst &);
146public:
147 explicit AllocaInst(const Type *Ty, Value *ArraySize = 0,
148 const std::string &Name = "",
149 Instruction *InsertBefore = 0)
Nate Begeman14b05292005-11-05 09:21:28 +0000150 : AllocationInst(Ty, ArraySize, Alloca, 0, Name, InsertBefore) {}
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000151 AllocaInst(const Type *Ty, Value *ArraySize, const std::string &Name,
152 BasicBlock *InsertAtEnd)
Nate Begeman14b05292005-11-05 09:21:28 +0000153 : AllocationInst(Ty, ArraySize, Alloca, 0, Name, InsertAtEnd) {}
Chris Lattnerb77780e2006-05-10 04:38:35 +0000154
155 AllocaInst(const Type *Ty, const std::string &Name,
156 Instruction *InsertBefore = 0)
157 : AllocationInst(Ty, 0, Alloca, 0, Name, InsertBefore) {}
158 AllocaInst(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
159 : AllocationInst(Ty, 0, Alloca, 0, Name, InsertAtEnd) {}
Chris Lattnerf56a8db2006-10-03 17:09:12 +0000160
Chris Lattnerb77780e2006-05-10 04:38:35 +0000161 AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
162 const std::string &Name = "", Instruction *InsertBefore = 0)
163 : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertBefore) {}
Nate Begeman14b05292005-11-05 09:21:28 +0000164 AllocaInst(const Type *Ty, Value *ArraySize, unsigned Align,
165 const std::string &Name, BasicBlock *InsertAtEnd)
Chris Lattnerb77780e2006-05-10 04:38:35 +0000166 : AllocationInst(Ty, ArraySize, Alloca, Align, Name, InsertAtEnd) {}
Chris Lattnerf56a8db2006-10-03 17:09:12 +0000167
Chris Lattnerf319e832004-10-15 23:52:05 +0000168 virtual AllocaInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000169
170 // Methods for support type inquiry through isa, cast, and dyn_cast:
171 static inline bool classof(const AllocaInst *) { return true; }
172 static inline bool classof(const Instruction *I) {
173 return (I->getOpcode() == Instruction::Alloca);
174 }
175 static inline bool classof(const Value *V) {
176 return isa<Instruction>(V) && classof(cast<Instruction>(V));
177 }
178};
179
180
181//===----------------------------------------------------------------------===//
182// FreeInst Class
183//===----------------------------------------------------------------------===//
184
185/// FreeInst - an instruction to deallocate memory
186///
Chris Lattner454928e2005-01-29 00:31:36 +0000187class FreeInst : public UnaryInstruction {
188 void AssertOK();
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000189public:
190 explicit FreeInst(Value *Ptr, Instruction *InsertBefore = 0);
191 FreeInst(Value *Ptr, BasicBlock *InsertAfter);
192
Chris Lattnerf319e832004-10-15 23:52:05 +0000193 virtual FreeInst *clone() const;
Owen Andersonc9edf0b2007-07-06 23:13:31 +0000194
195 // Accessor methods for consistency with other memory operations
196 Value *getPointerOperand() { return getOperand(0); }
197 const Value *getPointerOperand() const { return getOperand(0); }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000198
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000199 // Methods for support type inquiry through isa, cast, and dyn_cast:
200 static inline bool classof(const FreeInst *) { return true; }
201 static inline bool classof(const Instruction *I) {
202 return (I->getOpcode() == Instruction::Free);
203 }
204 static inline bool classof(const Value *V) {
205 return isa<Instruction>(V) && classof(cast<Instruction>(V));
206 }
207};
208
209
210//===----------------------------------------------------------------------===//
211// LoadInst Class
212//===----------------------------------------------------------------------===//
213
Chris Lattner88fe29a2005-02-05 01:44:18 +0000214/// LoadInst - an instruction for reading from memory. This uses the
215/// SubclassData field in Value to store whether or not the load is volatile.
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000216///
Chris Lattner454928e2005-01-29 00:31:36 +0000217class LoadInst : public UnaryInstruction {
Christopher Lamb43c7f372007-04-22 19:24:39 +0000218
Chris Lattner454928e2005-01-29 00:31:36 +0000219 LoadInst(const LoadInst &LI)
Chris Lattner88fe29a2005-02-05 01:44:18 +0000220 : UnaryInstruction(LI.getType(), Load, LI.getOperand(0)) {
221 setVolatile(LI.isVolatile());
Christopher Lamb43c7f372007-04-22 19:24:39 +0000222 setAlignment(LI.getAlignment());
Misha Brukman9769ab22005-04-21 20:19:05 +0000223
Chris Lattner454928e2005-01-29 00:31:36 +0000224#ifndef NDEBUG
225 AssertOK();
226#endif
227 }
228 void AssertOK();
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000229public:
230 LoadInst(Value *Ptr, const std::string &Name, Instruction *InsertBefore);
231 LoadInst(Value *Ptr, const std::string &Name, BasicBlock *InsertAtEnd);
Christopher Lamb43c7f372007-04-22 19:24:39 +0000232 LoadInst(Value *Ptr, const std::string &Name, bool isVolatile = false,
233 Instruction *InsertBefore = 0);
234 LoadInst(Value *Ptr, const std::string &Name, bool isVolatile, unsigned Align,
Chris Lattnerf00042a2007-02-13 07:54:42 +0000235 Instruction *InsertBefore = 0);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000236 LoadInst(Value *Ptr, const std::string &Name, bool isVolatile,
237 BasicBlock *InsertAtEnd);
Dan Gohman6ab2d182007-07-18 20:51:11 +0000238 LoadInst(Value *Ptr, const std::string &Name, bool isVolatile, unsigned Align,
239 BasicBlock *InsertAtEnd);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000240
Chris Lattnerf00042a2007-02-13 07:54:42 +0000241 LoadInst(Value *Ptr, const char *Name, Instruction *InsertBefore);
242 LoadInst(Value *Ptr, const char *Name, BasicBlock *InsertAtEnd);
Christopher Lamb43c7f372007-04-22 19:24:39 +0000243 explicit LoadInst(Value *Ptr, const char *Name = 0, bool isVolatile = false,
Chris Lattnerf00042a2007-02-13 07:54:42 +0000244 Instruction *InsertBefore = 0);
245 LoadInst(Value *Ptr, const char *Name, bool isVolatile,
246 BasicBlock *InsertAtEnd);
247
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000248 /// isVolatile - Return true if this is a load from a volatile memory
249 /// location.
250 ///
Christopher Lamb43c7f372007-04-22 19:24:39 +0000251 bool isVolatile() const { return SubclassData & 1; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000252
253 /// setVolatile - Specify whether this is a volatile load or not.
254 ///
Christopher Lamb43c7f372007-04-22 19:24:39 +0000255 void setVolatile(bool V) {
Hartmut Kaiserefd4a512007-10-17 14:56:40 +0000256 SubclassData = (SubclassData & ~1) | (V ? 1 : 0);
Christopher Lamb43c7f372007-04-22 19:24:39 +0000257 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000258
Chris Lattnerf319e832004-10-15 23:52:05 +0000259 virtual LoadInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000260
Christopher Lamb43c7f372007-04-22 19:24:39 +0000261 /// getAlignment - Return the alignment of the access that is being performed
262 ///
263 unsigned getAlignment() const {
Christopher Lamb032507d2007-04-22 22:22:02 +0000264 return (1 << (SubclassData>>1)) >> 1;
Christopher Lamb43c7f372007-04-22 19:24:39 +0000265 }
266
267 void setAlignment(unsigned Align);
268
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000269 Value *getPointerOperand() { return getOperand(0); }
270 const Value *getPointerOperand() const { return getOperand(0); }
271 static unsigned getPointerOperandIndex() { return 0U; }
272
273 // Methods for support type inquiry through isa, cast, and dyn_cast:
274 static inline bool classof(const LoadInst *) { return true; }
275 static inline bool classof(const Instruction *I) {
276 return I->getOpcode() == Instruction::Load;
277 }
278 static inline bool classof(const Value *V) {
279 return isa<Instruction>(V) && classof(cast<Instruction>(V));
280 }
281};
282
283
284//===----------------------------------------------------------------------===//
285// StoreInst Class
286//===----------------------------------------------------------------------===//
287
Misha Brukman9769ab22005-04-21 20:19:05 +0000288/// StoreInst - an instruction for storing to memory
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000289///
290class StoreInst : public Instruction {
Gabor Greif051a9502008-04-06 20:25:17 +0000291 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Christopher Lamb43c7f372007-04-22 19:24:39 +0000292
Gabor Greifefe65362008-05-10 08:32:32 +0000293 StoreInst(const StoreInst &SI) : Instruction(SI.getType(), Store,
294 &Op<0>(), 2) {
Gabor Greif6c80c382008-05-26 21:33:52 +0000295 Op<0>() = SI.Op<0>();
296 Op<1>() = SI.Op<1>();
Chris Lattner88fe29a2005-02-05 01:44:18 +0000297 setVolatile(SI.isVolatile());
Christopher Lamb43c7f372007-04-22 19:24:39 +0000298 setAlignment(SI.getAlignment());
299
Chris Lattner454928e2005-01-29 00:31:36 +0000300#ifndef NDEBUG
301 AssertOK();
302#endif
303 }
304 void AssertOK();
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000305public:
Gabor Greif051a9502008-04-06 20:25:17 +0000306 // allocate space for exactly two operands
307 void *operator new(size_t s) {
308 return User::operator new(s, 2);
309 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000310 StoreInst(Value *Val, Value *Ptr, Instruction *InsertBefore);
311 StoreInst(Value *Val, Value *Ptr, BasicBlock *InsertAtEnd);
312 StoreInst(Value *Val, Value *Ptr, bool isVolatile = false,
313 Instruction *InsertBefore = 0);
Christopher Lamb43c7f372007-04-22 19:24:39 +0000314 StoreInst(Value *Val, Value *Ptr, bool isVolatile,
315 unsigned Align, Instruction *InsertBefore = 0);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000316 StoreInst(Value *Val, Value *Ptr, bool isVolatile, BasicBlock *InsertAtEnd);
Dan Gohman6ab2d182007-07-18 20:51:11 +0000317 StoreInst(Value *Val, Value *Ptr, bool isVolatile,
318 unsigned Align, BasicBlock *InsertAtEnd);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000319
320
321 /// isVolatile - Return true if this is a load from a volatile memory
322 /// location.
323 ///
Christopher Lamb43c7f372007-04-22 19:24:39 +0000324 bool isVolatile() const { return SubclassData & 1; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000325
326 /// setVolatile - Specify whether this is a volatile load or not.
327 ///
Christopher Lamb43c7f372007-04-22 19:24:39 +0000328 void setVolatile(bool V) {
Hartmut Kaiserefd4a512007-10-17 14:56:40 +0000329 SubclassData = (SubclassData & ~1) | (V ? 1 : 0);
Christopher Lamb43c7f372007-04-22 19:24:39 +0000330 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000331
Chris Lattner454928e2005-01-29 00:31:36 +0000332 /// Transparently provide more efficient getOperand methods.
Gabor Greifefe65362008-05-10 08:32:32 +0000333 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Chris Lattner454928e2005-01-29 00:31:36 +0000334
Christopher Lamb43c7f372007-04-22 19:24:39 +0000335 /// getAlignment - Return the alignment of the access that is being performed
336 ///
337 unsigned getAlignment() const {
Christopher Lamb032507d2007-04-22 22:22:02 +0000338 return (1 << (SubclassData>>1)) >> 1;
Christopher Lamb43c7f372007-04-22 19:24:39 +0000339 }
340
341 void setAlignment(unsigned Align);
342
Chris Lattnerf319e832004-10-15 23:52:05 +0000343 virtual StoreInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000344
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000345 Value *getPointerOperand() { return getOperand(1); }
346 const Value *getPointerOperand() const { return getOperand(1); }
347 static unsigned getPointerOperandIndex() { return 1U; }
348
349 // Methods for support type inquiry through isa, cast, and dyn_cast:
350 static inline bool classof(const StoreInst *) { return true; }
351 static inline bool classof(const Instruction *I) {
352 return I->getOpcode() == Instruction::Store;
353 }
354 static inline bool classof(const Value *V) {
355 return isa<Instruction>(V) && classof(cast<Instruction>(V));
356 }
357};
358
Gabor Greifefe65362008-05-10 08:32:32 +0000359template <>
360struct OperandTraits<StoreInst> : FixedNumOperandTraits<2> {
361};
362
363DEFINE_TRANSPARENT_OPERAND_ACCESSORS(StoreInst, Value)
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000364
365//===----------------------------------------------------------------------===//
366// GetElementPtrInst Class
367//===----------------------------------------------------------------------===//
368
David Greeneb8f74792007-09-04 15:46:09 +0000369// checkType - Simple wrapper function to give a better assertion failure
370// message on bad indexes for a gep instruction.
371//
372static inline const Type *checkType(const Type *Ty) {
373 assert(Ty && "Invalid GetElementPtrInst indices for type!");
374 return Ty;
375}
376
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000377/// GetElementPtrInst - an instruction for type-safe pointer arithmetic to
378/// access elements of arrays and structs
379///
380class GetElementPtrInst : public Instruction {
Gabor Greifefe65362008-05-10 08:32:32 +0000381 GetElementPtrInst(const GetElementPtrInst &GEPI);
Matthijs Kooijmancfd5b7d2008-06-05 07:26:15 +0000382 void init(Value *Ptr, Value* const *Idx, unsigned NumIdx,
383 const std::string &Name);
Matthijs Kooijman338169d2008-06-04 16:14:12 +0000384 void init(Value *Ptr, Value *Idx, const std::string &Name);
David Greeneb8f74792007-09-04 15:46:09 +0000385
386 template<typename InputIterator>
387 void init(Value *Ptr, InputIterator IdxBegin, InputIterator IdxEnd,
388 const std::string &Name,
389 // This argument ensures that we have an iterator we can
390 // do arithmetic on in constant time
391 std::random_access_iterator_tag) {
Evan Cheng34cd4a42008-05-05 18:30:58 +0000392 unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
David Greeneb8f74792007-09-04 15:46:09 +0000393
394 if (NumIdx > 0) {
Gabor Greifefe65362008-05-10 08:32:32 +0000395 // This requires that the iterator points to contiguous memory.
Matthijs Kooijman338169d2008-06-04 16:14:12 +0000396 init(Ptr, &*IdxBegin, NumIdx, Name); // FIXME: for the general case
Gabor Greifefe65362008-05-10 08:32:32 +0000397 // we have to build an array here
David Greeneb8f74792007-09-04 15:46:09 +0000398 }
399 else {
Matthijs Kooijman338169d2008-06-04 16:14:12 +0000400 init(Ptr, 0, NumIdx, Name);
David Greeneb8f74792007-09-04 15:46:09 +0000401 }
David Greeneb8f74792007-09-04 15:46:09 +0000402 }
403
404 /// getIndexedType - Returns the type of the element that would be loaded with
405 /// a load instruction with the specified parameters.
406 ///
Dan Gohmane2d896f2008-05-15 23:35:32 +0000407 /// Null is returned if the indices are invalid for the specified
David Greeneb8f74792007-09-04 15:46:09 +0000408 /// pointer type.
409 ///
410 static const Type *getIndexedType(const Type *Ptr,
Dan Gohman041e2eb2008-05-15 19:50:34 +0000411 Value* const *Idx, unsigned NumIdx);
David Greeneb8f74792007-09-04 15:46:09 +0000412
413 template<typename InputIterator>
414 static const Type *getIndexedType(const Type *Ptr,
415 InputIterator IdxBegin,
416 InputIterator IdxEnd,
David Greeneb8f74792007-09-04 15:46:09 +0000417 // This argument ensures that we
418 // have an iterator we can do
419 // arithmetic on in constant time
420 std::random_access_iterator_tag) {
Evan Cheng34cd4a42008-05-05 18:30:58 +0000421 unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
David Greeneb8f74792007-09-04 15:46:09 +0000422
Dan Gohman041e2eb2008-05-15 19:50:34 +0000423 if (NumIdx > 0)
David Greeneb8f74792007-09-04 15:46:09 +0000424 // This requires that the iterator points to contiguous memory.
Dan Gohman041e2eb2008-05-15 19:50:34 +0000425 return getIndexedType(Ptr, (Value *const *)&*IdxBegin, NumIdx);
426 else
427 return getIndexedType(Ptr, (Value *const*)0, NumIdx);
David Greeneb8f74792007-09-04 15:46:09 +0000428 }
429
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000430 /// Constructors - Create a getelementptr instruction with a base pointer an
431 /// list of indices. The first ctor can optionally insert before an existing
432 /// instruction, the second appends the new instruction to the specified
433 /// BasicBlock.
David Greeneb8f74792007-09-04 15:46:09 +0000434 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +0000435 inline GetElementPtrInst(Value *Ptr, InputIterator IdxBegin,
436 InputIterator IdxEnd,
437 unsigned Values,
438 const std::string &Name,
439 Instruction *InsertBefore);
David Greeneb8f74792007-09-04 15:46:09 +0000440 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +0000441 inline GetElementPtrInst(Value *Ptr,
442 InputIterator IdxBegin, InputIterator IdxEnd,
443 unsigned Values,
444 const std::string &Name, BasicBlock *InsertAtEnd);
David Greeneb8f74792007-09-04 15:46:09 +0000445
Chris Lattner38bacf22005-05-03 05:43:30 +0000446 /// Constructors - These two constructors are convenience methods because one
447 /// and two index getelementptr instructions are so common.
Gabor Greifefe65362008-05-10 08:32:32 +0000448 GetElementPtrInst(Value *Ptr, Value *Idx, const std::string &Name = "",
449 Instruction *InsertBefore = 0);
Chris Lattner38bacf22005-05-03 05:43:30 +0000450 GetElementPtrInst(Value *Ptr, Value *Idx,
451 const std::string &Name, BasicBlock *InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +0000452public:
453 template<typename InputIterator>
454 static GetElementPtrInst *Create(Value *Ptr, InputIterator IdxBegin,
455 InputIterator IdxEnd,
456 const std::string &Name = "",
457 Instruction *InsertBefore = 0) {
Gabor Greifefe65362008-05-10 08:32:32 +0000458 typename std::iterator_traits<InputIterator>::difference_type Values =
459 1 + std::distance(IdxBegin, IdxEnd);
460 return new(Values)
461 GetElementPtrInst(Ptr, IdxBegin, IdxEnd, Values, Name, InsertBefore);
Gabor Greif051a9502008-04-06 20:25:17 +0000462 }
463 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +0000464 static GetElementPtrInst *Create(Value *Ptr,
465 InputIterator IdxBegin, InputIterator IdxEnd,
466 const std::string &Name,
467 BasicBlock *InsertAtEnd) {
468 typename std::iterator_traits<InputIterator>::difference_type Values =
469 1 + std::distance(IdxBegin, IdxEnd);
470 return new(Values)
471 GetElementPtrInst(Ptr, IdxBegin, IdxEnd, Values, Name, InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +0000472 }
473
Gabor Greifefe65362008-05-10 08:32:32 +0000474 /// Constructors - These two creators are convenience methods because one
475 /// index getelementptr instructions are so common.
Gabor Greif051a9502008-04-06 20:25:17 +0000476 static GetElementPtrInst *Create(Value *Ptr, Value *Idx,
Gabor Greifefe65362008-05-10 08:32:32 +0000477 const std::string &Name = "",
478 Instruction *InsertBefore = 0) {
479 return new(2) GetElementPtrInst(Ptr, Idx, Name, InsertBefore);
Gabor Greif051a9502008-04-06 20:25:17 +0000480 }
481 static GetElementPtrInst *Create(Value *Ptr, Value *Idx,
Gabor Greifefe65362008-05-10 08:32:32 +0000482 const std::string &Name,
483 BasicBlock *InsertAtEnd) {
484 return new(2) GetElementPtrInst(Ptr, Idx, Name, InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +0000485 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000486
Chris Lattnerf319e832004-10-15 23:52:05 +0000487 virtual GetElementPtrInst *clone() const;
Misha Brukman9769ab22005-04-21 20:19:05 +0000488
Gabor Greifefe65362008-05-10 08:32:32 +0000489 /// Transparently provide more efficient getOperand methods.
490 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
491
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000492 // getType - Overload to return most specific pointer type...
Devang Patel4d4a5e02008-02-23 01:11:02 +0000493 const PointerType *getType() const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000494 return reinterpret_cast<const PointerType*>(Instruction::getType());
495 }
496
497 /// getIndexedType - Returns the type of the element that would be loaded with
498 /// a load instruction with the specified parameters.
499 ///
Dan Gohmane2d896f2008-05-15 23:35:32 +0000500 /// Null is returned if the indices are invalid for the specified
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000501 /// pointer type.
502 ///
David Greeneb8f74792007-09-04 15:46:09 +0000503 template<typename InputIterator>
Misha Brukman9769ab22005-04-21 20:19:05 +0000504 static const Type *getIndexedType(const Type *Ptr,
David Greeneb8f74792007-09-04 15:46:09 +0000505 InputIterator IdxBegin,
Dan Gohman041e2eb2008-05-15 19:50:34 +0000506 InputIterator IdxEnd) {
507 return getIndexedType(Ptr, IdxBegin, IdxEnd,
David Greeneb8f74792007-09-04 15:46:09 +0000508 typename std::iterator_traits<InputIterator>::
Dan Gohman041e2eb2008-05-15 19:50:34 +0000509 iterator_category());
David Greeneb8f74792007-09-04 15:46:09 +0000510 }
Chris Lattner38bacf22005-05-03 05:43:30 +0000511 static const Type *getIndexedType(const Type *Ptr, Value *Idx);
Misha Brukman9769ab22005-04-21 20:19:05 +0000512
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000513 inline op_iterator idx_begin() { return op_begin()+1; }
514 inline const_op_iterator idx_begin() const { return op_begin()+1; }
515 inline op_iterator idx_end() { return op_end(); }
516 inline const_op_iterator idx_end() const { return op_end(); }
517
518 Value *getPointerOperand() {
519 return getOperand(0);
520 }
521 const Value *getPointerOperand() const {
522 return getOperand(0);
523 }
524 static unsigned getPointerOperandIndex() {
525 return 0U; // get index for modifying correct operand
526 }
527
Devang Patel4d4a5e02008-02-23 01:11:02 +0000528 unsigned getNumIndices() const { // Note: always non-negative
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000529 return getNumOperands() - 1;
530 }
Misha Brukman9769ab22005-04-21 20:19:05 +0000531
Devang Patel4d4a5e02008-02-23 01:11:02 +0000532 bool hasIndices() const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000533 return getNumOperands() > 1;
534 }
Chris Lattner6f771d42007-04-14 00:12:57 +0000535
536 /// hasAllZeroIndices - Return true if all of the indices of this GEP are
537 /// zeros. If so, the result pointer and the first operand have the same
538 /// value, just potentially different types.
539 bool hasAllZeroIndices() const;
Chris Lattner6b0974c2007-04-27 20:35:56 +0000540
541 /// hasAllConstantIndices - Return true if all of the indices of this GEP are
542 /// constant integers. If so, the result pointer and the first operand have
543 /// a constant offset between them.
544 bool hasAllConstantIndices() const;
545
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000546
547 // Methods for support type inquiry through isa, cast, and dyn_cast:
548 static inline bool classof(const GetElementPtrInst *) { return true; }
549 static inline bool classof(const Instruction *I) {
550 return (I->getOpcode() == Instruction::GetElementPtr);
551 }
552 static inline bool classof(const Value *V) {
553 return isa<Instruction>(V) && classof(cast<Instruction>(V));
554 }
555};
556
Gabor Greifefe65362008-05-10 08:32:32 +0000557template <>
558struct OperandTraits<GetElementPtrInst> : VariadicOperandTraits<1> {
559};
560
561template<typename InputIterator>
562GetElementPtrInst::GetElementPtrInst(Value *Ptr,
563 InputIterator IdxBegin,
564 InputIterator IdxEnd,
565 unsigned Values,
566 const std::string &Name,
567 Instruction *InsertBefore)
568 : Instruction(PointerType::get(checkType(
569 getIndexedType(Ptr->getType(),
Dan Gohman041e2eb2008-05-15 19:50:34 +0000570 IdxBegin, IdxEnd)),
Gabor Greifefe65362008-05-10 08:32:32 +0000571 cast<PointerType>(Ptr->getType())
572 ->getAddressSpace()),
573 GetElementPtr,
574 OperandTraits<GetElementPtrInst>::op_end(this) - Values,
575 Values, InsertBefore) {
576 init(Ptr, IdxBegin, IdxEnd, Name,
577 typename std::iterator_traits<InputIterator>::iterator_category());
578}
579template<typename InputIterator>
580GetElementPtrInst::GetElementPtrInst(Value *Ptr,
581 InputIterator IdxBegin,
582 InputIterator IdxEnd,
583 unsigned Values,
584 const std::string &Name,
585 BasicBlock *InsertAtEnd)
586 : Instruction(PointerType::get(checkType(
587 getIndexedType(Ptr->getType(),
Dan Gohman041e2eb2008-05-15 19:50:34 +0000588 IdxBegin, IdxEnd)),
Gabor Greifefe65362008-05-10 08:32:32 +0000589 cast<PointerType>(Ptr->getType())
590 ->getAddressSpace()),
591 GetElementPtr,
592 OperandTraits<GetElementPtrInst>::op_end(this) - Values,
593 Values, InsertAtEnd) {
594 init(Ptr, IdxBegin, IdxEnd, Name,
595 typename std::iterator_traits<InputIterator>::iterator_category());
596}
597
598
599DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetElementPtrInst, Value)
600
601
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000602//===----------------------------------------------------------------------===//
Reid Spencer45fb3f32006-11-20 01:22:35 +0000603// ICmpInst Class
604//===----------------------------------------------------------------------===//
605
606/// This instruction compares its operands according to the predicate given
Nate Begemanac80ade2008-05-12 19:01:56 +0000607/// to the constructor. It only operates on integers or pointers. The operands
608/// must be identical types.
Reid Spencer45fb3f32006-11-20 01:22:35 +0000609/// @brief Represent an integer comparison operator.
610class ICmpInst: public CmpInst {
611public:
Reid Spencer45fb3f32006-11-20 01:22:35 +0000612 /// @brief Constructor with insert-before-instruction semantics.
613 ICmpInst(
614 Predicate pred, ///< The predicate to use for the comparison
615 Value *LHS, ///< The left-hand-side of the expression
616 Value *RHS, ///< The right-hand-side of the expression
617 const std::string &Name = "", ///< Name of the instruction
618 Instruction *InsertBefore = 0 ///< Where to insert
Nate Begemanac80ade2008-05-12 19:01:56 +0000619 ) : CmpInst(Type::Int1Ty, Instruction::ICmp, pred, LHS, RHS, Name,
620 InsertBefore) {
621 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE &&
622 pred <= CmpInst::LAST_ICMP_PREDICATE &&
623 "Invalid ICmp predicate value");
Nate Begeman31cd33a2008-05-14 20:28:31 +0000624 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000625 "Both operands to ICmp instruction are not of the same type!");
626 // Check that the operands are the right type
Nate Begeman31cd33a2008-05-14 20:28:31 +0000627 assert((getOperand(0)->getType()->isInteger() ||
628 isa<PointerType>(getOperand(0)->getType())) &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000629 "Invalid operand types for ICmp instruction");
Reid Spencer45fb3f32006-11-20 01:22:35 +0000630 }
631
632 /// @brief Constructor with insert-at-block-end semantics.
633 ICmpInst(
634 Predicate pred, ///< The predicate to use for the comparison
635 Value *LHS, ///< The left-hand-side of the expression
636 Value *RHS, ///< The right-hand-side of the expression
637 const std::string &Name, ///< Name of the instruction
638 BasicBlock *InsertAtEnd ///< Block to insert into.
Nate Begemanac80ade2008-05-12 19:01:56 +0000639 ) : CmpInst(Type::Int1Ty, Instruction::ICmp, pred, LHS, RHS, Name,
640 InsertAtEnd) {
641 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE &&
642 pred <= CmpInst::LAST_ICMP_PREDICATE &&
643 "Invalid ICmp predicate value");
Nate Begeman31cd33a2008-05-14 20:28:31 +0000644 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000645 "Both operands to ICmp instruction are not of the same type!");
646 // Check that the operands are the right type
Nate Begeman31cd33a2008-05-14 20:28:31 +0000647 assert((getOperand(0)->getType()->isInteger() ||
648 isa<PointerType>(getOperand(0)->getType())) &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000649 "Invalid operand types for ICmp instruction");
Reid Spencer45fb3f32006-11-20 01:22:35 +0000650 }
651
Reid Spencere4d87aa2006-12-23 06:05:41 +0000652 /// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
653 /// @returns the predicate that would be the result if the operand were
654 /// regarded as signed.
655 /// @brief Return the signed version of the predicate
656 Predicate getSignedPredicate() const {
657 return getSignedPredicate(getPredicate());
658 }
659
660 /// This is a static version that you can use without an instruction.
661 /// @brief Return the signed version of the predicate.
662 static Predicate getSignedPredicate(Predicate pred);
Reid Spencer45fb3f32006-11-20 01:22:35 +0000663
Nick Lewycky4189a532008-01-28 03:48:02 +0000664 /// For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
665 /// @returns the predicate that would be the result if the operand were
666 /// regarded as unsigned.
667 /// @brief Return the unsigned version of the predicate
668 Predicate getUnsignedPredicate() const {
669 return getUnsignedPredicate(getPredicate());
670 }
671
672 /// This is a static version that you can use without an instruction.
673 /// @brief Return the unsigned version of the predicate.
674 static Predicate getUnsignedPredicate(Predicate pred);
675
Chris Lattnerc2bfadb2007-11-22 23:43:29 +0000676 /// isEquality - Return true if this predicate is either EQ or NE. This also
677 /// tests for commutativity.
678 static bool isEquality(Predicate P) {
679 return P == ICMP_EQ || P == ICMP_NE;
680 }
681
682 /// isEquality - Return true if this predicate is either EQ or NE. This also
683 /// tests for commutativity.
Reid Spencer45fb3f32006-11-20 01:22:35 +0000684 bool isEquality() const {
Chris Lattnerc2bfadb2007-11-22 23:43:29 +0000685 return isEquality(getPredicate());
Reid Spencer45fb3f32006-11-20 01:22:35 +0000686 }
Reid Spencere4d87aa2006-12-23 06:05:41 +0000687
688 /// @returns true if the predicate of this ICmpInst is commutative
689 /// @brief Determine if this relation is commutative.
Reid Spencer45fb3f32006-11-20 01:22:35 +0000690 bool isCommutative() const { return isEquality(); }
691
Chris Lattnerc2bfadb2007-11-22 23:43:29 +0000692 /// isRelational - Return true if the predicate is relational (not EQ or NE).
693 ///
Reid Spencer45fb3f32006-11-20 01:22:35 +0000694 bool isRelational() const {
695 return !isEquality();
696 }
697
Chris Lattnerc2bfadb2007-11-22 23:43:29 +0000698 /// isRelational - Return true if the predicate is relational (not EQ or NE).
699 ///
700 static bool isRelational(Predicate P) {
701 return !isEquality(P);
702 }
703
Reid Spencere4d87aa2006-12-23 06:05:41 +0000704 /// @returns true if the predicate of this ICmpInst is signed, false otherwise
705 /// @brief Determine if this instruction's predicate is signed.
Chris Lattner5bda9e42007-09-15 06:51:03 +0000706 bool isSignedPredicate() const { return isSignedPredicate(getPredicate()); }
Reid Spencere4d87aa2006-12-23 06:05:41 +0000707
708 /// @returns true if the predicate provided is signed, false otherwise
709 /// @brief Determine if the predicate is signed.
710 static bool isSignedPredicate(Predicate pred);
711
Nick Lewyckyfc1efbb2008-05-17 07:33:39 +0000712 /// @returns true if the specified compare predicate is
713 /// true when both operands are equal...
714 /// @brief Determine if the icmp is true when both operands are equal
715 static bool isTrueWhenEqual(ICmpInst::Predicate pred) {
716 return pred == ICmpInst::ICMP_EQ || pred == ICmpInst::ICMP_UGE ||
717 pred == ICmpInst::ICMP_SGE || pred == ICmpInst::ICMP_ULE ||
718 pred == ICmpInst::ICMP_SLE;
719 }
720
721 /// @returns true if the specified compare instruction is
722 /// true when both operands are equal...
723 /// @brief Determine if the ICmpInst returns true when both operands are equal
724 bool isTrueWhenEqual() {
725 return isTrueWhenEqual(getPredicate());
726 }
727
Reid Spencer3da43842007-02-28 22:00:54 +0000728 /// Initialize a set of values that all satisfy the predicate with C.
729 /// @brief Make a ConstantRange for a relation with a constant value.
730 static ConstantRange makeConstantRange(Predicate pred, const APInt &C);
731
Reid Spencer45fb3f32006-11-20 01:22:35 +0000732 /// Exchange the two operands to this instruction in such a way that it does
733 /// not modify the semantics of the instruction. The predicate value may be
734 /// changed to retain the same result if the predicate is order dependent
735 /// (e.g. ult).
736 /// @brief Swap operands and adjust predicate.
737 void swapOperands() {
738 SubclassData = getSwappedPredicate();
Gabor Greif94fb68b2008-05-13 22:51:52 +0000739 Op<0>().swap(Op<1>());
Reid Spencer45fb3f32006-11-20 01:22:35 +0000740 }
741
Chris Lattnercd406fe2007-08-24 20:48:18 +0000742 virtual ICmpInst *clone() const;
743
Reid Spencer45fb3f32006-11-20 01:22:35 +0000744 // Methods for support type inquiry through isa, cast, and dyn_cast:
745 static inline bool classof(const ICmpInst *) { return true; }
746 static inline bool classof(const Instruction *I) {
747 return I->getOpcode() == Instruction::ICmp;
748 }
749 static inline bool classof(const Value *V) {
750 return isa<Instruction>(V) && classof(cast<Instruction>(V));
751 }
752};
753
754//===----------------------------------------------------------------------===//
755// FCmpInst Class
756//===----------------------------------------------------------------------===//
757
758/// This instruction compares its operands according to the predicate given
759/// to the constructor. It only operates on floating point values or packed
760/// vectors of floating point values. The operands must be identical types.
761/// @brief Represents a floating point comparison operator.
762class FCmpInst: public CmpInst {
763public:
Reid Spencer45fb3f32006-11-20 01:22:35 +0000764 /// @brief Constructor with insert-before-instruction semantics.
765 FCmpInst(
766 Predicate pred, ///< The predicate to use for the comparison
767 Value *LHS, ///< The left-hand-side of the expression
768 Value *RHS, ///< The right-hand-side of the expression
769 const std::string &Name = "", ///< Name of the instruction
770 Instruction *InsertBefore = 0 ///< Where to insert
Nate Begemanac80ade2008-05-12 19:01:56 +0000771 ) : CmpInst(Type::Int1Ty, Instruction::FCmp, pred, LHS, RHS, Name,
772 InsertBefore) {
773 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE &&
774 "Invalid FCmp predicate value");
Nate Begeman31cd33a2008-05-14 20:28:31 +0000775 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000776 "Both operands to FCmp instruction are not of the same type!");
777 // Check that the operands are the right type
Nate Begeman31cd33a2008-05-14 20:28:31 +0000778 assert(getOperand(0)->getType()->isFloatingPoint() &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000779 "Invalid operand types for FCmp instruction");
Reid Spencer45fb3f32006-11-20 01:22:35 +0000780 }
781
782 /// @brief Constructor with insert-at-block-end semantics.
783 FCmpInst(
784 Predicate pred, ///< The predicate to use for the comparison
785 Value *LHS, ///< The left-hand-side of the expression
786 Value *RHS, ///< The right-hand-side of the expression
787 const std::string &Name, ///< Name of the instruction
788 BasicBlock *InsertAtEnd ///< Block to insert into.
Nate Begemanac80ade2008-05-12 19:01:56 +0000789 ) : CmpInst(Type::Int1Ty, Instruction::FCmp, pred, LHS, RHS, Name,
790 InsertAtEnd) {
791 assert(pred <= FCmpInst::LAST_FCMP_PREDICATE &&
792 "Invalid FCmp predicate value");
Nate Begeman31cd33a2008-05-14 20:28:31 +0000793 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000794 "Both operands to FCmp instruction are not of the same type!");
795 // Check that the operands are the right type
Nate Begeman31cd33a2008-05-14 20:28:31 +0000796 assert(getOperand(0)->getType()->isFloatingPoint() &&
Nate Begemanac80ade2008-05-12 19:01:56 +0000797 "Invalid operand types for FCmp instruction");
Reid Spencer45fb3f32006-11-20 01:22:35 +0000798 }
799
Reid Spencer45fb3f32006-11-20 01:22:35 +0000800 /// This also tests for commutativity. If isEquality() returns true then
801 /// the predicate is also commutative. Only the equality predicates are
802 /// commutative.
803 /// @returns true if the predicate of this instruction is EQ or NE.
804 /// @brief Determine if this is an equality predicate.
805 bool isEquality() const {
806 return SubclassData == FCMP_OEQ || SubclassData == FCMP_ONE ||
807 SubclassData == FCMP_UEQ || SubclassData == FCMP_UNE;
808 }
809 bool isCommutative() const { return isEquality(); }
810
811 /// @returns true if the predicate is relational (not EQ or NE).
812 /// @brief Determine if this a relational predicate.
813 bool isRelational() const { return !isEquality(); }
814
815 /// Exchange the two operands to this instruction in such a way that it does
816 /// not modify the semantics of the instruction. The predicate value may be
817 /// changed to retain the same result if the predicate is order dependent
818 /// (e.g. ult).
819 /// @brief Swap operands and adjust predicate.
820 void swapOperands() {
821 SubclassData = getSwappedPredicate();
Gabor Greif94fb68b2008-05-13 22:51:52 +0000822 Op<0>().swap(Op<1>());
Reid Spencer45fb3f32006-11-20 01:22:35 +0000823 }
824
Chris Lattnercd406fe2007-08-24 20:48:18 +0000825 virtual FCmpInst *clone() const;
826
Reid Spencer45fb3f32006-11-20 01:22:35 +0000827 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
828 static inline bool classof(const FCmpInst *) { return true; }
829 static inline bool classof(const Instruction *I) {
830 return I->getOpcode() == Instruction::FCmp;
831 }
832 static inline bool classof(const Value *V) {
833 return isa<Instruction>(V) && classof(cast<Instruction>(V));
834 }
835};
836
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000837//===----------------------------------------------------------------------===//
Nate Begemanac80ade2008-05-12 19:01:56 +0000838// VICmpInst Class
839//===----------------------------------------------------------------------===//
840
841/// This instruction compares its operands according to the predicate given
842/// to the constructor. It only operates on vectors of integers.
843/// The operands must be identical types.
844/// @brief Represents a vector integer comparison operator.
845class VICmpInst: public CmpInst {
846public:
847 /// @brief Constructor with insert-before-instruction semantics.
848 VICmpInst(
849 Predicate pred, ///< The predicate to use for the comparison
850 Value *LHS, ///< The left-hand-side of the expression
851 Value *RHS, ///< The right-hand-side of the expression
852 const std::string &Name = "", ///< Name of the instruction
853 Instruction *InsertBefore = 0 ///< Where to insert
854 ) : CmpInst(LHS->getType(), Instruction::VICmp, pred, LHS, RHS, Name,
855 InsertBefore) {
Nate Begeman31cd33a2008-05-14 20:28:31 +0000856 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE &&
857 pred <= CmpInst::LAST_ICMP_PREDICATE &&
858 "Invalid VICmp predicate value");
859 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
860 "Both operands to VICmp instruction are not of the same type!");
Nate Begemanac80ade2008-05-12 19:01:56 +0000861 }
862
863 /// @brief Constructor with insert-at-block-end semantics.
864 VICmpInst(
865 Predicate pred, ///< The predicate to use for the comparison
866 Value *LHS, ///< The left-hand-side of the expression
867 Value *RHS, ///< The right-hand-side of the expression
868 const std::string &Name, ///< Name of the instruction
869 BasicBlock *InsertAtEnd ///< Block to insert into.
870 ) : CmpInst(LHS->getType(), Instruction::VICmp, pred, LHS, RHS, Name,
871 InsertAtEnd) {
Nate Begeman31cd33a2008-05-14 20:28:31 +0000872 assert(pred >= CmpInst::FIRST_ICMP_PREDICATE &&
873 pred <= CmpInst::LAST_ICMP_PREDICATE &&
874 "Invalid VICmp predicate value");
875 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
876 "Both operands to VICmp instruction are not of the same type!");
Nate Begemanac80ade2008-05-12 19:01:56 +0000877 }
878
879 /// @brief Return the predicate for this instruction.
880 Predicate getPredicate() const { return Predicate(SubclassData); }
881
882 virtual VICmpInst *clone() const;
883
884 // Methods for support type inquiry through isa, cast, and dyn_cast:
885 static inline bool classof(const VICmpInst *) { return true; }
886 static inline bool classof(const Instruction *I) {
887 return I->getOpcode() == Instruction::VICmp;
888 }
889 static inline bool classof(const Value *V) {
890 return isa<Instruction>(V) && classof(cast<Instruction>(V));
891 }
892};
893
894//===----------------------------------------------------------------------===//
895// VFCmpInst Class
896//===----------------------------------------------------------------------===//
897
898/// This instruction compares its operands according to the predicate given
899/// to the constructor. It only operates on vectors of floating point values.
900/// The operands must be identical types.
901/// @brief Represents a vector floating point comparison operator.
902class VFCmpInst: public CmpInst {
903public:
904 /// @brief Constructor with insert-before-instruction semantics.
905 VFCmpInst(
906 Predicate pred, ///< The predicate to use for the comparison
907 Value *LHS, ///< The left-hand-side of the expression
908 Value *RHS, ///< The right-hand-side of the expression
909 const std::string &Name = "", ///< Name of the instruction
910 Instruction *InsertBefore = 0 ///< Where to insert
911 ) : CmpInst(VectorType::getInteger(cast<VectorType>(LHS->getType())),
912 Instruction::VFCmp, pred, LHS, RHS, Name, InsertBefore) {
Nate Begeman31cd33a2008-05-14 20:28:31 +0000913 assert(pred <= CmpInst::LAST_FCMP_PREDICATE &&
914 "Invalid VFCmp predicate value");
915 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
916 "Both operands to VFCmp instruction are not of the same type!");
Nate Begemanac80ade2008-05-12 19:01:56 +0000917 }
918
919 /// @brief Constructor with insert-at-block-end semantics.
920 VFCmpInst(
921 Predicate pred, ///< The predicate to use for the comparison
922 Value *LHS, ///< The left-hand-side of the expression
923 Value *RHS, ///< The right-hand-side of the expression
924 const std::string &Name, ///< Name of the instruction
925 BasicBlock *InsertAtEnd ///< Block to insert into.
926 ) : CmpInst(VectorType::getInteger(cast<VectorType>(LHS->getType())),
927 Instruction::VFCmp, pred, LHS, RHS, Name, InsertAtEnd) {
Nate Begeman31cd33a2008-05-14 20:28:31 +0000928 assert(pred <= CmpInst::LAST_FCMP_PREDICATE &&
929 "Invalid VFCmp predicate value");
930 assert(getOperand(0)->getType() == getOperand(1)->getType() &&
931 "Both operands to VFCmp instruction are not of the same type!");
Nate Begemanac80ade2008-05-12 19:01:56 +0000932 }
933
934 /// @brief Return the predicate for this instruction.
935 Predicate getPredicate() const { return Predicate(SubclassData); }
936
937 virtual VFCmpInst *clone() const;
938
939 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
940 static inline bool classof(const VFCmpInst *) { return true; }
941 static inline bool classof(const Instruction *I) {
942 return I->getOpcode() == Instruction::VFCmp;
943 }
944 static inline bool classof(const Value *V) {
945 return isa<Instruction>(V) && classof(cast<Instruction>(V));
946 }
947};
948
949//===----------------------------------------------------------------------===//
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000950// CallInst Class
951//===----------------------------------------------------------------------===//
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000952/// CallInst - This class represents a function call, abstracting a target
Chris Lattner3340ffe2005-05-06 20:26:26 +0000953/// machine's calling convention. This class uses low bit of the SubClassData
954/// field to indicate whether or not this is a tail call. The rest of the bits
955/// hold the calling convention of the call.
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000956///
David Greene52eec542007-08-01 03:43:44 +0000957
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000958class CallInst : public Instruction {
Chris Lattner58d74912008-03-12 17:45:29 +0000959 PAListPtr ParamAttrs; ///< parameter attributes for call
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000960 CallInst(const CallInst &CI);
Chris Lattnerd54f4322007-02-13 00:58:44 +0000961 void init(Value *Func, Value* const *Params, unsigned NumParams);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +0000962 void init(Value *Func, Value *Actual1, Value *Actual2);
963 void init(Value *Func, Value *Actual);
964 void init(Value *Func);
965
David Greene52eec542007-08-01 03:43:44 +0000966 template<typename InputIterator>
967 void init(Value *Func, InputIterator ArgBegin, InputIterator ArgEnd,
968 const std::string &Name,
969 // This argument ensures that we have an iterator we can
970 // do arithmetic on in constant time
971 std::random_access_iterator_tag) {
Chris Lattnera5c0d1e2007-08-29 16:32:50 +0000972 unsigned NumArgs = (unsigned)std::distance(ArgBegin, ArgEnd);
David Greene52eec542007-08-01 03:43:44 +0000973
Chris Lattnera5c0d1e2007-08-29 16:32:50 +0000974 // This requires that the iterator points to contiguous memory.
975 init(Func, NumArgs ? &*ArgBegin : 0, NumArgs);
David Greene52eec542007-08-01 03:43:44 +0000976 setName(Name);
977 }
978
David Greene52eec542007-08-01 03:43:44 +0000979 /// Construct a CallInst given a range of arguments. InputIterator
980 /// must be a random-access iterator pointing to contiguous storage
981 /// (e.g. a std::vector<>::iterator). Checks are made for
982 /// random-accessness but not for contiguous storage as that would
983 /// incur runtime overhead.
984 /// @brief Construct a CallInst from a range of arguments
985 template<typename InputIterator>
986 CallInst(Value *Func, InputIterator ArgBegin, InputIterator ArgEnd,
Gabor Greifefe65362008-05-10 08:32:32 +0000987 const std::string &Name, Instruction *InsertBefore);
David Greene52eec542007-08-01 03:43:44 +0000988
989 /// Construct a CallInst given a range of arguments. InputIterator
990 /// must be a random-access iterator pointing to contiguous storage
991 /// (e.g. a std::vector<>::iterator). Checks are made for
992 /// random-accessness but not for contiguous storage as that would
993 /// incur runtime overhead.
994 /// @brief Construct a CallInst from a range of arguments
995 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +0000996 inline CallInst(Value *Func, InputIterator ArgBegin, InputIterator ArgEnd,
997 const std::string &Name, BasicBlock *InsertAtEnd);
David Greene52eec542007-08-01 03:43:44 +0000998
Gabor Greifefe65362008-05-10 08:32:32 +0000999 CallInst(Value *F, Value *Actual, const std::string& Name,
1000 Instruction *InsertBefore);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001001 CallInst(Value *F, Value *Actual, const std::string& Name,
1002 BasicBlock *InsertAtEnd);
Gabor Greifefe65362008-05-10 08:32:32 +00001003 explicit CallInst(Value *F, const std::string &Name,
1004 Instruction *InsertBefore);
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001005 CallInst(Value *F, const std::string &Name, BasicBlock *InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00001006public:
1007 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +00001008 static CallInst *Create(Value *Func,
1009 InputIterator ArgBegin, InputIterator ArgEnd,
Evan Chengd69bb1a2008-05-05 17:41:03 +00001010 const std::string &Name = "",
1011 Instruction *InsertBefore = 0) {
Bill Wendlingc2e73532008-05-10 19:59:59 +00001012 return new((unsigned)(ArgEnd - ArgBegin + 1))
Evan Chengd69bb1a2008-05-05 17:41:03 +00001013 CallInst(Func, ArgBegin, ArgEnd, Name, InsertBefore);
Gabor Greif051a9502008-04-06 20:25:17 +00001014 }
1015 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +00001016 static CallInst *Create(Value *Func,
1017 InputIterator ArgBegin, InputIterator ArgEnd,
1018 const std::string &Name, BasicBlock *InsertAtEnd) {
Bill Wendlingc2e73532008-05-10 19:59:59 +00001019 return new((unsigned)(ArgEnd - ArgBegin + 1))
Evan Chengd69bb1a2008-05-05 17:41:03 +00001020 CallInst(Func, ArgBegin, ArgEnd, Name, InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00001021 }
1022 static CallInst *Create(Value *F, Value *Actual, const std::string& Name = "",
1023 Instruction *InsertBefore = 0) {
1024 return new(2) CallInst(F, Actual, Name, InsertBefore);
1025 }
1026 static CallInst *Create(Value *F, Value *Actual, const std::string& Name,
1027 BasicBlock *InsertAtEnd) {
1028 return new(2) CallInst(F, Actual, Name, InsertAtEnd);
1029 }
1030 static CallInst *Create(Value *F, const std::string &Name = "",
1031 Instruction *InsertBefore = 0) {
1032 return new(1) CallInst(F, Name, InsertBefore);
1033 }
Evan Cheng34cd4a42008-05-05 18:30:58 +00001034 static CallInst *Create(Value *F, const std::string &Name,
1035 BasicBlock *InsertAtEnd) {
Gabor Greif051a9502008-04-06 20:25:17 +00001036 return new(1) CallInst(F, Name, InsertAtEnd);
1037 }
1038
Gordon Henriksenafba8fe2007-12-10 02:14:30 +00001039 ~CallInst();
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001040
Chris Lattnerf319e832004-10-15 23:52:05 +00001041 virtual CallInst *clone() const;
Gabor Greifefe65362008-05-10 08:32:32 +00001042
1043 /// Provide fast operand accessors
1044 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Chris Lattnerbb5493d2007-02-15 23:15:00 +00001045
Chris Lattner3340ffe2005-05-06 20:26:26 +00001046 bool isTailCall() const { return SubclassData & 1; }
1047 void setTailCall(bool isTailCall = true) {
Jeff Cohen39cef602005-05-07 02:44:04 +00001048 SubclassData = (SubclassData & ~1) | unsigned(isTailCall);
Chris Lattner3340ffe2005-05-06 20:26:26 +00001049 }
1050
1051 /// getCallingConv/setCallingConv - Get or set the calling convention of this
1052 /// function call.
1053 unsigned getCallingConv() const { return SubclassData >> 1; }
1054 void setCallingConv(unsigned CC) {
1055 SubclassData = (SubclassData & 1) | (CC << 1);
1056 }
Chris Lattnerddb6db42005-05-06 05:51:46 +00001057
Chris Lattner041221c2008-03-13 04:33:03 +00001058 /// getParamAttrs - Return the parameter attributes for this call.
1059 ///
Chris Lattner58d74912008-03-12 17:45:29 +00001060 const PAListPtr &getParamAttrs() const { return ParamAttrs; }
Reid Spencer4746ecf2007-04-09 15:01:12 +00001061
Chris Lattner041221c2008-03-13 04:33:03 +00001062 /// setParamAttrs - Sets the parameter attributes for this call.
Chris Lattner58d74912008-03-12 17:45:29 +00001063 void setParamAttrs(const PAListPtr &Attrs) { ParamAttrs = Attrs; }
Eric Christopher0bf7b412008-05-16 20:39:43 +00001064
1065 /// addParamAttr - adds the attribute to the list of attributes.
1066 void addParamAttr(unsigned i, ParameterAttributes attr);
Duncan Sandsdc024672007-11-27 13:23:08 +00001067
Duncan Sandsafa3b6d2007-11-28 17:07:01 +00001068 /// @brief Determine whether the call or the callee has the given attribute.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001069 bool paramHasAttr(unsigned i, unsigned attr) const;
Duncan Sandsafa3b6d2007-11-28 17:07:01 +00001070
Dale Johannesen08e78b12008-02-22 17:49:45 +00001071 /// @brief Extract the alignment for a call or parameter (0=unknown).
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001072 unsigned getParamAlignment(unsigned i) const {
1073 return ParamAttrs.getParamAlignment(i);
1074 }
Dale Johannesen08e78b12008-02-22 17:49:45 +00001075
Duncan Sandsa3355ff2007-12-03 20:06:50 +00001076 /// @brief Determine if the call does not access memory.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001077 bool doesNotAccessMemory() const {
1078 return paramHasAttr(0, ParamAttr::ReadNone);
1079 }
Chris Lattner50ee9dd2008-01-02 23:42:30 +00001080
Duncan Sandsa3355ff2007-12-03 20:06:50 +00001081 /// @brief Determine if the call does not access or only reads memory.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001082 bool onlyReadsMemory() const {
1083 return doesNotAccessMemory() || paramHasAttr(0, ParamAttr::ReadOnly);
1084 }
Chris Lattner50ee9dd2008-01-02 23:42:30 +00001085
Duncan Sandscbb8bad2007-12-10 19:09:40 +00001086 /// @brief Determine if the call cannot return.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001087 bool doesNotReturn() const {
1088 return paramHasAttr(0, ParamAttr::NoReturn);
1089 }
Duncan Sandscbb8bad2007-12-10 19:09:40 +00001090
Duncan Sandsa3355ff2007-12-03 20:06:50 +00001091 /// @brief Determine if the call cannot unwind.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001092 bool doesNotThrow() const {
1093 return paramHasAttr(0, ParamAttr::NoUnwind);
1094 }
Duncan Sandsf0c33542007-12-19 21:13:37 +00001095 void setDoesNotThrow(bool doesNotThrow = true);
Duncan Sandsa3355ff2007-12-03 20:06:50 +00001096
Devang Patel41e23972008-03-03 21:46:28 +00001097 /// @brief Determine if the call returns a structure through first
1098 /// pointer argument.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001099 bool hasStructRetAttr() const {
1100 // Be friendly and also check the callee.
1101 return paramHasAttr(1, ParamAttr::StructRet);
1102 }
Reid Spencer4746ecf2007-04-09 15:01:12 +00001103
Evan Chengf4a54982008-01-12 18:57:32 +00001104 /// @brief Determine if any call argument is an aggregate passed by value.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00001105 bool hasByValArgument() const {
1106 return ParamAttrs.hasAttrSomewhere(ParamAttr::ByVal);
1107 }
Evan Chengf4a54982008-01-12 18:57:32 +00001108
Chris Lattner721aef62004-11-18 17:46:57 +00001109 /// getCalledFunction - Return the function being called by this instruction
1110 /// if it is a direct call. If it is a call through a function pointer,
1111 /// return null.
1112 Function *getCalledFunction() const {
Dan Gohman11a7dbf2007-09-24 15:46:02 +00001113 return dyn_cast<Function>(getOperand(0));
Chris Lattner721aef62004-11-18 17:46:57 +00001114 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001115
Reid Spencerc25ec252006-12-29 04:10:59 +00001116 /// getCalledValue - Get a pointer to the function that is invoked by this
1117 /// instruction
Devang Patel4d4a5e02008-02-23 01:11:02 +00001118 const Value *getCalledValue() const { return getOperand(0); }
1119 Value *getCalledValue() { return getOperand(0); }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001120
1121 // Methods for support type inquiry through isa, cast, and dyn_cast:
1122 static inline bool classof(const CallInst *) { return true; }
1123 static inline bool classof(const Instruction *I) {
Misha Brukman9769ab22005-04-21 20:19:05 +00001124 return I->getOpcode() == Instruction::Call;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001125 }
1126 static inline bool classof(const Value *V) {
1127 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1128 }
1129};
1130
Gabor Greifefe65362008-05-10 08:32:32 +00001131template <>
1132struct OperandTraits<CallInst> : VariadicOperandTraits<1> {
1133};
1134
1135template<typename InputIterator>
1136CallInst::CallInst(Value *Func, InputIterator ArgBegin, InputIterator ArgEnd,
1137 const std::string &Name, BasicBlock *InsertAtEnd)
1138 : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
1139 ->getElementType())->getReturnType(),
1140 Instruction::Call,
1141 OperandTraits<CallInst>::op_end(this) - (ArgEnd - ArgBegin + 1),
Bill Wendling1b2f7292008-05-10 11:26:52 +00001142 (unsigned)(ArgEnd - ArgBegin + 1), InsertAtEnd) {
Gabor Greifefe65362008-05-10 08:32:32 +00001143 init(Func, ArgBegin, ArgEnd, Name,
1144 typename std::iterator_traits<InputIterator>::iterator_category());
1145}
1146
1147template<typename InputIterator>
1148CallInst::CallInst(Value *Func, InputIterator ArgBegin, InputIterator ArgEnd,
1149 const std::string &Name, Instruction *InsertBefore)
1150 : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
1151 ->getElementType())->getReturnType(),
1152 Instruction::Call,
1153 OperandTraits<CallInst>::op_end(this) - (ArgEnd - ArgBegin + 1),
Bill Wendling1b2f7292008-05-10 11:26:52 +00001154 (unsigned)(ArgEnd - ArgBegin + 1), InsertBefore) {
Gabor Greifefe65362008-05-10 08:32:32 +00001155 init(Func, ArgBegin, ArgEnd, Name,
1156 typename std::iterator_traits<InputIterator>::iterator_category());
1157}
1158
1159DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CallInst, Value)
1160
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001161//===----------------------------------------------------------------------===//
1162// SelectInst Class
1163//===----------------------------------------------------------------------===//
1164
1165/// SelectInst - This class represents the LLVM 'select' instruction.
1166///
1167class SelectInst : public Instruction {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001168 void init(Value *C, Value *S1, Value *S2) {
Gabor Greifefe65362008-05-10 08:32:32 +00001169 Op<0>() = C;
1170 Op<1>() = S1;
1171 Op<2>() = S2;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001172 }
1173
Chris Lattner454928e2005-01-29 00:31:36 +00001174 SelectInst(const SelectInst &SI)
Gabor Greifefe65362008-05-10 08:32:32 +00001175 : Instruction(SI.getType(), SI.getOpcode(), &Op<0>(), 3) {
1176 init(SI.Op<0>(), SI.Op<1>(), SI.Op<2>());
Chris Lattner454928e2005-01-29 00:31:36 +00001177 }
Gabor Greifefe65362008-05-10 08:32:32 +00001178 SelectInst(Value *C, Value *S1, Value *S2, const std::string &Name,
1179 Instruction *InsertBefore)
1180 : Instruction(S1->getType(), Instruction::Select,
1181 &Op<0>(), 3, InsertBefore) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001182 init(C, S1, S2);
Chris Lattner910c80a2007-02-24 00:55:48 +00001183 setName(Name);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001184 }
1185 SelectInst(Value *C, Value *S1, Value *S2, const std::string &Name,
1186 BasicBlock *InsertAtEnd)
Gabor Greifefe65362008-05-10 08:32:32 +00001187 : Instruction(S1->getType(), Instruction::Select,
1188 &Op<0>(), 3, InsertAtEnd) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001189 init(C, S1, S2);
Chris Lattner910c80a2007-02-24 00:55:48 +00001190 setName(Name);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001191 }
Gabor Greif051a9502008-04-06 20:25:17 +00001192public:
Evan Chengd69bb1a2008-05-05 17:41:03 +00001193 static SelectInst *Create(Value *C, Value *S1, Value *S2,
1194 const std::string &Name = "",
1195 Instruction *InsertBefore = 0) {
Gabor Greif051a9502008-04-06 20:25:17 +00001196 return new(3) SelectInst(C, S1, S2, Name, InsertBefore);
1197 }
Evan Chengd69bb1a2008-05-05 17:41:03 +00001198 static SelectInst *Create(Value *C, Value *S1, Value *S2,
1199 const std::string &Name, BasicBlock *InsertAtEnd) {
Gabor Greif051a9502008-04-06 20:25:17 +00001200 return new(3) SelectInst(C, S1, S2, Name, InsertAtEnd);
1201 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001202
Gabor Greifefe65362008-05-10 08:32:32 +00001203 Value *getCondition() const { return Op<0>(); }
1204 Value *getTrueValue() const { return Op<1>(); }
1205 Value *getFalseValue() const { return Op<2>(); }
Chris Lattner454928e2005-01-29 00:31:36 +00001206
1207 /// Transparently provide more efficient getOperand methods.
Gabor Greifefe65362008-05-10 08:32:32 +00001208 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001209
1210 OtherOps getOpcode() const {
1211 return static_cast<OtherOps>(Instruction::getOpcode());
1212 }
1213
Chris Lattnerf319e832004-10-15 23:52:05 +00001214 virtual SelectInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001215
1216 // Methods for support type inquiry through isa, cast, and dyn_cast:
1217 static inline bool classof(const SelectInst *) { return true; }
1218 static inline bool classof(const Instruction *I) {
1219 return I->getOpcode() == Instruction::Select;
1220 }
1221 static inline bool classof(const Value *V) {
1222 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1223 }
1224};
1225
Gabor Greifefe65362008-05-10 08:32:32 +00001226template <>
1227struct OperandTraits<SelectInst> : FixedNumOperandTraits<3> {
1228};
1229
1230DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SelectInst, Value)
1231
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001232//===----------------------------------------------------------------------===//
1233// VAArgInst Class
1234//===----------------------------------------------------------------------===//
1235
1236/// VAArgInst - This class represents the va_arg llvm instruction, which returns
Andrew Lenharthf5428212005-06-18 18:31:30 +00001237/// an argument of the specified type given a va_list and increments that list
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001238///
Chris Lattner454928e2005-01-29 00:31:36 +00001239class VAArgInst : public UnaryInstruction {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001240 VAArgInst(const VAArgInst &VAA)
Chris Lattner454928e2005-01-29 00:31:36 +00001241 : UnaryInstruction(VAA.getType(), VAArg, VAA.getOperand(0)) {}
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001242public:
1243 VAArgInst(Value *List, const Type *Ty, const std::string &Name = "",
1244 Instruction *InsertBefore = 0)
Chris Lattner910c80a2007-02-24 00:55:48 +00001245 : UnaryInstruction(Ty, VAArg, List, InsertBefore) {
Chris Lattnerf00042a2007-02-13 07:54:42 +00001246 setName(Name);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001247 }
1248 VAArgInst(Value *List, const Type *Ty, const std::string &Name,
1249 BasicBlock *InsertAtEnd)
Chris Lattner910c80a2007-02-24 00:55:48 +00001250 : UnaryInstruction(Ty, VAArg, List, InsertAtEnd) {
Chris Lattnerf00042a2007-02-13 07:54:42 +00001251 setName(Name);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001252 }
1253
Chris Lattnerf319e832004-10-15 23:52:05 +00001254 virtual VAArgInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001255
1256 // Methods for support type inquiry through isa, cast, and dyn_cast:
1257 static inline bool classof(const VAArgInst *) { return true; }
1258 static inline bool classof(const Instruction *I) {
1259 return I->getOpcode() == VAArg;
1260 }
1261 static inline bool classof(const Value *V) {
1262 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1263 }
1264};
1265
1266//===----------------------------------------------------------------------===//
Robert Bocchino49b78a52006-01-10 19:04:13 +00001267// ExtractElementInst Class
1268//===----------------------------------------------------------------------===//
1269
1270/// ExtractElementInst - This instruction extracts a single (scalar)
Reid Spencer9d6565a2007-02-15 02:26:10 +00001271/// element from a VectorType value
Robert Bocchino49b78a52006-01-10 19:04:13 +00001272///
1273class ExtractElementInst : public Instruction {
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001274 ExtractElementInst(const ExtractElementInst &EE) :
Gabor Greifefe65362008-05-10 08:32:32 +00001275 Instruction(EE.getType(), ExtractElement, &Op<0>(), 2) {
Gabor Greif6c80c382008-05-26 21:33:52 +00001276 Op<0>() = EE.Op<0>();
1277 Op<1>() = EE.Op<1>();
Robert Bocchino49b78a52006-01-10 19:04:13 +00001278 }
1279
1280public:
Gabor Greif051a9502008-04-06 20:25:17 +00001281 // allocate space for exactly two operands
1282 void *operator new(size_t s) {
Gabor Greifefe65362008-05-10 08:32:32 +00001283 return User::operator new(s, 2); // FIXME: "unsigned Idx" forms of ctor?
Gabor Greif051a9502008-04-06 20:25:17 +00001284 }
Chris Lattner9fc18d22006-04-08 01:15:18 +00001285 ExtractElementInst(Value *Vec, Value *Idx, const std::string &Name = "",
1286 Instruction *InsertBefore = 0);
Chris Lattner06a248c22006-10-05 06:24:58 +00001287 ExtractElementInst(Value *Vec, unsigned Idx, const std::string &Name = "",
1288 Instruction *InsertBefore = 0);
Chris Lattner9fc18d22006-04-08 01:15:18 +00001289 ExtractElementInst(Value *Vec, Value *Idx, const std::string &Name,
1290 BasicBlock *InsertAtEnd);
Chris Lattner06a248c22006-10-05 06:24:58 +00001291 ExtractElementInst(Value *Vec, unsigned Idx, const std::string &Name,
1292 BasicBlock *InsertAtEnd);
Robert Bocchino49b78a52006-01-10 19:04:13 +00001293
Chris Lattnerfa495842006-04-08 04:04:54 +00001294 /// isValidOperands - Return true if an extractelement instruction can be
1295 /// formed with the specified operands.
1296 static bool isValidOperands(const Value *Vec, const Value *Idx);
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001297
Robert Bocchino49b78a52006-01-10 19:04:13 +00001298 virtual ExtractElementInst *clone() const;
1299
Robert Bocchino49b78a52006-01-10 19:04:13 +00001300 /// Transparently provide more efficient getOperand methods.
Gabor Greifefe65362008-05-10 08:32:32 +00001301 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Robert Bocchino49b78a52006-01-10 19:04:13 +00001302
1303 // Methods for support type inquiry through isa, cast, and dyn_cast:
1304 static inline bool classof(const ExtractElementInst *) { return true; }
1305 static inline bool classof(const Instruction *I) {
1306 return I->getOpcode() == Instruction::ExtractElement;
1307 }
1308 static inline bool classof(const Value *V) {
1309 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1310 }
1311};
1312
Gabor Greifefe65362008-05-10 08:32:32 +00001313template <>
1314struct OperandTraits<ExtractElementInst> : FixedNumOperandTraits<2> {
1315};
1316
1317DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractElementInst, Value)
1318
Robert Bocchino49b78a52006-01-10 19:04:13 +00001319//===----------------------------------------------------------------------===//
Robert Bocchinof9993442006-01-17 20:05:59 +00001320// InsertElementInst Class
1321//===----------------------------------------------------------------------===//
1322
1323/// InsertElementInst - This instruction inserts a single (scalar)
Reid Spencer9d6565a2007-02-15 02:26:10 +00001324/// element into a VectorType value
Robert Bocchinof9993442006-01-17 20:05:59 +00001325///
1326class InsertElementInst : public Instruction {
Chris Lattner6a56ed42006-04-14 22:20:07 +00001327 InsertElementInst(const InsertElementInst &IE);
Gabor Greif051a9502008-04-06 20:25:17 +00001328 InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
1329 const std::string &Name = "",Instruction *InsertBefore = 0);
1330 InsertElementInst(Value *Vec, Value *NewElt, unsigned Idx,
1331 const std::string &Name = "",Instruction *InsertBefore = 0);
1332 InsertElementInst(Value *Vec, Value *NewElt, Value *Idx,
1333 const std::string &Name, BasicBlock *InsertAtEnd);
1334 InsertElementInst(Value *Vec, Value *NewElt, unsigned Idx,
1335 const std::string &Name, BasicBlock *InsertAtEnd);
Robert Bocchinof9993442006-01-17 20:05:59 +00001336public:
Gabor Greif051a9502008-04-06 20:25:17 +00001337 static InsertElementInst *Create(const InsertElementInst &IE) {
1338 return new(IE.getNumOperands()) InsertElementInst(IE);
1339 }
1340 static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx,
Gabor Greifefe65362008-05-10 08:32:32 +00001341 const std::string &Name = "",
1342 Instruction *InsertBefore = 0) {
Gabor Greif051a9502008-04-06 20:25:17 +00001343 return new(3) InsertElementInst(Vec, NewElt, Idx, Name, InsertBefore);
1344 }
1345 static InsertElementInst *Create(Value *Vec, Value *NewElt, unsigned Idx,
Evan Chengd69bb1a2008-05-05 17:41:03 +00001346 const std::string &Name = "",
1347 Instruction *InsertBefore = 0) {
Gabor Greifefe65362008-05-10 08:32:32 +00001348 return new(3) InsertElementInst(Vec, NewElt, Idx, Name, InsertBefore);
Gabor Greif051a9502008-04-06 20:25:17 +00001349 }
1350 static InsertElementInst *Create(Value *Vec, Value *NewElt, Value *Idx,
Evan Chengd69bb1a2008-05-05 17:41:03 +00001351 const std::string &Name,
1352 BasicBlock *InsertAtEnd) {
Gabor Greif051a9502008-04-06 20:25:17 +00001353 return new(3) InsertElementInst(Vec, NewElt, Idx, Name, InsertAtEnd);
1354 }
1355 static InsertElementInst *Create(Value *Vec, Value *NewElt, unsigned Idx,
Evan Chengd69bb1a2008-05-05 17:41:03 +00001356 const std::string &Name,
1357 BasicBlock *InsertAtEnd) {
Gabor Greifefe65362008-05-10 08:32:32 +00001358 return new(3) InsertElementInst(Vec, NewElt, Idx, Name, InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00001359 }
Robert Bocchinof9993442006-01-17 20:05:59 +00001360
Chris Lattnerfa495842006-04-08 04:04:54 +00001361 /// isValidOperands - Return true if an insertelement instruction can be
1362 /// formed with the specified operands.
1363 static bool isValidOperands(const Value *Vec, const Value *NewElt,
1364 const Value *Idx);
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001365
Robert Bocchinof9993442006-01-17 20:05:59 +00001366 virtual InsertElementInst *clone() const;
1367
Reid Spencerac9dcb92007-02-15 03:39:18 +00001368 /// getType - Overload to return most specific vector type.
Chris Lattner6a56ed42006-04-14 22:20:07 +00001369 ///
Devang Patel4d4a5e02008-02-23 01:11:02 +00001370 const VectorType *getType() const {
Reid Spencer9d6565a2007-02-15 02:26:10 +00001371 return reinterpret_cast<const VectorType*>(Instruction::getType());
Chris Lattner6a56ed42006-04-14 22:20:07 +00001372 }
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001373
Robert Bocchinof9993442006-01-17 20:05:59 +00001374 /// Transparently provide more efficient getOperand methods.
Gabor Greifefe65362008-05-10 08:32:32 +00001375 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Robert Bocchinof9993442006-01-17 20:05:59 +00001376
1377 // Methods for support type inquiry through isa, cast, and dyn_cast:
1378 static inline bool classof(const InsertElementInst *) { return true; }
1379 static inline bool classof(const Instruction *I) {
1380 return I->getOpcode() == Instruction::InsertElement;
1381 }
1382 static inline bool classof(const Value *V) {
1383 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1384 }
1385};
1386
Gabor Greifefe65362008-05-10 08:32:32 +00001387template <>
1388struct OperandTraits<InsertElementInst> : FixedNumOperandTraits<3> {
1389};
1390
1391DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertElementInst, Value)
1392
Robert Bocchinof9993442006-01-17 20:05:59 +00001393//===----------------------------------------------------------------------===//
Chris Lattner9fc18d22006-04-08 01:15:18 +00001394// ShuffleVectorInst Class
1395//===----------------------------------------------------------------------===//
1396
1397/// ShuffleVectorInst - This instruction constructs a fixed permutation of two
1398/// input vectors.
1399///
1400class ShuffleVectorInst : public Instruction {
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001401 ShuffleVectorInst(const ShuffleVectorInst &IE);
Chris Lattner9fc18d22006-04-08 01:15:18 +00001402public:
Gabor Greif051a9502008-04-06 20:25:17 +00001403 // allocate space for exactly three operands
1404 void *operator new(size_t s) {
1405 return User::operator new(s, 3);
1406 }
Chris Lattner9fc18d22006-04-08 01:15:18 +00001407 ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
1408 const std::string &Name = "", Instruction *InsertBefor = 0);
1409 ShuffleVectorInst(Value *V1, Value *V2, Value *Mask,
1410 const std::string &Name, BasicBlock *InsertAtEnd);
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001411
Chris Lattnerfa495842006-04-08 04:04:54 +00001412 /// isValidOperands - Return true if a shufflevector instruction can be
Chris Lattner9fc18d22006-04-08 01:15:18 +00001413 /// formed with the specified operands.
1414 static bool isValidOperands(const Value *V1, const Value *V2,
1415 const Value *Mask);
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001416
Chris Lattner9fc18d22006-04-08 01:15:18 +00001417 virtual ShuffleVectorInst *clone() const;
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001418
Reid Spencerac9dcb92007-02-15 03:39:18 +00001419 /// getType - Overload to return most specific vector type.
Chris Lattner6a56ed42006-04-14 22:20:07 +00001420 ///
Devang Patel4d4a5e02008-02-23 01:11:02 +00001421 const VectorType *getType() const {
Reid Spencer9d6565a2007-02-15 02:26:10 +00001422 return reinterpret_cast<const VectorType*>(Instruction::getType());
Chris Lattner6a56ed42006-04-14 22:20:07 +00001423 }
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001424
Chris Lattner9fc18d22006-04-08 01:15:18 +00001425 /// Transparently provide more efficient getOperand methods.
Gabor Greifefe65362008-05-10 08:32:32 +00001426 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Chris Lattner8728f192008-03-02 05:28:33 +00001427
1428 /// getMaskValue - Return the index from the shuffle mask for the specified
1429 /// output result. This is either -1 if the element is undef or a number less
1430 /// than 2*numelements.
1431 int getMaskValue(unsigned i) const;
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001432
Chris Lattner9fc18d22006-04-08 01:15:18 +00001433 // Methods for support type inquiry through isa, cast, and dyn_cast:
1434 static inline bool classof(const ShuffleVectorInst *) { return true; }
1435 static inline bool classof(const Instruction *I) {
1436 return I->getOpcode() == Instruction::ShuffleVector;
1437 }
1438 static inline bool classof(const Value *V) {
1439 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1440 }
1441};
1442
Gabor Greifefe65362008-05-10 08:32:32 +00001443template <>
1444struct OperandTraits<ShuffleVectorInst> : FixedNumOperandTraits<3> {
1445};
1446
1447DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ShuffleVectorInst, Value)
Chris Lattner9fc18d22006-04-08 01:15:18 +00001448
1449//===----------------------------------------------------------------------===//
Dan Gohman041e2eb2008-05-15 19:50:34 +00001450// ExtractValueInst Class
1451//===----------------------------------------------------------------------===//
1452
Dan Gohmane2d896f2008-05-15 23:35:32 +00001453/// ExtractValueInst - This instruction extracts a struct member or array
1454/// element value from an aggregate value.
Dan Gohman041e2eb2008-05-15 19:50:34 +00001455///
1456class ExtractValueInst : public Instruction {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001457 SmallVector<unsigned, 4> Indices;
1458
Dan Gohman041e2eb2008-05-15 19:50:34 +00001459 ExtractValueInst(const ExtractValueInst &EVI);
Matthijs Kooijmancfd5b7d2008-06-05 07:26:15 +00001460 void init(Value *Agg, const unsigned *Idx, unsigned NumIdx,
1461 const std::string &Name);
Matthijs Kooijman444099f62008-06-04 14:40:55 +00001462 void init(Value *Agg, unsigned Idx, const std::string &Name);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001463
1464 template<typename InputIterator>
1465 void init(Value *Agg, InputIterator IdxBegin, InputIterator IdxEnd,
1466 const std::string &Name,
1467 // This argument ensures that we have an iterator we can
1468 // do arithmetic on in constant time
1469 std::random_access_iterator_tag) {
1470 unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
1471
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001472 // There's no fundamental reason why we require at least one index
1473 // (other than weirdness with &*IdxBegin being invalid; see
1474 // getelementptr's init routine for example). But there's no
1475 // present need to support it.
1476 assert(NumIdx > 0 && "ExtractValueInst must have at least one index");
1477
1478 // This requires that the iterator points to contiguous memory.
Matthijs Kooijman444099f62008-06-04 14:40:55 +00001479 init(Agg, &*IdxBegin, NumIdx, Name); // FIXME: for the general case
1480 // we have to build an array here
Dan Gohman041e2eb2008-05-15 19:50:34 +00001481 }
1482
1483 /// getIndexedType - Returns the type of the element that would be extracted
1484 /// with an extractvalue instruction with the specified parameters.
1485 ///
Dan Gohmane2d896f2008-05-15 23:35:32 +00001486 /// Null is returned if the indices are invalid for the specified
Dan Gohman041e2eb2008-05-15 19:50:34 +00001487 /// pointer type.
1488 ///
1489 static const Type *getIndexedType(const Type *Agg,
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001490 const unsigned *Idx, unsigned NumIdx);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001491
1492 template<typename InputIterator>
1493 static const Type *getIndexedType(const Type *Ptr,
1494 InputIterator IdxBegin,
1495 InputIterator IdxEnd,
1496 // This argument ensures that we
1497 // have an iterator we can do
1498 // arithmetic on in constant time
1499 std::random_access_iterator_tag) {
1500 unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
1501
1502 if (NumIdx > 0)
1503 // This requires that the iterator points to contiguous memory.
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001504 return getIndexedType(Ptr, (const unsigned *)&*IdxBegin, NumIdx);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001505 else
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001506 return getIndexedType(Ptr, (const unsigned *)0, NumIdx);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001507 }
1508
Dan Gohmane2d896f2008-05-15 23:35:32 +00001509 /// Constructors - Create a extractvalue instruction with a base aggregate
1510 /// value and a list of indices. The first ctor can optionally insert before
1511 /// an existing instruction, the second appends the new instruction to the
1512 /// specified BasicBlock.
Dan Gohman041e2eb2008-05-15 19:50:34 +00001513 template<typename InputIterator>
1514 inline ExtractValueInst(Value *Agg, InputIterator IdxBegin,
1515 InputIterator IdxEnd,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001516 const std::string &Name,
1517 Instruction *InsertBefore);
1518 template<typename InputIterator>
1519 inline ExtractValueInst(Value *Agg,
1520 InputIterator IdxBegin, InputIterator IdxEnd,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001521 const std::string &Name, BasicBlock *InsertAtEnd);
1522
1523 /// Constructors - These two constructors are convenience methods because one
1524 /// and two index extractvalue instructions are so common.
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001525 ExtractValueInst(Value *Agg, unsigned Idx, const std::string &Name = "",
Dan Gohman041e2eb2008-05-15 19:50:34 +00001526 Instruction *InsertBefore = 0);
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001527 ExtractValueInst(Value *Agg, unsigned Idx,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001528 const std::string &Name, BasicBlock *InsertAtEnd);
1529public:
Dan Gohman8e640412008-05-31 19:09:47 +00001530 // allocate space for exactly one operand
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001531 void *operator new(size_t s) {
1532 return User::operator new(s, 1);
1533 }
1534
Dan Gohman041e2eb2008-05-15 19:50:34 +00001535 template<typename InputIterator>
1536 static ExtractValueInst *Create(Value *Agg, InputIterator IdxBegin,
1537 InputIterator IdxEnd,
1538 const std::string &Name = "",
1539 Instruction *InsertBefore = 0) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001540 return new
1541 ExtractValueInst(Agg, IdxBegin, IdxEnd, Name, InsertBefore);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001542 }
1543 template<typename InputIterator>
1544 static ExtractValueInst *Create(Value *Agg,
1545 InputIterator IdxBegin, InputIterator IdxEnd,
1546 const std::string &Name,
1547 BasicBlock *InsertAtEnd) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001548 return new ExtractValueInst(Agg, IdxBegin, IdxEnd, Name, InsertAtEnd);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001549 }
1550
1551 /// Constructors - These two creators are convenience methods because one
1552 /// index extractvalue instructions are much more common than those with
1553 /// more than one.
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001554 static ExtractValueInst *Create(Value *Agg, unsigned Idx,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001555 const std::string &Name = "",
1556 Instruction *InsertBefore = 0) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001557 return new ExtractValueInst(Agg, Idx, Name, InsertBefore);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001558 }
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001559 static ExtractValueInst *Create(Value *Agg, unsigned Idx,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001560 const std::string &Name,
1561 BasicBlock *InsertAtEnd) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001562 return new ExtractValueInst(Agg, Idx, Name, InsertAtEnd);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001563 }
1564
1565 virtual ExtractValueInst *clone() const;
1566
1567 /// Transparently provide more efficient getOperand methods.
1568 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
1569
1570 // getType - Overload to return most specific pointer type...
1571 const PointerType *getType() const {
1572 return reinterpret_cast<const PointerType*>(Instruction::getType());
1573 }
1574
1575 /// getIndexedType - Returns the type of the element that would be extracted
1576 /// with an extractvalue instruction with the specified parameters.
1577 ///
Dan Gohmane2d896f2008-05-15 23:35:32 +00001578 /// Null is returned if the indices are invalid for the specified
Dan Gohman041e2eb2008-05-15 19:50:34 +00001579 /// pointer type.
1580 ///
1581 template<typename InputIterator>
1582 static const Type *getIndexedType(const Type *Ptr,
1583 InputIterator IdxBegin,
1584 InputIterator IdxEnd) {
1585 return getIndexedType(Ptr, IdxBegin, IdxEnd,
1586 typename std::iterator_traits<InputIterator>::
1587 iterator_category());
1588 }
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001589 static const Type *getIndexedType(const Type *Ptr, unsigned Idx);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001590
Dan Gohman35651cd2008-05-31 19:09:08 +00001591 inline const unsigned *idx_begin() const { return Indices.begin(); }
1592 inline const unsigned *idx_end() const { return Indices.end(); }
Dan Gohman041e2eb2008-05-15 19:50:34 +00001593
1594 Value *getAggregateOperand() {
1595 return getOperand(0);
1596 }
1597 const Value *getAggregateOperand() const {
1598 return getOperand(0);
1599 }
1600 static unsigned getAggregateOperandIndex() {
1601 return 0U; // get index for modifying correct operand
1602 }
1603
1604 unsigned getNumIndices() const { // Note: always non-negative
Bill Wendling67944fc2008-06-05 07:35:27 +00001605 return (unsigned)Indices.size();
Dan Gohman041e2eb2008-05-15 19:50:34 +00001606 }
1607
1608 bool hasIndices() const {
Dan Gohman35651cd2008-05-31 19:09:08 +00001609 return true;
Dan Gohman041e2eb2008-05-15 19:50:34 +00001610 }
1611
1612 // Methods for support type inquiry through isa, cast, and dyn_cast:
1613 static inline bool classof(const ExtractValueInst *) { return true; }
1614 static inline bool classof(const Instruction *I) {
1615 return I->getOpcode() == Instruction::ExtractValue;
1616 }
1617 static inline bool classof(const Value *V) {
1618 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1619 }
1620};
1621
1622template <>
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001623struct OperandTraits<ExtractValueInst> : FixedNumOperandTraits<1> {
Dan Gohman041e2eb2008-05-15 19:50:34 +00001624};
1625
Dan Gohmane4569942008-05-23 00:36:11 +00001626template<typename InputIterator>
1627ExtractValueInst::ExtractValueInst(Value *Agg,
1628 InputIterator IdxBegin,
1629 InputIterator IdxEnd,
Dan Gohmane4569942008-05-23 00:36:11 +00001630 const std::string &Name,
1631 Instruction *InsertBefore)
1632 : Instruction(checkType(getIndexedType(Agg->getType(), IdxBegin, IdxEnd)),
1633 ExtractValue,
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001634 OperandTraits<ExtractValueInst>::op_begin(this),
1635 1, InsertBefore) {
Dan Gohmane4569942008-05-23 00:36:11 +00001636 init(Agg, IdxBegin, IdxEnd, Name,
1637 typename std::iterator_traits<InputIterator>::iterator_category());
1638}
1639template<typename InputIterator>
1640ExtractValueInst::ExtractValueInst(Value *Agg,
1641 InputIterator IdxBegin,
1642 InputIterator IdxEnd,
Dan Gohmane4569942008-05-23 00:36:11 +00001643 const std::string &Name,
1644 BasicBlock *InsertAtEnd)
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001645 : Instruction(checkType(getIndexedType(Agg->getType(), IdxBegin, IdxEnd)),
Dan Gohmane4569942008-05-23 00:36:11 +00001646 ExtractValue,
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001647 OperandTraits<ExtractValueInst>::op_begin(this),
1648 1, InsertAtEnd) {
Dan Gohmane4569942008-05-23 00:36:11 +00001649 init(Agg, IdxBegin, IdxEnd, Name,
1650 typename std::iterator_traits<InputIterator>::iterator_category());
1651}
1652
Dan Gohman041e2eb2008-05-15 19:50:34 +00001653DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractValueInst, Value)
1654
Dan Gohmane4569942008-05-23 00:36:11 +00001655
Dan Gohman041e2eb2008-05-15 19:50:34 +00001656//===----------------------------------------------------------------------===//
1657// InsertValueInst Class
1658//===----------------------------------------------------------------------===//
1659
Dan Gohmane2d896f2008-05-15 23:35:32 +00001660/// InsertValueInst - This instruction inserts a struct field of array element
1661/// value into an aggregate value.
Dan Gohman041e2eb2008-05-15 19:50:34 +00001662///
1663class InsertValueInst : public Instruction {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001664 SmallVector<unsigned, 4> Indices;
1665
1666 void *operator new(size_t, unsigned); // Do not implement
Dan Gohman041e2eb2008-05-15 19:50:34 +00001667 InsertValueInst(const InsertValueInst &IVI);
Matthijs Kooijmancfd5b7d2008-06-05 07:26:15 +00001668 void init(Value *Agg, Value *Val, const unsigned *Idx, unsigned NumIdx,
1669 const std::string &Name);
Matthijs Kooijman444099f62008-06-04 14:40:55 +00001670 void init(Value *Agg, Value *Val, unsigned Idx, const std::string &Name);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001671
1672 template<typename InputIterator>
1673 void init(Value *Agg, Value *Val,
1674 InputIterator IdxBegin, InputIterator IdxEnd,
1675 const std::string &Name,
1676 // This argument ensures that we have an iterator we can
1677 // do arithmetic on in constant time
1678 std::random_access_iterator_tag) {
1679 unsigned NumIdx = static_cast<unsigned>(std::distance(IdxBegin, IdxEnd));
1680
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001681 // There's no fundamental reason why we require at least one index
1682 // (other than weirdness with &*IdxBegin being invalid; see
1683 // getelementptr's init routine for example). But there's no
1684 // present need to support it.
1685 assert(NumIdx > 0 && "InsertValueInst must have at least one index");
1686
1687 // This requires that the iterator points to contiguous memory.
Matthijs Kooijman444099f62008-06-04 14:40:55 +00001688 init(Agg, Val, &*IdxBegin, NumIdx, Name); // FIXME: for the general case
1689 // we have to build an array here
Dan Gohman041e2eb2008-05-15 19:50:34 +00001690 }
1691
Dan Gohmane2d896f2008-05-15 23:35:32 +00001692 /// Constructors - Create a insertvalue instruction with a base aggregate
1693 /// value, a value to insert, and a list of indices. The first ctor can
1694 /// optionally insert before an existing instruction, the second appends
1695 /// the new instruction to the specified BasicBlock.
Dan Gohman041e2eb2008-05-15 19:50:34 +00001696 template<typename InputIterator>
1697 inline InsertValueInst(Value *Agg, Value *Val, InputIterator IdxBegin,
Dan Gohmane2d896f2008-05-15 23:35:32 +00001698 InputIterator IdxEnd,
Dan Gohmane2d896f2008-05-15 23:35:32 +00001699 const std::string &Name,
1700 Instruction *InsertBefore);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001701 template<typename InputIterator>
1702 inline InsertValueInst(Value *Agg, Value *Val,
Dan Gohmane2d896f2008-05-15 23:35:32 +00001703 InputIterator IdxBegin, InputIterator IdxEnd,
Dan Gohmane2d896f2008-05-15 23:35:32 +00001704 const std::string &Name, BasicBlock *InsertAtEnd);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001705
1706 /// Constructors - These two constructors are convenience methods because one
1707 /// and two index insertvalue instructions are so common.
1708 InsertValueInst(Value *Agg, Value *Val,
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001709 unsigned Idx, const std::string &Name = "",
Dan Gohman041e2eb2008-05-15 19:50:34 +00001710 Instruction *InsertBefore = 0);
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001711 InsertValueInst(Value *Agg, Value *Val, unsigned Idx,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001712 const std::string &Name, BasicBlock *InsertAtEnd);
1713public:
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001714 // allocate space for exactly two operands
1715 void *operator new(size_t s) {
1716 return User::operator new(s, 2);
1717 }
1718
Dan Gohman041e2eb2008-05-15 19:50:34 +00001719 template<typename InputIterator>
Matthijs Kooijmancfd5b7d2008-06-05 07:26:15 +00001720 static InsertValueInst *Create(Value *Agg, Value *Val, InputIterator IdxBegin,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001721 InputIterator IdxEnd,
1722 const std::string &Name = "",
1723 Instruction *InsertBefore = 0) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001724 return new InsertValueInst(Agg, Val, IdxBegin, IdxEnd,
1725 Name, InsertBefore);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001726 }
1727 template<typename InputIterator>
1728 static InsertValueInst *Create(Value *Agg, Value *Val,
1729 InputIterator IdxBegin, InputIterator IdxEnd,
1730 const std::string &Name,
1731 BasicBlock *InsertAtEnd) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001732 return new InsertValueInst(Agg, Val, IdxBegin, IdxEnd,
1733 Name, InsertAtEnd);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001734 }
1735
1736 /// Constructors - These two creators are convenience methods because one
1737 /// index insertvalue instructions are much more common than those with
1738 /// more than one.
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001739 static InsertValueInst *Create(Value *Agg, Value *Val, unsigned Idx,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001740 const std::string &Name = "",
1741 Instruction *InsertBefore = 0) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001742 return new InsertValueInst(Agg, Val, Idx, Name, InsertBefore);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001743 }
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001744 static InsertValueInst *Create(Value *Agg, Value *Val, unsigned Idx,
Dan Gohman041e2eb2008-05-15 19:50:34 +00001745 const std::string &Name,
1746 BasicBlock *InsertAtEnd) {
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001747 return new InsertValueInst(Agg, Val, Idx, Name, InsertAtEnd);
Dan Gohman041e2eb2008-05-15 19:50:34 +00001748 }
1749
1750 virtual InsertValueInst *clone() const;
1751
1752 /// Transparently provide more efficient getOperand methods.
1753 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
1754
1755 // getType - Overload to return most specific pointer type...
1756 const PointerType *getType() const {
1757 return reinterpret_cast<const PointerType*>(Instruction::getType());
1758 }
1759
Dan Gohman35651cd2008-05-31 19:09:08 +00001760 inline const unsigned *idx_begin() const { return Indices.begin(); }
1761 inline const unsigned *idx_end() const { return Indices.end(); }
Dan Gohman041e2eb2008-05-15 19:50:34 +00001762
1763 Value *getAggregateOperand() {
1764 return getOperand(0);
1765 }
1766 const Value *getAggregateOperand() const {
1767 return getOperand(0);
1768 }
1769 static unsigned getAggregateOperandIndex() {
1770 return 0U; // get index for modifying correct operand
1771 }
1772
1773 Value *getInsertedValueOperand() {
1774 return getOperand(1);
1775 }
1776 const Value *getInsertedValueOperand() const {
1777 return getOperand(1);
1778 }
1779 static unsigned getInsertedValueOperandIndex() {
1780 return 1U; // get index for modifying correct operand
1781 }
1782
1783 unsigned getNumIndices() const { // Note: always non-negative
Bill Wendling67944fc2008-06-05 07:35:27 +00001784 return (unsigned)Indices.size();
Dan Gohman041e2eb2008-05-15 19:50:34 +00001785 }
1786
1787 bool hasIndices() const {
Dan Gohman35651cd2008-05-31 19:09:08 +00001788 return true;
Dan Gohman041e2eb2008-05-15 19:50:34 +00001789 }
1790
1791 // Methods for support type inquiry through isa, cast, and dyn_cast:
1792 static inline bool classof(const InsertValueInst *) { return true; }
1793 static inline bool classof(const Instruction *I) {
1794 return I->getOpcode() == Instruction::InsertValue;
1795 }
1796 static inline bool classof(const Value *V) {
1797 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1798 }
1799};
1800
1801template <>
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001802struct OperandTraits<InsertValueInst> : FixedNumOperandTraits<2> {
Dan Gohman041e2eb2008-05-15 19:50:34 +00001803};
1804
Dan Gohmane4569942008-05-23 00:36:11 +00001805template<typename InputIterator>
1806InsertValueInst::InsertValueInst(Value *Agg,
1807 Value *Val,
1808 InputIterator IdxBegin,
1809 InputIterator IdxEnd,
Dan Gohmane4569942008-05-23 00:36:11 +00001810 const std::string &Name,
1811 Instruction *InsertBefore)
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001812 : Instruction(Agg->getType(), InsertValue,
1813 OperandTraits<InsertValueInst>::op_begin(this),
1814 2, InsertBefore) {
Dan Gohmane4569942008-05-23 00:36:11 +00001815 init(Agg, Val, IdxBegin, IdxEnd, Name,
1816 typename std::iterator_traits<InputIterator>::iterator_category());
1817}
1818template<typename InputIterator>
1819InsertValueInst::InsertValueInst(Value *Agg,
1820 Value *Val,
1821 InputIterator IdxBegin,
1822 InputIterator IdxEnd,
Dan Gohmane4569942008-05-23 00:36:11 +00001823 const std::string &Name,
1824 BasicBlock *InsertAtEnd)
Dan Gohman81a0c0b2008-05-31 00:58:22 +00001825 : Instruction(Agg->getType(), InsertValue,
1826 OperandTraits<InsertValueInst>::op_begin(this),
1827 2, InsertAtEnd) {
Dan Gohmane4569942008-05-23 00:36:11 +00001828 init(Agg, Val, IdxBegin, IdxEnd, Name,
1829 typename std::iterator_traits<InputIterator>::iterator_category());
1830}
1831
Dan Gohman041e2eb2008-05-15 19:50:34 +00001832DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value)
1833
1834//===----------------------------------------------------------------------===//
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001835// PHINode Class
1836//===----------------------------------------------------------------------===//
1837
1838// PHINode - The PHINode class is used to represent the magical mystical PHI
1839// node, that can not exist in nature, but can be synthesized in a computer
1840// scientist's overactive imagination.
1841//
1842class PHINode : public Instruction {
Gabor Greif051a9502008-04-06 20:25:17 +00001843 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Chris Lattner454928e2005-01-29 00:31:36 +00001844 /// ReservedSpace - The number of operands actually allocated. NumOperands is
1845 /// the number actually in use.
1846 unsigned ReservedSpace;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001847 PHINode(const PHINode &PN);
Gabor Greif051a9502008-04-06 20:25:17 +00001848 // allocate space for exactly zero operands
1849 void *operator new(size_t s) {
1850 return User::operator new(s, 0);
1851 }
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001852 explicit PHINode(const Type *Ty, const std::string &Name = "",
1853 Instruction *InsertBefore = 0)
Chris Lattner910c80a2007-02-24 00:55:48 +00001854 : Instruction(Ty, Instruction::PHI, 0, 0, InsertBefore),
Chris Lattner454928e2005-01-29 00:31:36 +00001855 ReservedSpace(0) {
Chris Lattner910c80a2007-02-24 00:55:48 +00001856 setName(Name);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001857 }
1858
1859 PHINode(const Type *Ty, const std::string &Name, BasicBlock *InsertAtEnd)
Chris Lattner910c80a2007-02-24 00:55:48 +00001860 : Instruction(Ty, Instruction::PHI, 0, 0, InsertAtEnd),
Chris Lattner454928e2005-01-29 00:31:36 +00001861 ReservedSpace(0) {
Chris Lattner910c80a2007-02-24 00:55:48 +00001862 setName(Name);
Chris Lattner454928e2005-01-29 00:31:36 +00001863 }
Gabor Greif051a9502008-04-06 20:25:17 +00001864public:
1865 static PHINode *Create(const Type *Ty, const std::string &Name = "",
1866 Instruction *InsertBefore = 0) {
1867 return new PHINode(Ty, Name, InsertBefore);
1868 }
Evan Chengd69bb1a2008-05-05 17:41:03 +00001869 static PHINode *Create(const Type *Ty, const std::string &Name,
1870 BasicBlock *InsertAtEnd) {
Gabor Greif051a9502008-04-06 20:25:17 +00001871 return new PHINode(Ty, Name, InsertAtEnd);
1872 }
Gordon Henriksenafba8fe2007-12-10 02:14:30 +00001873 ~PHINode();
1874
Chris Lattner454928e2005-01-29 00:31:36 +00001875 /// reserveOperandSpace - This method can be used to avoid repeated
1876 /// reallocation of PHI operand lists by reserving space for the correct
1877 /// number of operands before adding them. Unlike normal vector reserves,
1878 /// this method can also be used to trim the operand space.
1879 void reserveOperandSpace(unsigned NumValues) {
1880 resizeOperands(NumValues*2);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001881 }
1882
Chris Lattnerf319e832004-10-15 23:52:05 +00001883 virtual PHINode *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001884
Gabor Greifefe65362008-05-10 08:32:32 +00001885 /// Provide fast operand accessors
1886 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
1887
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001888 /// getNumIncomingValues - Return the number of incoming edges
1889 ///
Chris Lattner454928e2005-01-29 00:31:36 +00001890 unsigned getNumIncomingValues() const { return getNumOperands()/2; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001891
Reid Spencerc773de62006-05-19 19:07:54 +00001892 /// getIncomingValue - Return incoming value number x
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001893 ///
1894 Value *getIncomingValue(unsigned i) const {
Chris Lattner454928e2005-01-29 00:31:36 +00001895 assert(i*2 < getNumOperands() && "Invalid value number!");
1896 return getOperand(i*2);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001897 }
1898 void setIncomingValue(unsigned i, Value *V) {
Chris Lattner454928e2005-01-29 00:31:36 +00001899 assert(i*2 < getNumOperands() && "Invalid value number!");
1900 setOperand(i*2, V);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001901 }
Chris Lattner454928e2005-01-29 00:31:36 +00001902 unsigned getOperandNumForIncomingValue(unsigned i) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001903 return i*2;
1904 }
1905
Reid Spencerc773de62006-05-19 19:07:54 +00001906 /// getIncomingBlock - Return incoming basic block number x
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001907 ///
Misha Brukman9769ab22005-04-21 20:19:05 +00001908 BasicBlock *getIncomingBlock(unsigned i) const {
Gabor Greifefe65362008-05-10 08:32:32 +00001909 return static_cast<BasicBlock*>(getOperand(i*2+1));
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001910 }
1911 void setIncomingBlock(unsigned i, BasicBlock *BB) {
Gabor Greifefe65362008-05-10 08:32:32 +00001912 setOperand(i*2+1, BB);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001913 }
1914 unsigned getOperandNumForIncomingBlock(unsigned i) {
1915 return i*2+1;
1916 }
1917
1918 /// addIncoming - Add an incoming value to the end of the PHI list
1919 ///
1920 void addIncoming(Value *V, BasicBlock *BB) {
Anton Korobeynikov351b0d42008-02-27 22:37:28 +00001921 assert(V && "PHI node got a null value!");
1922 assert(BB && "PHI node got a null basic block!");
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001923 assert(getType() == V->getType() &&
1924 "All operands to PHI node must be the same type as the PHI node!");
Chris Lattner454928e2005-01-29 00:31:36 +00001925 unsigned OpNo = NumOperands;
1926 if (OpNo+2 > ReservedSpace)
1927 resizeOperands(0); // Get more space!
1928 // Initialize some new operands.
1929 NumOperands = OpNo+2;
Gabor Greif6c80c382008-05-26 21:33:52 +00001930 OperandList[OpNo] = V;
1931 OperandList[OpNo+1] = BB;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001932 }
Misha Brukman9769ab22005-04-21 20:19:05 +00001933
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001934 /// removeIncomingValue - Remove an incoming value. This is useful if a
1935 /// predecessor basic block is deleted. The value removed is returned.
1936 ///
1937 /// If the last incoming value for a PHI node is removed (and DeletePHIIfEmpty
1938 /// is true), the PHI node is destroyed and any uses of it are replaced with
1939 /// dummy values. The only time there should be zero incoming values to a PHI
1940 /// node is when the block is dead, so this strategy is sound.
1941 ///
1942 Value *removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty = true);
1943
Gabor Greifefe65362008-05-10 08:32:32 +00001944 Value *removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty=true) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001945 int Idx = getBasicBlockIndex(BB);
1946 assert(Idx >= 0 && "Invalid basic block argument to remove!");
1947 return removeIncomingValue(Idx, DeletePHIIfEmpty);
1948 }
1949
Misha Brukman9769ab22005-04-21 20:19:05 +00001950 /// getBasicBlockIndex - Return the first index of the specified basic
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001951 /// block in the value list for this PHI. Returns -1 if no instance.
1952 ///
1953 int getBasicBlockIndex(const BasicBlock *BB) const {
Chris Lattner454928e2005-01-29 00:31:36 +00001954 Use *OL = OperandList;
Misha Brukman9769ab22005-04-21 20:19:05 +00001955 for (unsigned i = 0, e = getNumOperands(); i != e; i += 2)
Gabor Greifefe65362008-05-10 08:32:32 +00001956 if (OL[i+1].get() == BB) return i/2;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001957 return -1;
1958 }
1959
1960 Value *getIncomingValueForBlock(const BasicBlock *BB) const {
1961 return getIncomingValue(getBasicBlockIndex(BB));
1962 }
1963
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001964 /// hasConstantValue - If the specified PHI node always merges together the
Nate Begemana83ba0f2005-08-04 23:24:19 +00001965 /// same value, return the value, otherwise return null.
1966 ///
Chris Lattner9acbd612005-08-05 00:49:06 +00001967 Value *hasConstantValue(bool AllowNonDominatingInstruction = false) const;
Chris Lattnerf56a8db2006-10-03 17:09:12 +00001968
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001969 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1970 static inline bool classof(const PHINode *) { return true; }
1971 static inline bool classof(const Instruction *I) {
Misha Brukman9769ab22005-04-21 20:19:05 +00001972 return I->getOpcode() == Instruction::PHI;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001973 }
1974 static inline bool classof(const Value *V) {
1975 return isa<Instruction>(V) && classof(cast<Instruction>(V));
1976 }
Chris Lattner454928e2005-01-29 00:31:36 +00001977 private:
1978 void resizeOperands(unsigned NumOperands);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001979};
1980
Gabor Greifefe65362008-05-10 08:32:32 +00001981template <>
1982struct OperandTraits<PHINode> : HungoffOperandTraits<2> {
1983};
1984
1985DEFINE_TRANSPARENT_OPERAND_ACCESSORS(PHINode, Value)
1986
1987
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001988//===----------------------------------------------------------------------===//
1989// ReturnInst Class
1990//===----------------------------------------------------------------------===//
1991
1992//===---------------------------------------------------------------------------
1993/// ReturnInst - Return a value (possibly void), from a function. Execution
1994/// does not continue in this function any longer.
1995///
1996class ReturnInst : public TerminatorInst {
Chris Lattner910c80a2007-02-24 00:55:48 +00001997 ReturnInst(const ReturnInst &RI);
Devang Patelfea98302008-02-26 19:15:26 +00001998 void init(Value * const* retVals, unsigned N);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00001999
Gabor Greif051a9502008-04-06 20:25:17 +00002000private:
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002001 // ReturnInst constructors:
2002 // ReturnInst() - 'ret void' instruction
Alkis Evlogimenos859804f2004-11-17 21:02:25 +00002003 // ReturnInst( null) - 'ret void' instruction
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002004 // ReturnInst(Value* X) - 'ret X' instruction
Gabor Greifefe65362008-05-10 08:32:32 +00002005 // ReturnInst( null, Inst *I) - 'ret void' instruction, insert before I
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002006 // ReturnInst(Value* X, Inst *I) - 'ret X' instruction, insert before I
Gabor Greifefe65362008-05-10 08:32:32 +00002007 // ReturnInst( null, BB *B) - 'ret void' instruction, insert @ end of B
2008 // ReturnInst(Value* X, BB *B) - 'ret X' instruction, insert @ end of B
Devang Patele6be34a2008-02-27 01:20:54 +00002009 // ReturnInst(Value* X, N) - 'ret X,X+1...X+N-1' instruction
Gabor Greifefe65362008-05-10 08:32:32 +00002010 // ReturnInst(Value* X, N, Inst *I) - 'ret X,X+1...X+N-1', insert before I
2011 // ReturnInst(Value* X, N, BB *B) - 'ret X,X+1...X+N-1', insert @ end of B
Alkis Evlogimenos859804f2004-11-17 21:02:25 +00002012 //
2013 // NOTE: If the Value* passed is of type void then the constructor behaves as
2014 // if it was passed NULL.
Chris Lattner910c80a2007-02-24 00:55:48 +00002015 explicit ReturnInst(Value *retVal = 0, Instruction *InsertBefore = 0);
2016 ReturnInst(Value *retVal, BasicBlock *InsertAtEnd);
Gabor Greifefe65362008-05-10 08:32:32 +00002017 ReturnInst(Value * const* retVals, unsigned N, Instruction *InsertBefore = 0);
Devang Patelf4511cd2008-02-26 19:38:17 +00002018 ReturnInst(Value * const* retVals, unsigned N, BasicBlock *InsertAtEnd);
Chris Lattner910c80a2007-02-24 00:55:48 +00002019 explicit ReturnInst(BasicBlock *InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00002020public:
2021 static ReturnInst* Create(Value *retVal = 0, Instruction *InsertBefore = 0) {
2022 return new(!!retVal) ReturnInst(retVal, InsertBefore);
2023 }
2024 static ReturnInst* Create(Value *retVal, BasicBlock *InsertAtEnd) {
2025 return new(!!retVal) ReturnInst(retVal, InsertAtEnd);
2026 }
Evan Chengd69bb1a2008-05-05 17:41:03 +00002027 static ReturnInst* Create(Value * const* retVals, unsigned N,
Gabor Greifefe65362008-05-10 08:32:32 +00002028 Instruction *InsertBefore = 0) {
Gabor Greif051a9502008-04-06 20:25:17 +00002029 return new(N) ReturnInst(retVals, N, InsertBefore);
2030 }
Evan Chengd69bb1a2008-05-05 17:41:03 +00002031 static ReturnInst* Create(Value * const* retVals, unsigned N,
2032 BasicBlock *InsertAtEnd) {
Gabor Greif051a9502008-04-06 20:25:17 +00002033 return new(N) ReturnInst(retVals, N, InsertAtEnd);
2034 }
2035 static ReturnInst* Create(BasicBlock *InsertAtEnd) {
2036 return new(0) ReturnInst(InsertAtEnd);
2037 }
Devang Patel57ef4f42008-02-23 00:35:18 +00002038 virtual ~ReturnInst();
Gabor Greifefe65362008-05-10 08:32:32 +00002039 inline void operator delete(void*);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002040
Chris Lattnerf319e832004-10-15 23:52:05 +00002041 virtual ReturnInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002042
Gabor Greifefe65362008-05-10 08:32:32 +00002043 /// Provide fast operand accessors
2044 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Devang Patel64d4e612008-02-26 17:56:20 +00002045
Gabor Greifefe65362008-05-10 08:32:32 +00002046 /// Convenience accessor
Devang Patel1eafa062008-03-11 17:35:03 +00002047 Value *getReturnValue(unsigned n = 0) const {
Gabor Greifefe65362008-05-10 08:32:32 +00002048 return n < getNumOperands()
2049 ? getOperand(n)
2050 : 0;
Devang Patel1eafa062008-03-11 17:35:03 +00002051 }
2052
Chris Lattner454928e2005-01-29 00:31:36 +00002053 unsigned getNumSuccessors() const { return 0; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002054
2055 // Methods for support type inquiry through isa, cast, and dyn_cast:
2056 static inline bool classof(const ReturnInst *) { return true; }
2057 static inline bool classof(const Instruction *I) {
2058 return (I->getOpcode() == Instruction::Ret);
2059 }
2060 static inline bool classof(const Value *V) {
2061 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2062 }
Chris Lattner454928e2005-01-29 00:31:36 +00002063 private:
2064 virtual BasicBlock *getSuccessorV(unsigned idx) const;
2065 virtual unsigned getNumSuccessorsV() const;
2066 virtual void setSuccessorV(unsigned idx, BasicBlock *B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002067};
2068
Gabor Greifefe65362008-05-10 08:32:32 +00002069template <>
2070struct OperandTraits<ReturnInst> : VariadicOperandTraits<> {
2071};
2072
2073DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ReturnInst, Value)
2074void ReturnInst::operator delete(void *it) {
2075 ReturnInst* me(static_cast<ReturnInst*>(it));
2076 Use::zap(OperandTraits<ReturnInst>::op_begin(me),
2077 OperandTraits<ReturnInst>::op_end(me),
2078 true);
2079}
2080
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002081//===----------------------------------------------------------------------===//
2082// BranchInst Class
2083//===----------------------------------------------------------------------===//
2084
2085//===---------------------------------------------------------------------------
2086/// BranchInst - Conditional or Unconditional Branch instruction.
2087///
2088class BranchInst : public TerminatorInst {
Chris Lattner454928e2005-01-29 00:31:36 +00002089 /// Ops list - Branches are strange. The operands are ordered:
2090 /// TrueDest, FalseDest, Cond. This makes some accessors faster because
2091 /// they don't have to check for cond/uncond branchness.
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002092 BranchInst(const BranchInst &BI);
Chris Lattner454928e2005-01-29 00:31:36 +00002093 void AssertOK();
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002094 // BranchInst constructors (where {B, T, F} are blocks, and C is a condition):
2095 // BranchInst(BB *B) - 'br B'
2096 // BranchInst(BB* T, BB *F, Value *C) - 'br C, T, F'
2097 // BranchInst(BB* B, Inst *I) - 'br B' insert before I
2098 // BranchInst(BB* T, BB *F, Value *C, Inst *I) - 'br C, T, F', insert before I
2099 // BranchInst(BB* B, BB *I) - 'br B' insert at end
2100 // BranchInst(BB* T, BB *F, Value *C, BB *I) - 'br C, T, F', insert at end
Chris Lattner910c80a2007-02-24 00:55:48 +00002101 explicit BranchInst(BasicBlock *IfTrue, Instruction *InsertBefore = 0);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002102 BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
Chris Lattner910c80a2007-02-24 00:55:48 +00002103 Instruction *InsertBefore = 0);
2104 BranchInst(BasicBlock *IfTrue, BasicBlock *InsertAtEnd);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002105 BranchInst(BasicBlock *IfTrue, BasicBlock *IfFalse, Value *Cond,
Chris Lattner910c80a2007-02-24 00:55:48 +00002106 BasicBlock *InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00002107public:
2108 static BranchInst *Create(BasicBlock *IfTrue, Instruction *InsertBefore = 0) {
2109 return new(1) BranchInst(IfTrue, InsertBefore);
2110 }
Gabor Greifefe65362008-05-10 08:32:32 +00002111 static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse,
2112 Value *Cond, Instruction *InsertBefore = 0) {
Gabor Greif051a9502008-04-06 20:25:17 +00002113 return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertBefore);
2114 }
2115 static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *InsertAtEnd) {
2116 return new(1) BranchInst(IfTrue, InsertAtEnd);
2117 }
Gabor Greifefe65362008-05-10 08:32:32 +00002118 static BranchInst *Create(BasicBlock *IfTrue, BasicBlock *IfFalse,
2119 Value *Cond, BasicBlock *InsertAtEnd) {
Gabor Greif051a9502008-04-06 20:25:17 +00002120 return new(3) BranchInst(IfTrue, IfFalse, Cond, InsertAtEnd);
2121 }
Chris Lattner454928e2005-01-29 00:31:36 +00002122
Bill Wendlingd2a5a2a2008-05-10 10:58:07 +00002123 ~BranchInst() {
Gabor Greifefe65362008-05-10 08:32:32 +00002124 if (NumOperands == 1)
Bill Wendlingc2e73532008-05-10 19:59:59 +00002125 NumOperands = (unsigned)((Use*)this - OperandList);
Gabor Greifefe65362008-05-10 08:32:32 +00002126 }
2127
Chris Lattner454928e2005-01-29 00:31:36 +00002128 /// Transparently provide more efficient getOperand methods.
Gabor Greifefe65362008-05-10 08:32:32 +00002129 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002130
Chris Lattnerf319e832004-10-15 23:52:05 +00002131 virtual BranchInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002132
Devang Patel4d4a5e02008-02-23 01:11:02 +00002133 bool isUnconditional() const { return getNumOperands() == 1; }
2134 bool isConditional() const { return getNumOperands() == 3; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002135
Devang Patel4d4a5e02008-02-23 01:11:02 +00002136 Value *getCondition() const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002137 assert(isConditional() && "Cannot get condition of an uncond branch!");
Chris Lattner454928e2005-01-29 00:31:36 +00002138 return getOperand(2);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002139 }
2140
2141 void setCondition(Value *V) {
2142 assert(isConditional() && "Cannot set condition of unconditional branch!");
2143 setOperand(2, V);
2144 }
2145
2146 // setUnconditionalDest - Change the current branch to an unconditional branch
2147 // targeting the specified block.
Chris Lattner454928e2005-01-29 00:31:36 +00002148 // FIXME: Eliminate this ugly method.
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002149 void setUnconditionalDest(BasicBlock *Dest) {
Gabor Greifefe65362008-05-10 08:32:32 +00002150 Op<0>() = Dest;
Chris Lattner454928e2005-01-29 00:31:36 +00002151 if (isConditional()) { // Convert this to an uncond branch.
Gabor Greifefe65362008-05-10 08:32:32 +00002152 Op<1>().set(0);
2153 Op<2>().set(0);
Chris Lattner454928e2005-01-29 00:31:36 +00002154 NumOperands = 1;
Chris Lattner454928e2005-01-29 00:31:36 +00002155 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002156 }
2157
Chris Lattner454928e2005-01-29 00:31:36 +00002158 unsigned getNumSuccessors() const { return 1+isConditional(); }
2159
2160 BasicBlock *getSuccessor(unsigned i) const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002161 assert(i < getNumSuccessors() && "Successor # out of range for Branch!");
Dan Gohmanb96039e2007-05-11 20:59:29 +00002162 return cast<BasicBlock>(getOperand(i));
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002163 }
2164
Chris Lattner454928e2005-01-29 00:31:36 +00002165 void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002166 assert(idx < getNumSuccessors() && "Successor # out of range for Branch!");
Gabor Greifefe65362008-05-10 08:32:32 +00002167 setOperand(idx, NewSucc);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002168 }
2169
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002170 // Methods for support type inquiry through isa, cast, and dyn_cast:
2171 static inline bool classof(const BranchInst *) { return true; }
2172 static inline bool classof(const Instruction *I) {
2173 return (I->getOpcode() == Instruction::Br);
2174 }
2175 static inline bool classof(const Value *V) {
2176 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2177 }
Chris Lattner454928e2005-01-29 00:31:36 +00002178private:
2179 virtual BasicBlock *getSuccessorV(unsigned idx) const;
2180 virtual unsigned getNumSuccessorsV() const;
2181 virtual void setSuccessorV(unsigned idx, BasicBlock *B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002182};
2183
Gabor Greifefe65362008-05-10 08:32:32 +00002184template <>
2185struct OperandTraits<BranchInst> : HungoffOperandTraits<> {
2186 // we need to access operands via OperandList, since
2187 // the NumOperands may change from 3 to 1
2188 static inline void *allocate(unsigned); // FIXME
2189};
2190
2191DEFINE_TRANSPARENT_OPERAND_ACCESSORS(BranchInst, Value)
2192
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002193//===----------------------------------------------------------------------===//
2194// SwitchInst Class
2195//===----------------------------------------------------------------------===//
2196
2197//===---------------------------------------------------------------------------
2198/// SwitchInst - Multiway switch
2199///
2200class SwitchInst : public TerminatorInst {
Gabor Greifefe65362008-05-10 08:32:32 +00002201 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Chris Lattner454928e2005-01-29 00:31:36 +00002202 unsigned ReservedSpace;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002203 // Operand[0] = Value to switch on
2204 // Operand[1] = Default basic block destination
2205 // Operand[2n ] = Value to match
2206 // Operand[2n+1] = BasicBlock to go to on match
2207 SwitchInst(const SwitchInst &RI);
Chris Lattner454928e2005-01-29 00:31:36 +00002208 void init(Value *Value, BasicBlock *Default, unsigned NumCases);
2209 void resizeOperands(unsigned No);
Gabor Greifefe65362008-05-10 08:32:32 +00002210 // allocate space for exactly zero operands
2211 void *operator new(size_t s) {
2212 return User::operator new(s, 0);
2213 }
Chris Lattner454928e2005-01-29 00:31:36 +00002214 /// SwitchInst ctor - Create a new switch instruction, specifying a value to
2215 /// switch on and a default destination. The number of additional cases can
2216 /// be specified here to make memory allocation more efficient. This
2217 /// constructor can also autoinsert before another instruction.
2218 SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
Chris Lattner910c80a2007-02-24 00:55:48 +00002219 Instruction *InsertBefore = 0);
2220
Chris Lattner454928e2005-01-29 00:31:36 +00002221 /// SwitchInst ctor - Create a new switch instruction, specifying a value to
2222 /// switch on and a default destination. The number of additional cases can
2223 /// be specified here to make memory allocation more efficient. This
2224 /// constructor also autoinserts at the end of the specified BasicBlock.
2225 SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
Chris Lattner910c80a2007-02-24 00:55:48 +00002226 BasicBlock *InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00002227public:
Gabor Greifefe65362008-05-10 08:32:32 +00002228 static SwitchInst *Create(Value *Value, BasicBlock *Default,
2229 unsigned NumCases, Instruction *InsertBefore = 0) {
2230 return new SwitchInst(Value, Default, NumCases, InsertBefore);
Gabor Greif051a9502008-04-06 20:25:17 +00002231 }
Gabor Greifefe65362008-05-10 08:32:32 +00002232 static SwitchInst *Create(Value *Value, BasicBlock *Default,
2233 unsigned NumCases, BasicBlock *InsertAtEnd) {
2234 return new SwitchInst(Value, Default, NumCases, InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00002235 }
Gordon Henriksenafba8fe2007-12-10 02:14:30 +00002236 ~SwitchInst();
Chris Lattner454928e2005-01-29 00:31:36 +00002237
Gabor Greifefe65362008-05-10 08:32:32 +00002238 /// Provide fast operand accessors
2239 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
2240
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002241 // Accessor Methods for Switch stmt
Devang Patel4d4a5e02008-02-23 01:11:02 +00002242 Value *getCondition() const { return getOperand(0); }
Chris Lattner454928e2005-01-29 00:31:36 +00002243 void setCondition(Value *V) { setOperand(0, V); }
Chris Lattnerbfaf88a2004-12-10 20:35:47 +00002244
Devang Patel4d4a5e02008-02-23 01:11:02 +00002245 BasicBlock *getDefaultDest() const {
Chris Lattner454928e2005-01-29 00:31:36 +00002246 return cast<BasicBlock>(getOperand(1));
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002247 }
2248
2249 /// getNumCases - return the number of 'cases' in this switch instruction.
2250 /// Note that case #0 is always the default case.
2251 unsigned getNumCases() const {
Chris Lattner454928e2005-01-29 00:31:36 +00002252 return getNumOperands()/2;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002253 }
2254
2255 /// getCaseValue - Return the specified case value. Note that case #0, the
2256 /// default destination, does not have a case value.
Chris Lattnerd1a32602005-02-24 05:32:09 +00002257 ConstantInt *getCaseValue(unsigned i) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002258 assert(i && i < getNumCases() && "Illegal case value to get!");
2259 return getSuccessorValue(i);
2260 }
2261
2262 /// getCaseValue - Return the specified case value. Note that case #0, the
2263 /// default destination, does not have a case value.
Chris Lattnerd1a32602005-02-24 05:32:09 +00002264 const ConstantInt *getCaseValue(unsigned i) const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002265 assert(i && i < getNumCases() && "Illegal case value to get!");
2266 return getSuccessorValue(i);
2267 }
2268
2269 /// findCaseValue - Search all of the case values for the specified constant.
2270 /// If it is explicitly handled, return the case number of it, otherwise
2271 /// return 0 to indicate that it is handled by the default handler.
Chris Lattnerd1a32602005-02-24 05:32:09 +00002272 unsigned findCaseValue(const ConstantInt *C) const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002273 for (unsigned i = 1, e = getNumCases(); i != e; ++i)
2274 if (getCaseValue(i) == C)
2275 return i;
2276 return 0;
2277 }
2278
Nick Lewycky011f1842006-09-18 19:03:59 +00002279 /// findCaseDest - Finds the unique case value for a given successor. Returns
2280 /// null if the successor is not found, not unique, or is the default case.
2281 ConstantInt *findCaseDest(BasicBlock *BB) {
Nick Lewyckyd7915442006-09-18 20:44:37 +00002282 if (BB == getDefaultDest()) return NULL;
2283
Nick Lewycky011f1842006-09-18 19:03:59 +00002284 ConstantInt *CI = NULL;
2285 for (unsigned i = 1, e = getNumCases(); i != e; ++i) {
2286 if (getSuccessor(i) == BB) {
2287 if (CI) return NULL; // Multiple cases lead to BB.
2288 else CI = getCaseValue(i);
2289 }
2290 }
2291 return CI;
2292 }
2293
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002294 /// addCase - Add an entry to the switch instruction...
2295 ///
Chris Lattnerd1a32602005-02-24 05:32:09 +00002296 void addCase(ConstantInt *OnVal, BasicBlock *Dest);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002297
2298 /// removeCase - This method removes the specified successor from the switch
2299 /// instruction. Note that this cannot be used to remove the default
2300 /// destination (successor #0).
2301 ///
2302 void removeCase(unsigned idx);
2303
Chris Lattner454928e2005-01-29 00:31:36 +00002304 virtual SwitchInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002305
Chris Lattner454928e2005-01-29 00:31:36 +00002306 unsigned getNumSuccessors() const { return getNumOperands()/2; }
2307 BasicBlock *getSuccessor(unsigned idx) const {
2308 assert(idx < getNumSuccessors() &&"Successor idx out of range for switch!");
2309 return cast<BasicBlock>(getOperand(idx*2+1));
2310 }
2311 void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002312 assert(idx < getNumSuccessors() && "Successor # out of range for switch!");
Gabor Greifefe65362008-05-10 08:32:32 +00002313 setOperand(idx*2+1, NewSucc);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002314 }
2315
2316 // getSuccessorValue - Return the value associated with the specified
2317 // successor.
Devang Patel4d4a5e02008-02-23 01:11:02 +00002318 ConstantInt *getSuccessorValue(unsigned idx) const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002319 assert(idx < getNumSuccessors() && "Successor # out of range!");
Reid Spenceredd5d9e2005-05-15 16:13:11 +00002320 return reinterpret_cast<ConstantInt*>(getOperand(idx*2));
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002321 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002322
2323 // Methods for support type inquiry through isa, cast, and dyn_cast:
2324 static inline bool classof(const SwitchInst *) { return true; }
2325 static inline bool classof(const Instruction *I) {
Chris Lattnerd1a32602005-02-24 05:32:09 +00002326 return I->getOpcode() == Instruction::Switch;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002327 }
2328 static inline bool classof(const Value *V) {
2329 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2330 }
Chris Lattner454928e2005-01-29 00:31:36 +00002331private:
2332 virtual BasicBlock *getSuccessorV(unsigned idx) const;
2333 virtual unsigned getNumSuccessorsV() const;
2334 virtual void setSuccessorV(unsigned idx, BasicBlock *B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002335};
2336
Gabor Greifefe65362008-05-10 08:32:32 +00002337template <>
2338struct OperandTraits<SwitchInst> : HungoffOperandTraits<2> {
2339};
2340
2341DEFINE_TRANSPARENT_OPERAND_ACCESSORS(SwitchInst, Value)
2342
2343
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002344//===----------------------------------------------------------------------===//
2345// InvokeInst Class
2346//===----------------------------------------------------------------------===//
2347
Chris Lattner3340ffe2005-05-06 20:26:26 +00002348/// InvokeInst - Invoke instruction. The SubclassData field is used to hold the
2349/// calling convention of the call.
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002350///
2351class InvokeInst : public TerminatorInst {
Chris Lattner58d74912008-03-12 17:45:29 +00002352 PAListPtr ParamAttrs;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002353 InvokeInst(const InvokeInst &BI);
2354 void init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
Chris Lattnerd2dd1502007-02-13 01:04:01 +00002355 Value* const *Args, unsigned NumArgs);
David Greenef1355a52007-08-27 19:04:21 +00002356
2357 template<typename InputIterator>
2358 void init(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
2359 InputIterator ArgBegin, InputIterator ArgEnd,
2360 const std::string &Name,
2361 // This argument ensures that we have an iterator we can
2362 // do arithmetic on in constant time
2363 std::random_access_iterator_tag) {
Chris Lattnera5c0d1e2007-08-29 16:32:50 +00002364 unsigned NumArgs = (unsigned)std::distance(ArgBegin, ArgEnd);
David Greenef1355a52007-08-27 19:04:21 +00002365
Chris Lattnera5c0d1e2007-08-29 16:32:50 +00002366 // This requires that the iterator points to contiguous memory.
2367 init(Func, IfNormal, IfException, NumArgs ? &*ArgBegin : 0, NumArgs);
David Greenef1355a52007-08-27 19:04:21 +00002368 setName(Name);
2369 }
2370
David Greenef1355a52007-08-27 19:04:21 +00002371 /// Construct an InvokeInst given a range of arguments.
2372 /// InputIterator must be a random-access iterator pointing to
2373 /// contiguous storage (e.g. a std::vector<>::iterator). Checks are
2374 /// made for random-accessness but not for contiguous storage as
2375 /// that would incur runtime overhead.
2376 ///
2377 /// @brief Construct an InvokeInst from a range of arguments
2378 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +00002379 inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
2380 InputIterator ArgBegin, InputIterator ArgEnd,
2381 unsigned Values,
2382 const std::string &Name, Instruction *InsertBefore);
David Greenef1355a52007-08-27 19:04:21 +00002383
2384 /// Construct an InvokeInst given a range of arguments.
2385 /// InputIterator must be a random-access iterator pointing to
2386 /// contiguous storage (e.g. a std::vector<>::iterator). Checks are
2387 /// made for random-accessness but not for contiguous storage as
2388 /// that would incur runtime overhead.
2389 ///
2390 /// @brief Construct an InvokeInst from a range of arguments
2391 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +00002392 inline InvokeInst(Value *Func, BasicBlock *IfNormal, BasicBlock *IfException,
2393 InputIterator ArgBegin, InputIterator ArgEnd,
2394 unsigned Values,
2395 const std::string &Name, BasicBlock *InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00002396public:
2397 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +00002398 static InvokeInst *Create(Value *Func,
2399 BasicBlock *IfNormal, BasicBlock *IfException,
Gabor Greif051a9502008-04-06 20:25:17 +00002400 InputIterator ArgBegin, InputIterator ArgEnd,
Evan Chengd69bb1a2008-05-05 17:41:03 +00002401 const std::string &Name = "",
2402 Instruction *InsertBefore = 0) {
Gabor Greifefe65362008-05-10 08:32:32 +00002403 unsigned Values(ArgEnd - ArgBegin + 3);
2404 return new(Values) InvokeInst(Func, IfNormal, IfException, ArgBegin, ArgEnd,
2405 Values, Name, InsertBefore);
Gabor Greif051a9502008-04-06 20:25:17 +00002406 }
2407 template<typename InputIterator>
Gabor Greifefe65362008-05-10 08:32:32 +00002408 static InvokeInst *Create(Value *Func,
2409 BasicBlock *IfNormal, BasicBlock *IfException,
Gabor Greif051a9502008-04-06 20:25:17 +00002410 InputIterator ArgBegin, InputIterator ArgEnd,
2411 const std::string &Name, BasicBlock *InsertAtEnd) {
Gabor Greifefe65362008-05-10 08:32:32 +00002412 unsigned Values(ArgEnd - ArgBegin + 3);
2413 return new(Values) InvokeInst(Func, IfNormal, IfException, ArgBegin, ArgEnd,
2414 Values, Name, InsertAtEnd);
Gabor Greif051a9502008-04-06 20:25:17 +00002415 }
David Greenef1355a52007-08-27 19:04:21 +00002416
Chris Lattnerf319e832004-10-15 23:52:05 +00002417 virtual InvokeInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002418
Gabor Greifefe65362008-05-10 08:32:32 +00002419 /// Provide fast operand accessors
2420 DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
2421
Chris Lattner3340ffe2005-05-06 20:26:26 +00002422 /// getCallingConv/setCallingConv - Get or set the calling convention of this
2423 /// function call.
2424 unsigned getCallingConv() const { return SubclassData; }
2425 void setCallingConv(unsigned CC) {
2426 SubclassData = CC;
2427 }
2428
Chris Lattner041221c2008-03-13 04:33:03 +00002429 /// getParamAttrs - Return the parameter attributes for this invoke.
Chris Lattner58d74912008-03-12 17:45:29 +00002430 ///
2431 const PAListPtr &getParamAttrs() const { return ParamAttrs; }
Reid Spencerfa3e9122007-04-09 18:00:57 +00002432
Chris Lattner041221c2008-03-13 04:33:03 +00002433 /// setParamAttrs - Set the parameter attributes for this invoke.
Chris Lattner58d74912008-03-12 17:45:29 +00002434 ///
2435 void setParamAttrs(const PAListPtr &Attrs) { ParamAttrs = Attrs; }
Duncan Sandsdc024672007-11-27 13:23:08 +00002436
Duncan Sandsafa3b6d2007-11-28 17:07:01 +00002437 /// @brief Determine whether the call or the callee has the given attribute.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002438 bool paramHasAttr(unsigned i, ParameterAttributes attr) const;
Eric Christopher0bf7b412008-05-16 20:39:43 +00002439
2440 /// addParamAttr - adds the attribute to the list of attributes.
2441 void addParamAttr(unsigned i, ParameterAttributes attr);
Duncan Sandsafa3b6d2007-11-28 17:07:01 +00002442
Dale Johannesen08e78b12008-02-22 17:49:45 +00002443 /// @brief Extract the alignment for a call or parameter (0=unknown).
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002444 unsigned getParamAlignment(unsigned i) const {
2445 return ParamAttrs.getParamAlignment(i);
2446 }
Dale Johannesen08e78b12008-02-22 17:49:45 +00002447
Duncan Sandsa3355ff2007-12-03 20:06:50 +00002448 /// @brief Determine if the call does not access memory.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002449 bool doesNotAccessMemory() const {
2450 return paramHasAttr(0, ParamAttr::ReadNone);
2451 }
Duncan Sandsa3355ff2007-12-03 20:06:50 +00002452
2453 /// @brief Determine if the call does not access or only reads memory.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002454 bool onlyReadsMemory() const {
2455 return doesNotAccessMemory() || paramHasAttr(0, ParamAttr::ReadOnly);
2456 }
Duncan Sandsa3355ff2007-12-03 20:06:50 +00002457
Duncan Sandscbb8bad2007-12-10 19:09:40 +00002458 /// @brief Determine if the call cannot return.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002459 bool doesNotReturn() const {
2460 return paramHasAttr(0, ParamAttr::NoReturn);
2461 }
Duncan Sandscbb8bad2007-12-10 19:09:40 +00002462
Duncan Sandsa3355ff2007-12-03 20:06:50 +00002463 /// @brief Determine if the call cannot unwind.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002464 bool doesNotThrow() const {
2465 return paramHasAttr(0, ParamAttr::NoUnwind);
2466 }
Duncan Sandsf0c33542007-12-19 21:13:37 +00002467 void setDoesNotThrow(bool doesNotThrow = true);
Duncan Sandsa3355ff2007-12-03 20:06:50 +00002468
Devang Patel41e23972008-03-03 21:46:28 +00002469 /// @brief Determine if the call returns a structure through first
2470 /// pointer argument.
Chris Lattnerd5d94df2008-03-13 05:00:21 +00002471 bool hasStructRetAttr() const {
2472 // Be friendly and also check the callee.
2473 return paramHasAttr(1, ParamAttr::StructRet);
2474 }
Reid Spencerfa3e9122007-04-09 18:00:57 +00002475
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002476 /// getCalledFunction - Return the function called, or null if this is an
Chris Lattner721aef62004-11-18 17:46:57 +00002477 /// indirect function invocation.
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002478 ///
Chris Lattner721aef62004-11-18 17:46:57 +00002479 Function *getCalledFunction() const {
Chris Lattner454928e2005-01-29 00:31:36 +00002480 return dyn_cast<Function>(getOperand(0));
Chris Lattner721aef62004-11-18 17:46:57 +00002481 }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002482
2483 // getCalledValue - Get a pointer to a function that is invoked by this inst.
Devang Patel4d4a5e02008-02-23 01:11:02 +00002484 Value *getCalledValue() const { return getOperand(0); }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002485
2486 // get*Dest - Return the destination basic blocks...
Chris Lattner454928e2005-01-29 00:31:36 +00002487 BasicBlock *getNormalDest() const {
2488 return cast<BasicBlock>(getOperand(1));
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002489 }
Chris Lattner454928e2005-01-29 00:31:36 +00002490 BasicBlock *getUnwindDest() const {
2491 return cast<BasicBlock>(getOperand(2));
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002492 }
Chris Lattner454928e2005-01-29 00:31:36 +00002493 void setNormalDest(BasicBlock *B) {
Gabor Greifefe65362008-05-10 08:32:32 +00002494 setOperand(1, B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002495 }
2496
Chris Lattner454928e2005-01-29 00:31:36 +00002497 void setUnwindDest(BasicBlock *B) {
Gabor Greifefe65362008-05-10 08:32:32 +00002498 setOperand(2, B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002499 }
2500
Devang Patel4d4a5e02008-02-23 01:11:02 +00002501 BasicBlock *getSuccessor(unsigned i) const {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002502 assert(i < 2 && "Successor # out of range for invoke!");
2503 return i == 0 ? getNormalDest() : getUnwindDest();
2504 }
2505
Chris Lattner454928e2005-01-29 00:31:36 +00002506 void setSuccessor(unsigned idx, BasicBlock *NewSucc) {
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002507 assert(idx < 2 && "Successor # out of range for invoke!");
Gabor Greifefe65362008-05-10 08:32:32 +00002508 setOperand(idx+1, NewSucc);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002509 }
2510
Chris Lattner454928e2005-01-29 00:31:36 +00002511 unsigned getNumSuccessors() const { return 2; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002512
2513 // Methods for support type inquiry through isa, cast, and dyn_cast:
2514 static inline bool classof(const InvokeInst *) { return true; }
2515 static inline bool classof(const Instruction *I) {
2516 return (I->getOpcode() == Instruction::Invoke);
2517 }
2518 static inline bool classof(const Value *V) {
2519 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2520 }
Chris Lattner454928e2005-01-29 00:31:36 +00002521private:
2522 virtual BasicBlock *getSuccessorV(unsigned idx) const;
2523 virtual unsigned getNumSuccessorsV() const;
2524 virtual void setSuccessorV(unsigned idx, BasicBlock *B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002525};
2526
Gabor Greifefe65362008-05-10 08:32:32 +00002527template <>
2528struct OperandTraits<InvokeInst> : VariadicOperandTraits<3> {
2529};
2530
2531template<typename InputIterator>
2532InvokeInst::InvokeInst(Value *Func,
2533 BasicBlock *IfNormal, BasicBlock *IfException,
2534 InputIterator ArgBegin, InputIterator ArgEnd,
2535 unsigned Values,
2536 const std::string &Name, Instruction *InsertBefore)
2537 : TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
2538 ->getElementType())->getReturnType(),
2539 Instruction::Invoke,
2540 OperandTraits<InvokeInst>::op_end(this) - Values,
2541 Values, InsertBefore) {
2542 init(Func, IfNormal, IfException, ArgBegin, ArgEnd, Name,
2543 typename std::iterator_traits<InputIterator>::iterator_category());
2544}
2545template<typename InputIterator>
2546InvokeInst::InvokeInst(Value *Func,
2547 BasicBlock *IfNormal, BasicBlock *IfException,
2548 InputIterator ArgBegin, InputIterator ArgEnd,
2549 unsigned Values,
2550 const std::string &Name, BasicBlock *InsertAtEnd)
2551 : TerminatorInst(cast<FunctionType>(cast<PointerType>(Func->getType())
2552 ->getElementType())->getReturnType(),
2553 Instruction::Invoke,
2554 OperandTraits<InvokeInst>::op_end(this) - Values,
2555 Values, InsertAtEnd) {
2556 init(Func, IfNormal, IfException, ArgBegin, ArgEnd, Name,
2557 typename std::iterator_traits<InputIterator>::iterator_category());
2558}
2559
2560DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InvokeInst, Value)
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002561
2562//===----------------------------------------------------------------------===//
2563// UnwindInst Class
2564//===----------------------------------------------------------------------===//
2565
2566//===---------------------------------------------------------------------------
2567/// UnwindInst - Immediately exit the current function, unwinding the stack
2568/// until an invoke instruction is found.
2569///
Chris Lattner1fca5ff2004-10-27 16:14:51 +00002570class UnwindInst : public TerminatorInst {
Gabor Greif051a9502008-04-06 20:25:17 +00002571 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Chris Lattner1fca5ff2004-10-27 16:14:51 +00002572public:
Gabor Greif051a9502008-04-06 20:25:17 +00002573 // allocate space for exactly zero operands
2574 void *operator new(size_t s) {
2575 return User::operator new(s, 0);
2576 }
Chris Lattner910c80a2007-02-24 00:55:48 +00002577 explicit UnwindInst(Instruction *InsertBefore = 0);
2578 explicit UnwindInst(BasicBlock *InsertAtEnd);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002579
Chris Lattnerf319e832004-10-15 23:52:05 +00002580 virtual UnwindInst *clone() const;
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002581
Chris Lattner454928e2005-01-29 00:31:36 +00002582 unsigned getNumSuccessors() const { return 0; }
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002583
2584 // Methods for support type inquiry through isa, cast, and dyn_cast:
2585 static inline bool classof(const UnwindInst *) { return true; }
2586 static inline bool classof(const Instruction *I) {
2587 return I->getOpcode() == Instruction::Unwind;
2588 }
2589 static inline bool classof(const Value *V) {
2590 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2591 }
Chris Lattner454928e2005-01-29 00:31:36 +00002592private:
2593 virtual BasicBlock *getSuccessorV(unsigned idx) const;
2594 virtual unsigned getNumSuccessorsV() const;
2595 virtual void setSuccessorV(unsigned idx, BasicBlock *B);
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00002596};
2597
Chris Lattner076b3f12004-10-16 18:05:54 +00002598//===----------------------------------------------------------------------===//
2599// UnreachableInst Class
2600//===----------------------------------------------------------------------===//
2601
2602//===---------------------------------------------------------------------------
2603/// UnreachableInst - This function has undefined behavior. In particular, the
2604/// presence of this instruction indicates some higher level knowledge that the
2605/// end of the block cannot be reached.
2606///
Chris Lattner1fca5ff2004-10-27 16:14:51 +00002607class UnreachableInst : public TerminatorInst {
Gabor Greif051a9502008-04-06 20:25:17 +00002608 void *operator new(size_t, unsigned); // DO NOT IMPLEMENT
Chris Lattner1fca5ff2004-10-27 16:14:51 +00002609public:
Gabor Greif051a9502008-04-06 20:25:17 +00002610 // allocate space for exactly zero operands
2611 void *operator new(size_t s) {
2612 return User::operator new(s, 0);
2613 }
Chris Lattner910c80a2007-02-24 00:55:48 +00002614 explicit UnreachableInst(Instruction *InsertBefore = 0);
2615 explicit UnreachableInst(BasicBlock *InsertAtEnd);
Chris Lattner076b3f12004-10-16 18:05:54 +00002616
2617 virtual UnreachableInst *clone() const;
2618
Chris Lattner454928e2005-01-29 00:31:36 +00002619 unsigned getNumSuccessors() const { return 0; }
Chris Lattner076b3f12004-10-16 18:05:54 +00002620
2621 // Methods for support type inquiry through isa, cast, and dyn_cast:
2622 static inline bool classof(const UnreachableInst *) { return true; }
2623 static inline bool classof(const Instruction *I) {
2624 return I->getOpcode() == Instruction::Unreachable;
2625 }
2626 static inline bool classof(const Value *V) {
2627 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2628 }
Chris Lattner454928e2005-01-29 00:31:36 +00002629private:
2630 virtual BasicBlock *getSuccessorV(unsigned idx) const;
2631 virtual unsigned getNumSuccessorsV() const;
2632 virtual void setSuccessorV(unsigned idx, BasicBlock *B);
Chris Lattner076b3f12004-10-16 18:05:54 +00002633};
2634
Reid Spencer3da59db2006-11-27 01:05:10 +00002635//===----------------------------------------------------------------------===//
2636// TruncInst Class
2637//===----------------------------------------------------------------------===//
2638
2639/// @brief This class represents a truncation of integer types.
2640class TruncInst : public CastInst {
2641 /// Private copy constructor
2642 TruncInst(const TruncInst &CI)
2643 : CastInst(CI.getType(), Trunc, CI.getOperand(0)) {
2644 }
2645public:
2646 /// @brief Constructor with insert-before-instruction semantics
2647 TruncInst(
2648 Value *S, ///< The value to be truncated
2649 const Type *Ty, ///< The (smaller) type to truncate to
2650 const std::string &Name = "", ///< A name for the new instruction
2651 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2652 );
2653
2654 /// @brief Constructor with insert-at-end-of-block semantics
2655 TruncInst(
2656 Value *S, ///< The value to be truncated
2657 const Type *Ty, ///< The (smaller) type to truncate to
2658 const std::string &Name, ///< A name for the new instruction
2659 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2660 );
2661
2662 /// @brief Clone an identical TruncInst
2663 virtual CastInst *clone() const;
2664
2665 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2666 static inline bool classof(const TruncInst *) { return true; }
2667 static inline bool classof(const Instruction *I) {
2668 return I->getOpcode() == Trunc;
2669 }
2670 static inline bool classof(const Value *V) {
2671 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2672 }
2673};
2674
2675//===----------------------------------------------------------------------===//
2676// ZExtInst Class
2677//===----------------------------------------------------------------------===//
2678
2679/// @brief This class represents zero extension of integer types.
2680class ZExtInst : public CastInst {
2681 /// @brief Private copy constructor
2682 ZExtInst(const ZExtInst &CI)
2683 : CastInst(CI.getType(), ZExt, CI.getOperand(0)) {
2684 }
2685public:
2686 /// @brief Constructor with insert-before-instruction semantics
2687 ZExtInst(
2688 Value *S, ///< The value to be zero extended
2689 const Type *Ty, ///< The type to zero extend to
2690 const std::string &Name = "", ///< A name for the new instruction
2691 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2692 );
2693
2694 /// @brief Constructor with insert-at-end semantics.
2695 ZExtInst(
2696 Value *S, ///< The value to be zero extended
2697 const Type *Ty, ///< The type to zero extend to
2698 const std::string &Name, ///< A name for the new instruction
2699 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2700 );
2701
2702 /// @brief Clone an identical ZExtInst
2703 virtual CastInst *clone() const;
2704
2705 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2706 static inline bool classof(const ZExtInst *) { return true; }
2707 static inline bool classof(const Instruction *I) {
2708 return I->getOpcode() == ZExt;
2709 }
2710 static inline bool classof(const Value *V) {
2711 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2712 }
2713};
2714
2715//===----------------------------------------------------------------------===//
2716// SExtInst Class
2717//===----------------------------------------------------------------------===//
2718
2719/// @brief This class represents a sign extension of integer types.
2720class SExtInst : public CastInst {
2721 /// @brief Private copy constructor
2722 SExtInst(const SExtInst &CI)
2723 : CastInst(CI.getType(), SExt, CI.getOperand(0)) {
2724 }
2725public:
2726 /// @brief Constructor with insert-before-instruction semantics
2727 SExtInst(
2728 Value *S, ///< The value to be sign extended
2729 const Type *Ty, ///< The type to sign extend to
2730 const std::string &Name = "", ///< A name for the new instruction
2731 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2732 );
2733
2734 /// @brief Constructor with insert-at-end-of-block semantics
2735 SExtInst(
2736 Value *S, ///< The value to be sign extended
2737 const Type *Ty, ///< The type to sign extend to
2738 const std::string &Name, ///< A name for the new instruction
2739 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2740 );
2741
2742 /// @brief Clone an identical SExtInst
2743 virtual CastInst *clone() const;
2744
2745 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2746 static inline bool classof(const SExtInst *) { return true; }
2747 static inline bool classof(const Instruction *I) {
2748 return I->getOpcode() == SExt;
2749 }
2750 static inline bool classof(const Value *V) {
2751 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2752 }
2753};
2754
2755//===----------------------------------------------------------------------===//
2756// FPTruncInst Class
2757//===----------------------------------------------------------------------===//
2758
2759/// @brief This class represents a truncation of floating point types.
2760class FPTruncInst : public CastInst {
2761 FPTruncInst(const FPTruncInst &CI)
2762 : CastInst(CI.getType(), FPTrunc, CI.getOperand(0)) {
2763 }
2764public:
2765 /// @brief Constructor with insert-before-instruction semantics
2766 FPTruncInst(
2767 Value *S, ///< The value to be truncated
2768 const Type *Ty, ///< The type to truncate to
2769 const std::string &Name = "", ///< A name for the new instruction
2770 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2771 );
2772
2773 /// @brief Constructor with insert-before-instruction semantics
2774 FPTruncInst(
2775 Value *S, ///< The value to be truncated
2776 const Type *Ty, ///< The type to truncate to
2777 const std::string &Name, ///< A name for the new instruction
2778 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2779 );
2780
2781 /// @brief Clone an identical FPTruncInst
2782 virtual CastInst *clone() const;
2783
2784 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2785 static inline bool classof(const FPTruncInst *) { return true; }
2786 static inline bool classof(const Instruction *I) {
2787 return I->getOpcode() == FPTrunc;
2788 }
2789 static inline bool classof(const Value *V) {
2790 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2791 }
2792};
2793
2794//===----------------------------------------------------------------------===//
2795// FPExtInst Class
2796//===----------------------------------------------------------------------===//
2797
2798/// @brief This class represents an extension of floating point types.
2799class FPExtInst : public CastInst {
2800 FPExtInst(const FPExtInst &CI)
2801 : CastInst(CI.getType(), FPExt, CI.getOperand(0)) {
2802 }
2803public:
2804 /// @brief Constructor with insert-before-instruction semantics
2805 FPExtInst(
2806 Value *S, ///< The value to be extended
2807 const Type *Ty, ///< The type to extend to
2808 const std::string &Name = "", ///< A name for the new instruction
2809 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2810 );
2811
2812 /// @brief Constructor with insert-at-end-of-block semantics
2813 FPExtInst(
2814 Value *S, ///< The value to be extended
2815 const Type *Ty, ///< The type to extend to
2816 const std::string &Name, ///< A name for the new instruction
2817 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2818 );
2819
2820 /// @brief Clone an identical FPExtInst
2821 virtual CastInst *clone() const;
2822
2823 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2824 static inline bool classof(const FPExtInst *) { return true; }
2825 static inline bool classof(const Instruction *I) {
2826 return I->getOpcode() == FPExt;
2827 }
2828 static inline bool classof(const Value *V) {
2829 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2830 }
2831};
2832
2833//===----------------------------------------------------------------------===//
2834// UIToFPInst Class
2835//===----------------------------------------------------------------------===//
2836
2837/// @brief This class represents a cast unsigned integer to floating point.
2838class UIToFPInst : public CastInst {
2839 UIToFPInst(const UIToFPInst &CI)
2840 : CastInst(CI.getType(), UIToFP, CI.getOperand(0)) {
2841 }
2842public:
2843 /// @brief Constructor with insert-before-instruction semantics
2844 UIToFPInst(
2845 Value *S, ///< The value to be converted
2846 const Type *Ty, ///< The type to convert to
2847 const std::string &Name = "", ///< A name for the new instruction
2848 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2849 );
2850
2851 /// @brief Constructor with insert-at-end-of-block semantics
2852 UIToFPInst(
2853 Value *S, ///< The value to be converted
2854 const Type *Ty, ///< The type to convert to
2855 const std::string &Name, ///< A name for the new instruction
2856 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2857 );
2858
2859 /// @brief Clone an identical UIToFPInst
2860 virtual CastInst *clone() const;
2861
2862 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2863 static inline bool classof(const UIToFPInst *) { return true; }
2864 static inline bool classof(const Instruction *I) {
2865 return I->getOpcode() == UIToFP;
2866 }
2867 static inline bool classof(const Value *V) {
2868 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2869 }
2870};
2871
2872//===----------------------------------------------------------------------===//
2873// SIToFPInst Class
2874//===----------------------------------------------------------------------===//
2875
2876/// @brief This class represents a cast from signed integer to floating point.
2877class SIToFPInst : public CastInst {
2878 SIToFPInst(const SIToFPInst &CI)
2879 : CastInst(CI.getType(), SIToFP, CI.getOperand(0)) {
2880 }
2881public:
2882 /// @brief Constructor with insert-before-instruction semantics
2883 SIToFPInst(
2884 Value *S, ///< The value to be converted
2885 const Type *Ty, ///< The type to convert to
2886 const std::string &Name = "", ///< A name for the new instruction
2887 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2888 );
2889
2890 /// @brief Constructor with insert-at-end-of-block semantics
2891 SIToFPInst(
2892 Value *S, ///< The value to be converted
2893 const Type *Ty, ///< The type to convert to
2894 const std::string &Name, ///< A name for the new instruction
2895 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2896 );
2897
2898 /// @brief Clone an identical SIToFPInst
2899 virtual CastInst *clone() const;
2900
2901 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2902 static inline bool classof(const SIToFPInst *) { return true; }
2903 static inline bool classof(const Instruction *I) {
2904 return I->getOpcode() == SIToFP;
2905 }
2906 static inline bool classof(const Value *V) {
2907 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2908 }
2909};
2910
2911//===----------------------------------------------------------------------===//
2912// FPToUIInst Class
2913//===----------------------------------------------------------------------===//
2914
2915/// @brief This class represents a cast from floating point to unsigned integer
2916class FPToUIInst : public CastInst {
2917 FPToUIInst(const FPToUIInst &CI)
2918 : CastInst(CI.getType(), FPToUI, CI.getOperand(0)) {
2919 }
2920public:
2921 /// @brief Constructor with insert-before-instruction semantics
2922 FPToUIInst(
2923 Value *S, ///< The value to be converted
2924 const Type *Ty, ///< The type to convert to
2925 const std::string &Name = "", ///< A name for the new instruction
2926 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2927 );
2928
2929 /// @brief Constructor with insert-at-end-of-block semantics
2930 FPToUIInst(
2931 Value *S, ///< The value to be converted
2932 const Type *Ty, ///< The type to convert to
2933 const std::string &Name, ///< A name for the new instruction
2934 BasicBlock *InsertAtEnd ///< Where to insert the new instruction
2935 );
2936
2937 /// @brief Clone an identical FPToUIInst
2938 virtual CastInst *clone() const;
2939
2940 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2941 static inline bool classof(const FPToUIInst *) { return true; }
2942 static inline bool classof(const Instruction *I) {
2943 return I->getOpcode() == FPToUI;
2944 }
2945 static inline bool classof(const Value *V) {
2946 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2947 }
2948};
2949
2950//===----------------------------------------------------------------------===//
2951// FPToSIInst Class
2952//===----------------------------------------------------------------------===//
2953
2954/// @brief This class represents a cast from floating point to signed integer.
2955class FPToSIInst : public CastInst {
2956 FPToSIInst(const FPToSIInst &CI)
2957 : CastInst(CI.getType(), FPToSI, CI.getOperand(0)) {
2958 }
2959public:
2960 /// @brief Constructor with insert-before-instruction semantics
2961 FPToSIInst(
2962 Value *S, ///< The value to be converted
2963 const Type *Ty, ///< The type to convert to
2964 const std::string &Name = "", ///< A name for the new instruction
2965 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
2966 );
2967
2968 /// @brief Constructor with insert-at-end-of-block semantics
2969 FPToSIInst(
2970 Value *S, ///< The value to be converted
2971 const Type *Ty, ///< The type to convert to
2972 const std::string &Name, ///< A name for the new instruction
2973 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
2974 );
2975
2976 /// @brief Clone an identical FPToSIInst
2977 virtual CastInst *clone() const;
2978
2979 /// @brief Methods for support type inquiry through isa, cast, and dyn_cast:
2980 static inline bool classof(const FPToSIInst *) { return true; }
2981 static inline bool classof(const Instruction *I) {
2982 return I->getOpcode() == FPToSI;
2983 }
2984 static inline bool classof(const Value *V) {
2985 return isa<Instruction>(V) && classof(cast<Instruction>(V));
2986 }
2987};
2988
2989//===----------------------------------------------------------------------===//
2990// IntToPtrInst Class
2991//===----------------------------------------------------------------------===//
2992
2993/// @brief This class represents a cast from an integer to a pointer.
2994class IntToPtrInst : public CastInst {
2995 IntToPtrInst(const IntToPtrInst &CI)
2996 : CastInst(CI.getType(), IntToPtr, CI.getOperand(0)) {
2997 }
2998public:
2999 /// @brief Constructor with insert-before-instruction semantics
3000 IntToPtrInst(
3001 Value *S, ///< The value to be converted
3002 const Type *Ty, ///< The type to convert to
3003 const std::string &Name = "", ///< A name for the new instruction
3004 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
3005 );
3006
3007 /// @brief Constructor with insert-at-end-of-block semantics
3008 IntToPtrInst(
3009 Value *S, ///< The value to be converted
3010 const Type *Ty, ///< The type to convert to
3011 const std::string &Name, ///< A name for the new instruction
3012 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
3013 );
3014
3015 /// @brief Clone an identical IntToPtrInst
3016 virtual CastInst *clone() const;
3017
3018 // Methods for support type inquiry through isa, cast, and dyn_cast:
3019 static inline bool classof(const IntToPtrInst *) { return true; }
3020 static inline bool classof(const Instruction *I) {
3021 return I->getOpcode() == IntToPtr;
3022 }
3023 static inline bool classof(const Value *V) {
3024 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3025 }
3026};
3027
3028//===----------------------------------------------------------------------===//
3029// PtrToIntInst Class
3030//===----------------------------------------------------------------------===//
3031
3032/// @brief This class represents a cast from a pointer to an integer
3033class PtrToIntInst : public CastInst {
3034 PtrToIntInst(const PtrToIntInst &CI)
3035 : CastInst(CI.getType(), PtrToInt, CI.getOperand(0)) {
3036 }
3037public:
3038 /// @brief Constructor with insert-before-instruction semantics
3039 PtrToIntInst(
3040 Value *S, ///< The value to be converted
3041 const Type *Ty, ///< The type to convert to
3042 const std::string &Name = "", ///< A name for the new instruction
3043 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
3044 );
3045
3046 /// @brief Constructor with insert-at-end-of-block semantics
3047 PtrToIntInst(
3048 Value *S, ///< The value to be converted
3049 const Type *Ty, ///< The type to convert to
3050 const std::string &Name, ///< A name for the new instruction
3051 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
3052 );
3053
3054 /// @brief Clone an identical PtrToIntInst
3055 virtual CastInst *clone() const;
3056
3057 // Methods for support type inquiry through isa, cast, and dyn_cast:
3058 static inline bool classof(const PtrToIntInst *) { return true; }
3059 static inline bool classof(const Instruction *I) {
3060 return I->getOpcode() == PtrToInt;
3061 }
3062 static inline bool classof(const Value *V) {
3063 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3064 }
3065};
3066
3067//===----------------------------------------------------------------------===//
3068// BitCastInst Class
3069//===----------------------------------------------------------------------===//
3070
3071/// @brief This class represents a no-op cast from one type to another.
3072class BitCastInst : public CastInst {
3073 BitCastInst(const BitCastInst &CI)
3074 : CastInst(CI.getType(), BitCast, CI.getOperand(0)) {
3075 }
3076public:
3077 /// @brief Constructor with insert-before-instruction semantics
3078 BitCastInst(
3079 Value *S, ///< The value to be casted
3080 const Type *Ty, ///< The type to casted to
3081 const std::string &Name = "", ///< A name for the new instruction
3082 Instruction *InsertBefore = 0 ///< Where to insert the new instruction
3083 );
3084
3085 /// @brief Constructor with insert-at-end-of-block semantics
3086 BitCastInst(
3087 Value *S, ///< The value to be casted
3088 const Type *Ty, ///< The type to casted to
3089 const std::string &Name, ///< A name for the new instruction
3090 BasicBlock *InsertAtEnd ///< The block to insert the instruction into
3091 );
3092
3093 /// @brief Clone an identical BitCastInst
3094 virtual CastInst *clone() const;
3095
3096 // Methods for support type inquiry through isa, cast, and dyn_cast:
3097 static inline bool classof(const BitCastInst *) { return true; }
3098 static inline bool classof(const Instruction *I) {
3099 return I->getOpcode() == BitCast;
3100 }
3101 static inline bool classof(const Value *V) {
3102 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3103 }
3104};
3105
Devang Patel40a04212008-02-19 22:15:16 +00003106//===----------------------------------------------------------------------===//
3107// GetResultInst Class
3108//===----------------------------------------------------------------------===//
3109
3110/// GetResultInst - This instruction extracts individual result value from
3111/// aggregate value, where aggregate value is returned by CallInst.
3112///
Gabor Greifd6a22182008-05-13 07:09:08 +00003113class GetResultInst : public UnaryInstruction {
Devang Patel23755d82008-02-20 19:10:47 +00003114 unsigned Idx;
Devang Patel40a04212008-02-19 22:15:16 +00003115 GetResultInst(const GetResultInst &GRI) :
Gabor Greifd6a22182008-05-13 07:09:08 +00003116 UnaryInstruction(GRI.getType(), Instruction::GetResult, GRI.getOperand(0)),
3117 Idx(GRI.Idx) {
Devang Patel40a04212008-02-19 22:15:16 +00003118 }
3119
3120public:
Gabor Greifefe65362008-05-10 08:32:32 +00003121 GetResultInst(Value *Aggr, unsigned index,
3122 const std::string &Name = "",
3123 Instruction *InsertBefore = 0);
Devang Patel40a04212008-02-19 22:15:16 +00003124
3125 /// isValidOperands - Return true if an getresult instruction can be
3126 /// formed with the specified operands.
Devang Patel23755d82008-02-20 19:10:47 +00003127 static bool isValidOperands(const Value *Aggr, unsigned index);
Devang Patel40a04212008-02-19 22:15:16 +00003128
3129 virtual GetResultInst *clone() const;
3130
Devang Patel4d4a5e02008-02-23 01:11:02 +00003131 Value *getAggregateValue() {
Devang Patel40a04212008-02-19 22:15:16 +00003132 return getOperand(0);
3133 }
Devang Patel2d2ae342008-02-20 18:36:16 +00003134
Devang Patel4d4a5e02008-02-23 01:11:02 +00003135 const Value *getAggregateValue() const {
Devang Patel2d2ae342008-02-20 18:36:16 +00003136 return getOperand(0);
3137 }
3138
Devang Patel4d4a5e02008-02-23 01:11:02 +00003139 unsigned getIndex() const {
Devang Patel23755d82008-02-20 19:10:47 +00003140 return Idx;
Devang Patel40a04212008-02-19 22:15:16 +00003141 }
3142
Devang Patel40a04212008-02-19 22:15:16 +00003143 // Methods for support type inquiry through isa, cast, and dyn_cast:
3144 static inline bool classof(const GetResultInst *) { return true; }
3145 static inline bool classof(const Instruction *I) {
3146 return (I->getOpcode() == Instruction::GetResult);
3147 }
3148 static inline bool classof(const Value *V) {
3149 return isa<Instruction>(V) && classof(cast<Instruction>(V));
3150 }
3151};
3152
Alkis Evlogimenoseb62bc72004-07-29 12:17:34 +00003153} // End llvm namespace
Chris Lattnera892a3a2003-01-27 22:08:52 +00003154
3155#endif