Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions llvm/include/llvm/Analysis/TargetLibraryInfo.def
Original file line number Diff line number Diff line change
Expand Up @@ -1731,6 +1731,22 @@ TLI_DEFINE_ENUM_INTERNAL(llabs)
TLI_DEFINE_STRING_INTERNAL("llabs")
TLI_DEFINE_SIG_INTERNAL(LLong, LLong)

//long long llrint ( double num );
TLI_DEFINE_ENUM_INTERNAL(llrint)
TLI_DEFINE_STRING_INTERNAL("llrint")
TLI_DEFINE_SIG_INTERNAL(LLong,Dbl)


//long long llrintf( float arg );
TLI_DEFINE_ENUM_INTERNAL(llrintf)
TLI_DEFINE_STRING_INTERNAL("llrintf")
TLI_DEFINE_SIG_INTERNAL(LLong,Flt)

//long long llrintl( long double arg );
TLI_DEFINE_ENUM_INTERNAL(llrintl)
TLI_DEFINE_STRING_INTERNAL("llrintl")
TLI_DEFINE_SIG_INTERNAL(LLong,LDbl)

/// double log(double x);
TLI_DEFINE_ENUM_INTERNAL(log)
TLI_DEFINE_STRING_INTERNAL("log")
Expand Down
1 change: 1 addition & 0 deletions llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ class LibCallSimplifier {
Value *optimizeLog(CallInst *CI, IRBuilderBase &B);
Value *optimizeSqrt(CallInst *CI, IRBuilderBase &B);
Value *optimizeFMod(CallInst *CI, IRBuilderBase &B);
Value *optimizellrint(CallInst *CI,IRBuilderBase &B);
Value *mergeSqrtToExp(CallInst *CI, IRBuilderBase &B);
Value *optimizeSinCosPi(CallInst *CI, bool IsSin, IRBuilderBase &B);
Value *optimizeTrigInversionPairs(CallInst *CI, IRBuilderBase &B);
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Analysis/TargetLibraryInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_floorf);
TLI.setUnavailable(LibFunc_fmodf);
TLI.setUnavailable(LibFunc_hypotf);
TLI.setAvailable(LibFunc_llrintf);
TLI.setUnavailable(LibFunc_log10f);
TLI.setUnavailable(LibFunc_logf);
TLI.setUnavailable(LibFunc_modff);
Expand Down Expand Up @@ -342,6 +343,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_frexpl);
TLI.setUnavailable(LibFunc_hypotl);
TLI.setUnavailable(LibFunc_ldexpl);
TLI.setUnavailable(LibFunc_llrintl);
TLI.setUnavailable(LibFunc_log10l);
TLI.setUnavailable(LibFunc_logl);
TLI.setUnavailable(LibFunc_modfl);
Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/Transforms/Utils/BuildLibCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1368,6 +1368,13 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setDoesNotFreeMemory(F);
Changed |= setWillReturn(F);
break;
case LibFunc_llrintf:
case LibFunc_llrintl:
case LibFunc_llrint:
Changed|=setDoesNotThrow(F);
Changed|=setDoesNotAccessMemory(F);
Changed|=setWillReturn(F);
break;
case LibFunc_sincos:
case LibFunc_sincosf:
case LibFunc_sincosl:
Expand Down
22 changes: 22 additions & 0 deletions llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3111,6 +3111,28 @@ Value *LibCallSimplifier::optimizeRemquo(CallInst *CI, IRBuilderBase &B) {
return ConstantFP::get(CI->getType(), Rem);
}

Value *LibCallSimplifier::optimizellrint(CallInst *CI,IRBuilderBase &B){
const APFloat *X;
if(!match(CI->getOperand(0),m_APFloat(X))){
return nullptr;
}
Type *type=CI->getType();

unsigned width=type->getIntegerBitWidth();

APSInt Result(width,false);
bool Isexact;

APFloat::opStatus Status=X->convertToInteger(Result,APFloat::rmNearestTiesToEven,&Isexact);

if(Status==APFloat::opOK || Status==APFloat::opInexact){
return ConstantInt::get(type,Result);
}

return nullptr;

}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As this is just constant folding, it should be in ConstantFolding.cpp.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since these are optimizing out the standard library calls i placed in simplifylibcalls.cpp

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still belongs in ConstantFolding


/// Constant folds fdim
Value *LibCallSimplifier::optimizeFdim(CallInst *CI, IRBuilderBase &B) {
// Cannot perform the fold unless the call has attribute memory(none)
Expand Down
10 changes: 10 additions & 0 deletions llvm/test/Transforms/InferFunctionAttrs/annotate.ll
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,15 @@ declare i32 @ilogbf(float)
; CHECK: declare i32 @ilogbl(x86_fp80) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]]
declare i32 @ilogbl(x86_fp80)

; CHECK: declare noundef i64 @llrint(double) [[MATH_NOACCESS:#[0-9]+]]
declare i64 @llrint(double)

; CHECK: declare noundef i64 @llrintf(float) [[MATH_NOACCESS:#[0-9]+]]
declare i64 @llrintf(float)

; CHECK: declare noundef i64 @llrintl(x86_fp80) [[MATH_NOACCESS:#[0-9]+]]
declare i64 @llrintl(x86_fp80)

; CHECK: declare double @logb(double) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]]
declare double @logb(double)

Expand Down Expand Up @@ -1196,6 +1205,7 @@ declare void @memset_pattern16(ptr, ptr, i64)
; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY_WILLRETURN]] = { mustprogress nocallback nofree nounwind willreturn memory(read) }
; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY]] = { nofree nounwind memory(read) }
; CHECK-DAG: attributes [[MATH_NOACCESS]] = { mustprogress nofree nosync nounwind willreturn memory(none) }
; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_FREE_FAMILY_MALLOC]] = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
; CHECK-DAG: attributes [[INACCESSIBLEMEMONLY_NOFREE_NOUNWIND_WILLRETURN_ALLOCKIND_ALLOCUNINIT_ALLOCSIZE0_FAMILY_MALLOC]] = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
; CHECK-DAG: attributes [[INACCESSIBLEMEMONLY_NOFREE_NOUNWIND_WILLRETURN_ALLOCKIND_ALLOCUNINIT_FAMILY_MALLOC]] = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
Expand Down
87 changes: 87 additions & 0 deletions llvm/test/Transforms/InstCombine/llrint_fold.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s


declare i64 @llrint(double)

; Positive number test
; CHECK-LABEL: define i64 @test_llrint_pos()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 4
define i64 @test_llrint_pos() {
entry:
%val = call i64 @llrint(double 3.5)
ret i64 %val
}

; Negative number test
; CHECK-LABEL: define i64 @test_llrint_neg()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 -2
define i64 @test_llrint_neg() {
entry:
%val = call i64 @llrint(double -2.5)
ret i64 %val
}

; Zero test
; CHECK-LABEL: define i64 @test_llrint_zero()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 0
define i64 @test_llrint_zero() {
entry:
%val = call i64 @llrint(double 0.0)
ret i64 %val
}

; Large value test
; CHECK-LABEL: define i64 @test_llrint_large()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 1000000
define i64 @test_llrint_large() {
entry:
%val = call i64 @llrint(double 1.0e6)
ret i64 %val
}

; Rounding test (check ties-to-even)
; CHECK-LABEL: define i64 @test_llrint_round_even()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 2
define i64 @test_llrint_round_even() {
entry:
%val = call i64 @llrint(double 2.5)
ret i64 %val
}

; NaN test
; CHECK-LABEL: define i64 @test_llrint_nan()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrint(double 0x7FF8000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrint_nan() {
entry:
%val = call i64 @llrint(double 0x7FF8000000000000) ; NaN
ret i64 %val
}

; +Inf test
; CHECK-LABEL: define i64 @test_llrint_posinf()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrint(double 0x7FF0000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrint_posinf() {
entry:
%val = call i64 @llrint(double 0x7FF0000000000000) ; +Inf
ret i64 %val
}

; -Inf test
; CHECK-LABEL: define i64 @test_llrint_neginf()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrint(double 0xFFF0000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrint_neginf() {
entry:
%val = call i64 @llrint(double 0xFFF0000000000000) ; -Inf
ret i64 %val
}
102 changes: 102 additions & 0 deletions llvm/test/Transforms/InstCombine/llrintf_fold.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s

declare i64 @llrintf(float)

; Positive number test
; CHECK-LABEL: define i64 @test_llrintf_pos()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 4
define i64 @test_llrintf_pos() {
entry:
%val = call i64 @llrintf(float 3.5)
ret i64 %val
}

; Negative number test
; CHECK-LABEL: define i64 @test_llrintf_neg()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 -2
define i64 @test_llrintf_neg() {
entry:
%val = call i64 @llrintf(float -2.5)
ret i64 %val
}

; Zero test
; CHECK-LABEL: define i64 @test_llrintf_zero()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 0
define i64 @test_llrintf_zero() {
entry:
%val = call i64 @llrintf(float 0.0)
ret i64 %val
}
65 changes: 65 additions & 0 deletions65
llvm/test/Transforms/InstCombine/llrintl_fp80.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
declare i64 @llrintl(x86_fp80)

; Positive number
; CHECK-LABEL: define i64 @test_llrintl_pos()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 4
define i64 @test_llrintl_pos() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK4000E000000000000000)
ret i64 %val
}

; Negative number
; CHECK-LABEL: define i64 @test_llrintl_neg()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 -2
define i64 @test_llrintl_neg() {
entry:
%val = call i64 @llrintl(x86_fp80 0xKC000A000000000000000)
ret i64 %val
}

; Zero
; CHECK-LABEL: define i64 @test_llrintl_zero()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 0
define i64 @test_llrintl_zero() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK00000000000000000000)
ret i64 %val
}

; NaN
; CHECK-LABEL: define i64 @test_llrintl_nan()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrintl_nan() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
ret i64 %val
}

; +Inf
; CHECK-LABEL: define i64 @test_llrintl_posinf()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrintl_posinf() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
ret i64 %val
}

; -Inf
; CHECK-LABEL: define i64 @test_llrintl_neginf()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrintl_neginf() {
entry:
%val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
ret i64 %val
}
65 changes: 65 additions & 0 deletions llvm/test/Transforms/InstCombine/llrintl_fp80.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
declare i64 @llrintl(x86_fp80)

; Positive number
; CHECK-LABEL: define i64 @test_llrintl_pos()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 4
define i64 @test_llrintl_pos() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK4000E000000000000000)
ret i64 %val
}

; Negative number
; CHECK-LABEL: define i64 @test_llrintl_neg()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 -2
define i64 @test_llrintl_neg() {
entry:
%val = call i64 @llrintl(x86_fp80 0xKC000A000000000000000)
ret i64 %val
}

; Zero
; CHECK-LABEL: define i64 @test_llrintl_zero()
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 0
define i64 @test_llrintl_zero() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK00000000000000000000)
ret i64 %val
}

; NaN
; CHECK-LABEL: define i64 @test_llrintl_nan()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrintl_nan() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
ret i64 %val
}

; +Inf
; CHECK-LABEL: define i64 @test_llrintl_posinf()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrintl_posinf() {
entry:
%val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
ret i64 %val
}

; -Inf
; CHECK-LABEL: define i64 @test_llrintl_neginf()
; CHECK-NEXT: entry:
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
; CHECK-NEXT: ret i64 %val
define i64 @test_llrintl_neginf() {
entry:
%val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
ret i64 %val
}
12 changes: 12 additions & 0 deletions llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,18 @@ DynamicSymbols:
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
- Name: llrint
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
- Name: llrintf
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
- Name: llrintl
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
- Name: logb
Type: STT_FUNC
Section: .text
Expand Down
Loading
Loading