From 538ee6c38cb40dc3ac54683727818023d17835f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Duncan=20P=2E=20N=2E=20Exon=C2=A0Smith?= Date: Fri, 30 Oct 2020 11:13:37 -0400 Subject: [PATCH] Support: Avoid std::tie in Support/FileSystem/UniqueID.h, NFC Running `-fsyntax-only` on UniqueID.h is 2x faster with this patch (which avoids calling `std::tie` for `operator<`). Since the transitive includers of this file will go up as `FileEntryRef` gets used in more places, avoid that compile-time hit. This is a follow-up to 23ed570af1cc165afea1b70a533a4a39d6656501 (suggested by Reid Kleckner). Also drop the `` include from FileSystem.h (which was vestigal from before UniqueID.h was split out). Differential Revision: https://reviews.llvm.org/D90471 --- include/llvm/Support/FileSystem.h | 1 - include/llvm/Support/FileSystem/UniqueID.h | 8 +++-- unittests/Support/CMakeLists.txt | 1 + unittests/Support/FSUniqueIDTest.cpp | 38 ++++++++++++++++++++++ 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 unittests/Support/FSUniqueIDTest.cpp diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index b1fb54ef47e..2483aae046f 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -43,7 +43,6 @@ #include #include #include -#include #include #ifdef HAVE_SYS_STAT_H diff --git a/include/llvm/Support/FileSystem/UniqueID.h b/include/llvm/Support/FileSystem/UniqueID.h index 1b79d4aad8e..229410c8292 100644 --- a/include/llvm/Support/FileSystem/UniqueID.h +++ b/include/llvm/Support/FileSystem/UniqueID.h @@ -15,7 +15,6 @@ #define LLVM_SUPPORT_FILESYSTEM_UNIQUEID_H #include -#include namespace llvm { namespace sys { @@ -34,7 +33,12 @@ public: } bool operator!=(const UniqueID &Other) const { return !(*this == Other); } bool operator<(const UniqueID &Other) const { - return std::tie(Device, File) < std::tie(Other.Device, Other.File); + /// Don't use std::tie since it bloats the compile time of this header. + if (Device < Other.Device) + return true; + if (Other.Device < Device) + return false; + return File < Other.File; } uint64_t getDevice() const { return Device; } diff --git a/unittests/Support/CMakeLists.txt b/unittests/Support/CMakeLists.txt index a1086e8b514..0fb636a11a8 100644 --- a/unittests/Support/CMakeLists.txt +++ b/unittests/Support/CMakeLists.txt @@ -37,6 +37,7 @@ add_llvm_unittest(SupportTests FileOutputBufferTest.cpp FileUtilitiesTest.cpp FormatVariadicTest.cpp + FSUniqueIDTest.cpp GlobPatternTest.cpp Host.cpp IndexedAccessorTest.cpp diff --git a/unittests/Support/FSUniqueIDTest.cpp b/unittests/Support/FSUniqueIDTest.cpp new file mode 100644 index 00000000000..6c794730e39 --- /dev/null +++ b/unittests/Support/FSUniqueIDTest.cpp @@ -0,0 +1,38 @@ +//===- llvm/unittest/Support/FSUniqueIDTest.cpp - Test sys::fs::UniqueID --===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/FileSystem/UniqueID.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace llvm::sys::fs; + +namespace { + +TEST(FSUniqueIDTest, construct) { + EXPECT_EQ(20u, UniqueID(20, 10).getDevice()); + EXPECT_EQ(10u, UniqueID(20, 10).getFile()); +} + +TEST(FSUniqueIDTest, equals) { + EXPECT_TRUE(UniqueID(20, 10) == UniqueID(20, 10)); + EXPECT_FALSE(UniqueID(20, 20) == UniqueID(20, 10)); + EXPECT_FALSE(UniqueID(10, 10) == UniqueID(20, 10)); +} + +TEST(FSUniqueIDTest, less) { + EXPECT_FALSE(UniqueID(20, 2) < UniqueID(20, 2)); + EXPECT_FALSE(UniqueID(20, 3) < UniqueID(20, 2)); + EXPECT_FALSE(UniqueID(30, 2) < UniqueID(20, 2)); + EXPECT_FALSE(UniqueID(30, 2) < UniqueID(20, 40)); + EXPECT_TRUE(UniqueID(20, 2) < UniqueID(20, 3)); + EXPECT_TRUE(UniqueID(20, 2) < UniqueID(30, 2)); + EXPECT_TRUE(UniqueID(20, 40) < UniqueID(30, 2)); +} + +} // anonymous namespace