[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
Nuno Lopes
nunoplopes at sapo.pt
Thu Jun 21 14:42:13 PDT 2012
Quoting Eli Friedman <eli.friedman at gmail.com>:
> 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.
Uhm, the transformation is happening locally. Although we cannot see
the context here, this function is replacing an invoke with a branch
to the same BB that the invoke was jumping to.
BTW, should I keep an artificial edge to the landing pad? E.g., br i1
true, normalDest, unwindDest
Nuno
More information about the llvm-commits
mailing list