[llvm-commits] [llvm] r82867 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll

Chris Lattner clattner at apple.com
Sat Sep 26 12:14:38 PDT 2009


On Sep 26, 2009, at 11:10 AM, Dan Gohman wrote:

> Author: djg
> Date: Sat Sep 26 13:10:13 2009
> New Revision: 82867
>
> URL: http://llvm.org/viewvc/llvm-project?rev=82867&view=rev
> Log:
> Fix SimplifyLibCalls to transfer attributes from callees rather than
> calls, since direct calls don't always reflect the attributes of their
> callees.

But sometimes calls have more precise information than the callee.   
For example, if you have (with -fmath-errno):

if (X > 42.1)
   Y = sqrt(X);

then the call to sqrt could be marked readnone/only but the sqrt  
Function object wouldn't be either.  Why not use something like "if  
the old call was readonly, add the readonly bit to the new call"?   
This has the benefit of transparently looking from the call to the  
callee.

-Chris


>
> Modified:
>    llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
>    llvm/trunk/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp?rev=82867&r1=82866&r2=82867&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Sat Sep 26  
> 13:10:13 2009
> @@ -1019,7 +1019,7 @@
>       if (Op1C->isExactlyValue(1.0))  // pow(1.0, x) -> 1.0
>         return Op1C;
>       if (Op1C->isExactlyValue(2.0))  // pow(2.0, x) -> exp2(x)
> -        return EmitUnaryFloatFnCall(Op2, "exp2", B, CI- 
> >getAttributes());
> +        return EmitUnaryFloatFnCall(Op2, "exp2", B, Callee- 
> >getAttributes());
>     }
>
>     ConstantFP *Op2C = dyn_cast<ConstantFP>(Op2);
> @@ -1036,8 +1036,10 @@
>       // TODO: In finite-only mode, this could be just fabs(sqrt(x)).
>       Value *Inf = ConstantFP::getInfinity(CI->getType());
>       Value *NegInf = ConstantFP::getInfinity(CI->getType(), true);
> -      Value *Sqrt = EmitUnaryFloatFnCall(Op1, "sqrt", B, CI- 
> >getAttributes());
> -      Value *FAbs = EmitUnaryFloatFnCall(Sqrt, "fabs", B, CI- 
> >getAttributes());
> +      Value *Sqrt = EmitUnaryFloatFnCall(Op1, "sqrt", B,
> +                                         Callee->getAttributes());
> +      Value *FAbs = EmitUnaryFloatFnCall(Sqrt, "fabs", B,
> +                                         Callee->getAttributes());
>       Value *FCmp = B.CreateFCmpOEQ(Op1, NegInf, "tmp");
>       Value *Sel = B.CreateSelect(FCmp, Inf, FAbs, "tmp");
>       return Sel;
> @@ -1121,7 +1123,8 @@
>
>     // floor((double)floatval) -> (double)floorf(floatval)
>     Value *V = Cast->getOperand(0);
> -    V = EmitUnaryFloatFnCall(V, Callee->getName().data(), B, CI- 
> >getAttributes());
> +    V = EmitUnaryFloatFnCall(V, Callee->getName().data(), B,
> +                             Callee->getAttributes());
>     return B.CreateFPExt(V, Type::getDoubleTy(*Context));
>   }
> };
>
> Modified: llvm/trunk/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll?rev=82867&r1=82866&r2=82867&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll  
> (original)
> +++ llvm/trunk/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll Sat  
> Sep 26 13:10:13 2009
> @@ -5,27 +5,27 @@
> ; special cases. The readonly attribute on the call should be  
> preserved.
>
> ; CHECK: define float @foo(float %x) nounwind {
> -; CHECK:   %sqrtf = call float @sqrtf(float %x) readonly
> -; CHECK:   %fabsf = call float @fabsf(float %sqrtf) readonly
> +; CHECK:   %sqrtf = call float @sqrtf(float %x) nounwind readonly
> +; CHECK:   %fabsf = call float @fabsf(float %sqrtf) nounwind readonly
> ; CHECK:   %tmp = fcmp oeq float %x, 0xFFF0000000000000
> ; CHECK:   %tmp1 = select i1 %tmp, float 0x7FF0000000000000, float  
> %fabsf
> ; CHECK:   ret float %tmp1
>
> define float @foo(float %x) nounwind {
> -  %retval = call float @powf(float %x, float 0.5) readonly
> +  %retval = call float @powf(float %x, float 0.5)
>   ret float %retval
> }
>
> ; CHECK: define double @doo(double %x) nounwind {
> -; CHECK:   %sqrt = call double @sqrt(double %x) readonly
> -; CHECK:   %fabs = call double @fabs(double %sqrt) readonly
> +; CHECK:   %sqrt = call double @sqrt(double %x) nounwind readonly
> +; CHECK:   %fabs = call double @fabs(double %sqrt) nounwind readonly
> ; CHECK:   %tmp = fcmp oeq double %x, 0xFFF0000000000000
> ; CHECK:   %tmp1 = select i1 %tmp, double 0x7FF0000000000000, double  
> %fabs
> ; CHECK:   ret double %tmp1
> ; CHECK: }
>
> define double @doo(double %x) nounwind {
> -  %retval = call double @pow(double %x, double 0.5) readonly
> +  %retval = call double @pow(double %x, double 0.5)
>   ret double %retval
> }
>
>
>
> _______________________________________________
> 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