diff options
-rw-r--r-- | include/llvm/Instruction.h | 4 | ||||
-rw-r--r-- | lib/VMCore/Instruction.cpp | 21 |
2 files changed, 23 insertions, 2 deletions
diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h index 7933a4d3c2..29ae5c3cfb 100644 --- a/include/llvm/Instruction.h +++ b/include/llvm/Instruction.h @@ -50,6 +50,10 @@ public: /// bool mayWriteToMemory() const; + /// mayReadFromMemory - Return true if this instruction may read memory. + /// + bool mayReadFromMemory() const; + /// clone() - Create a copy of 'this' instruction that is identical in all /// ways except the following: /// * The instruction has no parent diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp index 5344cf7bfe..345fd1dd94 100644 --- a/lib/VMCore/Instruction.cpp +++ b/lib/VMCore/Instruction.cpp @@ -219,7 +219,23 @@ bool Instruction::isUsedOutsideOfBlock(const BasicBlock *BB) const { return false; } - +/// mayReadFromMemory - Return true if this instruction may read memory. +/// +bool Instruction::mayReadFromMemory() const { + switch (getOpcode()) { + default: return false; + case Instruction::Free: + case Instruction::Store: + case Instruction::VAArg: + return true; + case Instruction::Call: + return !cast<CallInst>(this)->doesNotAccessMemory(); + case Instruction::Invoke: + return !cast<InvokeInst>(this)->doesNotAccessMemory(); + case Instruction::Load: + return true; + } +} /// mayWriteToMemory - Return true if this instruction may modify memory. /// @@ -227,12 +243,13 @@ bool Instruction::mayWriteToMemory() const { switch (getOpcode()) { default: return false; case Instruction::Free: - case Instruction::Invoke: case Instruction::Store: case Instruction::VAArg: return true; case Instruction::Call: return !cast<CallInst>(this)->onlyReadsMemory(); + case Instruction::Invoke: + return !cast<InvokeInst>(this)->onlyReadsMemory(); case Instruction::Load: return cast<LoadInst>(this)->isVolatile(); } |