[llvm-commits] [llvm] r158937 - in /llvm/trunk: include/llvm/Analysis/MemoryBuiltins.h lib/Analysis/MemoryBuiltins.cpp lib/Transforms/InstCombine/InstCombineCalls.cpp lib/Transforms/InstCombine/InstructionCombining.cpp test/Transforms/InstCombine
Eli Friedman
eli.friedman at gmail.com
Thu Jun 21 14:34:13 PDT 2012
On Thu, Jun 21, 2012 at 2:25 PM, Nuno Lopes <nunoplopes at sapo.pt> wrote:
> Author: nlopes
> Date: Thu Jun 21 16:25:05 2012
> New Revision: 158937
>
> URL: http://llvm.org/viewvc/llvm-project?rev=158937&view=rev
> Log:
> Add support for invoke to the MemoryBuiltin analysid.
> Update comments accordingly.
>
> Make instcombine remove useless invokes to C++'s 'new' allocation function (test attached).
>
> Modified:
> llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h
> llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
> llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
> llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
> llvm/trunk/test/Transforms/InstCombine/objsize-64.ll
>
> Modified: llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h?rev=158937&r1=158936&r2=158937&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h (original)
> +++ llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h Thu Jun 21 16:25:05 2012
> @@ -31,28 +31,29 @@
> class Value;
>
>
> -/// \brief Tests if a value is a call to a library function that allocates or
> -/// reallocates memory (either malloc, calloc, realloc, or strdup like).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates or reallocates memory (either malloc, calloc, realloc, or strdup
> +/// like).
> bool isAllocationFn(const Value *V, bool LookThroughBitCast = false);
>
> -/// \brief Tests if a value is a call to a function that returns a NoAlias
> -/// pointer (including malloc/calloc/strdup-like functions).
> +/// \brief Tests if a value is a call or invoke to a function that returns a
> +/// NoAlias pointer (including malloc/calloc/strdup-like functions).
> bool isNoAliasFn(const Value *V, bool LookThroughBitCast = false);
>
> -/// \brief Tests if a value is a call to a library function that allocates
> -/// uninitialized memory (such as malloc).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates uninitialized memory (such as malloc).
> bool isMallocLikeFn(const Value *V, bool LookThroughBitCast = false);
>
> -/// \brief Tests if a value is a call to a library function that allocates
> -/// zero-filled memory (such as calloc).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates zero-filled memory (such as calloc).
> bool isCallocLikeFn(const Value *V, bool LookThroughBitCast = false);
>
> -/// \brief Tests if a value is a call to a library function that allocates
> -/// memory (either malloc, calloc, or strdup like).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates memory (either malloc, calloc, or strdup like).
> bool isAllocLikeFn(const Value *V, bool LookThroughBitCast = false);
>
> -/// \brief Tests if a value is a call to a library function that reallocates
> -/// memory (such as realloc).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// reallocates memory (such as realloc).
> bool isReallocLikeFn(const Value *V, bool LookThroughBitCast = false);
>
>
>
> Modified: llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryBuiltins.cpp?rev=158937&r1=158936&r2=158937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/MemoryBuiltins.cpp (original)
> +++ llvm/trunk/lib/Analysis/MemoryBuiltins.cpp Thu Jun 21 16:25:05 2012
> @@ -65,11 +65,17 @@
> static Function *getCalledFunction(const Value *V, bool LookThroughBitCast) {
> if (LookThroughBitCast)
> V = V->stripPointerCasts();
> - const CallInst *CI = dyn_cast<CallInst>(V);
> - if (!CI)
> +
> + Value *I = const_cast<Value*>(V);
> + CallSite CS;
> + if (CallInst *CI = dyn_cast<CallInst>(I))
> + CS = CallSite(CI);
> + else if (InvokeInst *II = dyn_cast<InvokeInst>(I))
> + CS = CallSite(II);
> + else
> return 0;
>
> - Function *Callee = CI->getCalledFunction();
> + Function *Callee = CS.getCalledFunction();
> if (!Callee || !Callee->isDeclaration())
> return 0;
> return Callee;
> @@ -122,39 +128,40 @@
> }
>
>
> -/// \brief Tests if a value is a call to a library function that allocates or
> -/// reallocates memory (either malloc, calloc, realloc, or strdup like).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates or reallocates memory (either malloc, calloc, realloc, or strdup
> +/// like).
> bool llvm::isAllocationFn(const Value *V, bool LookThroughBitCast) {
> return getAllocationData(V, AnyAlloc, LookThroughBitCast);
> }
>
> -/// \brief Tests if a value is a call to a function that returns a NoAlias
> -/// pointer (including malloc/calloc/strdup-like functions).
> +/// \brief Tests if a value is a call or invoke to a function that returns a
> +/// NoAlias pointer (including malloc/calloc/strdup-like functions).
> bool llvm::isNoAliasFn(const Value *V, bool LookThroughBitCast) {
> return isAllocLikeFn(V, LookThroughBitCast) ||
> hasNoAliasAttr(V, LookThroughBitCast);
> }
>
> -/// \brief Tests if a value is a call to a library function that allocates
> -/// uninitialized memory (such as malloc).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates uninitialized memory (such as malloc).
> bool llvm::isMallocLikeFn(const Value *V, bool LookThroughBitCast) {
> return getAllocationData(V, MallocLike, LookThroughBitCast);
> }
>
> -/// \brief Tests if a value is a call to a library function that allocates
> -/// zero-filled memory (such as calloc).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates zero-filled memory (such as calloc).
> bool llvm::isCallocLikeFn(const Value *V, bool LookThroughBitCast) {
> return getAllocationData(V, CallocLike, LookThroughBitCast);
> }
>
> -/// \brief Tests if a value is a call to a library function that allocates
> -/// memory (either malloc, calloc, or strdup like).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// allocates memory (either malloc, calloc, or strdup like).
> bool llvm::isAllocLikeFn(const Value *V, bool LookThroughBitCast) {
> return getAllocationData(V, AllocLike, LookThroughBitCast);
> }
>
> -/// \brief Tests if a value is a call to a library function that reallocates
> -/// memory (such as realloc).
> +/// \brief Tests if a value is a call or invoke to a library function that
> +/// reallocates memory (such as realloc).
> bool llvm::isReallocLikeFn(const Value *V, bool LookThroughBitCast) {
> return getAllocationData(V, ReallocLike, LookThroughBitCast);
> }
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=158937&r1=158936&r2=158937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Thu Jun 21 16:25:05 2012
> @@ -172,8 +172,6 @@
> Instruction *InstCombiner::visitCallInst(CallInst &CI) {
> if (isFreeCall(&CI))
> return visitFree(CI);
> - if (isAllocLikeFn(&CI))
> - return visitMalloc(CI);
>
> // If the caller function is nounwind, mark the call as nounwind, even if the
> // callee isn't.
> @@ -881,6 +879,9 @@
> // visitCallSite - Improvements for call and invoke instructions.
> //
> Instruction *InstCombiner::visitCallSite(CallSite CS) {
> + if (isAllocLikeFn(CS.getInstruction()))
> + return visitMalloc(*CS.getInstruction());
> +
> bool Changed = false;
>
> // If the callee is a pointer to a function, attempt to move any casts to the
>
> Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=158937&r1=158936&r2=158937&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp (original)
> +++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Thu Jun 21 16:25:05 2012
> @@ -1167,6 +1167,10 @@
> }
> EraseInstFromFunction(*I);
> }
> +
> + if (InvokeInst *II = dyn_cast<InvokeInst>(&MI)) {
> + BranchInst::Create(II->getNormalDest(), II->getParent());
> + }
This part of the patch is kind of weird; we generally prefer that
instcombine transformations which modify branches perform the relevant
updates locally, instead of making the main loop guess what is
supposed to happen.
-Eli
More information about the llvm-commits
mailing list