[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