aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/CaptureTracking.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-11-20 00:50:47 +0000
committerDan Gohman <gohman@apple.com>2009-11-20 00:50:47 +0000
commit91449224e8f627ad842534b68980b69159593010 (patch)
tree2bb1ff1f08b21b2c9d907eaa253f9bd91c26eff1 /llvm/lib/Analysis/CaptureTracking.cpp
parent18fc44dfd376b8af8768d02510db3f88395e528f (diff)
downloadllvm-91449224e8f627ad842534b68980b69159593010.zip
llvm-91449224e8f627ad842534b68980b69159593010.tar.gz
llvm-91449224e8f627ad842534b68980b69159593010.tar.bz2
Refine the capture tracking rules for comparisons to be more
careful about crazy methods of capturing pointers using comparisons. Comparisons of identified objects with null in the default address space are not captures. And, comparisons of two pointers within the same identified object are not captures. llvm-svn: 89421
Diffstat (limited to 'llvm/lib/Analysis/CaptureTracking.cpp')
-rw-r--r--llvm/lib/Analysis/CaptureTracking.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp
index 9f27e3d..e86ad96 100644
--- a/llvm/lib/Analysis/CaptureTracking.cpp
+++ b/llvm/lib/Analysis/CaptureTracking.cpp
@@ -19,6 +19,7 @@
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Instructions.h"
#include "llvm/Value.h"
+#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/CallSite.h"
@@ -104,13 +105,25 @@ bool llvm::PointerMayBeCaptured(const Value *V,
Worklist.push_back(U);
}
break;
- case Instruction::ICmp:
- // Comparing the pointer against null does not count as a capture.
- if (ConstantPointerNull *CPN =
- dyn_cast<ConstantPointerNull>(I->getOperand(1)))
- if (CPN->getType()->getAddressSpace() == 0)
- break;
+ case Instruction::ICmp: {
+ // Don't count comparisons of the original value against null as captures.
+ // This allows us to ignore comparisons of malloc results with null,
+ // for example.
+ if (isIdentifiedObject(V))
+ if (ConstantPointerNull *CPN =
+ dyn_cast<ConstantPointerNull>(I->getOperand(1)))
+ if (CPN->getType()->getAddressSpace() == 0)
+ break;
+ // Don't count comparisons of two pointers within the same identified
+ // object as captures.
+ Value *O0 = I->getOperand(0)->getUnderlyingObject();
+ if (isIdentifiedObject(O0) &&
+ O0 == I->getOperand(1)->getUnderlyingObject())
+ break;
+ // Otherwise, be conservative. There are crazy ways to capture pointers
+ // using comparisons.
return true;
+ }
default:
// Something else - be conservative and say it is captured.
return true;