From 76926b6789e72eb4864dbfc1830b138486281c1d Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Sat, 26 Sep 2009 18:10:13 +0000 Subject: [PATCH] Fix SimplifyLibCalls to transfer attributes from callees rather than calls, since direct calls don't always reflect the attributes of their callees. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82867 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SimplifyLibCalls.cpp | 11 +++++++---- test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll | 12 ++++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index bb4d5e250b5..57a7d051e9f 100644 --- a/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -1019,7 +1019,7 @@ struct PowOpt : public LibCallOptimization { 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(Op2); @@ -1036,8 +1036,10 @@ struct PowOpt : public LibCallOptimization { // 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 @@ struct UnaryDoubleFPOpt : public LibCallOptimization { // 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)); } }; diff --git a/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll b/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll index 75e5104d33e..669b414531a 100644 --- a/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll +++ b/test/Transforms/SimplifyLibCalls/pow-to-sqrt.ll @@ -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 } -- 2.34.1