[llvm-commits] [llvm] r127673 - /llvm/trunk/lib/Analysis/MemoryBuiltins.cpp

Benjamin Kramer benny.kra at googlemail.com
Wed Mar 16 12:32:56 PDT 2011


On 15.03.2011, at 08:31, Nick Lewycky wrote:

> Author: nicholas
> Date: Tue Mar 15 02:31:32 2011
> New Revision: 127673
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=127673&view=rev
> Log:
> Add C++ global operator {new,new[],delete,delete[]}(unsigned {int,long}) to the
> memory builtins as equivalent to malloc/free.
> 
> This is different from any attribute we have. For example, you can delete the
> allocators when their result is unused, but you can't collapse two calls to the
> same function, even if no global/memory state has changed in between. The
> noalias return states that the result does not alias any other pointer, but
> instcombine optimizes malloc() as though the result is non-null for the purpose
> of eliminating unused pointers.
> 
> 
> Modified:
>    llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
> 
> Modified: llvm/trunk/lib/Analysis/MemoryBuiltins.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryBuiltins.cpp?rev=127673&r1=127672&r2=127673&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/MemoryBuiltins.cpp (original)
> +++ llvm/trunk/lib/Analysis/MemoryBuiltins.cpp Tue Mar 15 02:31:32 2011
> @@ -35,7 +35,11 @@
>     return false;
> 
>   Function *Callee = CI->getCalledFunction();
> -  if (Callee == 0 || !Callee->isDeclaration() || Callee->getName() != "malloc")
> +  if (Callee == 0 || !Callee->isDeclaration())
> +    return false;
> +  if (Callee->getName() != "malloc" &&
> +      Callee->getName() != "_Znwj" && Callee->getName() != "_Znwm" &&
> +      Callee->getName() != "_Znaj" && Callee->getName() != "_Znam")
>     return false;

What about the nothrow versions of operator new/delete?

>   // Check malloc prototype.
> @@ -189,7 +193,12 @@
>   if (!CI)
>     return 0;
>   Function *Callee = CI->getCalledFunction();
> -  if (Callee == 0 || !Callee->isDeclaration() || Callee->getName() != "free")
> +  if (Callee == 0 || !Callee->isDeclaration())
> +    return 0;
> +
> +  if (Callee->getName() != "free" &&
> +      Callee->getName() != "_Zdlj" && Callee->getName() != "_Zdlm" &&
> +      Callee->getName() != "_Zdaj" && Callee->getName() != "_Zdam")
>     return 0;

The signature of operator delete is "operator delete(void*)" aka _ZdlPv, not "operator delete(int)".
Comments with the demangled names would be helpful here.



More information about the llvm-commits mailing list