Skip to content

Commit

Permalink
Revert r319482 and r319483 "[memcpyopt] Teach memcpyopt to optimize a…
Browse files Browse the repository at this point in the history
…cross basic blocks"

This caused PR35519.

> [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%.
>
> Fixes PR28958.
>
> Differential Revision: https://reviews.llvm.org/D38374
>

> [memcpyopt] Commit file missed in r319482.
>
> This change was meant to be included with r319482 but was accidentally
> omitted.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319873 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
zmodem committed Dec 6, 2017
1 parent f07b02f commit d5bd8ee
Show file tree
Hide file tree
Showing 5 changed files with 3 additions and 204 deletions.
6 changes: 0 additions & 6 deletions include/llvm/Analysis/MemoryDependenceAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -407,12 +407,6 @@ class MemoryDependenceResults {
void getNonLocalPointerDependency(Instruction *QueryInst,
SmallVectorImpl<NonLocalDepResult> &Result);

/// Perform a dependency query specifically for QueryInst's access to Loc.
/// The other comments for getNonLocalPointerDependency apply here as well.
void getNonLocalPointerDependencyFrom(Instruction *QueryInst,
const MemoryLocation &Loc, bool isLoad,
SmallVectorImpl<NonLocalDepResult> &Result);

/// Removes an instruction from the dependence analysis, updating the
/// dependence of instructions that previously depended on it.
void removeInstruction(Instruction *InstToRemove);
Expand Down
8 changes: 0 additions & 8 deletions lib/Analysis/MemoryDependenceAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -917,14 +917,6 @@ 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);

Expand Down
31 changes: 3 additions & 28 deletions lib/Transforms/Scalar/MemCpyOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1031,22 +1031,9 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
//
// NOTE: This is conservative, it will stop on any read from the source loc,
// not just the defining memcpy.
MemoryLocation SourceLoc = MemoryLocation::getForSource(MDep);
MemDepResult SourceDep = MD->getPointerDependencyFrom(SourceLoc, false,
M->getIterator(), M->getParent());

if (SourceDep.isNonLocal()) {
SmallVector<NonLocalDepResult, 2> NonLocalDepResults;
MD->getNonLocalPointerDependencyFrom(M, SourceLoc, /*isLoad=*/false,
NonLocalDepResults);
if (NonLocalDepResults.size() == 1) {
SourceDep = NonLocalDepResults[0].getResult();
assert((!SourceDep.getInst() ||
LookupDomTree().dominates(SourceDep.getInst(), M)) &&
"when memdep returns exactly one result, it should dominate");
}
}

MemDepResult SourceDep =
MD->getPointerDependencyFrom(MemoryLocation::getForSource(MDep), false,
M->getIterator(), M->getParent());
if (!SourceDep.isClobber() || SourceDep.getInst() != MDep)
return false;

Expand Down Expand Up @@ -1248,18 +1235,6 @@ bool MemCpyOptPass::processMemCpy(MemCpyInst *M) {
MemDepResult SrcDepInfo = MD->getPointerDependencyFrom(
SrcLoc, true, M->getIterator(), M->getParent());

if (SrcDepInfo.isNonLocal()) {
SmallVector<NonLocalDepResult, 2> NonLocalDepResults;
MD->getNonLocalPointerDependencyFrom(M, SrcLoc, /*isLoad=*/true,
NonLocalDepResults);
if (NonLocalDepResults.size() == 1) {
SrcDepInfo = NonLocalDepResults[0].getResult();
assert((!SrcDepInfo.getInst() ||
LookupDomTree().dominates(SrcDepInfo.getInst(), M)) &&
"when memdep returns exactly one result, it should dominate");
}
}

if (SrcDepInfo.isClobber()) {
if (MemCpyInst *MDep = dyn_cast<MemCpyInst>(SrcDepInfo.getInst()))
return processMemCpyMemCpyDependence(M, MDep);
Expand Down
48 changes: 0 additions & 48 deletions test/Transforms/MemCpyOpt/memcpy-invoke-memcpy.ll

This file was deleted.

114 changes: 0 additions & 114 deletions test/Transforms/MemCpyOpt/nonlocal-memcpy-memcpy.ll

This file was deleted.

0 comments on commit d5bd8ee

Please sign in to comment.