mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 04:24:00 +00:00
Extend CaptureTracking to indicate when a value is never stored, even
if it is not ultimately captured. Teach BasicAliasAnalysis that a local object address which does not escape and is never stored does not alias with a value resulting from a load. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89398 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -28,8 +28,11 @@ using namespace llvm;
|
||||
/// by the enclosing function (which is required to exist). This routine can
|
||||
/// be expensive, so consider caching the results. The boolean ReturnCaptures
|
||||
/// specifies whether returning the value (or part of it) from the function
|
||||
/// counts as capturing it or not. The boolean StoreCaptures specified whether
|
||||
/// storing the value (or part of it) into memory anywhere automatically
|
||||
/// counts as capturing it or not.
|
||||
bool llvm::PointerMayBeCaptured(const Value *V, bool ReturnCaptures) {
|
||||
bool llvm::PointerMayBeCaptured(const Value *V,
|
||||
bool ReturnCaptures, bool StoreCaptures) {
|
||||
assert(isa<PointerType>(V->getType()) && "Capture is for pointers only!");
|
||||
SmallVector<Use*, 16> Worklist;
|
||||
SmallSet<Use*, 16> Visited;
|
||||
@ -82,7 +85,11 @@ bool llvm::PointerMayBeCaptured(const Value *V, bool ReturnCaptures) {
|
||||
break;
|
||||
case Instruction::Store:
|
||||
if (V == I->getOperand(0))
|
||||
// Stored the pointer - it may be captured.
|
||||
// Stored the pointer - conservatively assume it may be captured.
|
||||
// TODO: If StoreCaptures is not true, we could do Fancy analysis
|
||||
// to determine whether this store is not actually an escape point.
|
||||
// In that case, BasicAliasAnalysis should be updated as well to
|
||||
// take advantage of this.
|
||||
return true;
|
||||
// Storing to the pointee does not cause the pointer to be captured.
|
||||
break;
|
||||
|
Reference in New Issue
Block a user