From a8c144d534429d209926e4ad18372db42f68faf9 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 20 Nov 2009 17:50:21 +0000 Subject: [PATCH] Revert the rule that considers comparisons between two pointers in the same object to be a non-capture; Duncan pointed out a way that such a comparison could be a capture. Make the rule that considers a comparison against null more specific, and only consider noalias return values compared against null. This still supports test/Transforms/GVN/nonescaping-malloc.ll, and is not susceptible to the problem Duncan pointed out with noalias arguments. llvm-svn: 89468 --- llvm/lib/Analysis/CaptureTracking.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp index 1db9f2dda19c..8364d81497c2 100644 --- a/llvm/lib/Analysis/CaptureTracking.cpp +++ b/llvm/lib/Analysis/CaptureTracking.cpp @@ -106,19 +106,14 @@ bool llvm::PointerMayBeCaptured(const Value *V, } 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)) + // Don't count comparisons of a no-alias return value against null as + // captures. This allows us to ignore comparisons of malloc results + // with null, for example. + if (isNoAliasCall(V)) if (ConstantPointerNull *CPN = dyn_cast(I->getOperand(1))) if (CPN->getType()->getAddressSpace() == 0) break; - // Don't count comparisons of two pointers within the same object - // as captures. - if (I->getOperand(0)->getUnderlyingObject() == - I->getOperand(1)->getUnderlyingObject()) - break; // Otherwise, be conservative. There are crazy ways to capture pointers // using comparisons. return true;