mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 17:24:48 +00:00
Match semantics of PointerMayBeCapturedBefore to its name by default
As it turns out, the capture tracker named CaptureBefore used by AA, and now available via the PointerMayBeCapturedBefore function, would have been more-aptly named CapturedBeforeOrAt, because it considers captures at the instruction provided. This is not always what one wants, and it is difficult to get the strictly-before behavior given only the current interface. This adds an additional parameter which controls whether or not you want to include captures at the provided instruction. The default is not to include the instruction provided, so that 'Before' matches its name. No functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213582 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -57,14 +57,18 @@ namespace {
|
||||
/// Only support the case where the Value is defined in the same basic block
|
||||
/// as the given instruction and the use.
|
||||
struct CapturesBefore : public CaptureTracker {
|
||||
CapturesBefore(bool ReturnCaptures, const Instruction *I, DominatorTree *DT)
|
||||
CapturesBefore(bool ReturnCaptures, const Instruction *I, DominatorTree *DT,
|
||||
bool IncludeI)
|
||||
: BeforeHere(I), DT(DT), ReturnCaptures(ReturnCaptures),
|
||||
Captured(false) {}
|
||||
IncludeI(IncludeI), Captured(false) {}
|
||||
|
||||
void tooManyUses() override { Captured = true; }
|
||||
|
||||
bool shouldExplore(const Use *U) override {
|
||||
Instruction *I = cast<Instruction>(U->getUser());
|
||||
if (BeforeHere == I && !IncludeI)
|
||||
return false;
|
||||
|
||||
BasicBlock *BB = I->getParent();
|
||||
// We explore this usage only if the usage can reach "BeforeHere".
|
||||
// If use is not reachable from entry, there is no need to explore.
|
||||
@ -84,6 +88,9 @@ namespace {
|
||||
return false;
|
||||
|
||||
Instruction *I = cast<Instruction>(U->getUser());
|
||||
if (BeforeHere == I && !IncludeI)
|
||||
return false;
|
||||
|
||||
BasicBlock *BB = I->getParent();
|
||||
// Same logic as in shouldExplore.
|
||||
if (BeforeHere != I && !DT->isReachableFromEntry(BB))
|
||||
@ -99,6 +106,7 @@ namespace {
|
||||
DominatorTree *DT;
|
||||
|
||||
bool ReturnCaptures;
|
||||
bool IncludeI;
|
||||
|
||||
bool Captured;
|
||||
};
|
||||
@ -138,7 +146,7 @@ bool llvm::PointerMayBeCaptured(const Value *V,
|
||||
/// or not.
|
||||
bool llvm::PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures,
|
||||
bool StoreCaptures, const Instruction *I,
|
||||
DominatorTree *DT) {
|
||||
DominatorTree *DT, bool IncludeI) {
|
||||
assert(!isa<GlobalValue>(V) &&
|
||||
"It doesn't make sense to ask whether a global is captured.");
|
||||
|
||||
@ -148,7 +156,7 @@ bool llvm::PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures,
|
||||
// TODO: See comment in PointerMayBeCaptured regarding what could be done
|
||||
// with StoreCaptures.
|
||||
|
||||
CapturesBefore CB(ReturnCaptures, I, DT);
|
||||
CapturesBefore CB(ReturnCaptures, I, DT, IncludeI);
|
||||
PointerMayBeCaptured(V, &CB);
|
||||
return CB.Captured;
|
||||
}
|
||||
|
Reference in New Issue
Block a user