forked from OSchip/llvm-project
[CFLAA] Change FunctionHandle to be common to Steensgaard's and Andersens'
Differential Revision: https://reviews.llvm.org/D34638 llvm-svn: 306348
This commit is contained in:
parent
3cc6d0bc67
commit
e34a806431
|
@ -0,0 +1,44 @@
|
|||
//=- CFLAliasAnalysisUtils.h - Utilities for CFL Alias Analysis ----*- C++-*-=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
// \file
|
||||
// These are the utilities/helpers used by the CFL Alias Analyses available in
|
||||
// tree, i.e. Steensgaard's and Andersens'.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_ANALYSIS_CFLALIASANALYSISUTILS_H
|
||||
#define LLVM_ANALYSIS_CFLALIASANALYSISUTILS_H
|
||||
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
template <typename AAResult> struct FunctionHandle final : public CallbackVH {
|
||||
FunctionHandle(Function *Fn, AAResult *Result)
|
||||
: CallbackVH(Fn), Result(Result) {
|
||||
assert(Fn != nullptr);
|
||||
assert(Result != nullptr);
|
||||
}
|
||||
|
||||
void deleted() override { removeSelfFromCache(); }
|
||||
void allUsesReplacedWith(Value *) override { removeSelfFromCache(); }
|
||||
|
||||
private:
|
||||
AAResult *Result;
|
||||
|
||||
void removeSelfFromCache() {
|
||||
assert(Result != nullptr);
|
||||
auto *Val = getValPtr();
|
||||
Result->evict(cast<Function>(Val));
|
||||
setValPtr(nullptr);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // LLVM_ANALYSIS_CFLALIASANALYSISUTILS_H
|
|
@ -18,8 +18,8 @@
|
|||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/CFLAliasAnalysisUtils.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include <forward_list>
|
||||
|
||||
|
@ -47,7 +47,7 @@ public:
|
|||
return false;
|
||||
}
|
||||
/// Evict the given function from cache
|
||||
void evict(const Function &Fn);
|
||||
void evict(const Function *Fn);
|
||||
|
||||
/// \brief Get the alias summary for the given function
|
||||
/// Return nullptr if the summary is not found or not available
|
||||
|
@ -57,27 +57,6 @@ public:
|
|||
AliasResult alias(const MemoryLocation &, const MemoryLocation &);
|
||||
|
||||
private:
|
||||
struct FunctionHandle final : public CallbackVH {
|
||||
FunctionHandle(Function *Fn, CFLAndersAAResult *Result)
|
||||
: CallbackVH(Fn), Result(Result) {
|
||||
assert(Fn != nullptr);
|
||||
assert(Result != nullptr);
|
||||
}
|
||||
|
||||
void deleted() override { removeSelfFromCache(); }
|
||||
void allUsesReplacedWith(Value *) override { removeSelfFromCache(); }
|
||||
|
||||
private:
|
||||
CFLAndersAAResult *Result;
|
||||
|
||||
void removeSelfFromCache() {
|
||||
assert(Result != nullptr);
|
||||
auto *Val = getValPtr();
|
||||
Result->evict(*cast<Function>(Val));
|
||||
setValPtr(nullptr);
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief Ensures that the given function is available in the cache.
|
||||
/// Returns the appropriate entry from the cache.
|
||||
const Optional<FunctionInfo> &ensureCached(const Function &);
|
||||
|
@ -97,7 +76,7 @@ private:
|
|||
/// that simply has empty sets.
|
||||
DenseMap<const Function *, Optional<FunctionInfo>> Cache;
|
||||
|
||||
std::forward_list<FunctionHandle> Handles;
|
||||
std::forward_list<FunctionHandle<CFLAndersAAResult>> Handles;
|
||||
};
|
||||
|
||||
/// Analysis pass providing a never-invalidated alias analysis result.
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/CFLAliasAnalysisUtils.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/ValueHandle.h"
|
||||
|
@ -85,27 +86,6 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
struct FunctionHandle final : public CallbackVH {
|
||||
FunctionHandle(Function *Fn, CFLSteensAAResult *Result)
|
||||
: CallbackVH(Fn), Result(Result) {
|
||||
assert(Fn != nullptr);
|
||||
assert(Result != nullptr);
|
||||
}
|
||||
|
||||
void deleted() override { removeSelfFromCache(); }
|
||||
void allUsesReplacedWith(Value *) override { removeSelfFromCache(); }
|
||||
|
||||
private:
|
||||
CFLSteensAAResult *Result;
|
||||
|
||||
void removeSelfFromCache() {
|
||||
assert(Result != nullptr);
|
||||
auto *Val = getValPtr();
|
||||
Result->evict(cast<Function>(Val));
|
||||
setValPtr(nullptr);
|
||||
}
|
||||
};
|
||||
|
||||
const TargetLibraryInfo &TLI;
|
||||
|
||||
/// \brief Cached mapping of Functions to their StratifiedSets.
|
||||
|
@ -114,7 +94,7 @@ private:
|
|||
/// have any kind of recursion, it is discernable from a function
|
||||
/// that simply has empty sets.
|
||||
DenseMap<Function *, Optional<FunctionInfo>> Cache;
|
||||
std::forward_list<FunctionHandle> Handles;
|
||||
std::forward_list<FunctionHandle<CFLSteensAAResult>> Handles;
|
||||
|
||||
FunctionInfo buildSetsFrom(Function *F);
|
||||
};
|
||||
|
|
|
@ -789,10 +789,10 @@ void CFLAndersAAResult::scan(const Function &Fn) {
|
|||
// resize and invalidating the reference returned by operator[]
|
||||
auto FunInfo = buildInfoFrom(Fn);
|
||||
Cache[&Fn] = std::move(FunInfo);
|
||||
Handles.push_front(FunctionHandle(const_cast<Function *>(&Fn), this));
|
||||
Handles.emplace_front(const_cast<Function *>(&Fn), this);
|
||||
}
|
||||
|
||||
void CFLAndersAAResult::evict(const Function &Fn) { Cache.erase(&Fn); }
|
||||
void CFLAndersAAResult::evict(const Function *Fn) { Cache.erase(Fn); }
|
||||
|
||||
const Optional<CFLAndersAAResult::FunctionInfo> &
|
||||
CFLAndersAAResult::ensureCached(const Function &Fn) {
|
||||
|
|
|
@ -245,7 +245,7 @@ void CFLSteensAAResult::scan(Function *Fn) {
|
|||
auto FunInfo = buildSetsFrom(Fn);
|
||||
Cache[Fn] = std::move(FunInfo);
|
||||
|
||||
Handles.push_front(FunctionHandle(Fn, this));
|
||||
Handles.emplace_front(Fn, this);
|
||||
}
|
||||
|
||||
void CFLSteensAAResult::evict(Function *Fn) { Cache.erase(Fn); }
|
||||
|
|
Loading…
Reference in New Issue