From 3e86a05613af4a3df78eef0dde7493a0cf73e482 Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Fri, 31 Mar 2017 19:58:07 +0000 Subject: [PATCH] Do not translate rint into nearbyint, but truncate it like nearbyint. A common way to implement nearbyint is by fiddling with the floating point environment and calling rint. This is used at least by the BSD libm and musl. As such, canonicalizing the latter to the former will create infinite loops for libm and generally pessimize performance, at least when the generic C versions are used. This change preserves the rint in the libcall translation and also handles the domain truncation logic, so that rint with float argument will be reduced to rintf etc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299247 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineCalls.cpp | 1 + lib/Transforms/Utils/SimplifyLibCalls.cpp | 3 ++- test/Transforms/InstCombine/float-shrink-compare.ll | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index 71ca14dee58..af4c9ac7537 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -2091,6 +2091,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { case Intrinsic::floor: case Intrinsic::round: case Intrinsic::nearbyint: + case Intrinsic::rint: case Intrinsic::trunc: { Value *ExtSrc; if (match(II->getArgOperand(0), m_FPExt(m_Value(ExtSrc))) && diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp index fa0ef1729cf..cd2d7f91920 100644 --- a/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -2160,8 +2160,9 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) { case LibFunc_round: return replaceUnaryCall(CI, Builder, Intrinsic::round); case LibFunc_nearbyint: - case LibFunc_rint: return replaceUnaryCall(CI, Builder, Intrinsic::nearbyint); + case LibFunc_rint: + return replaceUnaryCall(CI, Builder, Intrinsic::rint); case LibFunc_trunc: return replaceUnaryCall(CI, Builder, Intrinsic::trunc); case LibFunc_acos: diff --git a/test/Transforms/InstCombine/float-shrink-compare.ll b/test/Transforms/InstCombine/float-shrink-compare.ll index a98f4cd1cb4..e0925952bf4 100644 --- a/test/Transforms/InstCombine/float-shrink-compare.ll +++ b/test/Transforms/InstCombine/float-shrink-compare.ll @@ -119,7 +119,7 @@ define i32 @test5(float %x, float %y) nounwind uwtable { %cmp.ext = zext i1 %cmp to i32 ret i32 %cmp.ext ; CHECK-LABEL: @test5( -; CHECK-NEXT: %rint = call float @llvm.nearbyint.f32(float %x) +; CHECK-NEXT: %rint = call float @llvm.rint.f32(float %x) ; CHECK-NEXT: fcmp oeq float %rint, %y } @@ -276,7 +276,7 @@ define i32 @test12(float %x, float %y) nounwind uwtable { %cmp.ext = zext i1 %cmp to i32 ret i32 %cmp.ext ; CHECK-LABEL: @test12( -; CHECK-NEXT: %rint = call float @llvm.nearbyint.f32(float %x) +; CHECK-NEXT: %rint = call float @llvm.rint.f32(float %x) ; CHECK-NEXT: fcmp oeq float %rint, %y } -- 2.50.1