[llvm] r179817 - Implement a better fix for PR15185.

Bill Wendling isanbard at gmail.com
Fri Apr 19 11:03:13 PDT 2013


I'll try to modify the crash test to check for the merge.

-bw

On Apr 18, 2013, at 5:31 PM, Rafael Ávila De Espíndola <rafael.espindola at gmail.com> wrote:

> Can you add a test that two such functions are merged?
> 
> Sent from my iPhone
> 
> On 2013-04-18, at 19:34, Bill Wendling <isanbard at gmail.com> wrote:
> 
>> Author: void
>> Date: Thu Apr 18 18:34:17 2013
>> New Revision: 179817
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=179817&view=rev
>> Log:
>> Implement a better fix for PR15185.
>> 
>> If the return type is a pointer and the call returns an integer, then do the
>> inttoptr convertions. And vice versa.
>> 
>> Modified:
>>   llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
>> 
>> Modified: llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp?rev=179817&r1=179816&r2=179817&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp (original)
>> +++ llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp Thu Apr 18 18:34:17 2013
>> @@ -185,7 +185,7 @@ private:
>>  }
>> 
>>  /// Compare two Types, treating all pointer types as equal.
>> -  bool isEquivalentType(Type *Ty1, Type *Ty2, bool isReturnType = false) const;
>> +  bool isEquivalentType(Type *Ty1, Type *Ty2) const;
>> 
>>  // The two functions undergoing comparison.
>>  const Function *F1, *F2;
>> @@ -200,12 +200,11 @@ private:
>> 
>> // Any two pointers in the same address space are equivalent, intptr_t and
>> // pointers are equivalent. Otherwise, standard type equivalence rules apply.
>> -bool FunctionComparator::isEquivalentType(Type *Ty1, Type *Ty2,
>> -                                          bool isReturnType) const {
>> +bool FunctionComparator::isEquivalentType(Type *Ty1, Type *Ty2) const {
>>  if (Ty1 == Ty2)
>>    return true;
>>  if (Ty1->getTypeID() != Ty2->getTypeID()) {
>> -    if (TD && !isReturnType) {
>> +    if (TD) {
>>      LLVMContext &Ctx = Ty1->getContext();
>>      if (isa<PointerType>(Ty1) && Ty2 == TD->getIntPtrType(Ctx)) return true;
>>      if (isa<PointerType>(Ty2) && Ty1 == TD->getIntPtrType(Ctx)) return true;
>> @@ -261,7 +260,7 @@ bool FunctionComparator::isEquivalentTyp
>>        FTy1->isVarArg() != FTy2->isVarArg())
>>      return false;
>> 
>> -    if (!isEquivalentType(FTy1->getReturnType(), FTy2->getReturnType(), true))
>> +    if (!isEquivalentType(FTy1->getReturnType(), FTy2->getReturnType()))
>>      return false;
>> 
>>    for (unsigned i = 0, e = FTy1->getNumParams(); i != e; ++i) {
>> @@ -740,7 +739,13 @@ void MergeFunctions::writeThunk(Function
>>  if (NewG->getReturnType()->isVoidTy()) {
>>    Builder.CreateRetVoid();
>>  } else {
>> -    Builder.CreateRet(Builder.CreateBitCast(CI, NewG->getReturnType()));
>> +    Type *RetTy = NewG->getReturnType();
>> +    if (CI->getType()->isIntegerTy() && RetTy->isPointerTy())
>> +      Builder.CreateRet(Builder.CreateIntToPtr(CI, RetTy));
>> +    else if (CI->getType()->isPointerTy() && RetTy->isIntegerTy())
>> +      Builder.CreateRet(Builder.CreatePtrToInt(CI, RetTy));
>> +    else
>> +      Builder.CreateRet(Builder.CreateBitCast(CI, RetTy));
>>  }
>> 
>>  NewG->copyAttributesFrom(G);
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list