[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