forked from OSchip/llvm-project
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:
parent
0a66c26191
commit
a8c144d534
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue