diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2012-05-10 17:14:00 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2012-05-10 17:14:00 +0000 |
commit | e54874471cf565bbacdca69c95ae7287badc578f (patch) | |
tree | fd2341972c1f5e8d2ad3ed31ce77eaf10c4e9440 | |
parent | 9777f61bfe36a53757977cd777f2b4e73fc3e8a3 (diff) |
teach DSE and isInstructionTriviallyDead() about calloc
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156553 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/DeadStoreElimination.cpp | 19 | ||||
-rw-r--r-- | lib/Transforms/Utils/Local.cpp | 2 | ||||
-rw-r--r-- | test/Transforms/DeadStoreElimination/simple.ll | 10 |
3 files changed, 26 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index c8c5360601..a46e802f4c 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -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. diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index d1c4d59682..4e1a00fa2d 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -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))) diff --git a/test/Transforms/DeadStoreElimination/simple.ll b/test/Transforms/DeadStoreElimination/simple.ll index 81eb5a8c70..7c8a9b3337 100644 --- a/test/Transforms/DeadStoreElimination/simple.ll +++ b/test/Transforms/DeadStoreElimination/simple.ll @@ -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 +} |