Merge InstrTypes.cpp into this file
[oota-llvm.git] / lib / VMCore / Instructions.cpp
1 //===-- Instructions.cpp - Implement the LLVM instructions ----------------===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements all of the non-inline methods for the LLVM instruction
11 // classes.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/BasicBlock.h"
16 #include "llvm/Constants.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Function.h"
19 #include "llvm/Instructions.h"
20 #include "llvm/Support/CallSite.h"
21 using namespace llvm;
22
23 //===----------------------------------------------------------------------===//
24 //                            TerminatorInst Class
25 //===----------------------------------------------------------------------===//
26
27 TerminatorInst::TerminatorInst(Instruction::TermOps iType,
28                                Use *Ops, unsigned NumOps, Instruction *IB) 
29   : Instruction(Type::VoidTy, iType, Ops, NumOps, "", IB) {
30 }
31
32 TerminatorInst::TerminatorInst(Instruction::TermOps iType,
33                                Use *Ops, unsigned NumOps, BasicBlock *IAE)
34   : Instruction(Type::VoidTy, iType, Ops, NumOps, "", IAE) {
35 }
36
37
38
39 //===----------------------------------------------------------------------===//
40 //                               PHINode Class
41 //===----------------------------------------------------------------------===//
42
43 PHINode::PHINode(const PHINode &PN)
44   : Instruction(PN.getType(), Instruction::PHI,
45                 new Use[PN.getNumOperands()], PN.getNumOperands()),
46     ReservedSpace(PN.getNumOperands()) {
47   Use *OL = OperandList;
48   for (unsigned i = 0, e = PN.getNumOperands(); i != e; i+=2) {
49     OL[i].init(PN.getOperand(i), this);
50     OL[i+1].init(PN.getOperand(i+1), this);
51   }
52 }
53
54 PHINode::~PHINode() {
55   delete [] OperandList;
56 }
57
58 // removeIncomingValue - Remove an incoming value.  This is useful if a
59 // predecessor basic block is deleted.
60 Value *PHINode::removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty) {
61   unsigned NumOps = getNumOperands();
62   Use *OL = OperandList;
63   assert(Idx*2 < NumOps && "BB not in PHI node!");
64   Value *Removed = OL[Idx*2];
65
66   // Move everything after this operand down.
67   //
68   // FIXME: we could just swap with the end of the list, then erase.  However,
69   // client might not expect this to happen.  The code as it is thrashes the
70   // use/def lists, which is kinda lame.
71   for (unsigned i = (Idx+1)*2; i != NumOps; i += 2) {
72     OL[i-2] = OL[i];
73     OL[i-2+1] = OL[i+1];
74   }
75
76   // Nuke the last value.
77   OL[NumOps-2].set(0);
78   OL[NumOps-2+1].set(0);
79   NumOperands = NumOps-2;
80
81   // If the PHI node is dead, because it has zero entries, nuke it now.
82   if (NumOps == 2 && DeletePHIIfEmpty) {
83     // If anyone is using this PHI, make them use a dummy value instead...
84     replaceAllUsesWith(UndefValue::get(getType()));
85     eraseFromParent();
86   }
87   return Removed;
88 }
89
90 /// resizeOperands - resize operands - This adjusts the length of the operands
91 /// list according to the following behavior:
92 ///   1. If NumOps == 0, grow the operand list in response to a push_back style
93 ///      of operation.  This grows the number of ops by 1.5 times.
94 ///   2. If NumOps > NumOperands, reserve space for NumOps operands.
95 ///   3. If NumOps == NumOperands, trim the reserved space.
96 ///
97 void PHINode::resizeOperands(unsigned NumOps) {
98   if (NumOps == 0) {
99     NumOps = (getNumOperands())*3/2;
100     if (NumOps < 4) NumOps = 4;      // 4 op PHI nodes are VERY common.
101   } else if (NumOps*2 > NumOperands) {
102     // No resize needed.
103     if (ReservedSpace >= NumOps) return;
104   } else if (NumOps == NumOperands) {
105     if (ReservedSpace == NumOps) return;
106   } else {
107     return;        
108   }
109
110   ReservedSpace = NumOps;
111   Use *NewOps = new Use[NumOps];
112   Use *OldOps = OperandList;
113   for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
114       NewOps[i].init(OldOps[i], this);
115       OldOps[i].set(0);
116   }
117   delete [] OldOps;
118   OperandList = NewOps;
119 }
120
121
122 //===----------------------------------------------------------------------===//
123 //                        CallInst Implementation
124 //===----------------------------------------------------------------------===//
125
126 CallInst::~CallInst() {
127   delete [] OperandList;
128 }
129
130 void CallInst::init(Value *Func, const std::vector<Value*> &Params) {
131   NumOperands = Params.size()+1;
132   Use *OL = OperandList = new Use[Params.size()+1];
133   OL[0].init(Func, this);
134
135   const FunctionType *FTy = 
136     cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
137
138   assert((Params.size() == FTy->getNumParams() || 
139           (FTy->isVarArg() && Params.size() > FTy->getNumParams())) &&
140          "Calling a function with bad signature");
141   for (unsigned i = 0, e = Params.size(); i != e; ++i)
142     OL[i+1].init(Params[i], this);
143 }
144
145 void CallInst::init(Value *Func, Value *Actual1, Value *Actual2) {
146   NumOperands = 3;
147   Use *OL = OperandList = new Use[3];
148   OL[0].init(Func, this);
149   OL[1].init(Actual1, this);
150   OL[2].init(Actual2, this);
151   
152   const FunctionType *FTy = 
153     cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
154
155   assert((FTy->getNumParams() == 2 ||
156           (FTy->isVarArg() && FTy->getNumParams() == 0)) &&
157          "Calling a function with bad signature");
158 }
159
160 void CallInst::init(Value *Func, Value *Actual) {
161   NumOperands = 2;
162   Use *OL = OperandList = new Use[2];
163   OL[0].init(Func, this);
164   OL[1].init(Actual, this);
165   
166   const FunctionType *FTy = 
167     cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
168
169   assert((FTy->getNumParams() == 1 ||
170           (FTy->isVarArg() && FTy->getNumParams() == 0)) &&
171          "Calling a function with bad signature");
172 }
173
174 void CallInst::init(Value *Func) {
175   NumOperands = 1;
176   Use *OL = OperandList = new Use[1];
177   OL[0].init(Func, this);
178   
179   const FunctionType *MTy = 
180     cast<FunctionType>(cast<PointerType>(Func->getType())->getElementType());
181
182   assert(MTy->getNumParams() == 0 && "Calling a function with bad signature");
183 }
184
185 CallInst::CallInst(Value *Func, const std::vector<Value*> &Params, 
186                    const std::string &Name, Instruction *InsertBefore) 
187   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
188                                  ->getElementType())->getReturnType(),
189                 Instruction::Call, 0, 0, Name, InsertBefore) {
190   init(Func, Params);
191 }
192
193 CallInst::CallInst(Value *Func, const std::vector<Value*> &Params, 
194                    const std::string &Name, BasicBlock *InsertAtEnd) 
195   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
196                                  ->getElementType())->getReturnType(),
197                 Instruction::Call, 0, 0, Name, InsertAtEnd) {
198   init(Func, Params);
199 }
200
201 CallInst::CallInst(Value *Func, Value *Actual1, Value *Actual2,
202                    const std::string &Name, Instruction  *InsertBefore)
203   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
204                                    ->getElementType())->getReturnType(),
205                 Instruction::Call, 0, 0, Name, InsertBefore) {
206   init(Func, Actual1, Actual2);
207 }
208
209 CallInst::CallInst(Value *Func, Value *Actual1, Value *Actual2,
210                    const std::string &Name, BasicBlock  *InsertAtEnd)
211   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
212                                    ->getElementType())->getReturnType(),
213                 Instruction::Call, 0, 0, Name, InsertAtEnd) {
214   init(Func, Actual1, Actual2);
215 }
216
217 CallInst::CallInst(Value *Func, Value* Actual, const std::string &Name,
218                    Instruction  *InsertBefore)
219   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
220                                    ->getElementType())->getReturnType(),
221                 Instruction::Call, 0, 0, Name, InsertBefore) {
222   init(Func, Actual);
223 }
224
225 CallInst::CallInst(Value *Func, Value* Actual, const std::string &Name,
226                    BasicBlock  *InsertAtEnd)
227   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
228                                    ->getElementType())->getReturnType(),
229                 Instruction::Call, 0, 0, Name, InsertAtEnd) {
230   init(Func, Actual);
231 }
232
233 CallInst::CallInst(Value *Func, const std::string &Name,
234                    Instruction *InsertBefore)
235   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
236                                    ->getElementType())->getReturnType(),
237                 Instruction::Call, 0, 0, Name, InsertBefore) {
238   init(Func);
239 }
240
241 CallInst::CallInst(Value *Func, const std::string &Name,
242                    BasicBlock *InsertAtEnd)
243   : Instruction(cast<FunctionType>(cast<PointerType>(Func->getType())
244                                    ->getElementType())->getReturnType(),
245                 Instruction::Call, 0, 0, Name, InsertAtEnd) {
246   init(Func);
247 }
248
249 CallInst::CallInst(const CallInst &CI) 
250   : Instruction(CI.getType(), Instruction::Call, new Use[CI.getNumOperands()],
251                 CI.getNumOperands()) {
252   Use *OL = OperandList;
253   Use *InOL = CI.OperandList;
254   for (unsigned i = 0, e = CI.getNumOperands(); i != e; ++i)
255     OL[i].init(InOL[i], this);
256 }
257
258
259 //===----------------------------------------------------------------------===//
260 //                        InvokeInst Implementation
261 //===----------------------------------------------------------------------===//
262
263 InvokeInst::~InvokeInst() {
264   delete [] OperandList;
265 }
266
267 void InvokeInst::init(Value *Fn, BasicBlock *IfNormal, BasicBlock *IfException,
268                       const std::vector<Value*> &Params) {
269   NumOperands = 3+Params.size();
270   Use *OL = OperandList = new Use[3+Params.size()];
271   OL[0].init(Fn, this);
272   OL[1].init(IfNormal, this);
273   OL[2].init(IfException, this);
274   const FunctionType *FTy = 
275     cast<FunctionType>(cast<PointerType>(Fn->getType())->getElementType());
276   
277   assert((Params.size() == FTy->getNumParams()) || 
278          (FTy->isVarArg() && Params.size() > FTy->getNumParams()) &&
279          "Calling a function with bad signature");
280   
281   for (unsigned i = 0, e = Params.size(); i != e; i++)
282     OL[i+3].init(Params[i], this);
283 }
284
285 InvokeInst::InvokeInst(Value *Fn, BasicBlock *IfNormal,
286                        BasicBlock *IfException,
287                        const std::vector<Value*> &Params,
288                        const std::string &Name, Instruction *InsertBefore)
289   : TerminatorInst(cast<FunctionType>(cast<PointerType>(Fn->getType())
290                                     ->getElementType())->getReturnType(),
291                    Instruction::Invoke, 0, 0, Name, InsertBefore) {
292   init(Fn, IfNormal, IfException, Params);
293 }
294
295 InvokeInst::InvokeInst(Value *Fn, BasicBlock *IfNormal,
296                        BasicBlock *IfException,
297                        const std::vector<Value*> &Params,
298                        const std::string &Name, BasicBlock *InsertAtEnd)
299   : TerminatorInst(cast<FunctionType>(cast<PointerType>(Fn->getType())
300                                     ->getElementType())->getReturnType(),
301                    Instruction::Invoke, 0, 0, Name, InsertAtEnd) {
302   init(Fn, IfNormal, IfException, Params);
303 }
304
305 InvokeInst::InvokeInst(const InvokeInst &II) 
306   : TerminatorInst(II.getType(), Instruction::Invoke,
307                    new Use[II.getNumOperands()], II.getNumOperands()) {
308   Use *OL = OperandList, *InOL = II.OperandList;
309   for (unsigned i = 0, e = II.getNumOperands(); i != e; ++i)
310     OL[i].init(InOL[i], this);
311 }
312
313 BasicBlock *InvokeInst::getSuccessorV(unsigned idx) const {
314   return getSuccessor(idx);
315 }
316 unsigned InvokeInst::getNumSuccessorsV() const {
317   return getNumSuccessors();
318 }
319 void InvokeInst::setSuccessorV(unsigned idx, BasicBlock *B) {
320   return setSuccessor(idx, B);
321 }
322
323
324 //===----------------------------------------------------------------------===//
325 //                        ReturnInst Implementation
326 //===----------------------------------------------------------------------===//
327
328 void ReturnInst::init(Value *retVal) {
329   if (retVal && retVal->getType() != Type::VoidTy) {
330     assert(!isa<BasicBlock>(retVal) && 
331            "Cannot return basic block.  Probably using the incorrect ctor");
332     NumOperands = 1;
333     RetVal.init(retVal, this);
334   }
335 }
336
337 unsigned ReturnInst::getNumSuccessorsV() const {
338   return getNumSuccessors();
339 }
340
341 // Out-of-line ReturnInst method, put here so the C++ compiler can choose to
342 // emit the vtable for the class in this translation unit.
343 void ReturnInst::setSuccessorV(unsigned idx, BasicBlock *NewSucc) {
344   assert(0 && "ReturnInst has no successors!");
345 }
346
347 BasicBlock *ReturnInst::getSuccessorV(unsigned idx) const {
348   assert(0 && "ReturnInst has no successors!");
349   abort();
350   return 0;
351 }
352
353
354 //===----------------------------------------------------------------------===//
355 //                        UnwindInst Implementation
356 //===----------------------------------------------------------------------===//
357
358 unsigned UnwindInst::getNumSuccessorsV() const {
359   return getNumSuccessors();
360 }
361
362 void UnwindInst::setSuccessorV(unsigned idx, BasicBlock *NewSucc) {
363   assert(0 && "UnwindInst has no successors!");
364 }
365
366 BasicBlock *UnwindInst::getSuccessorV(unsigned idx) const {
367   assert(0 && "UnwindInst has no successors!");
368   abort();
369   return 0;
370 }
371
372 //===----------------------------------------------------------------------===//
373 //                      UnreachableInst Implementation
374 //===----------------------------------------------------------------------===//
375
376 unsigned UnreachableInst::getNumSuccessorsV() const {
377   return getNumSuccessors();
378 }
379
380 void UnreachableInst::setSuccessorV(unsigned idx, BasicBlock *NewSucc) {
381   assert(0 && "UnwindInst has no successors!");
382 }
383
384 BasicBlock *UnreachableInst::getSuccessorV(unsigned idx) const {
385   assert(0 && "UnwindInst has no successors!");
386   abort();
387   return 0;
388 }
389
390 //===----------------------------------------------------------------------===//
391 //                        BranchInst Implementation
392 //===----------------------------------------------------------------------===//
393
394 void BranchInst::AssertOK() {
395   if (isConditional())
396     assert(getCondition()->getType() == Type::BoolTy && 
397            "May only branch on boolean predicates!");
398 }
399
400 BranchInst::BranchInst(const BranchInst &BI) :
401   TerminatorInst(Instruction::Br, Ops, BI.getNumOperands()) {
402   OperandList[0].init(BI.getOperand(0), this);
403   if (BI.getNumOperands() != 1) {
404     assert(BI.getNumOperands() == 3 && "BR can have 1 or 3 operands!");
405     OperandList[1].init(BI.getOperand(1), this);
406     OperandList[2].init(BI.getOperand(2), this);
407   }
408 }
409
410 BasicBlock *BranchInst::getSuccessorV(unsigned idx) const {
411   return getSuccessor(idx);
412 }
413 unsigned BranchInst::getNumSuccessorsV() const {
414   return getNumSuccessors();
415 }
416 void BranchInst::setSuccessorV(unsigned idx, BasicBlock *B) {
417   setSuccessor(idx, B);
418 }
419
420
421 //===----------------------------------------------------------------------===//
422 //                        AllocationInst Implementation
423 //===----------------------------------------------------------------------===//
424
425 static Value *getAISize(Value *Amt) {
426   if (!Amt)
427     Amt = ConstantUInt::get(Type::UIntTy, 1);
428   else
429     assert(Amt->getType() == Type::UIntTy &&
430            "Malloc/Allocation array size != UIntTy!");
431   return Amt;  
432 }
433
434 AllocationInst::AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, 
435                                const std::string &Name,
436                                Instruction *InsertBefore)
437   : UnaryInstruction(PointerType::get(Ty), iTy, getAISize(ArraySize),
438                      Name, InsertBefore) {
439   assert(Ty != Type::VoidTy && "Cannot allocate void!");
440 }
441
442 AllocationInst::AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, 
443                                const std::string &Name,
444                                BasicBlock *InsertAtEnd)
445   : UnaryInstruction(PointerType::get(Ty), iTy, getAISize(ArraySize),
446                      Name, InsertAtEnd) {
447   assert(Ty != Type::VoidTy && "Cannot allocate void!");
448 }
449
450 bool AllocationInst::isArrayAllocation() const {
451   if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(getOperand(0)))
452     return CUI->getValue() != 1;
453   return true;
454 }
455
456 const Type *AllocationInst::getAllocatedType() const {
457   return getType()->getElementType();
458 }
459
460 AllocaInst::AllocaInst(const AllocaInst &AI)
461   : AllocationInst(AI.getType()->getElementType(), (Value*)AI.getOperand(0),
462                    Instruction::Alloca) {
463 }
464
465 MallocInst::MallocInst(const MallocInst &MI)
466   : AllocationInst(MI.getType()->getElementType(), (Value*)MI.getOperand(0),
467                    Instruction::Malloc) {
468 }
469
470 //===----------------------------------------------------------------------===//
471 //                             FreeInst Implementation
472 //===----------------------------------------------------------------------===//
473
474 void FreeInst::AssertOK() {
475   assert(isa<PointerType>(getOperand(0)->getType()) &&
476          "Can not free something of nonpointer type!");
477 }
478
479 FreeInst::FreeInst(Value *Ptr, Instruction *InsertBefore)
480   : UnaryInstruction(Type::VoidTy, Free, Ptr, "", InsertBefore) {
481   AssertOK();
482 }
483
484 FreeInst::FreeInst(Value *Ptr, BasicBlock *InsertAtEnd)
485   : UnaryInstruction(Type::VoidTy, Free, Ptr, "", InsertAtEnd) {
486   AssertOK();
487 }
488
489
490 //===----------------------------------------------------------------------===//
491 //                           LoadInst Implementation
492 //===----------------------------------------------------------------------===//
493
494 void LoadInst::AssertOK() {
495   assert(isa<PointerType>(getOperand(0)->getType()) && 
496          "Ptr must have pointer type.");
497 }
498
499 LoadInst::LoadInst(Value *Ptr, const std::string &Name, Instruction *InsertBef)
500   : UnaryInstruction(cast<PointerType>(Ptr->getType())->getElementType(),
501                      Load, Ptr, Name, InsertBef), Volatile(false) {
502   AssertOK();
503 }
504
505 LoadInst::LoadInst(Value *Ptr, const std::string &Name, BasicBlock *InsertAE)
506   : UnaryInstruction(cast<PointerType>(Ptr->getType())->getElementType(),
507                      Load, Ptr, Name, InsertAE), Volatile(false) {
508   AssertOK();
509 }
510
511 LoadInst::LoadInst(Value *Ptr, const std::string &Name, bool isVolatile,
512                    Instruction *InsertBef)
513   : UnaryInstruction(cast<PointerType>(Ptr->getType())->getElementType(),
514                      Load, Ptr, Name, InsertBef), Volatile(isVolatile) {
515   AssertOK();
516 }
517
518 LoadInst::LoadInst(Value *Ptr, const std::string &Name, bool isVolatile,
519                    BasicBlock *InsertAE)
520   : UnaryInstruction(cast<PointerType>(Ptr->getType())->getElementType(),
521                      Load, Ptr, Name, InsertAE), Volatile(isVolatile) {
522   AssertOK();
523 }
524
525
526 //===----------------------------------------------------------------------===//
527 //                           StoreInst Implementation
528 //===----------------------------------------------------------------------===//
529
530 void StoreInst::AssertOK() {
531   assert(isa<PointerType>(getOperand(1)->getType()) &&
532          "Ptr must have pointer type!");
533   assert(getOperand(0)->getType() ==
534                  cast<PointerType>(getOperand(1)->getType())->getElementType()
535          && "Ptr must be a pointer to Val type!");
536 }
537
538
539 StoreInst::StoreInst(Value *val, Value *addr, Instruction *InsertBefore)
540   : Instruction(Type::VoidTy, Store, Ops, 2, "", InsertBefore),
541     Volatile(false) {
542   Ops[0].init(val, this);
543   Ops[1].init(addr, this);
544   AssertOK();
545 }
546
547 StoreInst::StoreInst(Value *val, Value *addr, BasicBlock *InsertAtEnd)
548   : Instruction(Type::VoidTy, Store, Ops, 2, "", InsertAtEnd), Volatile(false) {
549   Ops[0].init(val, this);
550   Ops[1].init(addr, this);
551   AssertOK();
552 }
553
554 StoreInst::StoreInst(Value *val, Value *addr, bool isVolatile, 
555                      Instruction *InsertBefore)
556   : Instruction(Type::VoidTy, Store, Ops, 2, "", InsertBefore),
557     Volatile(isVolatile) {
558   Ops[0].init(val, this);
559   Ops[1].init(addr, this);
560   AssertOK();
561 }
562
563 StoreInst::StoreInst(Value *val, Value *addr, bool isVolatile, 
564                      BasicBlock *InsertAtEnd)
565   : Instruction(Type::VoidTy, Store, Ops, 2, "", InsertAtEnd),
566     Volatile(isVolatile) {
567   Ops[0].init(val, this);
568   Ops[1].init(addr, this);
569   AssertOK();
570 }
571
572 //===----------------------------------------------------------------------===//
573 //                       GetElementPtrInst Implementation
574 //===----------------------------------------------------------------------===//
575
576 // checkType - Simple wrapper function to give a better assertion failure
577 // message on bad indexes for a gep instruction.
578 //
579 static inline const Type *checkType(const Type *Ty) {
580   assert(Ty && "Invalid indices for type!");
581   return Ty;
582 }
583
584 void GetElementPtrInst::init(Value *Ptr, const std::vector<Value*> &Idx) {
585   NumOperands = 1+Idx.size();
586   Use *OL = OperandList = new Use[NumOperands];
587   OL[0].init(Ptr, this);
588
589   for (unsigned i = 0, e = Idx.size(); i != e; ++i)
590     OL[i+1].init(Idx[i], this);
591 }
592
593 void GetElementPtrInst::init(Value *Ptr, Value *Idx0, Value *Idx1) {
594   NumOperands = 3;
595   Use *OL = OperandList = new Use[3];
596   OL[0].init(Ptr, this);
597   OL[1].init(Idx0, this);
598   OL[2].init(Idx1, this);
599 }
600
601 GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
602                                      const std::string &Name, Instruction *InBe)
603   : Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
604                                                           Idx, true))),
605                 GetElementPtr, 0, 0, Name, InBe) {
606   init(Ptr, Idx);
607 }
608
609 GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
610                                      const std::string &Name, BasicBlock *IAE)
611   : Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
612                                                           Idx, true))),
613                 GetElementPtr, 0, 0, Name, IAE) {
614   init(Ptr, Idx);
615 }
616
617 GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
618                                      const std::string &Name, Instruction *InBe)
619   : Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
620                                                           Idx0, Idx1, true))),
621                 GetElementPtr, 0, 0, Name, InBe) {
622   init(Ptr, Idx0, Idx1);
623 }
624
625 GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
626                                      const std::string &Name, BasicBlock *IAE)
627   : Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
628                                                           Idx0, Idx1, true))),
629                 GetElementPtr, 0, 0, Name, IAE) {
630   init(Ptr, Idx0, Idx1);
631 }
632
633 GetElementPtrInst::~GetElementPtrInst() {
634   delete[] OperandList;
635 }
636
637 // getIndexedType - Returns the type of the element that would be loaded with
638 // a load instruction with the specified parameters.
639 //
640 // A null type is returned if the indices are invalid for the specified 
641 // pointer type.
642 //
643 const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, 
644                                               const std::vector<Value*> &Idx,
645                                               bool AllowCompositeLeaf) {
646   if (!isa<PointerType>(Ptr)) return 0;   // Type isn't a pointer type!
647
648   // Handle the special case of the empty set index set...
649   if (Idx.empty())
650     if (AllowCompositeLeaf ||
651         cast<PointerType>(Ptr)->getElementType()->isFirstClassType())
652       return cast<PointerType>(Ptr)->getElementType();
653     else
654       return 0;
655  
656   unsigned CurIdx = 0;
657   while (const CompositeType *CT = dyn_cast<CompositeType>(Ptr)) {
658     if (Idx.size() == CurIdx) {
659       if (AllowCompositeLeaf || CT->isFirstClassType()) return Ptr;
660       return 0;   // Can't load a whole structure or array!?!?
661     }
662
663     Value *Index = Idx[CurIdx++];
664     if (isa<PointerType>(CT) && CurIdx != 1)
665       return 0;  // Can only index into pointer types at the first index!
666     if (!CT->indexValid(Index)) return 0;
667     Ptr = CT->getTypeAtIndex(Index);
668
669     // If the new type forwards to another type, then it is in the middle
670     // of being refined to another type (and hence, may have dropped all
671     // references to what it was using before).  So, use the new forwarded
672     // type.
673     if (const Type * Ty = Ptr->getForwardedType()) {
674       Ptr = Ty;
675     }
676   }
677   return CurIdx == Idx.size() ? Ptr : 0;
678 }
679
680 const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, 
681                                               Value *Idx0, Value *Idx1,
682                                               bool AllowCompositeLeaf) {
683   const PointerType *PTy = dyn_cast<PointerType>(Ptr);
684   if (!PTy) return 0;   // Type isn't a pointer type!
685
686   // Check the pointer index.
687   if (!PTy->indexValid(Idx0)) return 0;
688
689   const CompositeType *CT = dyn_cast<CompositeType>(PTy->getElementType());
690   if (!CT || !CT->indexValid(Idx1)) return 0;
691
692   const Type *ElTy = CT->getTypeAtIndex(Idx1);
693   if (AllowCompositeLeaf || ElTy->isFirstClassType())
694     return ElTy;
695   return 0;
696 }
697
698 //===----------------------------------------------------------------------===//
699 //                             BinaryOperator Class
700 //===----------------------------------------------------------------------===//
701
702 void BinaryOperator::init(BinaryOps iType)
703 {
704   Value *LHS = getOperand(0), *RHS = getOperand(1);
705   assert(LHS->getType() == RHS->getType() &&
706          "Binary operator operand types must match!");
707 #ifndef NDEBUG
708   switch (iType) {
709   case Add: case Sub:
710   case Mul: case Div:
711   case Rem:
712     assert(getType() == LHS->getType() &&
713            "Arithmetic operation should return same type as operands!");
714     assert((getType()->isInteger() || 
715             getType()->isFloatingPoint() || 
716             isa<PackedType>(getType()) ) && 
717           "Tried to create an arithmetic operation on a non-arithmetic type!");
718     break;
719   case And: case Or:
720   case Xor:
721     assert(getType() == LHS->getType() &&
722            "Logical operation should return same type as operands!");
723     assert(getType()->isIntegral() &&
724            "Tried to create a logical operation on a non-integral type!");
725     break;
726   case SetLT: case SetGT: case SetLE:
727   case SetGE: case SetEQ: case SetNE:
728     assert(getType() == Type::BoolTy && "Setcc must return bool!");
729   default:
730     break;
731   }
732 #endif
733 }
734
735 BinaryOperator *BinaryOperator::create(BinaryOps Op, Value *S1, Value *S2,
736                                        const std::string &Name,
737                                        Instruction *InsertBefore) {
738   assert(S1->getType() == S2->getType() &&
739          "Cannot create binary operator with two operands of differing type!");
740   switch (Op) {
741   // Binary comparison operators...
742   case SetLT: case SetGT: case SetLE:
743   case SetGE: case SetEQ: case SetNE:
744     return new SetCondInst(Op, S1, S2, Name, InsertBefore);
745
746   default:
747     return new BinaryOperator(Op, S1, S2, S1->getType(), Name, InsertBefore);
748   }
749 }
750
751 BinaryOperator *BinaryOperator::create(BinaryOps Op, Value *S1, Value *S2,
752                                        const std::string &Name,
753                                        BasicBlock *InsertAtEnd) {
754   BinaryOperator *Res = create(Op, S1, S2, Name);
755   InsertAtEnd->getInstList().push_back(Res);
756   return Res;
757 }
758
759 BinaryOperator *BinaryOperator::createNeg(Value *Op, const std::string &Name,
760                                           Instruction *InsertBefore) {
761   if (!Op->getType()->isFloatingPoint())
762     return new BinaryOperator(Instruction::Sub,
763                               Constant::getNullValue(Op->getType()), Op,
764                               Op->getType(), Name, InsertBefore);
765   else
766     return new BinaryOperator(Instruction::Sub,
767                               ConstantFP::get(Op->getType(), -0.0), Op,
768                               Op->getType(), Name, InsertBefore);
769 }
770
771 BinaryOperator *BinaryOperator::createNeg(Value *Op, const std::string &Name,
772                                           BasicBlock *InsertAtEnd) {
773   if (!Op->getType()->isFloatingPoint())
774     return new BinaryOperator(Instruction::Sub,
775                               Constant::getNullValue(Op->getType()), Op,
776                               Op->getType(), Name, InsertAtEnd);
777   else
778     return new BinaryOperator(Instruction::Sub,
779                               ConstantFP::get(Op->getType(), -0.0), Op,
780                               Op->getType(), Name, InsertAtEnd);
781 }
782
783 BinaryOperator *BinaryOperator::createNot(Value *Op, const std::string &Name,
784                                           Instruction *InsertBefore) {
785   return new BinaryOperator(Instruction::Xor, Op,
786                             ConstantIntegral::getAllOnesValue(Op->getType()),
787                             Op->getType(), Name, InsertBefore);
788 }
789
790 BinaryOperator *BinaryOperator::createNot(Value *Op, const std::string &Name,
791                                           BasicBlock *InsertAtEnd) {
792   return new BinaryOperator(Instruction::Xor, Op,
793                             ConstantIntegral::getAllOnesValue(Op->getType()),
794                             Op->getType(), Name, InsertAtEnd);
795 }
796
797
798 // isConstantAllOnes - Helper function for several functions below
799 static inline bool isConstantAllOnes(const Value *V) {
800   return isa<ConstantIntegral>(V) &&cast<ConstantIntegral>(V)->isAllOnesValue();
801 }
802
803 bool BinaryOperator::isNeg(const Value *V) {
804   if (const BinaryOperator *Bop = dyn_cast<BinaryOperator>(V))
805     if (Bop->getOpcode() == Instruction::Sub)
806       if (!V->getType()->isFloatingPoint())
807         return Bop->getOperand(0) == Constant::getNullValue(Bop->getType());
808       else
809         return Bop->getOperand(0) == ConstantFP::get(Bop->getType(), -0.0);
810   return false;
811 }
812
813 bool BinaryOperator::isNot(const Value *V) {
814   if (const BinaryOperator *Bop = dyn_cast<BinaryOperator>(V))
815     return (Bop->getOpcode() == Instruction::Xor &&
816             (isConstantAllOnes(Bop->getOperand(1)) ||
817              isConstantAllOnes(Bop->getOperand(0))));
818   return false;
819 }
820
821 Value *BinaryOperator::getNegArgument(BinaryOperator *Bop) {
822   assert(isNeg(Bop) && "getNegArgument from non-'neg' instruction!");
823   return Bop->getOperand(1);
824 }
825
826 const Value *BinaryOperator::getNegArgument(const BinaryOperator *Bop) {
827   return getNegArgument((BinaryOperator*)Bop);
828 }
829
830 Value *BinaryOperator::getNotArgument(BinaryOperator *Bop) {
831   assert(isNot(Bop) && "getNotArgument on non-'not' instruction!");
832   Value *Op0 = Bop->getOperand(0);
833   Value *Op1 = Bop->getOperand(1);
834   if (isConstantAllOnes(Op0)) return Op1;
835
836   assert(isConstantAllOnes(Op1));
837   return Op0;
838 }
839
840 const Value *BinaryOperator::getNotArgument(const BinaryOperator *Bop) {
841   return getNotArgument((BinaryOperator*)Bop);
842 }
843
844
845 // swapOperands - Exchange the two operands to this instruction.  This
846 // instruction is safe to use on any binary instruction and does not
847 // modify the semantics of the instruction.  If the instruction is
848 // order dependent (SetLT f.e.) the opcode is changed.
849 //
850 bool BinaryOperator::swapOperands() {
851   if (isCommutative())
852     ;  // If the instruction is commutative, it is safe to swap the operands
853   else if (SetCondInst *SCI = dyn_cast<SetCondInst>(this))
854     /// FIXME: SetCC instructions shouldn't all have different opcodes.
855     setOpcode(SCI->getSwappedCondition());
856   else
857     return true;   // Can't commute operands
858
859   std::swap(Ops[0], Ops[1]);
860   return false;
861 }
862
863
864 //===----------------------------------------------------------------------===//
865 //                             SetCondInst Class
866 //===----------------------------------------------------------------------===//
867
868 SetCondInst::SetCondInst(BinaryOps Opcode, Value *S1, Value *S2, 
869                          const std::string &Name, Instruction *InsertBefore)
870   : BinaryOperator(Opcode, S1, S2, Type::BoolTy, Name, InsertBefore) {
871
872   // Make sure it's a valid type... getInverseCondition will assert out if not.
873   assert(getInverseCondition(Opcode));
874 }
875
876 SetCondInst::SetCondInst(BinaryOps Opcode, Value *S1, Value *S2, 
877                          const std::string &Name, BasicBlock *InsertAtEnd)
878   : BinaryOperator(Opcode, S1, S2, Type::BoolTy, Name, InsertAtEnd) {
879
880   // Make sure it's a valid type... getInverseCondition will assert out if not.
881   assert(getInverseCondition(Opcode));
882 }
883
884 // getInverseCondition - Return the inverse of the current condition opcode.
885 // For example seteq -> setne, setgt -> setle, setlt -> setge, etc...
886 //
887 Instruction::BinaryOps SetCondInst::getInverseCondition(BinaryOps Opcode) {
888   switch (Opcode) {
889   default:
890     assert(0 && "Unknown setcc opcode!");
891   case SetEQ: return SetNE;
892   case SetNE: return SetEQ;
893   case SetGT: return SetLE;
894   case SetLT: return SetGE;
895   case SetGE: return SetLT;
896   case SetLE: return SetGT;
897   }
898 }
899
900 // getSwappedCondition - Return the condition opcode that would be the result
901 // of exchanging the two operands of the setcc instruction without changing
902 // the result produced.  Thus, seteq->seteq, setle->setge, setlt->setgt, etc.
903 //
904 Instruction::BinaryOps SetCondInst::getSwappedCondition(BinaryOps Opcode) {
905   switch (Opcode) {
906   default: assert(0 && "Unknown setcc instruction!");
907   case SetEQ: case SetNE: return Opcode;
908   case SetGT: return SetLT;
909   case SetLT: return SetGT;
910   case SetGE: return SetLE;
911   case SetLE: return SetGE;
912   }
913 }
914
915 //===----------------------------------------------------------------------===//
916 //                        SwitchInst Implementation
917 //===----------------------------------------------------------------------===//
918
919 void SwitchInst::init(Value *Value, BasicBlock *Default, unsigned NumCases) {
920   assert(Value && Default);
921   ReservedSpace = 2+NumCases*2;
922   NumOperands = 2;
923   OperandList = new Use[ReservedSpace];
924
925   OperandList[0].init(Value, this);
926   OperandList[1].init(Default, this);
927 }
928
929 SwitchInst::SwitchInst(const SwitchInst &SI) 
930   : TerminatorInst(Instruction::Switch, new Use[SI.getNumOperands()],
931                    SI.getNumOperands()) {
932   Use *OL = OperandList, *InOL = SI.OperandList;
933   for (unsigned i = 0, E = SI.getNumOperands(); i != E; i+=2) {
934     OL[i].init(InOL[i], this);
935     OL[i+1].init(InOL[i+1], this);
936   }
937 }
938
939 SwitchInst::~SwitchInst() {
940   delete [] OperandList;
941 }
942
943
944 /// addCase - Add an entry to the switch instruction...
945 ///
946 void SwitchInst::addCase(Constant *OnVal, BasicBlock *Dest) {
947   unsigned OpNo = NumOperands;
948   if (OpNo+2 > ReservedSpace)
949     resizeOperands(0);  // Get more space!
950   // Initialize some new operands.
951   NumOperands = OpNo+2;
952   OperandList[OpNo].init(OnVal, this);
953   OperandList[OpNo+1].init(Dest, this);
954 }
955
956 /// removeCase - This method removes the specified successor from the switch
957 /// instruction.  Note that this cannot be used to remove the default
958 /// destination (successor #0).
959 ///
960 void SwitchInst::removeCase(unsigned idx) {
961   assert(idx != 0 && "Cannot remove the default case!");
962   assert(idx*2 < getNumOperands() && "Successor index out of range!!!");
963
964   unsigned NumOps = getNumOperands();
965   Use *OL = OperandList;
966
967   // Move everything after this operand down.
968   //
969   // FIXME: we could just swap with the end of the list, then erase.  However,
970   // client might not expect this to happen.  The code as it is thrashes the
971   // use/def lists, which is kinda lame.
972   for (unsigned i = (idx+1)*2; i != NumOps; i += 2) {
973     OL[i-2] = OL[i];
974     OL[i-2+1] = OL[i+1];
975   }
976
977   // Nuke the last value.
978   OL[NumOps-2].set(0);
979   OL[NumOps-2+1].set(0);
980   NumOperands = NumOps-2;
981 }
982
983 /// resizeOperands - resize operands - This adjusts the length of the operands
984 /// list according to the following behavior:
985 ///   1. If NumOps == 0, grow the operand list in response to a push_back style
986 ///      of operation.  This grows the number of ops by 1.5 times.
987 ///   2. If NumOps > NumOperands, reserve space for NumOps operands.
988 ///   3. If NumOps == NumOperands, trim the reserved space.
989 ///
990 void SwitchInst::resizeOperands(unsigned NumOps) {
991   if (NumOps == 0) {
992     NumOps = (getNumOperands())*3/2;
993   } else if (NumOps*2 > NumOperands) {
994     // No resize needed.
995     if (ReservedSpace >= NumOps) return;
996   } else if (NumOps == NumOperands) {
997     if (ReservedSpace == NumOps) return;
998   } else {
999     return;        
1000   }
1001
1002   ReservedSpace = NumOps;
1003   Use *NewOps = new Use[NumOps];
1004   Use *OldOps = OperandList;
1005   for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
1006       NewOps[i].init(OldOps[i], this);
1007       OldOps[i].set(0);
1008   }
1009   delete [] OldOps;
1010   OperandList = NewOps;
1011 }
1012
1013
1014 BasicBlock *SwitchInst::getSuccessorV(unsigned idx) const {
1015   return getSuccessor(idx);
1016 }
1017 unsigned SwitchInst::getNumSuccessorsV() const {
1018   return getNumSuccessors();
1019 }
1020 void SwitchInst::setSuccessorV(unsigned idx, BasicBlock *B) {
1021   setSuccessor(idx, B);
1022 }
1023
1024
1025 // Define these methods here so vtables don't get emitted into every translation
1026 // unit that uses these classes.
1027
1028 GetElementPtrInst *GetElementPtrInst::clone() const {
1029   return new GetElementPtrInst(*this);
1030 }
1031
1032 BinaryOperator *BinaryOperator::clone() const {
1033   return create(getOpcode(), Ops[0], Ops[1]);
1034 }
1035
1036 MallocInst *MallocInst::clone() const { return new MallocInst(*this); }
1037 AllocaInst *AllocaInst::clone() const { return new AllocaInst(*this); }
1038 FreeInst   *FreeInst::clone()   const { return new FreeInst(getOperand(0)); }
1039 LoadInst   *LoadInst::clone()   const { return new LoadInst(*this); }
1040 StoreInst  *StoreInst::clone()  const { return new StoreInst(*this); }
1041 CastInst   *CastInst::clone()   const { return new CastInst(*this); }
1042 CallInst   *CallInst::clone()   const { return new CallInst(*this); }
1043 ShiftInst  *ShiftInst::clone()  const { return new ShiftInst(*this); }
1044 SelectInst *SelectInst::clone() const { return new SelectInst(*this); }
1045 VANextInst *VANextInst::clone() const { return new VANextInst(*this); }
1046 VAArgInst  *VAArgInst::clone()  const { return new VAArgInst(*this); }
1047 PHINode    *PHINode::clone()    const { return new PHINode(*this); }
1048 ReturnInst *ReturnInst::clone() const { return new ReturnInst(*this); }
1049 BranchInst *BranchInst::clone() const { return new BranchInst(*this); }
1050 SwitchInst *SwitchInst::clone() const { return new SwitchInst(*this); }
1051 InvokeInst *InvokeInst::clone() const { return new InvokeInst(*this); }
1052 UnwindInst *UnwindInst::clone() const { return new UnwindInst(); }
1053 UnreachableInst *UnreachableInst::clone() const { return new UnreachableInst();}