mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-02 18:31:54 +00:00
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. llvm-svn: 120368
This commit is contained in:
parent
6c0221e3ae
commit
8ec1830a01
@ -703,6 +703,8 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,
|
|||||||
if (isNoAlias(Location(Dest, Len), Loc))
|
if (isNoAlias(Location(Dest, Len), Loc))
|
||||||
return NoModRef;
|
return NoModRef;
|
||||||
}
|
}
|
||||||
|
// We know that memset doesn't load anything.
|
||||||
|
Min = Mod;
|
||||||
break;
|
break;
|
||||||
case Intrinsic::atomic_cmp_swap:
|
case Intrinsic::atomic_cmp_swap:
|
||||||
case Intrinsic::atomic_swap:
|
case Intrinsic::atomic_swap:
|
||||||
|
@ -191,6 +191,7 @@ static bool isStoreAtLeastAsWideAs(Instruction *I1, Instruction *I2,
|
|||||||
I1Size >= I2Size;
|
I1Size >= I2Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
||||||
MemoryDependenceAnalysis &MD = getAnalysis<MemoryDependenceAnalysis>();
|
MemoryDependenceAnalysis &MD = getAnalysis<MemoryDependenceAnalysis>();
|
||||||
TD = getAnalysisIfAvailable<TargetData>();
|
TD = getAnalysisIfAvailable<TargetData>();
|
||||||
@ -239,7 +240,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!InstDep.isDef()) {
|
if (!InstDep.isDef()) {
|
||||||
// If this is a may-aliased store that is clobbering the store value, we
|
// If this is a may-aliased store that is clobbering the store value, we
|
||||||
// can keep searching past it for another must-aliased pointer that stores
|
// can keep searching past it for another must-aliased pointer that stores
|
||||||
@ -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
|
// we can remove the first store to P even though we don't know if P and Q
|
||||||
// alias.
|
// alias.
|
||||||
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
|
||||||
AliasAnalysis::Location Loc =
|
AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
|
||||||
getAnalysis<AliasAnalysis>().getLocation(SI);
|
AliasAnalysis::Location Loc = AA.getLocation(SI);
|
||||||
while (InstDep.isClobber() && isa<StoreInst>(InstDep.getInst()) &&
|
while (InstDep.isClobber() && InstDep.getInst() != &BB.front()) {
|
||||||
InstDep.getInst() != &BB.front())
|
// Can't look past this instruction if it might read 'Loc'.
|
||||||
InstDep = MD.getPointerDependencyFrom(Loc, false, InstDep.getInst(),
|
if (AA.getModRefInfo(InstDep.getInst(), Loc) & AliasAnalysis::Ref)
|
||||||
&BB);
|
break;
|
||||||
|
|
||||||
|
InstDep = MD.getPointerDependencyFrom(Loc, false,
|
||||||
|
InstDep.getInst(), &BB);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,3 +54,17 @@ define void @test5(i32* %Q) {
|
|||||||
; CHECK-NEXT: volatile load
|
; CHECK-NEXT: volatile load
|
||||||
; CHECK-NEXT: ret void
|
; 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
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user