mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-07 12:28:24 +00:00
implement PR8576, deleting dead stores with intervening may-alias stores.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119927 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -335,11 +335,19 @@ namespace llvm {
|
|||||||
/// critical edges.
|
/// critical edges.
|
||||||
void invalidateCachedPredecessors();
|
void invalidateCachedPredecessors();
|
||||||
|
|
||||||
private:
|
/// getPointerDependencyFrom - Return the instruction on which a memory
|
||||||
|
/// location depends. If isLoad is true, this routine ignores may-aliases
|
||||||
|
/// with read-only operations. If isLoad is false, this routine ignores
|
||||||
|
/// may-aliases with reads from read-only locations.
|
||||||
|
///
|
||||||
|
/// Note that this is an uncached query, and thus may be inefficient.
|
||||||
|
///
|
||||||
MemDepResult getPointerDependencyFrom(const AliasAnalysis::Location &Loc,
|
MemDepResult getPointerDependencyFrom(const AliasAnalysis::Location &Loc,
|
||||||
bool isLoad,
|
bool isLoad,
|
||||||
BasicBlock::iterator ScanIt,
|
BasicBlock::iterator ScanIt,
|
||||||
BasicBlock *BB);
|
BasicBlock *BB);
|
||||||
|
|
||||||
|
private:
|
||||||
MemDepResult getCallSiteDependencyFrom(CallSite C, bool isReadOnlyCall,
|
MemDepResult getCallSiteDependencyFrom(CallSite C, bool isReadOnlyCall,
|
||||||
BasicBlock::iterator ScanIt,
|
BasicBlock::iterator ScanIt,
|
||||||
BasicBlock *BB);
|
BasicBlock *BB);
|
||||||
|
@@ -409,9 +409,9 @@ MemDepResult MemoryDependenceAnalysis::getDependency(Instruction *QueryInst) {
|
|||||||
if (MemLoc.Ptr) {
|
if (MemLoc.Ptr) {
|
||||||
// If we can do a pointer scan, make it happen.
|
// If we can do a pointer scan, make it happen.
|
||||||
bool isLoad = !(MR & AliasAnalysis::Mod);
|
bool isLoad = !(MR & AliasAnalysis::Mod);
|
||||||
if (IntrinsicInst *II = dyn_cast<MemoryUseIntrinsic>(QueryInst)) {
|
if (IntrinsicInst *II = dyn_cast<MemoryUseIntrinsic>(QueryInst))
|
||||||
isLoad |= II->getIntrinsicID() == Intrinsic::lifetime_end;
|
isLoad |= II->getIntrinsicID() == Intrinsic::lifetime_end;
|
||||||
}
|
|
||||||
LocalCache = getPointerDependencyFrom(MemLoc, isLoad, ScanPos,
|
LocalCache = getPointerDependencyFrom(MemLoc, isLoad, ScanPos,
|
||||||
QueryParent);
|
QueryParent);
|
||||||
} else if (isa<CallInst>(QueryInst) || isa<InvokeInst>(QueryInst)) {
|
} else if (isa<CallInst>(QueryInst) || isa<InvokeInst>(QueryInst)) {
|
||||||
|
@@ -217,9 +217,28 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If not a definite must-alias dependency, ignore it.
|
if (!InstDep.isDef()) {
|
||||||
if (!InstDep.isDef())
|
// If this is a may-aliased store that is clobbering the store value, we
|
||||||
continue;
|
// can keep searching past it for another must-aliased pointer that stores
|
||||||
|
// to the same location. For example, in:
|
||||||
|
// store -> P
|
||||||
|
// store -> Q
|
||||||
|
// store -> P
|
||||||
|
// we can remove the first store to P even though we don't know if P and Q
|
||||||
|
// alias.
|
||||||
|
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
||||||
|
AliasAnalysis::Location Loc =
|
||||||
|
getAnalysis<AliasAnalysis>().getLocation(SI);
|
||||||
|
while (InstDep.isClobber() && isa<StoreInst>(InstDep.getInst()) &&
|
||||||
|
InstDep.getInst() != &BB.front())
|
||||||
|
InstDep = MD.getPointerDependencyFrom(Loc, false, InstDep.getInst(),
|
||||||
|
&BB);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not a definite must-alias dependency, ignore it.
|
||||||
|
if (!InstDep.isDef())
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// If this is a store-store dependence, then the previous store is dead so
|
// If this is a store-store dependence, then the previous store is dead so
|
||||||
// long as this store is at least as big as it.
|
// long as this store is at least as big as it.
|
||||||
|
@@ -11,3 +11,12 @@ define void @test1(i32* %Q, i32* %P) {
|
|||||||
; CHECK-NEXT: ret void
|
; CHECK-NEXT: ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; PR8576 - Should delete store of 10 even though p/q are may aliases.
|
||||||
|
define void @test2(i32 *%p, i32 *%q) {
|
||||||
|
store i32 10, i32* %p, align 4
|
||||||
|
store i32 20, i32* %q, align 4
|
||||||
|
store i32 30, i32* %p, align 4
|
||||||
|
ret void
|
||||||
|
; CHECK: @test2
|
||||||
|
; CHECK-NEXT: store i32 20
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user