[llvm-commits] [llvm] r50121 - /llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Chris Lattner clattner at apple.com
Tue Apr 22 20:08:26 PDT 2008


On Apr 22, 2008, at 6:03 PM, Dale Johannesen wrote:
> URL: http://llvm.org/viewvc/llvm-project?rev=50121&view=rev
> Log:
> Do not change the type of a ByVal argument to a
> type of a different size.

Very nice Dale!

> +++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Tue  
> Apr 22 20:03:05 2008
> @@ -8748,16 +8748,29 @@
>   const PointerType *PTy = cast<PointerType>(Callee->getType());
>   const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
>   if (FTy->isVarArg()) {
> +    int ix = FTy->getNumParams() + (isa<InvokeInst>(Callee) ? 3 : 1);
>     // See if we can optimize any arguments passed through the  
> varargs area of
>     // the call.
>     for (CallSite::arg_iterator I = CS.arg_begin()+FTy- 
> >getNumParams(),
> -           E = CS.arg_end(); I != E; ++I)
> +           E = CS.arg_end(); I != E; ++I, ++ix)
>       if (CastInst *CI = dyn_cast<CastInst>(*I)) {
> -        // If this cast does not effect the value passed through  
> the varargs
> +        // If this cast does not affect the value passed through  
> the varargs
>         // area, we can eliminate the use of the cast.
> -        Value *Op = CI->getOperand(0);
> +        const PointerType* SrcPTy, *DstPTy;
>         if (CI->isLosslessCast()) {
> -          *I = Op;
> +          // The size of ByVal arguments is derived from the type,  
> so we
> +          // can't change to a type with a different size.  If the  
> size were
> +          // passed explicitly we could avoid this check.
> +          if (CS.paramHasAttr(ix, ParamAttr::ByVal) &&
> +              (SrcPTy = cast<PointerType>(CI->getOperand(0)- 
> >getType())) &&
> +              (DstPTy = cast<PointerType>(CI->getType()))) {
> +            const Type* SrcTy = SrcPTy->getElementType();
> +            const Type* DstTy = DstPTy->getElementType();
> +            if (!SrcTy->isSized() || !DstTy->isSized() ||
> +                TD->getABITypeSize(SrcTy) != TD- 
> >getABITypeSize(DstTy))
> +              continue;
> +          }
> +          *I = CI->getOperand(0);
>           Changed = true;
>         }
>       }

This logic is pretty hairy.  Please add a new static  
"isSafeToEliminateVarargsCast" predicate.  This gives allows this to  
be written more naturally with early outs.

Thanks for tracking this down!

-Chris




More information about the llvm-commits mailing list