From ef7d38d35a19eba99bd37dc6ac92b8a147fb0e97 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 15 Jan 2015 01:00:33 +0000 Subject: [PATCH] For PR21145: recognise a builtin call to a known deallocation function even if it's defined in the current module. Clang generates this situation for the C++14 sized deallocation functions, because it generates a weak definition in case one isn't provided by the C++ runtime library. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226069 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/MemoryBuiltins.cpp | 2 +- .../InstCombine/malloc-free-delete.ll | 27 ++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/Analysis/MemoryBuiltins.cpp b/lib/Analysis/MemoryBuiltins.cpp index 08b41fee445..233cdab2e59 100644 --- a/lib/Analysis/MemoryBuiltins.cpp +++ b/lib/Analysis/MemoryBuiltins.cpp @@ -319,7 +319,7 @@ const CallInst *llvm::isFreeCall(const Value *I, const TargetLibraryInfo *TLI) { if (!CI || isa(CI)) return nullptr; Function *Callee = CI->getCalledFunction(); - if (Callee == nullptr || !Callee->isDeclaration()) + if (Callee == nullptr) return nullptr; StringRef FnName = Callee->getName(); diff --git a/test/Transforms/InstCombine/malloc-free-delete.ll b/test/Transforms/InstCombine/malloc-free-delete.ll index ed25e4e49c8..765c8c35c92 100644 --- a/test/Transforms/InstCombine/malloc-free-delete.ll +++ b/test/Transforms/InstCombine/malloc-free-delete.ll @@ -146,17 +146,36 @@ lpad.i: ; preds = %entry } declare i8* @_Znwm(i64) nobuiltin -declare void @_ZdlPvm(i8*, i64) nobuiltin declare i8* @_Znwj(i32) nobuiltin -declare void @_ZdlPvj(i8*, i32) nobuiltin declare i8* @_Znam(i64) nobuiltin -declare void @_ZdaPvm(i8*, i64) nobuiltin declare i8* @_Znaj(i32) nobuiltin -declare void @_ZdaPvj(i8*, i32) nobuiltin +declare void @_ZdlPv(i8*) nobuiltin +declare void @_ZdaPv(i8*) nobuiltin + +define linkonce void @_ZdlPvm(i8* %p, i64) nobuiltin { + call void @_ZdlPv(i8* %p) + ret void +} +define linkonce void @_ZdlPvj(i8* %p, i32) nobuiltin { + call void @_ZdlPv(i8* %p) + ret void +} +define linkonce void @_ZdaPvm(i8* %p, i64) nobuiltin { + call void @_ZdaPv(i8* %p) + ret void +} +define linkonce void @_ZdaPvj(i8* %p, i32) nobuiltin { + call void @_ZdaPv(i8* %p) + ret void +} ; CHECK-LABEL: @test8( define void @test8() { ; CHECK-NOT: call + %nw = call i8* @_Znwm(i64 32) builtin + call void @_ZdlPv(i8* %nw) builtin + %na = call i8* @_Znam(i64 32) builtin + call void @_ZdaPv(i8* %na) builtin %nwm = call i8* @_Znwm(i64 32) builtin call void @_ZdlPvm(i8* %nwm, i64 32) builtin %nwj = call i8* @_Znwj(i32 32) builtin