Skip to content

Commit 48e5f1b

Browse files
committed
Add REQUIRES: logf128 lit guard and move tests to instsimplify
1 parent ca14318 commit 48e5f1b

File tree

13 files changed

+115
-99
lines changed

13 files changed

+115
-99
lines changed

llvm/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@ set(LLVM_USE_STATIC_ZSTD FALSE CACHE BOOL "Use static version of zstd. Can be TR
562562

563563
set(LLVM_ENABLE_CURL "OFF" CACHE STRING "Use libcurl for the HTTP client if available. Can be ON, OFF, or FORCE_ON")
564564

565+
set(LLVM_HAS_LOGF128 "OFF" CACHE STRING "Use logf128 to constant fold fp128 logarithm calls. Can be ON, OFF, or FORCE_ON")
566+
565567
set(LLVM_ENABLE_HTTPLIB "OFF" CACHE STRING "Use cpp-httplib HTTP server library if available. Can be ON, OFF, or FORCE_ON")
566568

567569
set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")

llvm/cmake/config-ix.cmake

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,17 @@ else()
257257
set(LLVM_ENABLE_TERMINFO 0)
258258
endif()
259259

260+
if(LLVM_HAS_LOGF128)
261+
include(CheckCXXSymbolExists)
262+
check_cxx_symbol_exists(logf128 math.h HAS_LOGF128)
263+
264+
if(LLVM_HAS_LOGF128 STREQUAL FORCE_ON AND NOT HAS_LOGF128)
265+
message(FATAL_ERROR "Failed to configure logf128")
266+
endif()
267+
268+
set(LLVM_HAS_LOGF128 "${HAS_LOGF128}")
269+
endif()
270+
260271
# function checks
261272
check_symbol_exists(arc4random "stdlib.h" HAVE_DECL_ARC4RANDOM)
262273
find_package(Backtrace)

llvm/include/llvm/Config/llvm-config.h.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,7 @@
198198
/* Define if plugins enabled */
199199
#cmakedefine LLVM_ENABLE_PLUGINS
200200

201+
/* Define if logf128 is available */
202+
#cmakedefine LLVM_HAS_LOGF128
203+
201204
#endif

llvm/include/llvm/IR/Constants.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,6 @@ class ConstantFP final : public ConstantData {
290290
/// host double and as the target format.
291291
static Constant *get(Type *Ty, double V);
292292

293-
#ifdef __FLOAT128__
294-
static Constant *get128(Type *Ty, float128 V);
295-
#endif
296-
297293
/// If Ty is a vector type, return a Constant with a splat of the given
298294
/// value. Otherwise return a ConstantFP for the given value.
299295
static Constant *get(Type *Ty, const APFloat &V);

llvm/include/llvm/Support/float128.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
#ifndef LLVM_FLOAT128
1010
#define LLVM_FLOAT128
1111

12+
namespace llvm {
13+
1214
#if defined(__clang__) && defined(__FLOAT128__)
1315
typedef __float128 float128;
1416
#elif defined(__FLOAT128__) && (defined(__GNUC__) || defined(__GNUG__))
1517
typedef _Float128 float128;
1618
#endif
1719

20+
} // namespace llvm
1821
#endif // LLVM_FLOAT128

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,8 +2088,18 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
20882088
if (IntrinsicID == Intrinsic::canonicalize)
20892089
return constantFoldCanonicalize(Ty, Call, U);
20902090

2091-
if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy() &&
2092-
!Ty->isFP128Ty())
2091+
#if defined(__FLOAT128__) && defined(HAS_LOGF128)
2092+
if (Ty->isFP128Ty()) {
2093+
switch (IntrinsicID) {
2094+
default:
2095+
return nullptr;
2096+
case Intrinsic::log:
2097+
return ConstantFP::get(Ty, logf128(Op->getValueAPF().convertToQuad()));
2098+
}
2099+
}
2100+
#endif
2101+
2102+
if (!Ty->isHalfTy() && !Ty->isFloatTy() && !Ty->isDoubleTy())
20932103
return nullptr;
20942104

20952105
// Use internal versions of these intrinsics.
@@ -2204,11 +2214,6 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
22042214
switch (IntrinsicID) {
22052215
default: break;
22062216
case Intrinsic::log:
2207-
#if defined(__FLOAT128__) && defined(HAS_LOGF128)
2208-
if (Ty->isFP128Ty()) {
2209-
return ConstantFP::get(Ty, logf128(APF.convertToQuad()));
2210-
}
2211-
#endif
22122217
return ConstantFoldFP(log, APF, Ty);
22132218
case Intrinsic::log2:
22142219
// TODO: What about hosts that lack a C99 library?

llvm/lib/IR/Constants.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -976,24 +976,6 @@ Constant *ConstantFP::get(Type *Ty, double V) {
976976
return C;
977977
}
978978

979-
#ifdef __FLOAT128__
980-
Constant *ConstantFP::get128(Type *Ty, float128 V) {
981-
LLVMContext &Context = Ty->getContext();
982-
983-
APFloat FV(V);
984-
bool ignored;
985-
FV.convert(Ty->getScalarType()->getFltSemantics(),
986-
APFloat::rmNearestTiesToEven, &ignored);
987-
Constant *C = get(Context, FV);
988-
989-
// For vectors, broadcast the value.
990-
if (VectorType *VTy = dyn_cast<VectorType>(Ty))
991-
return ConstantVector::getSplat(VTy->getElementCount(), C);
992-
993-
return C;
994-
}
995-
#endif
996-
997979
Constant *ConstantFP::get(Type *Ty, const APFloat &V) {
998980
ConstantFP *C = get(Ty->getContext(), V);
999981
assert(C->getType() == Ty->getScalarType() &&

llvm/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ llvm_canonicalize_cmake_booleans(
2525
LLVM_INCLUDE_DXIL_TESTS
2626
LLVM_TOOL_LLVM_DRIVER_BUILD
2727
LLVM_INCLUDE_SPIRV_TOOLS_TESTS
28+
LLVM_HAS_LOGF128
2829
)
2930

3031
configure_lit_site_cfg(
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3+
4+
; REQUIRES: has_logf128
5+
; REQUIRES: aarch64-registered-target
6+
declare fp128 @llvm.log.f128(fp128)
7+
8+
define fp128 @log_e_64(){
9+
; CHECK-LABEL: define fp128 @log_e_64() {
10+
; CHECK-NEXT: ret fp128 0xL300000000000000040010A2B23F3BAB7
11+
;
12+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xL00000000000000004005000000000000)
13+
ret fp128 %A
14+
}
15+
16+
define fp128 @log_e_smallest_positive_subnormal_number(){
17+
; CHECK-LABEL: define fp128 @log_e_smallest_positive_subnormal_number() {
18+
; CHECK-NEXT: ret fp128 0xL3000000000000000C00C654628220780
19+
;
20+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xL00000000000000010000000000000000)
21+
ret fp128 %A
22+
}
23+
24+
define fp128 @log_e_largest_subnormal_number(){
25+
; CHECK-LABEL: define fp128 @log_e_largest_subnormal_number() {
26+
; CHECK-NEXT: ret fp128 0xLD000000000000000C00C62D918CE2421
27+
;
28+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xLFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF)
29+
ret fp128 %A
30+
}
31+
32+
define fp128 @log_e_smallest_positive_normal_number(){
33+
;
34+
; CHECK-LABEL: define fp128 @log_e_smallest_positive_normal_number() {
35+
; CHECK-NEXT: ret fp128 0xLD000000000000000C00C62D918CE2421
36+
;
37+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xL00000000000000000001000000000000)
38+
ret fp128 %A
39+
}
40+
41+
define fp128 @log_e_largest_normal_number(){
42+
; CHECK-LABEL: define fp128 @log_e_largest_normal_number() {
43+
; CHECK-NEXT: ret fp128 0xLF000000000000000400C62E42FEFA39E
44+
;
45+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xLFFFFFFFFFFFFFFFF7FFEFFFFFFFFFFFF)
46+
ret fp128 %A
47+
}
48+
49+
define fp128 @log_e_largest_number_less_than_one(){
50+
; CHECK-LABEL: define fp128 @log_e_largest_number_less_than_one() {
51+
; CHECK-NEXT: ret fp128 0xL0000000000000000BF8E000000000000
52+
;
53+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xLFFFFFFFFFFFFFFFF3FFEFFFFFFFFFFFF)
54+
ret fp128 %A
55+
}
56+
57+
define fp128 @log_e_1(){
58+
; CHECK-LABEL: define fp128 @log_e_1() {
59+
; CHECK-NEXT: ret fp128 0xL00000000000000000000000000000000
60+
;
61+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xL00000000000000003FFF000000000000)
62+
ret fp128 %A
63+
}
64+
65+
define fp128 @log_e_smallest_number_larger_than_one(){
66+
; CHECK-LABEL: define fp128 @log_e_smallest_number_larger_than_one() {
67+
; CHECK-NEXT: ret fp128 0xL00000000000000003F8F000000000000
68+
;
69+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xL00000000000000013FFF000000000000)
70+
ret fp128 %A
71+
}
72+
73+
define fp128 @log_e_minus_2(){
74+
; CHECK-LABEL: define fp128 @log_e_minus_2() {
75+
; CHECK-NEXT: ret fp128 0xL00000000000000007FFF800000000000
76+
;
77+
%A = call fp128 @llvm.log.f128(fp128 noundef 0xL0000000000000000C000000000000000)
78+
ret fp128 %A
79+
}

llvm/test/lit.cfg.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,3 +614,6 @@ def have_ld64_plugin_support():
614614
# "OBJECT_MODE" to 'any' by default on AIX OS.
615615
if "system-aix" in config.available_features:
616616
config.environment["OBJECT_MODE"] = "any"
617+
618+
if config.has_logf128:
619+
config.available_features.add("has_logf128")

llvm/test/lit.site.cfg.py.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ config.reverse_iteration = @LLVM_ENABLE_REVERSE_ITERATION@
6161
config.dxil_tests = @LLVM_INCLUDE_DXIL_TESTS@
6262
config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@
6363
config.spirv_tools_tests = @LLVM_INCLUDE_SPIRV_TOOLS_TESTS@
64+
config.has_logf128 = @LLVM_HAS_LOGF128@
6465

6566
import lit.llvm
6667
lit.llvm.initialize(lit_config, config)

llvm/unittests/Analysis/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ set(ANALYSIS_TEST_SOURCES
5151
ValueLatticeTest.cpp
5252
ValueTrackingTest.cpp
5353
VectorUtilsTest.cpp
54-
ConstantLogf128.cpp
5554
)
5655

5756
set(MLGO_TESTS TFUtilsTest.cpp)

llvm/unittests/Analysis/ConstantLogf128.cpp

Lines changed: 0 additions & 69 deletions
This file was deleted.

0 commit comments

Comments
 (0)