teach DSE and isInstructionTriviallyDead() about calloc

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156553 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nuno Lopes 2012-05-10 17:14:00 +00:00
parent 9777f61bfe
commit e54874471c
3 changed files with 26 additions and 5 deletions

View File

@ -282,6 +282,12 @@ static uint64_t getPointerSize(const Value *V, AliasAnalysis &AA) {
return C->getZExtValue();
}
if (const CallInst *CI = extractCallocCall(V)) {
if (const ConstantInt *C1 = dyn_cast<ConstantInt>(CI->getArgOperand(0)))
if (const ConstantInt *C2 = dyn_cast<ConstantInt>(CI->getArgOperand(1)))
return (C1->getValue() * C2->getValue()).getZExtValue();
}
if (TD == 0)
return AliasAnalysis::UnknownSize;
@ -704,9 +710,11 @@ bool DSE::handleEndBlock(BasicBlock &BB) {
// Okay, so these are dead heap objects, but if the pointer never escapes
// then it's leaked by this function anyways.
if (CallInst *CI = extractMallocCall(I))
if (!PointerMayBeCaptured(CI, true, true))
DeadStackObjects.insert(CI);
CallInst *CI = extractMallocCall(I);
if (!CI)
CI = extractCallocCall(I);
if (CI && !PointerMayBeCaptured(CI, true, true))
DeadStackObjects.insert(CI);
}
// Treat byval arguments the same, stores to them are dead at the end of the
@ -759,6 +767,11 @@ bool DSE::handleEndBlock(BasicBlock &BB) {
continue;
}
if (CallInst *CI = extractCallocCall(BBI)) {
DeadStackObjects.erase(CI);
continue;
}
if (CallSite CS = cast<Value>(BBI)) {
// If this call does not access memory, it can't be loading any of our
// pointers.

View File

@ -260,7 +260,7 @@ bool llvm::isInstructionTriviallyDead(Instruction *I) {
return isa<UndefValue>(II->getArgOperand(1));
}
if (extractMallocCall(I)) return true;
if (extractMallocCall(I) || extractCallocCall(I)) return true;
if (CallInst *CI = isFreeCall(I))
if (Constant *C = dyn_cast<Constant>(CI->getArgOperand(0)))

View File

@ -164,7 +164,7 @@ define i32* @test13() {
}
declare noalias i8* @malloc(i32)
declare noalias i8* @calloc(i32, i32)
define void @test14(i32* %Q) {
@ -258,3 +258,11 @@ define void @test20() {
}
; CHECK: @test20
; CHECK-NEXT: ret void
; CHECK: @test21
define void @test21() {
%m = call i8* @calloc(i32 9, i32 7)
store i8 0, i8* %m
; CHECK-NEXT: ret void
ret void
}