diff options
author | Dan Gohman <dan433584@gmail.com> | 2013-02-01 00:49:06 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2013-02-01 00:49:06 +0000 |
commit | 901261d558d0b41ba75d8aa2b38aac72aaa41bae (patch) | |
tree | 67fbdd4c1fc16f5b7d8821e83a162f6f1491a6af /lib/Analysis | |
parent | f715dbd263149efeb9c684dfdb0637cf84f94399 (diff) | |
download | external_llvm-901261d558d0b41ba75d8aa2b38aac72aaa41bae.zip external_llvm-901261d558d0b41ba75d8aa2b38aac72aaa41bae.tar.gz external_llvm-901261d558d0b41ba75d8aa2b38aac72aaa41bae.tar.bz2 |
Add a comment explaining an unavailable optimization.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174131 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 2ca37cc..e296215 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -1688,6 +1688,34 @@ static Value *ExtractEquivalentCondition(Value *V, CmpInst::Predicate Pred, return 0; } +// A significant optimization not implemented here is assuming that alloca +// addresses are not equal to incoming argument values. They don't *alias*, +// as we say, but that doesn't mean they aren't equal, so we take a +// conservative approach. +// +// This is inspired in part by C++11 5.10p1: +// "Two pointers of the same type compare equal if and only if they are both +// null, both point to the same function, or both represent the same +// address." +// +// This is pretty permissive. +// +// It's also partly due to C11 6.5.9p6: +// "Two pointers compare equal if and only if both are null pointers, both are +// pointers to the same object (including a pointer to an object and a +// subobject at its beginning) or function, both are pointers to one past the +// last element of the same array object, or one is a pointer to one past the +// end of one array object and the other is a pointer to the start of a +// different array object that happens to immediately follow the first array +// object in the address space.) +// +// C11's version is more restrictive, however there's no reason why an argument +// couldn't be a one-past-the-end value for a stack object in the caller and be +// equal to the beginning of a stack object in the callee. +// +// If the C and C++ standards are ever made sufficiently restrictive in this +// area, it may be possible to update LLVM's semantics accordingly and reinstate +// this optimization. static Constant *computePointerICmp(const DataLayout *TD, const TargetLibraryInfo *TLI, CmpInst::Predicate Pred, |