Skip to content

Commit 6b5a018

Browse files
author
Pratheek Gowda BS
committed
errors were fixed
1 parent c347b26 commit 6b5a018

File tree

10 files changed

+312
-1
lines changed

10 files changed

+312
-1
lines changed

llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ class LibCallSimplifier {
209209
Value *optimizeLog(CallInst *CI, IRBuilderBase &B);
210210
Value *optimizeSqrt(CallInst *CI, IRBuilderBase &B);
211211
Value *optimizeFMod(CallInst *CI, IRBuilderBase &B);
212+
Value *optimizellrint(CallInst *CI,IRBuilderBase &B);
212213
Value *mergeSqrtToExp(CallInst *CI, IRBuilderBase &B);
213214
Value *optimizeSinCosPi(CallInst *CI, bool IsSin, IRBuilderBase &B);
214215
Value *optimizeTrigInversionPairs(CallInst *CI, IRBuilderBase &B);

llvm/lib/Analysis/TargetLibraryInfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T,
255255
TLI.setUnavailable(LibFunc_floorf);
256256
TLI.setUnavailable(LibFunc_fmodf);
257257
TLI.setUnavailable(LibFunc_hypotf);
258+
TLI.setAvailable(LibFunc_llrintf);
258259
TLI.setUnavailable(LibFunc_log10f);
259260
TLI.setUnavailable(LibFunc_logf);
260261
TLI.setUnavailable(LibFunc_modff);
@@ -288,6 +289,7 @@ static void initializeLibCalls(TargetLibraryInfoImpl &TLI, const Triple &T,
288289
TLI.setUnavailable(LibFunc_frexpl);
289290
TLI.setUnavailable(LibFunc_hypotl);
290291
TLI.setUnavailable(LibFunc_ldexpl);
292+
TLI.setUnavailable(LibFunc_llrintl);
291293
TLI.setUnavailable(LibFunc_log10l);
292294
TLI.setUnavailable(LibFunc_logl);
293295
TLI.setUnavailable(LibFunc_modfl);

llvm/lib/Transforms/Utils/BuildLibCalls.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,13 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
13831383
Changed |= setDoesNotFreeMemory(F);
13841384
Changed |= setWillReturn(F);
13851385
break;
1386+
case LibFunc_llrintf:
1387+
case LibFunc_llrintl:
1388+
case LibFunc_llrint:
1389+
Changed|=setDoesNotThrow(F);
1390+
Changed|=setDoesNotAccessMemory(F);
1391+
Changed|=setWillReturn(F);
1392+
break;
13861393
case LibFunc_sincos:
13871394
case LibFunc_sincosf:
13881395
case LibFunc_sincosl:

llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,28 @@ Value *LibCallSimplifier::optimizeRemquo(CallInst *CI, IRBuilderBase &B) {
31883188
return ConstantFP::get(CI->getType(), Rem);
31893189
}
31903190

3191+
Value *LibCallSimplifier::optimizellrint(CallInst *CI,IRBuilderBase &B){
3192+
const APFloat *X;
3193+
if(!match(CI->getOperand(0),m_APFloat(X))){
3194+
return nullptr;
3195+
}
3196+
Type *type=CI->getType();
3197+
3198+
unsigned width=type->getIntegerBitWidth();
3199+
3200+
APSInt Result(width,false);
3201+
bool Isexact;
3202+
3203+
APFloat::opStatus Status=X->convertToInteger(Result,APFloat::rmNearestTiesToEven,&Isexact);
3204+
3205+
if(Status==APFloat::opOK || Status==APFloat::opInexact){
3206+
return ConstantInt::get(type,Result);
3207+
}
3208+
3209+
return nullptr;
3210+
3211+
}
3212+
31913213
/// Constant folds fdim
31923214
Value *LibCallSimplifier::optimizeFdim(CallInst *CI, IRBuilderBase &B) {
31933215
// Cannot perform the fold unless the call has attribute memory(none)

llvm/test/Transforms/InferFunctionAttrs/annotate.ll

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,16 @@ declare i32 @ilogbf(float)
679679
; CHECK: declare i32 @ilogbl(x86_fp80) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN]]
680680
declare i32 @ilogbl(x86_fp80)
681681

682-
; CHECK: declare double @logb(double) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN]]
682+
; CHECK: declare i64 @llrint(double) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]]
683+
declare i64 @llrint(double)
684+
685+
; CHECK: declare i64 @llrintf(float) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]]
686+
declare i64 @llrintf(float)
687+
688+
; CHECK: declare i64 @llrintl(x86_fp80) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]]
689+
declare i64 @llrintl(x86_fp80)
690+
691+
; CHECK: declare double @logb(double) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN:#[0-9]+]]
683692
declare double @logb(double)
684693

685694
; CHECK: declare float @logbf(float) [[ERRNOMEMONLY_NOFREE_NOUNWIND_WILLRETURN]]
@@ -1241,6 +1250,7 @@ declare void @memset_pattern16(ptr, ptr, i64)
12411250
; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY_WILLRETURN]] = { mustprogress nocallback nofree nounwind willreturn memory(read) }
12421251
; CHECK-DAG: attributes [[ARGMEMONLY_NOFREE_NOUNWIND_WILLRETURN]] = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
12431252
; CHECK-DAG: attributes [[NOFREE_NOUNWIND_READONLY]] = { nofree nounwind memory(read) }
1253+
; CHECK-DAG: attributes [[MATH_NOACCESS]] = { mustprogress nofree nosync nounwind willreturn memory(none) }
12441254
; CHECK-DAG: attributes [[INACCESSIBLEMEMORARGMEMONLY_NOUNWIND_WILLRETURN_ALLOCKIND_FREE_FAMILY_MALLOC]] = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" }
12451255
; 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" }
12461256
; CHECK-DAG: attributes [[INACCESSIBLEMEMONLY_NOFREE_NOUNWIND_WILLRETURN_ALLOCKIND_ALLOCUNINIT_FAMILY_MALLOC]] = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
2+
3+
4+
declare i64 @llrint(double)
5+
6+
; Positive number test
7+
; CHECK-LABEL: define i64 @test_llrint_pos()
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: ret i64 4
10+
define i64 @test_llrint_pos() {
11+
entry:
12+
%val = call i64 @llrint(double 3.5)
13+
ret i64 %val
14+
}
15+
16+
; Negative number test
17+
; CHECK-LABEL: define i64 @test_llrint_neg()
18+
; CHECK-NEXT: entry:
19+
; CHECK-NEXT: ret i64 -2
20+
define i64 @test_llrint_neg() {
21+
entry:
22+
%val = call i64 @llrint(double -2.5)
23+
ret i64 %val
24+
}
25+
26+
; Zero test
27+
; CHECK-LABEL: define i64 @test_llrint_zero()
28+
; CHECK-NEXT: entry:
29+
; CHECK-NEXT: ret i64 0
30+
define i64 @test_llrint_zero() {
31+
entry:
32+
%val = call i64 @llrint(double 0.0)
33+
ret i64 %val
34+
}
35+
36+
; Large value test
37+
; CHECK-LABEL: define i64 @test_llrint_large()
38+
; CHECK-NEXT: entry:
39+
; CHECK-NEXT: ret i64 1000000
40+
define i64 @test_llrint_large() {
41+
entry:
42+
%val = call i64 @llrint(double 1.0e6)
43+
ret i64 %val
44+
}
45+
46+
; Rounding test (check ties-to-even)
47+
; CHECK-LABEL: define i64 @test_llrint_round_even()
48+
; CHECK-NEXT: entry:
49+
; CHECK-NEXT: ret i64 2
50+
define i64 @test_llrint_round_even() {
51+
entry:
52+
%val = call i64 @llrint(double 2.5)
53+
ret i64 %val
54+
}
55+
56+
; NaN test
57+
; CHECK-LABEL: define i64 @test_llrint_nan()
58+
; CHECK-NEXT: entry:
59+
; CHECK-NEXT: %val = call i64 @llrint(double 0x7FF8000000000000)
60+
; CHECK-NEXT: ret i64 %val
61+
define i64 @test_llrint_nan() {
62+
entry:
63+
%val = call i64 @llrint(double 0x7FF8000000000000) ; NaN
64+
ret i64 %val
65+
}
66+
67+
; +Inf test
68+
; CHECK-LABEL: define i64 @test_llrint_posinf()
69+
; CHECK-NEXT: entry:
70+
; CHECK-NEXT: %val = call i64 @llrint(double 0x7FF0000000000000)
71+
; CHECK-NEXT: ret i64 %val
72+
define i64 @test_llrint_posinf() {
73+
entry:
74+
%val = call i64 @llrint(double 0x7FF0000000000000) ; +Inf
75+
ret i64 %val
76+
}
77+
78+
; -Inf test
79+
; CHECK-LABEL: define i64 @test_llrint_neginf()
80+
; CHECK-NEXT: entry:
81+
; CHECK-NEXT: %val = call i64 @llrint(double 0xFFF0000000000000)
82+
; CHECK-NEXT: ret i64 %val
83+
define i64 @test_llrint_neginf() {
84+
entry:
85+
%val = call i64 @llrint(double 0xFFF0000000000000) ; -Inf
86+
ret i64 %val
87+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
2+
3+
declare i64 @llrintf(float)
4+
5+
; Positive number test
6+
; CHECK-LABEL: define i64 @test_llrintf_pos()
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: ret i64 4
9+
define i64 @test_llrintf_pos() {
10+
entry:
11+
%val = call i64 @llrintf(float 3.5)
12+
ret i64 %val
13+
}
14+
15+
; Negative number test
16+
; CHECK-LABEL: define i64 @test_llrintf_neg()
17+
; CHECK-NEXT: entry:
18+
; CHECK-NEXT: ret i64 -2
19+
define i64 @test_llrintf_neg() {
20+
entry:
21+
%val = call i64 @llrintf(float -2.5)
22+
ret i64 %val
23+
}
24+
25+
; Zero test
26+
; CHECK-LABEL: define i64 @test_llrintf_zero()
27+
; CHECK-NEXT: entry:
28+
; CHECK-NEXT: ret i64 0
29+
define i64 @test_llrintf_zero() {
30+
entry:
31+
%val = call i64 @llrintf(float 0.0)
32+
ret i64 %val
33+
}
34+
65 changes: 65 additions & 0 deletions65
35+
llvm/test/Transforms/InstCombine/llrintl_fp80.ll
36+
Original file line number Diff line number Diff line change
37+
@@ -0,0 +1,65 @@
38+
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
39+
declare i64 @llrintl(x86_fp80)
40+
41+
; Positive number
42+
; CHECK-LABEL: define i64 @test_llrintl_pos()
43+
; CHECK-NEXT: entry:
44+
; CHECK-NEXT: ret i64 4
45+
define i64 @test_llrintl_pos() {
46+
entry:
47+
%val = call i64 @llrintl(x86_fp80 0xK4000E000000000000000)
48+
ret i64 %val
49+
}
50+
51+
; Negative number
52+
; CHECK-LABEL: define i64 @test_llrintl_neg()
53+
; CHECK-NEXT: entry:
54+
; CHECK-NEXT: ret i64 -2
55+
define i64 @test_llrintl_neg() {
56+
entry:
57+
%val = call i64 @llrintl(x86_fp80 0xKC000A000000000000000)
58+
ret i64 %val
59+
}
60+
61+
; Zero
62+
; CHECK-LABEL: define i64 @test_llrintl_zero()
63+
; CHECK-NEXT: entry:
64+
; CHECK-NEXT: ret i64 0
65+
define i64 @test_llrintl_zero() {
66+
entry:
67+
%val = call i64 @llrintl(x86_fp80 0xK00000000000000000000)
68+
ret i64 %val
69+
}
70+
71+
; NaN
72+
; CHECK-LABEL: define i64 @test_llrintl_nan()
73+
; CHECK-NEXT: entry:
74+
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
75+
; CHECK-NEXT: ret i64 %val
76+
define i64 @test_llrintl_nan() {
77+
entry:
78+
%val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
79+
ret i64 %val
80+
}
81+
82+
; +Inf
83+
; CHECK-LABEL: define i64 @test_llrintl_posinf()
84+
; CHECK-NEXT: entry:
85+
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
86+
; CHECK-NEXT: ret i64 %val
87+
define i64 @test_llrintl_posinf() {
88+
entry:
89+
%val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
90+
ret i64 %val
91+
}
92+
93+
; -Inf
94+
; CHECK-LABEL: define i64 @test_llrintl_neginf()
95+
; CHECK-NEXT: entry:
96+
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
97+
; CHECK-NEXT: ret i64 %val
98+
define i64 @test_llrintl_neginf() {
99+
entry:
100+
%val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
101+
ret i64 %val
102+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
2+
declare i64 @llrintl(x86_fp80)
3+
4+
; Positive number
5+
; CHECK-LABEL: define i64 @test_llrintl_pos()
6+
; CHECK-NEXT: entry:
7+
; CHECK-NEXT: ret i64 4
8+
define i64 @test_llrintl_pos() {
9+
entry:
10+
%val = call i64 @llrintl(x86_fp80 0xK4000E000000000000000)
11+
ret i64 %val
12+
}
13+
14+
; Negative number
15+
; CHECK-LABEL: define i64 @test_llrintl_neg()
16+
; CHECK-NEXT: entry:
17+
; CHECK-NEXT: ret i64 -2
18+
define i64 @test_llrintl_neg() {
19+
entry:
20+
%val = call i64 @llrintl(x86_fp80 0xKC000A000000000000000)
21+
ret i64 %val
22+
}
23+
24+
; Zero
25+
; CHECK-LABEL: define i64 @test_llrintl_zero()
26+
; CHECK-NEXT: entry:
27+
; CHECK-NEXT: ret i64 0
28+
define i64 @test_llrintl_zero() {
29+
entry:
30+
%val = call i64 @llrintl(x86_fp80 0xK00000000000000000000)
31+
ret i64 %val
32+
}
33+
34+
; NaN
35+
; CHECK-LABEL: define i64 @test_llrintl_nan()
36+
; CHECK-NEXT: entry:
37+
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
38+
; CHECK-NEXT: ret i64 %val
39+
define i64 @test_llrintl_nan() {
40+
entry:
41+
%val = call i64 @llrintl(x86_fp80 0xK7FFF8000000000000000)
42+
ret i64 %val
43+
}
44+
45+
; +Inf
46+
; CHECK-LABEL: define i64 @test_llrintl_posinf()
47+
; CHECK-NEXT: entry:
48+
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
49+
; CHECK-NEXT: ret i64 %val
50+
define i64 @test_llrintl_posinf() {
51+
entry:
52+
%val = call i64 @llrintl(x86_fp80 0xK7FFF0000000000000000)
53+
ret i64 %val
54+
}
55+
56+
; -Inf
57+
; CHECK-LABEL: define i64 @test_llrintl_neginf()
58+
; CHECK-NEXT: entry:
59+
; CHECK-NEXT: %val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
60+
; CHECK-NEXT: ret i64 %val
61+
define i64 @test_llrintl_neginf() {
62+
entry:
63+
%val = call i64 @llrintl(x86_fp80 0xKFFFF0000000000000000)
64+
ret i64 %val
65+
}

llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,18 @@ DynamicSymbols:
690690
Type: STT_FUNC
691691
Section: .text
692692
Binding: STB_GLOBAL
693+
- Name: llrint
694+
Type: STT_FUNC
695+
Section: .text
696+
Binding: STB_GLOBAL
697+
- Name: llrintf
698+
Type: STT_FUNC
699+
Section: .text
700+
Binding: STB_GLOBAL
701+
- Name: llrintl
702+
Type: STT_FUNC
703+
Section: .text
704+
Binding: STB_GLOBAL
693705
- Name: logb
694706
Type: STT_FUNC
695707
Section: .text

llvm/unittests/Analysis/TargetLibraryInfoTest.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ TEST_F(TargetLibraryInfoTest, ValidProto) {
258258
"declare double @ldexp(double, i32)\n"
259259
"declare float @ldexpf(float, i32)\n"
260260
"declare x86_fp80 @ldexpl(x86_fp80, i32)\n"
261+
"declare i64 @llrint(double)\n"
262+
"declare i64 @llrintf(float)\n"
263+
"declare i64 @llrintl(x86_fp80)\n"
261264
"declare i64 @llabs(i64)\n"
262265
"declare double @log(double)\n"
263266
"declare double @log10(double)\n"

0 commit comments

Comments
 (0)