blob: d31a92e0317fb875c398539434e518d1032ce3a0 [file] [log] [blame]
Chris Lattnercf3056d2003-10-13 03:32:08 +00001//===-- Instruction.cpp - Implement the Instruction class -----------------===//
Misha Brukmanfd939082005-04-21 23:48:37 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanfd939082005-04-21 23:48:37 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner00950542001-06-06 20:29:01 +00009//
Chandler Carruthc2c50cd2013-01-02 09:10:48 +000010// This file implements the Instruction class for the IR library.
Chris Lattner00950542001-06-06 20:29:01 +000011//
12//===----------------------------------------------------------------------===//
13
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000014#include "llvm/IR/Instruction.h"
Stephen Hines36b56882014-04-23 16:57:46 -070015#include "llvm/IR/CallSite.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000016#include "llvm/IR/Constants.h"
17#include "llvm/IR/Instructions.h"
Stephen Hines36b56882014-04-23 16:57:46 -070018#include "llvm/IR/LeakDetector.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000019#include "llvm/IR/Module.h"
20#include "llvm/IR/Operator.h"
21#include "llvm/IR/Type.h"
Chris Lattner4b74c832003-11-20 17:45:12 +000022using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000023
Chris Lattnerdb125cf2011-07-18 04:54:35 +000024Instruction::Instruction(Type *ty, unsigned it, Use *Ops, unsigned NumOps,
Chris Lattner910c80a2007-02-24 00:55:48 +000025 Instruction *InsertBefore)
Chris Lattner61336ae2010-04-01 05:23:13 +000026 : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0) {
Chris Lattnerd1e693f2002-09-08 18:59:35 +000027 // Make sure that we get added to a basicblock
28 LeakDetector::addGarbageObject(this);
Chris Lattner2aa83112002-09-10 15:45:53 +000029
30 // If requested, insert this instruction into a basic block...
31 if (InsertBefore) {
32 assert(InsertBefore->getParent() &&
33 "Instruction to insert before is not in a basic block!");
34 InsertBefore->getParent()->getInstList().insert(InsertBefore, this);
35 }
Chris Lattner00950542001-06-06 20:29:01 +000036}
37
Stephen Hines36b56882014-04-23 16:57:46 -070038const DataLayout *Instruction::getDataLayout() const {
39 return getParent()->getDataLayout();
40}
41
Chris Lattnerdb125cf2011-07-18 04:54:35 +000042Instruction::Instruction(Type *ty, unsigned it, Use *Ops, unsigned NumOps,
Chris Lattner910c80a2007-02-24 00:55:48 +000043 BasicBlock *InsertAtEnd)
Chris Lattner61336ae2010-04-01 05:23:13 +000044 : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0) {
Chris Lattner96d83f62005-01-29 00:35:33 +000045 // Make sure that we get added to a basicblock
46 LeakDetector::addGarbageObject(this);
Alkis Evlogimenose5828f12004-05-26 21:41:09 +000047
48 // append this instruction into the basic block
49 assert(InsertAtEnd && "Basic block to append to may not be NULL!");
50 InsertAtEnd->getInstList().push_back(this);
Chris Lattnerf00042a2007-02-13 07:54:42 +000051}
52
53
Chris Lattner70aa33e2006-06-21 16:53:47 +000054// Out of line virtual method, so the vtable, etc has a home.
Gordon Henriksenafba8fe2007-12-10 02:14:30 +000055Instruction::~Instruction() {
Devang Patelf9e0a222009-09-24 16:19:11 +000056 assert(Parent == 0 && "Instruction still linked in the program!");
Dan Gohman4f1be4a2010-07-20 22:25:04 +000057 if (hasMetadataHashEntry())
58 clearMetadataHashEntries();
Chris Lattner70aa33e2006-06-21 16:53:47 +000059}
60
61
Chris Lattnerbded1322002-09-06 21:33:15 +000062void Instruction::setParent(BasicBlock *P) {
Chris Lattner786993c2004-02-04 01:06:38 +000063 if (getParent()) {
64 if (!P) LeakDetector::addGarbageObject(this);
65 } else {
66 if (P) LeakDetector::removeGarbageObject(this);
67 }
Chris Lattnerd1e693f2002-09-08 18:59:35 +000068
Chris Lattnerbded1322002-09-06 21:33:15 +000069 Parent = P;
70}
71
Chris Lattner4b833802004-10-11 22:21:39 +000072void Instruction::removeFromParent() {
73 getParent()->getInstList().remove(this);
74}
75
76void Instruction::eraseFromParent() {
77 getParent()->getInstList().erase(this);
78}
Vikram S. Advec1056452002-07-14 23:09:40 +000079
Owen Anderson26bb50a2008-06-17 18:29:27 +000080/// insertBefore - Insert an unlinked instructions into a basic block
81/// immediately before the specified instruction.
82void Instruction::insertBefore(Instruction *InsertPos) {
83 InsertPos->getParent()->getInstList().insert(InsertPos, this);
84}
85
Chris Lattner3ff704f2009-01-13 07:43:51 +000086/// insertAfter - Insert an unlinked instructions into a basic block
87/// immediately after the specified instruction.
88void Instruction::insertAfter(Instruction *InsertPos) {
89 InsertPos->getParent()->getInstList().insertAfter(InsertPos, this);
90}
91
Chris Lattner0fe34d82005-08-08 05:21:50 +000092/// moveBefore - Unlink this instruction from its current basic block and
93/// insert it into the basic block that MovePos lives in, right before
94/// MovePos.
95void Instruction::moveBefore(Instruction *MovePos) {
96 MovePos->getParent()->getInstList().splice(MovePos,getParent()->getInstList(),
97 this);
98}
99
Michael Ilseman125fc7f2012-11-27 00:41:22 +0000100/// Set or clear the unsafe-algebra flag on this instruction, which must be an
101/// operator which supports this flag. See LangRef.html for the meaning of this
102/// flag.
103void Instruction::setHasUnsafeAlgebra(bool B) {
104 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
105 cast<FPMathOperator>(this)->setHasUnsafeAlgebra(B);
106}
107
108/// Set or clear the NoNaNs flag on this instruction, which must be an operator
109/// which supports this flag. See LangRef.html for the meaning of this flag.
110void Instruction::setHasNoNaNs(bool B) {
111 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
112 cast<FPMathOperator>(this)->setHasNoNaNs(B);
113}
114
115/// Set or clear the no-infs flag on this instruction, which must be an operator
116/// which supports this flag. See LangRef.html for the meaning of this flag.
117void Instruction::setHasNoInfs(bool B) {
118 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
119 cast<FPMathOperator>(this)->setHasNoInfs(B);
120}
121
122/// Set or clear the no-signed-zeros flag on this instruction, which must be an
123/// operator which supports this flag. See LangRef.html for the meaning of this
124/// flag.
125void Instruction::setHasNoSignedZeros(bool B) {
126 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
127 cast<FPMathOperator>(this)->setHasNoSignedZeros(B);
128}
129
130/// Set or clear the allow-reciprocal flag on this instruction, which must be an
131/// operator which supports this flag. See LangRef.html for the meaning of this
132/// flag.
133void Instruction::setHasAllowReciprocal(bool B) {
134 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
135 cast<FPMathOperator>(this)->setHasAllowReciprocal(B);
136}
137
138/// Convenience function for setting all the fast-math flags on this
139/// instruction, which must be an operator which supports these flags. See
140/// LangRef.html for the meaning of these flats.
141void Instruction::setFastMathFlags(FastMathFlags FMF) {
142 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
143 cast<FPMathOperator>(this)->setFastMathFlags(FMF);
144}
145
146/// Determine whether the unsafe-algebra flag is set.
147bool Instruction::hasUnsafeAlgebra() const {
148 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
149 return cast<FPMathOperator>(this)->hasUnsafeAlgebra();
150}
151
152/// Determine whether the no-NaNs flag is set.
153bool Instruction::hasNoNaNs() const {
154 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
155 return cast<FPMathOperator>(this)->hasNoNaNs();
156}
157
158/// Determine whether the no-infs flag is set.
159bool Instruction::hasNoInfs() const {
160 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
161 return cast<FPMathOperator>(this)->hasNoInfs();
162}
163
164/// Determine whether the no-signed-zeros flag is set.
165bool Instruction::hasNoSignedZeros() const {
166 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
167 return cast<FPMathOperator>(this)->hasNoSignedZeros();
168}
169
170/// Determine whether the allow-reciprocal flag is set.
171bool Instruction::hasAllowReciprocal() const {
172 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
173 return cast<FPMathOperator>(this)->hasAllowReciprocal();
174}
175
176/// Convenience function for getting all the fast-math flags, which must be an
177/// operator which supports these flags. See LangRef.html for the meaning of
178/// these flats.
179FastMathFlags Instruction::getFastMathFlags() const {
180 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
181 return cast<FPMathOperator>(this)->getFastMathFlags();
182}
Chris Lattner0fe34d82005-08-08 05:21:50 +0000183
Michael Ilseman4b896dd2012-11-29 21:25:12 +0000184/// Copy I's fast-math flags
185void Instruction::copyFastMathFlags(const Instruction *I) {
186 setFastMathFlags(I->getFastMathFlags());
187}
188
189
Vikram S. Advec1056452002-07-14 23:09:40 +0000190const char *Instruction::getOpcodeName(unsigned OpCode) {
191 switch (OpCode) {
192 // Terminators
Chris Lattner0513e9f2002-08-14 18:18:02 +0000193 case Ret: return "ret";
194 case Br: return "br";
Vikram S. Advec1056452002-07-14 23:09:40 +0000195 case Switch: return "switch";
Chris Lattnerab21db72009-10-28 00:19:10 +0000196 case IndirectBr: return "indirectbr";
Vikram S. Advec1056452002-07-14 23:09:40 +0000197 case Invoke: return "invoke";
Bill Wendlingdccc03b2011-07-31 06:30:59 +0000198 case Resume: return "resume";
Chris Lattnerb976e662004-10-16 18:08:06 +0000199 case Unreachable: return "unreachable";
Misha Brukmanfd939082005-04-21 23:48:37 +0000200
Vikram S. Advec1056452002-07-14 23:09:40 +0000201 // Standard binary operators...
202 case Add: return "add";
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000203 case FAdd: return "fadd";
Vikram S. Advec1056452002-07-14 23:09:40 +0000204 case Sub: return "sub";
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000205 case FSub: return "fsub";
Vikram S. Advec1056452002-07-14 23:09:40 +0000206 case Mul: return "mul";
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000207 case FMul: return "fmul";
Reid Spencer1628cec2006-10-26 06:15:43 +0000208 case UDiv: return "udiv";
209 case SDiv: return "sdiv";
210 case FDiv: return "fdiv";
Reid Spencer0a783f72006-11-02 01:53:59 +0000211 case URem: return "urem";
212 case SRem: return "srem";
213 case FRem: return "frem";
Vikram S. Advec1056452002-07-14 23:09:40 +0000214
215 // Logical operators...
216 case And: return "and";
217 case Or : return "or";
218 case Xor: return "xor";
219
Vikram S. Advec1056452002-07-14 23:09:40 +0000220 // Memory instructions...
Vikram S. Advec1056452002-07-14 23:09:40 +0000221 case Alloca: return "alloca";
222 case Load: return "load";
223 case Store: return "store";
Eli Friedmanff030482011-07-28 21:48:00 +0000224 case AtomicCmpXchg: return "cmpxchg";
225 case AtomicRMW: return "atomicrmw";
Eli Friedman47f35132011-07-25 23:16:38 +0000226 case Fence: return "fence";
Vikram S. Advec1056452002-07-14 23:09:40 +0000227 case GetElementPtr: return "getelementptr";
Misha Brukmanfd939082005-04-21 23:48:37 +0000228
Reid Spencer3da59db2006-11-27 01:05:10 +0000229 // Convert instructions...
Matt Arsenault59d3ae62013-11-15 01:34:59 +0000230 case Trunc: return "trunc";
231 case ZExt: return "zext";
232 case SExt: return "sext";
233 case FPTrunc: return "fptrunc";
234 case FPExt: return "fpext";
235 case FPToUI: return "fptoui";
236 case FPToSI: return "fptosi";
237 case UIToFP: return "uitofp";
238 case SIToFP: return "sitofp";
239 case IntToPtr: return "inttoptr";
240 case PtrToInt: return "ptrtoint";
241 case BitCast: return "bitcast";
242 case AddrSpaceCast: return "addrspacecast";
Reid Spencer3da59db2006-11-27 01:05:10 +0000243
Vikram S. Advec1056452002-07-14 23:09:40 +0000244 // Other instructions...
Reid Spencer74f16422006-12-03 06:27:29 +0000245 case ICmp: return "icmp";
246 case FCmp: return "fcmp";
Reid Spencer3da59db2006-11-27 01:05:10 +0000247 case PHI: return "phi";
248 case Select: return "select";
249 case Call: return "call";
250 case Shl: return "shl";
251 case LShr: return "lshr";
252 case AShr: return "ashr";
253 case VAArg: return "va_arg";
Robert Bocchinob52ee7f2006-01-10 19:05:34 +0000254 case ExtractElement: return "extractelement";
Reid Spencer3da59db2006-11-27 01:05:10 +0000255 case InsertElement: return "insertelement";
256 case ShuffleVector: return "shufflevector";
Matthijs Kooijman74b5e072008-05-30 10:31:54 +0000257 case ExtractValue: return "extractvalue";
258 case InsertValue: return "insertvalue";
Bill Wendlinge6e88262011-08-12 20:24:12 +0000259 case LandingPad: return "landingpad";
Chris Lattner8f77dae2003-05-08 02:44:12 +0000260
Vikram S. Advec1056452002-07-14 23:09:40 +0000261 default: return "<Invalid operator> ";
262 }
Vikram S. Advec1056452002-07-14 23:09:40 +0000263}
Chris Lattnerf2da7242002-10-31 04:14:01 +0000264
Chris Lattner38f14552004-11-30 02:51:53 +0000265/// isIdenticalTo - Return true if the specified instruction is exactly
266/// identical to the current one. This means that all operands match and any
267/// extra information (e.g. load is volatile) agree.
Chris Lattnere3a08842008-11-27 08:39:18 +0000268bool Instruction::isIdenticalTo(const Instruction *I) const {
Dan Gohman75b0eda2009-08-25 22:24:20 +0000269 return isIdenticalToWhenDefined(I) &&
Dan Gohman58cfa3b2009-08-25 22:11:20 +0000270 SubclassOptionalData == I->SubclassOptionalData;
271}
272
Dan Gohman75b0eda2009-08-25 22:24:20 +0000273/// isIdenticalToWhenDefined - This is like isIdenticalTo, except that it
Dan Gohman58cfa3b2009-08-25 22:11:20 +0000274/// ignores the SubclassOptionalData flags, which specify conditions
275/// under which the instruction's result is undefined.
276bool Instruction::isIdenticalToWhenDefined(const Instruction *I) const {
Chris Lattner38f14552004-11-30 02:51:53 +0000277 if (getOpcode() != I->getOpcode() ||
278 getNumOperands() != I->getNumOperands() ||
279 getType() != I->getType())
280 return false;
281
282 // We have two instructions of identical opcode and #operands. Check to see
283 // if all operands are the same.
Stephen Hines36b56882014-04-23 16:57:46 -0700284 if (!std::equal(op_begin(), op_end(), I->op_begin()))
285 return false;
Chris Lattner38f14552004-11-30 02:51:53 +0000286
287 // Check special state that is a part of some instructions.
288 if (const LoadInst *LI = dyn_cast<LoadInst>(this))
Dan Gohman9a8af452008-10-16 01:24:45 +0000289 return LI->isVolatile() == cast<LoadInst>(I)->isVolatile() &&
Eli Friedmane5e77122011-08-15 21:00:18 +0000290 LI->getAlignment() == cast<LoadInst>(I)->getAlignment() &&
291 LI->getOrdering() == cast<LoadInst>(I)->getOrdering() &&
292 LI->getSynchScope() == cast<LoadInst>(I)->getSynchScope();
Chris Lattner38f14552004-11-30 02:51:53 +0000293 if (const StoreInst *SI = dyn_cast<StoreInst>(this))
Dan Gohman9a8af452008-10-16 01:24:45 +0000294 return SI->isVolatile() == cast<StoreInst>(I)->isVolatile() &&
Eli Friedmane5e77122011-08-15 21:00:18 +0000295 SI->getAlignment() == cast<StoreInst>(I)->getAlignment() &&
296 SI->getOrdering() == cast<StoreInst>(I)->getOrdering() &&
297 SI->getSynchScope() == cast<StoreInst>(I)->getSynchScope();
Reid Spencere4d87aa2006-12-23 06:05:41 +0000298 if (const CmpInst *CI = dyn_cast<CmpInst>(this))
299 return CI->getPredicate() == cast<CmpInst>(I)->getPredicate();
Chris Lattnerddb6db42005-05-06 05:51:46 +0000300 if (const CallInst *CI = dyn_cast<CallInst>(this))
Dan Gohman9a8af452008-10-16 01:24:45 +0000301 return CI->isTailCall() == cast<CallInst>(I)->isTailCall() &&
302 CI->getCallingConv() == cast<CallInst>(I)->getCallingConv() &&
Nick Lewyckyf6c63c22011-01-26 09:23:19 +0000303 CI->getAttributes() == cast<CallInst>(I)->getAttributes();
Dan Gohman9a8af452008-10-16 01:24:45 +0000304 if (const InvokeInst *CI = dyn_cast<InvokeInst>(this))
Nick Lewycky41fe88b2008-10-27 07:28:44 +0000305 return CI->getCallingConv() == cast<InvokeInst>(I)->getCallingConv() &&
Nick Lewyckyf6c63c22011-01-26 09:23:19 +0000306 CI->getAttributes() == cast<InvokeInst>(I)->getAttributes();
Jay Foadfc6d3a42011-07-13 10:26:04 +0000307 if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(this))
308 return IVI->getIndices() == cast<InsertValueInst>(I)->getIndices();
309 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(this))
310 return EVI->getIndices() == cast<ExtractValueInst>(I)->getIndices();
Eli Friedman8a552bb2011-07-27 01:08:30 +0000311 if (const FenceInst *FI = dyn_cast<FenceInst>(this))
312 return FI->getOrdering() == cast<FenceInst>(FI)->getOrdering() &&
313 FI->getSynchScope() == cast<FenceInst>(FI)->getSynchScope();
Eli Friedman55ba8162011-07-29 03:05:32 +0000314 if (const AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(this))
315 return CXI->isVolatile() == cast<AtomicCmpXchgInst>(I)->isVolatile() &&
Stephen Hines36b56882014-04-23 16:57:46 -0700316 CXI->getSuccessOrdering() ==
317 cast<AtomicCmpXchgInst>(I)->getSuccessOrdering() &&
318 CXI->getFailureOrdering() ==
319 cast<AtomicCmpXchgInst>(I)->getFailureOrdering() &&
Eli Friedman55ba8162011-07-29 03:05:32 +0000320 CXI->getSynchScope() == cast<AtomicCmpXchgInst>(I)->getSynchScope();
321 if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(this))
322 return RMWI->getOperation() == cast<AtomicRMWInst>(I)->getOperation() &&
323 RMWI->isVolatile() == cast<AtomicRMWInst>(I)->isVolatile() &&
324 RMWI->getOrdering() == cast<AtomicRMWInst>(I)->getOrdering() &&
325 RMWI->getSynchScope() == cast<AtomicRMWInst>(I)->getSynchScope();
Joel Jones9df72a92012-05-10 15:59:41 +0000326 if (const PHINode *thisPHI = dyn_cast<PHINode>(this)) {
327 const PHINode *otherPHI = cast<PHINode>(I);
Stephen Hines36b56882014-04-23 16:57:46 -0700328 return std::equal(thisPHI->block_begin(), thisPHI->block_end(),
329 otherPHI->block_begin());
Joel Jones9df72a92012-05-10 15:59:41 +0000330 }
Chris Lattner38f14552004-11-30 02:51:53 +0000331 return true;
332}
333
Reid Spencere4d87aa2006-12-23 06:05:41 +0000334// isSameOperationAs
Dan Gohman194ae782009-06-12 19:03:05 +0000335// This should be kept in sync with isEquivalentOperation in
336// lib/Transforms/IPO/MergeFunctions.cpp.
Hal Finkelec4e85e2012-06-28 05:42:26 +0000337bool Instruction::isSameOperationAs(const Instruction *I,
338 unsigned flags) const {
339 bool IgnoreAlignment = flags & CompareIgnoringAlignment;
340 bool UseScalarTypes = flags & CompareUsingScalarTypes;
341
Dan Gohman194ae782009-06-12 19:03:05 +0000342 if (getOpcode() != I->getOpcode() ||
343 getNumOperands() != I->getNumOperands() ||
Hal Finkelec4e85e2012-06-28 05:42:26 +0000344 (UseScalarTypes ?
345 getType()->getScalarType() != I->getType()->getScalarType() :
346 getType() != I->getType()))
Reid Spencere4d87aa2006-12-23 06:05:41 +0000347 return false;
348
349 // We have two instructions of identical opcode and #operands. Check to see
350 // if all operands are the same type
351 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
Hal Finkelec4e85e2012-06-28 05:42:26 +0000352 if (UseScalarTypes ?
353 getOperand(i)->getType()->getScalarType() !=
354 I->getOperand(i)->getType()->getScalarType() :
355 getOperand(i)->getType() != I->getOperand(i)->getType())
Reid Spencere4d87aa2006-12-23 06:05:41 +0000356 return false;
357
358 // Check special state that is a part of some instructions.
359 if (const LoadInst *LI = dyn_cast<LoadInst>(this))
Dan Gohman9a8af452008-10-16 01:24:45 +0000360 return LI->isVolatile() == cast<LoadInst>(I)->isVolatile() &&
Hal Finkelec4e85e2012-06-28 05:42:26 +0000361 (LI->getAlignment() == cast<LoadInst>(I)->getAlignment() ||
362 IgnoreAlignment) &&
Eli Friedmane5e77122011-08-15 21:00:18 +0000363 LI->getOrdering() == cast<LoadInst>(I)->getOrdering() &&
364 LI->getSynchScope() == cast<LoadInst>(I)->getSynchScope();
Reid Spencere4d87aa2006-12-23 06:05:41 +0000365 if (const StoreInst *SI = dyn_cast<StoreInst>(this))
Dan Gohman9a8af452008-10-16 01:24:45 +0000366 return SI->isVolatile() == cast<StoreInst>(I)->isVolatile() &&
Hal Finkelec4e85e2012-06-28 05:42:26 +0000367 (SI->getAlignment() == cast<StoreInst>(I)->getAlignment() ||
368 IgnoreAlignment) &&
Eli Friedmane5e77122011-08-15 21:00:18 +0000369 SI->getOrdering() == cast<StoreInst>(I)->getOrdering() &&
370 SI->getSynchScope() == cast<StoreInst>(I)->getSynchScope();
Reid Spencere4d87aa2006-12-23 06:05:41 +0000371 if (const CmpInst *CI = dyn_cast<CmpInst>(this))
372 return CI->getPredicate() == cast<CmpInst>(I)->getPredicate();
373 if (const CallInst *CI = dyn_cast<CallInst>(this))
Dan Gohman9a8af452008-10-16 01:24:45 +0000374 return CI->isTailCall() == cast<CallInst>(I)->isTailCall() &&
375 CI->getCallingConv() == cast<CallInst>(I)->getCallingConv() &&
Nick Lewyckyf6c63c22011-01-26 09:23:19 +0000376 CI->getAttributes() == cast<CallInst>(I)->getAttributes();
Dan Gohman9a8af452008-10-16 01:24:45 +0000377 if (const InvokeInst *CI = dyn_cast<InvokeInst>(this))
Nick Lewycky41fe88b2008-10-27 07:28:44 +0000378 return CI->getCallingConv() == cast<InvokeInst>(I)->getCallingConv() &&
Nick Lewyckyf6c63c22011-01-26 09:23:19 +0000379 CI->getAttributes() ==
380 cast<InvokeInst>(I)->getAttributes();
Jay Foadfc6d3a42011-07-13 10:26:04 +0000381 if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(this))
382 return IVI->getIndices() == cast<InsertValueInst>(I)->getIndices();
383 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(this))
384 return EVI->getIndices() == cast<ExtractValueInst>(I)->getIndices();
Eli Friedman8a552bb2011-07-27 01:08:30 +0000385 if (const FenceInst *FI = dyn_cast<FenceInst>(this))
Eli Friedman55ba8162011-07-29 03:05:32 +0000386 return FI->getOrdering() == cast<FenceInst>(I)->getOrdering() &&
387 FI->getSynchScope() == cast<FenceInst>(I)->getSynchScope();
388 if (const AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(this))
389 return CXI->isVolatile() == cast<AtomicCmpXchgInst>(I)->isVolatile() &&
Stephen Hines36b56882014-04-23 16:57:46 -0700390 CXI->getSuccessOrdering() ==
391 cast<AtomicCmpXchgInst>(I)->getSuccessOrdering() &&
392 CXI->getFailureOrdering() ==
393 cast<AtomicCmpXchgInst>(I)->getFailureOrdering() &&
Eli Friedman55ba8162011-07-29 03:05:32 +0000394 CXI->getSynchScope() == cast<AtomicCmpXchgInst>(I)->getSynchScope();
395 if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(this))
396 return RMWI->getOperation() == cast<AtomicRMWInst>(I)->getOperation() &&
397 RMWI->isVolatile() == cast<AtomicRMWInst>(I)->isVolatile() &&
398 RMWI->getOrdering() == cast<AtomicRMWInst>(I)->getOrdering() &&
399 RMWI->getSynchScope() == cast<AtomicRMWInst>(I)->getSynchScope();
Reid Spencere4d87aa2006-12-23 06:05:41 +0000400
401 return true;
402}
403
Chris Lattner7ae40e72008-04-20 22:11:30 +0000404/// isUsedOutsideOfBlock - Return true if there are any uses of I outside of the
405/// specified block. Note that PHI nodes are considered to evaluate their
406/// operands in the corresponding predecessor block.
407bool Instruction::isUsedOutsideOfBlock(const BasicBlock *BB) const {
Stephen Hines36b56882014-04-23 16:57:46 -0700408 for (const Use &U : uses()) {
Chris Lattner7ae40e72008-04-20 22:11:30 +0000409 // PHI nodes uses values in the corresponding predecessor block. For other
410 // instructions, just check to see whether the parent of the use matches up.
Stephen Hines36b56882014-04-23 16:57:46 -0700411 const Instruction *I = cast<Instruction>(U.getUser());
412 const PHINode *PN = dyn_cast<PHINode>(I);
Chris Lattner7ae40e72008-04-20 22:11:30 +0000413 if (PN == 0) {
Stephen Hines36b56882014-04-23 16:57:46 -0700414 if (I->getParent() != BB)
Chris Lattner7ae40e72008-04-20 22:11:30 +0000415 return true;
416 continue;
417 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000418
Stephen Hines36b56882014-04-23 16:57:46 -0700419 if (PN->getIncomingBlock(U) != BB)
Chris Lattner7ae40e72008-04-20 22:11:30 +0000420 return true;
421 }
Daniel Dunbara279bc32009-09-20 02:20:51 +0000422 return false;
Chris Lattner7ae40e72008-04-20 22:11:30 +0000423}
424
Chris Lattnerd96288a2008-05-08 17:16:51 +0000425/// mayReadFromMemory - Return true if this instruction may read memory.
426///
427bool Instruction::mayReadFromMemory() const {
428 switch (getOpcode()) {
429 default: return false;
Chris Lattnerd96288a2008-05-08 17:16:51 +0000430 case Instruction::VAArg:
Chris Lattner748118d2008-05-08 21:58:49 +0000431 case Instruction::Load:
Eli Friedman8a552bb2011-07-27 01:08:30 +0000432 case Instruction::Fence: // FIXME: refine definition of mayReadFromMemory
Eli Friedman55ba8162011-07-29 03:05:32 +0000433 case Instruction::AtomicCmpXchg:
434 case Instruction::AtomicRMW:
Chris Lattnerd96288a2008-05-08 17:16:51 +0000435 return true;
436 case Instruction::Call:
437 return !cast<CallInst>(this)->doesNotAccessMemory();
438 case Instruction::Invoke:
439 return !cast<InvokeInst>(this)->doesNotAccessMemory();
Chris Lattner748118d2008-05-08 21:58:49 +0000440 case Instruction::Store:
Eli Friedmane5e77122011-08-15 21:00:18 +0000441 return !cast<StoreInst>(this)->isUnordered();
Chris Lattnerd96288a2008-05-08 17:16:51 +0000442 }
443}
Chris Lattner7ae40e72008-04-20 22:11:30 +0000444
Chris Lattnerbb5493d2007-02-15 23:15:00 +0000445/// mayWriteToMemory - Return true if this instruction may modify memory.
446///
447bool Instruction::mayWriteToMemory() const {
448 switch (getOpcode()) {
449 default: return false;
Eli Friedman8a552bb2011-07-27 01:08:30 +0000450 case Instruction::Fence: // FIXME: refine definition of mayWriteToMemory
Duncan Sandsa3355ff2007-12-03 20:06:50 +0000451 case Instruction::Store:
Chris Lattnerbb5493d2007-02-15 23:15:00 +0000452 case Instruction::VAArg:
Eli Friedman55ba8162011-07-29 03:05:32 +0000453 case Instruction::AtomicCmpXchg:
454 case Instruction::AtomicRMW:
Chris Lattnerbb5493d2007-02-15 23:15:00 +0000455 return true;
456 case Instruction::Call:
Duncan Sandsa3355ff2007-12-03 20:06:50 +0000457 return !cast<CallInst>(this)->onlyReadsMemory();
Chris Lattnerd96288a2008-05-08 17:16:51 +0000458 case Instruction::Invoke:
459 return !cast<InvokeInst>(this)->onlyReadsMemory();
Chris Lattnerbb5493d2007-02-15 23:15:00 +0000460 case Instruction::Load:
Eli Friedmane5e77122011-08-15 21:00:18 +0000461 return !cast<LoadInst>(this)->isUnordered();
Chris Lattnerbb5493d2007-02-15 23:15:00 +0000462 }
463}
Chris Lattnerf2da7242002-10-31 04:14:01 +0000464
Duncan Sands7af1c782009-05-06 06:49:50 +0000465bool Instruction::mayThrow() const {
466 if (const CallInst *CI = dyn_cast<CallInst>(this))
467 return !CI->doesNotThrow();
Bill Wendling55fdb4e2011-08-16 21:15:50 +0000468 return isa<ResumeInst>(this);
Duncan Sands7af1c782009-05-06 06:49:50 +0000469}
470
Nadav Rotem03544ec2013-02-19 20:02:09 +0000471bool Instruction::mayReturn() const {
472 if (const CallInst *CI = dyn_cast<CallInst>(this))
473 return !CI->doesNotReturn();
474 return true;
475}
476
Chris Lattnerf2da7242002-10-31 04:14:01 +0000477/// isAssociative - Return true if the instruction is associative:
478///
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000479/// Associative operators satisfy: x op (y op z) === (x op y) op z
Chris Lattnerf2da7242002-10-31 04:14:01 +0000480///
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000481/// In LLVM, the Add, Mul, And, Or, and Xor operators are associative.
Chris Lattnerf2da7242002-10-31 04:14:01 +0000482///
Duncan Sands0d7ce5f2010-12-20 13:10:23 +0000483bool Instruction::isAssociative(unsigned Opcode) {
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000484 return Opcode == And || Opcode == Or || Opcode == Xor ||
485 Opcode == Add || Opcode == Mul;
Chris Lattnerf2da7242002-10-31 04:14:01 +0000486}
487
Shuxin Yang9b7f6f22012-11-29 01:47:31 +0000488bool Instruction::isAssociative() const {
489 unsigned Opcode = getOpcode();
490 if (isAssociative(Opcode))
491 return true;
492
493 switch (Opcode) {
494 case FMul:
495 case FAdd:
496 return cast<FPMathOperator>(this)->hasUnsafeAlgebra();
497 default:
498 return false;
499 }
500}
501
Chris Lattnerf2da7242002-10-31 04:14:01 +0000502/// isCommutative - Return true if the instruction is commutative:
503///
Misha Brukman6b634522003-10-10 17:54:14 +0000504/// Commutative operators satisfy: (x op y) === (y op x)
Chris Lattnerf2da7242002-10-31 04:14:01 +0000505///
506/// In LLVM, these are the associative operators, plus SetEQ and SetNE, when
507/// applied to any type.
508///
509bool Instruction::isCommutative(unsigned op) {
510 switch (op) {
511 case Add:
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000512 case FAdd:
Chris Lattnerf2da7242002-10-31 04:14:01 +0000513 case Mul:
Dan Gohmanae3a0be2009-06-04 22:49:04 +0000514 case FMul:
Misha Brukmanfd939082005-04-21 23:48:37 +0000515 case And:
Chris Lattnerf2da7242002-10-31 04:14:01 +0000516 case Or:
517 case Xor:
Chris Lattnerf2da7242002-10-31 04:14:01 +0000518 return true;
519 default:
520 return false;
521 }
522}
Tanya Lattner741bb002003-07-31 04:05:50 +0000523
Duncan Sandsc038a782012-06-12 14:33:56 +0000524/// isIdempotent - Return true if the instruction is idempotent:
525///
526/// Idempotent operators satisfy: x op x === x
527///
528/// In LLVM, the And and Or operators are idempotent.
529///
530bool Instruction::isIdempotent(unsigned Opcode) {
531 return Opcode == And || Opcode == Or;
532}
533
534/// isNilpotent - Return true if the instruction is nilpotent:
535///
536/// Nilpotent operators satisfy: x op x === Id,
537///
538/// where Id is the identity for the operator, i.e. a constant such that
539/// x op Id === x and Id op x === x for all x.
540///
541/// In LLVM, the Xor operator is nilpotent.
542///
543bool Instruction::isNilpotent(unsigned Opcode) {
544 return Opcode == Xor;
545}
546
Devang Patel50b6e332009-10-27 22:16:29 +0000547Instruction *Instruction::clone() const {
548 Instruction *New = clone_impl();
549 New->SubclassOptionalData = SubclassOptionalData;
Chris Lattner508b19a2009-12-29 07:44:16 +0000550 if (!hasMetadata())
551 return New;
Michael Ilseman407a6162012-11-15 22:34:00 +0000552
Chris Lattner508b19a2009-12-29 07:44:16 +0000553 // Otherwise, enumerate and copy over metadata from the old instruction to the
554 // new one.
555 SmallVector<std::pair<unsigned, MDNode*>, 4> TheMDs;
Chris Lattner4baa5102011-07-14 18:57:51 +0000556 getAllMetadataOtherThanDebugLoc(TheMDs);
Stephen Hines36b56882014-04-23 16:57:46 -0700557 for (const auto &MD : TheMDs)
558 New->setMetadata(MD.first, MD.second);
Michael Ilseman407a6162012-11-15 22:34:00 +0000559
Chris Lattner4baa5102011-07-14 18:57:51 +0000560 New->setDebugLoc(getDebugLoc());
Devang Patel50b6e332009-10-27 22:16:29 +0000561 return New;
562}