Commit 44487 broke bootstrap of llvm-gcc-4.2. It is
[oota-llvm.git] / lib / VMCore / Instruction.cpp
1 //===-- Instruction.cpp - Implement the Instruction class -----------------===//
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 the Instruction class for the VMCore library.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Type.h"
15 #include "llvm/Instructions.h"
16 #include "llvm/IntrinsicInst.h" // FIXME: remove
17 #include "llvm/Function.h"
18 #include "llvm/Support/CallSite.h"
19 #include "llvm/Support/LeakDetector.h"
20 using namespace llvm;
21
22 Instruction::Instruction(const Type *ty, unsigned it, Use *Ops, unsigned NumOps,
23                          Instruction *InsertBefore)
24   : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0) {
25   // Make sure that we get added to a basicblock
26   LeakDetector::addGarbageObject(this);
27
28   // If requested, insert this instruction into a basic block...
29   if (InsertBefore) {
30     assert(InsertBefore->getParent() &&
31            "Instruction to insert before is not in a basic block!");
32     InsertBefore->getParent()->getInstList().insert(InsertBefore, this);
33   }
34 }
35
36 Instruction::Instruction(const Type *ty, unsigned it, Use *Ops, unsigned NumOps,
37                          BasicBlock *InsertAtEnd)
38   : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0) {
39   // Make sure that we get added to a basicblock
40   LeakDetector::addGarbageObject(this);
41
42   // append this instruction into the basic block
43   assert(InsertAtEnd && "Basic block to append to may not be NULL!");
44   InsertAtEnd->getInstList().push_back(this);
45 }
46
47
48 // Out of line virtual method, so the vtable, etc has a home.
49 Instruction::~Instruction() {
50   assert(Parent == 0 && "Instruction still linked in the program!");
51 }
52
53
54 void Instruction::setParent(BasicBlock *P) {
55   if (getParent()) {
56     if (!P) LeakDetector::addGarbageObject(this);
57   } else {
58     if (P) LeakDetector::removeGarbageObject(this);
59   }
60
61   Parent = P;
62 }
63
64 void Instruction::removeFromParent() {
65   getParent()->getInstList().remove(this);
66 }
67
68 void Instruction::eraseFromParent() {
69   getParent()->getInstList().erase(this);
70 }
71
72 /// moveBefore - Unlink this instruction from its current basic block and
73 /// insert it into the basic block that MovePos lives in, right before
74 /// MovePos.
75 void Instruction::moveBefore(Instruction *MovePos) {
76   MovePos->getParent()->getInstList().splice(MovePos,getParent()->getInstList(),
77                                              this);
78 }
79
80
81 const char *Instruction::getOpcodeName(unsigned OpCode) {
82   switch (OpCode) {
83   // Terminators
84   case Ret:    return "ret";
85   case Br:     return "br";
86   case Switch: return "switch";
87   case Invoke: return "invoke";
88   case Unwind: return "unwind";
89   case Unreachable: return "unreachable";
90
91   // Standard binary operators...
92   case Add: return "add";
93   case Sub: return "sub";
94   case Mul: return "mul";
95   case UDiv: return "udiv";
96   case SDiv: return "sdiv";
97   case FDiv: return "fdiv";
98   case URem: return "urem";
99   case SRem: return "srem";
100   case FRem: return "frem";
101
102   // Logical operators...
103   case And: return "and";
104   case Or : return "or";
105   case Xor: return "xor";
106
107   // Memory instructions...
108   case Malloc:        return "malloc";
109   case Free:          return "free";
110   case Alloca:        return "alloca";
111   case Load:          return "load";
112   case Store:         return "store";
113   case GetElementPtr: return "getelementptr";
114
115   // Convert instructions...
116   case Trunc:     return "trunc";
117   case ZExt:      return "zext";
118   case SExt:      return "sext";
119   case FPTrunc:   return "fptrunc";
120   case FPExt:     return "fpext";
121   case FPToUI:    return "fptoui";
122   case FPToSI:    return "fptosi";
123   case UIToFP:    return "uitofp";
124   case SIToFP:    return "sitofp";
125   case IntToPtr:  return "inttoptr";
126   case PtrToInt:  return "ptrtoint";
127   case BitCast:   return "bitcast";
128
129   // Other instructions...
130   case ICmp:           return "icmp";
131   case FCmp:           return "fcmp";
132   case PHI:            return "phi";
133   case Select:         return "select";
134   case Call:           return "call";
135   case Shl:            return "shl";
136   case LShr:           return "lshr";
137   case AShr:           return "ashr";
138   case VAArg:          return "va_arg";
139   case ExtractElement: return "extractelement";
140   case InsertElement:  return "insertelement";
141   case ShuffleVector:  return "shufflevector";
142
143   default: return "<Invalid operator> ";
144   }
145
146   return 0;
147 }
148
149 /// isIdenticalTo - Return true if the specified instruction is exactly
150 /// identical to the current one.  This means that all operands match and any
151 /// extra information (e.g. load is volatile) agree.
152 bool Instruction::isIdenticalTo(Instruction *I) const {
153   if (getOpcode() != I->getOpcode() ||
154       getNumOperands() != I->getNumOperands() ||
155       getType() != I->getType())
156     return false;
157
158   // We have two instructions of identical opcode and #operands.  Check to see
159   // if all operands are the same.
160   for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
161     if (getOperand(i) != I->getOperand(i))
162       return false;
163
164   // Check special state that is a part of some instructions.
165   if (const LoadInst *LI = dyn_cast<LoadInst>(this))
166     return LI->isVolatile() == cast<LoadInst>(I)->isVolatile();
167   if (const StoreInst *SI = dyn_cast<StoreInst>(this))
168     return SI->isVolatile() == cast<StoreInst>(I)->isVolatile();
169   if (const CmpInst *CI = dyn_cast<CmpInst>(this))
170     return CI->getPredicate() == cast<CmpInst>(I)->getPredicate();
171   if (const CallInst *CI = dyn_cast<CallInst>(this))
172     return CI->isTailCall() == cast<CallInst>(I)->isTailCall();
173   return true;
174 }
175
176 // isSameOperationAs
177 bool Instruction::isSameOperationAs(Instruction *I) const {
178   if (getOpcode() != I->getOpcode() || getType() != I->getType() ||
179       getNumOperands() != I->getNumOperands())
180     return false;
181
182   // We have two instructions of identical opcode and #operands.  Check to see
183   // if all operands are the same type
184   for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
185     if (getOperand(i)->getType() != I->getOperand(i)->getType())
186       return false;
187
188   // Check special state that is a part of some instructions.
189   if (const LoadInst *LI = dyn_cast<LoadInst>(this))
190     return LI->isVolatile() == cast<LoadInst>(I)->isVolatile();
191   if (const StoreInst *SI = dyn_cast<StoreInst>(this))
192     return SI->isVolatile() == cast<StoreInst>(I)->isVolatile();
193   if (const CmpInst *CI = dyn_cast<CmpInst>(this))
194     return CI->getPredicate() == cast<CmpInst>(I)->getPredicate();
195   if (const CallInst *CI = dyn_cast<CallInst>(this))
196     return CI->isTailCall() == cast<CallInst>(I)->isTailCall();
197
198   return true;
199 }
200
201 /// mayWriteToMemory - Return true if this instruction may modify memory.
202 ///
203 bool Instruction::mayWriteToMemory() const {
204   switch (getOpcode()) {
205   default: return false;
206   case Instruction::Free:
207   case Instruction::Invoke:
208   case Instruction::Store:
209   case Instruction::VAArg:
210     return true;
211   case Instruction::Call:
212     if (!isa<IntrinsicInst>(this))
213       return true; // FIXME: workaround gcc bootstrap breakage
214     return !cast<CallInst>(this)->onlyReadsMemory();
215   case Instruction::Load:
216     return cast<LoadInst>(this)->isVolatile();
217   }
218 }
219
220 /// isAssociative - Return true if the instruction is associative:
221 ///
222 ///   Associative operators satisfy:  x op (y op z) === (x op y) op z)
223 ///
224 /// In LLVM, the Add, Mul, And, Or, and Xor operators are associative, when not
225 /// applied to floating point types.
226 ///
227 bool Instruction::isAssociative(unsigned Opcode, const Type *Ty) {
228   if (Opcode == And || Opcode == Or || Opcode == Xor)
229     return true;
230
231   // Add/Mul reassociate unless they are FP or FP vectors.
232   if (Opcode == Add || Opcode == Mul)
233     return !Ty->isFPOrFPVector();
234   return 0;
235 }
236
237 /// isCommutative - Return true if the instruction is commutative:
238 ///
239 ///   Commutative operators satisfy: (x op y) === (y op x)
240 ///
241 /// In LLVM, these are the associative operators, plus SetEQ and SetNE, when
242 /// applied to any type.
243 ///
244 bool Instruction::isCommutative(unsigned op) {
245   switch (op) {
246   case Add:
247   case Mul:
248   case And:
249   case Or:
250   case Xor:
251     return true;
252   default:
253     return false;
254   }
255 }
256
257 /// isTrappingInstruction - Return true if the instruction may trap.
258 ///
259 bool Instruction::isTrapping(unsigned op) {
260   switch(op) {
261   case UDiv:
262   case SDiv:
263   case FDiv:
264   case URem:
265   case SRem:
266   case FRem:
267   case Load:
268   case Store:
269   case Call:
270   case Invoke:
271     return true;
272   default:
273     return false;
274   }
275 }