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
This commit is contained in:
Dan Gohman 2009-11-20 17:50:21 +00:00
parent 0a66c26191
commit a8c144d534
1 changed files with 4 additions and 9 deletions

View File

@ -106,19 +106,14 @@ bool llvm::PointerMayBeCaptured(const Value *V,
} }
break; break;
case Instruction::ICmp: case Instruction::ICmp:
// Don't count comparisons of the original value against null as captures. // Don't count comparisons of a no-alias return value against null as
// This allows us to ignore comparisons of malloc results with null, // captures. This allows us to ignore comparisons of malloc results
// for example. // with null, for example.
if (isIdentifiedObject(V)) if (isNoAliasCall(V))
if (ConstantPointerNull *CPN = if (ConstantPointerNull *CPN =
dyn_cast<ConstantPointerNull>(I->getOperand(1))) dyn_cast<ConstantPointerNull>(I->getOperand(1)))
if (CPN->getType()->getAddressSpace() == 0) if (CPN->getType()->getAddressSpace() == 0)
break; 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 // Otherwise, be conservative. There are crazy ways to capture pointers
// using comparisons. // using comparisons.
return true; return true;