mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-18 21:24:32 -04:00
[memcpyopt] Teach memcpyopt to optimize across basic blocks
This teaches memcpyopt to make a non-local memdep query when a local query indicates that the dependency is non-local. This notably allows it to eliminate many more llvm.memcpy calls in common Rust code, often by 20-30%. This is r319482 and r319483, along with fixes for PR35519: fix the optimization that merges stores into memsets to preserve cached memdep info, and fix memdep's non-local caching strategy to not assume that larger queries are always more conservative than smaller ones. Fixes PR28958 and PR35519. Differential Revision: https://reviews.llvm.org/D40802 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321138 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -919,6 +919,14 @@ void MemoryDependenceResults::getNonLocalPointerDependency(
|
||||
Instruction *QueryInst, SmallVectorImpl<NonLocalDepResult> &Result) {
|
||||
const MemoryLocation Loc = MemoryLocation::get(QueryInst);
|
||||
bool isLoad = isa<LoadInst>(QueryInst);
|
||||
return getNonLocalPointerDependencyFrom(QueryInst, Loc, isLoad, Result);
|
||||
}
|
||||
|
||||
void MemoryDependenceResults::getNonLocalPointerDependencyFrom(
|
||||
Instruction *QueryInst,
|
||||
const MemoryLocation &Loc,
|
||||
bool isLoad,
|
||||
SmallVectorImpl<NonLocalDepResult> &Result) {
|
||||
BasicBlock *FromBB = QueryInst->getParent();
|
||||
assert(FromBB);
|
||||
|
||||
@@ -1118,21 +1126,15 @@ bool MemoryDependenceResults::getNonLocalPointerDepFromBB(
|
||||
// If we already have a cache entry for this CacheKey, we may need to do some
|
||||
// work to reconcile the cache entry and the current query.
|
||||
if (!Pair.second) {
|
||||
if (CacheInfo->Size < Loc.Size) {
|
||||
// The query's Size is greater than the cached one. Throw out the
|
||||
// cached data and proceed with the query at the greater size.
|
||||
if (CacheInfo->Size != Loc.Size) {
|
||||
// The query's Size differs from the cached one. Throw out the
|
||||
// cached data and proceed with the query at the new size.
|
||||
CacheInfo->Pair = BBSkipFirstBlockPair();
|
||||
CacheInfo->Size = Loc.Size;
|
||||
for (auto &Entry : CacheInfo->NonLocalDeps)
|
||||
if (Instruction *Inst = Entry.getResult().getInst())
|
||||
RemoveFromReverseMap(ReverseNonLocalPtrDeps, Inst, CacheKey);
|
||||
CacheInfo->NonLocalDeps.clear();
|
||||
} else if (CacheInfo->Size > Loc.Size) {
|
||||
// This query's Size is less than the cached one. Conservatively restart
|
||||
// the query using the greater size.
|
||||
return getNonLocalPointerDepFromBB(
|
||||
QueryInst, Pointer, Loc.getWithNewSize(CacheInfo->Size), isLoad,
|
||||
StartBB, Result, Visited, SkipFirstBlock);
|
||||
}
|
||||
|
||||
// If the query's AATags are inconsistent with the cached one,
|
||||
|
||||
Reference in New Issue
Block a user