From: AKhatskevich <avkhatskevich@tarantool.org>
To: georgy@tarantool.org, tarantool-patches@freelists.org
Subject: [tarantool-patches] [PATCH 2/3] Add LTO support
Date: Wed, 8 Aug 2018 14:10:02 +0300 [thread overview]
Message-ID: <64060dd168d3977f90f06b0bd242cf7ecc256a07.1533726342.git.avkhatskevich@tarantool.org> (raw)
In-Reply-To: <cover.1533726342.git.avkhatskevich@tarantool.org>
In-Reply-To: <cover.1533726342.git.avkhatskevich@tarantool.org>
This commit introduces LTO support.
Changes:
- update submodules (fix lto-related warnings)
- add `TARANTOOL_LTO` cmake option (by default it is `False`)
LTO speeds up cpu-intensive workloads by up to 20%.
Requirements for LTO enabling:
- cmake >= 3.9
- linker
- ld >= 2.31 (or latest 2.30)
- gold >= 1.15 (binutils 2.30)
- mac xcode >= 8 (earlier versions are not tested)
This small patch required fixing bug in GNU ld linker.
(link gcc.gnu.org/bugzilla/show_bug.cgi?id=84901)
`ld` was not exporting symbols from dynamic list when LTO enabled.
Closes #3117
---
CMakeLists.txt | 1 +
cmake/lto.cmake | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++
src/lib/msgpuck | 2 +-
src/lib/small | 2 +-
third_party/libyaml | 2 +-
5 files changed, 59 insertions(+), 3 deletions(-)
create mode 100644 cmake/lto.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d0cae0f01..432d2a6fb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -63,6 +63,7 @@ include(cmake/pod2man.cmake)
include(cmake/arch.cmake)
include(cmake/os.cmake)
include(cmake/compiler.cmake)
+include(cmake/lto.cmake NO_POLICY_SCOPE)
include(cmake/simd.cmake)
include(cmake/atomic.cmake)
include(cmake/profile.cmake)
diff --git a/cmake/lto.cmake b/cmake/lto.cmake
new file mode 100644
index 000000000..96129ebfd
--- /dev/null
+++ b/cmake/lto.cmake
@@ -0,0 +1,55 @@
+##
+## Manage LTO (Link-Time-Optimization) and IPO (Inter-Procedural-Optimization)
+##
+
+# Tarantool uses both dynamic-list and lto link options, which works only
+# since binutils:
+# - 2.30 for linking with gold (gold version is 1.15)
+# - last 2.30 or 2.31 in case of ld (bfd)
+
+if (NOT DEFINED TARANTOOL_LTO)
+ set(TARANTOOL_LTO FALSE)
+endif()
+
+if(NOT CMAKE_VERSION VERSION_LESS 3.9)
+ cmake_policy(SET CMP0069 NEW)
+ include(CheckIPOSupported)
+ check_ipo_supported(RESULT CMAKE_IPO_AVAILABLE)
+else()
+ set(CMAKE_IPO_AVAILABLE FALSE)
+endif()
+
+# Ensure that default value is false
+set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
+if (TARANTOOL_LTO AND CMAKE_IPO_AVAILABLE AND NOT TARGET_OS_DARWIN)
+ execute_process(COMMAND ld -v OUTPUT_VARIABLE linker_v)
+ message(STATUS "LTO linker_v ${linker_v}")
+
+ # e.g. GNU ld (GNU Binutils) 2.29
+ string(REGEX MATCH "^GNU ld [^)]+[)] ([0-9.]+).*$" linker_valid ${linker_v})
+
+ if (NOT linker_valid)
+ message(FATAL_ERROR "Unsuported linker (ld expected)")
+ endif()
+
+ set(linker_version ${CMAKE_MATCH_1})
+ message(STATUS "Found linker ld VERSION ${linker_version}")
+
+ if (NOT linker_version VERSION_LESS "2.31")
+ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+ elseif(NOT linker_version VERSION_LESS "2.30")
+ # Use gold if LTO+dynamic-list is available in gold & not in ld
+ find_program(gold_available "ld.gold")
+ if (gold_available)
+ message(WARNING "Use gold linker (to enable LTO)")
+ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
+ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+ endif()
+ endif()
+endif()
+
+if (TARANTOOL_LTO AND CMAKE_IPO_AVAILABLE AND TARGET_OS_DARWIN)
+ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
+endif()
+
+message(STATUS "LTO enabled ${CMAKE_INTERPROCEDURAL_OPTIMIZATION}")
diff --git a/src/lib/msgpuck b/src/lib/msgpuck
index 3b8f3e59b..1eb56a447 160000
--- a/src/lib/msgpuck
+++ b/src/lib/msgpuck
@@ -1 +1 @@
-Subproject commit 3b8f3e59b62d74f0198e01cbec0beb9c6a3082fb
+Subproject commit 1eb56a447ea35f9c403dbc8aa98a25336303c1cb
diff --git a/src/lib/small b/src/lib/small
index 22d1bad18..0627a7f98 160000
--- a/src/lib/small
+++ b/src/lib/small
@@ -1 +1 @@
-Subproject commit 22d1bad1873edcb9b1383a273e70c4cf881d5349
+Subproject commit 0627a7f986ff91701bd741908818749fef5e2266
diff --git a/third_party/libyaml b/third_party/libyaml
index 6bd4be1a7..e554afad0 160000
--- a/third_party/libyaml
+++ b/third_party/libyaml
@@ -1 +1 @@
-Subproject commit 6bd4be1a7751d6022a413864666880bef8a87c3c
+Subproject commit e554afad015b2c7df76f9d5213d883e931246fad
--
2.14.1
next prev parent reply other threads:[~2018-08-08 11:10 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-08 11:10 [tarantool-patches] [PATCH 0/3] LTO && travis AKhatskevich
2018-08-08 11:10 ` [tarantool-patches] [PATCH 1/3] Fix: prevent guard-breaker optimization AKhatskevich
2018-10-10 14:26 ` [tarantool-patches] " Alexander Turenko
2018-10-11 16:02 ` Alex Khatskevich
2018-08-08 11:10 ` AKhatskevich [this message]
2018-10-10 14:29 ` [tarantool-patches] Re: [PATCH 2/3] Add LTO support Alexander Turenko
2018-10-11 16:01 ` Alex Khatskevich
2018-08-08 11:10 ` [tarantool-patches] [PATCH 3/3] Add LTO testing && refactor travis.yml AKhatskevich
2018-10-10 14:43 ` [tarantool-patches] " Alexander Turenko
2018-10-11 16:12 ` [tarantool-patches] [PATCH] Enable 0069 policy AKhatskevich
2018-10-11 16:14 ` [tarantool-patches] [tarantool-small] " AKhatskevich
2018-10-11 16:15 ` [tarantool-patches] [tarantool-libyaml] " AKhatskevich
2018-10-11 16:18 ` [tarantool-patches] [tarantool-msgpuck] " AKhatskevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=64060dd168d3977f90f06b0bd242cf7ecc256a07.1533726342.git.avkhatskevich@tarantool.org \
--to=avkhatskevich@tarantool.org \
--cc=georgy@tarantool.org \
--cc=tarantool-patches@freelists.org \
--subject='Re: [tarantool-patches] [PATCH 2/3] Add LTO support' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox