[llvm-commits] [llvm] r85176 - in /llvm/trunk: examples/BrainF/ include/llvm-c/ include/llvm/ include/llvm/Analysis/ include/llvm/Support/ include/llvm/Transforms/ lib/Analysis/ lib/Analysis/IPA/ lib/AsmParser/ lib/Bitcode/Writer/ lib/CodeGen/SelectionDAG/ lib/ExecutionEngine/Interpreter/ lib/Target/CBackend/ lib/Target/CppBackend/ lib/Target/MSIL/ lib/Transforms/Scalar/ lib/Transforms/Utils/ lib/VMCore/

Victor Hernandez vhernandez at apple.com
Tue Nov 3 12:40:11 PST 2009


Fixed in r85936.

Victor

On Nov 2, 2009, at 9:36 PM, Chris Lattner wrote:

>
> On Oct 26, 2009, at 4:43 PM, Victor Hernandez wrote:
>
>> Author: hernande
>> Date: Mon Oct 26 18:43:48 2009
>> New Revision: 85176
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=85176&view=rev
>> Log:
>> Remove FreeInst.
>> Remove LowerAllocations pass.
>> Update some more passes to treate free calls just like they were  
>> treating FreeInst.
>
> Thanks Victor,
>
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- llvm/trunk/lib/VMCore/Instruction.cpp (original)
>
>> +// Code here matches isFreeCall from MallocHelper, which is not in  
>> VMCore.
>> +static bool isFreeCall(const Value* I) {
>> +  const CallInst *CI = dyn_cast<CallInst>(I);
>> +  if (!CI)
>> +    return false;
>> +
>> +  const Module* M = CI->getParent()->getParent()->getParent();
>> +  Function *FreeFunc = M->getFunction("free");
>> +
>> +  if (CI->getOperand(0) != FreeFunc)
>> +    return false;
>
> Please use something like this, which would be much more efficient:
>
>  const CallInst *CI = dyn_cast<CallInst>(I);
>  if (!CI)
>    return false;
>  Function *Callee = CI->getCalledFunction();
>  if (Callee == 0 || !Callee->isDeclaration() || Callee->getName() !=  
> "free")
>    return false;
>
>
>> +
>> +  // Check free prototype.
>> +  // FIXME: workaround for PR5130, this will be obsolete when a  
>> nobuiltin
>> +  // attribute will exist.
>> +  const FunctionType *FTy = FreeFunc->getFunctionType();
>> +  if (FTy->getReturnType() != Type::getVoidTy(M->getContext()))
>
> Use ->isVoidTy() instead of comparing against a newly constructed  
> type.
>
>> /// mayReadFromMemory - Return true if this instruction may read  
>> memory.
>> ///
>> bool Instruction::mayReadFromMemory() const {
>>  switch (getOpcode()) {
>>  default: return false;
>> -  case Instruction::Free:
>>  case Instruction::VAArg:
>>  case Instruction::Load:
>>    return true;
>>  case Instruction::Call:
>> +    if (isFreeCall(this))
>> +      return true;
>>    return !cast<CallInst>(this)->doesNotAccessMemory();
>
> This call to isFreeCall isn't needed because the existing code works  
> for it.
>
>>  case Instruction::Invoke:
>>    return !cast<InvokeInst>(this)->doesNotAccessMemory();
>> @@ -326,11 +352,12 @@
>> bool Instruction::mayWriteToMemory() const {
>>  switch (getOpcode()) {
>>  default: return false;
>> -  case Instruction::Free:
>>  case Instruction::Store:
>>  case Instruction::VAArg:
>>    return true;
>>  case Instruction::Call:
>> +    if (isFreeCall(this))
>> +      return true;
>>    return !cast<CallInst>(this)->onlyReadsMemory();
>
> Likewise.  I removed some other ones that are not needed.
>
> -Chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20091103/b988040c/attachment.html>


More information about the llvm-commits mailing list