Teach basicaa that memset's modref set is at worst "mod" and never

contains "ref".

Enhance DSE to use a modref query instead of a store-specific hack
to generalize the "ignore may-alias stores" optimization to handle
memset and memcpy.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120368 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-11-30 00:28:45 +00:00
parent 532c2f1d50
commit 201d1e56bb
3 changed files with 28 additions and 7 deletions

View File

@ -703,6 +703,8 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
if (isNoAlias(Location(Dest, Len), Loc))
return NoModRef;
}
// We know that memset doesn't load anything.
Min = Mod;
break;
case Intrinsic::atomic_cmp_swap:
case Intrinsic::atomic_swap:

View File

@ -191,6 +191,7 @@ static bool isStoreAtLeastAsWideAs(Instruction *I1, Instruction *I2,
I1Size >= I2Size;
}
bool DSE::runOnBasicBlock(BasicBlock &BB) {
MemoryDependenceAnalysis &MD = getAnalysis<MemoryDependenceAnalysis>();
TD = getAnalysisIfAvailable<TargetData>();
@ -250,12 +251,16 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
// 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);
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
AliasAnalysis::Location Loc = AA.getLocation(SI);
while (InstDep.isClobber() && InstDep.getInst() != &BB.front()) {
// Can't look past this instruction if it might read 'Loc'.
if (AA.getModRefInfo(InstDep.getInst(), Loc) & AliasAnalysis::Ref)
break;
InstDep = MD.getPointerDependencyFrom(Loc, false,
InstDep.getInst(), &BB);
}
}
}

View File

@ -54,3 +54,17 @@ define void @test5(i32* %Q) {
; CHECK-NEXT: volatile load
; CHECK-NEXT: ret void
}
declare void @llvm.memset.i32(i8*, i8, i32, i32)
; Should delete store of 10 even though memset is a may-store to P (P and Q may
; alias).
define void @test6(i32 *%p, i8 *%q) {
store i32 10, i32* %p, align 4 ;; dead.
call void @llvm.memset.i32(i8* %q, i8 42, i32 900, i32 1)
store i32 30, i32* %p, align 4
ret void
; CHECK: @test6
; CHECK-NEXT: call void @llvm.memset
}