aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Instruction.h
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-07-17 08:38:29 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-07-17 08:38:29 +0000
commit8b7d706c80afa7ad40acaab08f7406093a2851ff (patch)
tree390126df27b992e49ebe2f2b74bf49162ae47c69 /include/llvm/Instruction.h
parentd8f7a36270591e9763c2fd98f05f4f0572b05135 (diff)
downloadexternal_llvm-8b7d706c80afa7ad40acaab08f7406093a2851ff.zip
external_llvm-8b7d706c80afa7ad40acaab08f7406093a2851ff.tar.gz
external_llvm-8b7d706c80afa7ad40acaab08f7406093a2851ff.tar.bz2
Documentation clarifications for isSafeToSpeculativelyExecute.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76168 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Instruction.h')
-rw-r--r--include/llvm/Instruction.h21
1 files changed, 17 insertions, 4 deletions
diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h
index 1d1f0f4..924b195 100644
--- a/include/llvm/Instruction.h
+++ b/include/llvm/Instruction.h
@@ -182,19 +182,32 @@ public:
/// mayHaveSideEffects - Return true if the instruction may have side effects.
///
+ /// Note that this does not consider malloc and alloca to have side
+ /// effects because the newly allocated memory is completely invisible to
+ /// instructions which don't used the returned value. For cases where this
+ /// matters, isSafeToSpeculativelyExecute may be more appropriate.
bool mayHaveSideEffects() const {
return mayWriteToMemory() || mayThrow();
}
/// isSafeToSpeculativelyExecute - Return true if the instruction does not
/// have any effects besides calculating the result and does not have
- /// undefined behavior. Unlike in mayHaveSideEffects(), allocating memory
- /// is considered an effect.
+ /// undefined behavior.
+ ///
+ /// This method never returns true for an instruction that returns true for
+ /// mayHaveSideEffects; however, this method also does some other checks in
+ /// addition. It checks for undefined behavior, like dividing by zero or
+ /// loading from an invalid pointer (but not for undefined results, like a
+ /// shift with a shift amount larger than the width of the result). It checks
+ /// for malloc and alloca because speculatively executing them might cause a
+ /// memory leak. It also returns false for instructions related to control
+ /// flow, specifically terminators and PHI nodes.
///
/// This method only looks at the instruction itself and its operands, so if
/// this method returns true, it is safe to move the instruction as long as
- /// the operands still dominate it. However, care must be taken with
- /// instructions which read memory.
+ /// the correct dominance relationships for the operands and users hold.
+ /// However, this method can return true for instructions that read memory;
+ /// for such instructions, moving them may change the resulting value.
bool isSafeToSpeculativelyExecute() const;
/// Methods for support type inquiry through isa, cast, and dyn_cast: