[llvm] [CMAKE][llvm-libraries] Add Precompiled Headers option to improve build times (PR #91755)

Ameer J via llvm-commits llvm-commits at lists.llvm.org
Fri May 10 17:01:32 PDT 2024


https://github.com/ameerj updated https://github.com/llvm/llvm-project/pull/91755

>From 16f9bc5e4de1bbed46981e32a127207477ebe376 Mon Sep 17 00:00:00 2001
From: ameerj <ameerj99 at outlook.com>
Date: Fri, 10 May 2024 20:00:42 -0400
Subject: [PATCH] [CMAKE][llvm-libraries] Add Precompiled Headers option to
 improve build times

---
 llvm/CMakeLists.txt                           |   3 +
 llvm/cmake/modules/HandleLLVMOptions.cmake    |   8 +-
 .../modules/LLVMPrecompiledHeaders.cmake      |  35 ++
 llvm/include/llvm/Demangle/ItaniumDemangle.h  |   6 +
 llvm/include/llvm/PrecompiledHeaders.h        |  28 ++
 llvm/lib/BinaryFormat/Dwarf.cpp               |  12 +-
 llvm/lib/BinaryFormat/MsgPackDocumentYAML.cpp |  14 +-
 .../DWARF/DWARFAbbreviationDeclaration.cpp    |   2 +-
 llvm/lib/Object/Minidump.cpp                  |   2 +-
 llvm/lib/ObjectYAML/MinidumpYAML.cpp          |   2 +-
 llvm/lib/Remarks/Remark.cpp                   |  17 +-
 llvm/lib/Remarks/YAMLRemarkParser.cpp         |   9 +-
 llvm/lib/Remarks/YAMLRemarkSerializer.cpp     |  28 +-
 llvm/lib/TargetParser/X86TargetParser.cpp     | 411 +++++++++---------
 llvm/lib/TextAPI/TextStubV5.cpp               |  10 +-
 15 files changed, 338 insertions(+), 249 deletions(-)
 create mode 100644 llvm/cmake/modules/LLVMPrecompiledHeaders.cmake
 create mode 100644 llvm/include/llvm/PrecompiledHeaders.h

diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index c06e661573ed4..e36abfaf475f0 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -1410,3 +1410,6 @@ endif()
 if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
   add_subdirectory(utils/llvm-locstats)
 endif()
+
+include(LLVMPrecompiledHeaders)
+llvm_lib_precompiled_headers()
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
index 185266c0861e8..7d7a451adc93c 100644
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
@@ -538,6 +538,8 @@ endif()
 
 option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
 
+option(LLVM_ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers to improve build times." ON)
+
 if( MSVC )
 
   # Add definitions that make MSVC much less annoying.
@@ -593,7 +595,11 @@ if( MSVC )
   # PDBs without changing codegen.
   option(LLVM_ENABLE_PDB OFF)
   if (LLVM_ENABLE_PDB AND uppercase_CMAKE_BUILD_TYPE STREQUAL "RELEASE")
-    append("/Zi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+    if (LLVM_ENABLE_PRECOMPILED_HEADERS)
+        append("/Z7" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+    else()
+        append("/Zi" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
+    endif()
     # /DEBUG disables linker GC and ICF, but we want those in Release mode.
     append("/DEBUG /OPT:REF /OPT:ICF"
           CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS
diff --git a/llvm/cmake/modules/LLVMPrecompiledHeaders.cmake b/llvm/cmake/modules/LLVMPrecompiledHeaders.cmake
new file mode 100644
index 0000000000000..ac6efe9e4599a
--- /dev/null
+++ b/llvm/cmake/modules/LLVMPrecompiledHeaders.cmake
@@ -0,0 +1,35 @@
+macro(get_all_targets_recursive targets dir)
+    get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
+    foreach(subdir ${subdirectories})
+        get_all_targets_recursive(${targets} ${subdir})
+    endforeach()
+
+    get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
+    list(APPEND ${targets} ${current_targets})
+endmacro()
+
+function(get_all_targets dir outvar)
+    set(targets)
+    get_all_targets_recursive(targets ${dir})
+    set(${outvar} ${targets} PARENT_SCOPE)
+endfunction()
+
+function(add_llvm_lib_precompiled_headers target)
+    if (LLVM_ENABLE_PRECOMPILED_HEADERS)
+        get_target_property(target_type ${target} TYPE)
+        if (target_type STREQUAL "STATIC_LIBRARY")
+            target_precompile_headers(
+                ${target}
+                PRIVATE
+                "$<$<COMPILE_LANGUAGE:CXX>:${LLVM_MAIN_INCLUDE_DIR}/llvm/PrecompiledHeaders.h>"
+            )
+        endif()
+    endif()
+endfunction()
+
+function(llvm_lib_precompiled_headers)
+    get_all_targets("${LLVM_MAIN_SRC_DIR}/lib" lib_targets)
+    foreach(target ${lib_targets})
+        add_llvm_lib_precompiled_headers(${target})
+    endforeach()
+endfunction()
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index d33af157543fe..cdd83b17851ea 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -586,6 +586,12 @@ class EnableIfAttr : public Node {
 
 class ObjCProtoName : public Node {
   const Node *Ty;
+#if LLVM_ENABLE_PRECOMPILED_HEADERS
+public:
+  // When PCH is enabled, Protocol is unable to be read by the PointerType
+  // friend class, make it public to avoid this issue.
+  // TODO: Fix friend class interaction when PCH is enabled.
+#endif
   std::string_view Protocol;
 
   friend class PointerType;
diff --git a/llvm/include/llvm/PrecompiledHeaders.h b/llvm/include/llvm/PrecompiledHeaders.h
new file mode 100644
index 0000000000000..4339b501b7cb1
--- /dev/null
+++ b/llvm/include/llvm/PrecompiledHeaders.h
@@ -0,0 +1,28 @@
+//===-- llvm/PrecompiledHeaders.h - Precompiled Headers ---------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains the most common headers used within the LLVM library. 
+/// It is intended to be used as a precompiled header.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_PRECOMPILEDHEADERS_H
+#define LLVM_PRECOMPILEDHEADERS_H
+
+#include "ADT/ArrayRef.h"
+
+#include "CodeGen/SelectionDAG.h"
+#include "CodeGen/TargetInstrInfo.h"
+
+#include "IR/IntrinsicInst.h"
+#include "IR/PassManager.h"
+
+#include "MC/MCContext.h"
+
+#endif // LLVM_PRECOMPILEDHEADERS_H
\ No newline at end of file
diff --git a/llvm/lib/BinaryFormat/Dwarf.cpp b/llvm/lib/BinaryFormat/Dwarf.cpp
index 7324266172684..f249a1923ec2c 100644
--- a/llvm/lib/BinaryFormat/Dwarf.cpp
+++ b/llvm/lib/BinaryFormat/Dwarf.cpp
@@ -858,9 +858,9 @@ StringRef llvm::dwarf::RLEString(unsigned RLE) {
   }
 }
 
-constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[];
-constexpr char llvm::dwarf::EnumTraits<Form>::Type[];
-constexpr char llvm::dwarf::EnumTraits<Index>::Type[];
-constexpr char llvm::dwarf::EnumTraits<Tag>::Type[];
-constexpr char llvm::dwarf::EnumTraits<LineNumberOps>::Type[];
-constexpr char llvm::dwarf::EnumTraits<LocationAtom>::Type[];
+constexpr char llvm::dwarf::EnumTraits<llvm::dwarf::Attribute>::Type[];
+constexpr char llvm::dwarf::EnumTraits<llvm::dwarf::Form>::Type[];
+constexpr char llvm::dwarf::EnumTraits<llvm::dwarf::Index>::Type[];
+constexpr char llvm::dwarf::EnumTraits<llvm::dwarf::Tag>::Type[];
+constexpr char llvm::dwarf::EnumTraits<llvm::dwarf::LineNumberOps>::Type[];
+constexpr char llvm::dwarf::EnumTraits<llvm::dwarf::LocationAtom>::Type[];
diff --git a/llvm/lib/BinaryFormat/MsgPackDocumentYAML.cpp b/llvm/lib/BinaryFormat/MsgPackDocumentYAML.cpp
index 3de3dccce0c6c..3917cd066360c 100644
--- a/llvm/lib/BinaryFormat/MsgPackDocumentYAML.cpp
+++ b/llvm/lib/BinaryFormat/MsgPackDocumentYAML.cpp
@@ -184,18 +184,18 @@ template <> struct TaggedScalarTraits<ScalarDocNode> {
 
   static QuotingType mustQuote(const ScalarDocNode &S, StringRef ScalarStr) {
     switch (S.getKind()) {
-    case Type::Int:
+    case msgpack::Type::Int:
       return ScalarTraits<int64_t>::mustQuote(ScalarStr);
-    case Type::UInt:
+    case msgpack::Type::UInt:
       return ScalarTraits<uint64_t>::mustQuote(ScalarStr);
-    case Type::Nil:
+    case msgpack::Type::Nil:
       return ScalarTraits<StringRef>::mustQuote(ScalarStr);
-    case Type::Boolean:
+    case msgpack::Type::Boolean:
       return ScalarTraits<bool>::mustQuote(ScalarStr);
-    case Type::Float:
+    case msgpack::Type::Float:
       return ScalarTraits<double>::mustQuote(ScalarStr);
-    case Type::Binary:
-    case Type::String:
+    case msgpack::Type::Binary:
+    case msgpack::Type::String:
       return ScalarTraits<std::string>::mustQuote(ScalarStr);
     default:
       llvm_unreachable("unrecognized ScalarKind");
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp
index ecdbd004efadb..1ade83cf275e0 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp
@@ -68,7 +68,7 @@ DWARFAbbreviationDeclaration::extract(DataExtractor Data, uint64_t *OffsetPtr) {
 
   // Read all of the abbreviation attributes and forms.
   while (Data.isValidOffset(*OffsetPtr)) {
-    auto A = static_cast<Attribute>(Data.getULEB128(OffsetPtr, &Err));
+    auto A = static_cast<dwarf::Attribute>(Data.getULEB128(OffsetPtr, &Err));
     if (Err)
       return std::move(Err);
 
diff --git a/llvm/lib/Object/Minidump.cpp b/llvm/lib/Object/Minidump.cpp
index 6febff89ac519..11c52182d20fd 100644
--- a/llvm/lib/Object/Minidump.cpp
+++ b/llvm/lib/Object/Minidump.cpp
@@ -92,7 +92,7 @@ Expected<ArrayRef<T>> MinidumpFile::getListStream(StreamType Type) const {
 
   return getDataSliceAs<T>(*Stream, ListOffset, ListSize);
 }
-template Expected<ArrayRef<Module>>
+template Expected<ArrayRef<minidump::Module>>
     MinidumpFile::getListStream(StreamType) const;
 template Expected<ArrayRef<Thread>>
     MinidumpFile::getListStream(StreamType) const;
diff --git a/llvm/lib/ObjectYAML/MinidumpYAML.cpp b/llvm/lib/ObjectYAML/MinidumpYAML.cpp
index fdbd2d8e6dcbc..1b70df2664f0f 100644
--- a/llvm/lib/ObjectYAML/MinidumpYAML.cpp
+++ b/llvm/lib/ObjectYAML/MinidumpYAML.cpp
@@ -499,7 +499,7 @@ Stream::create(const Directory &StreamDesc, const object::MinidumpFile &File) {
     if (!ExpectedList)
       return ExpectedList.takeError();
     std::vector<ModuleListStream::entry_type> Modules;
-    for (const Module &M : *ExpectedList) {
+    for (const minidump::Module &M : *ExpectedList) {
       auto ExpectedName = File.getString(M.ModuleNameRVA);
       if (!ExpectedName)
         return ExpectedName.takeError();
diff --git a/llvm/lib/Remarks/Remark.cpp b/llvm/lib/Remarks/Remark.cpp
index ef42271a3c8da..3418160f91f40 100644
--- a/llvm/lib/Remarks/Remark.cpp
+++ b/llvm/lib/Remarks/Remark.cpp
@@ -27,14 +27,16 @@ std::string Remark::getArgsAsMsg() const {
 }
 
 /// Returns the value of a specified key parsed from StringRef.
-std::optional<int> Argument::getValAsInt() const {
+std::optional<int> llvm::remarks::Argument::getValAsInt() const {
   APInt KeyVal;
   if (Val.getAsInteger(10, KeyVal))
     return std::nullopt;
   return KeyVal.getSExtValue();
 }
 
-bool Argument::isValInt() const { return getValAsInt().has_value(); }
+bool llvm::remarks::Argument::isValInt() const {
+  return getValAsInt().has_value();
+}
 
 void RemarkLocation::print(raw_ostream &OS) const {
   OS << "{ "
@@ -42,7 +44,7 @@ void RemarkLocation::print(raw_ostream &OS) const {
      << " Column:" << SourceColumn << " }\n";
 }
 
-void Argument::print(raw_ostream &OS) const {
+void llvm::remarks::Argument::print(raw_ostream &OS) const {
   OS << Key << ": " << Val << "\n";
 }
 
@@ -146,12 +148,12 @@ extern "C" uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark) {
 
 extern "C" LLVMRemarkArgRef
 LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark) {
-  ArrayRef<Argument> Args = unwrap(Remark)->Args;
+  ArrayRef<remarks::Argument> Args = unwrap(Remark)->Args;
   // No arguments to iterate on.
   if (Args.empty())
     return nullptr;
   return reinterpret_cast<LLVMRemarkArgRef>(
-      const_cast<Argument *>(Args.begin()));
+      const_cast<remarks::Argument *>(Args.begin()));
 }
 
 extern "C" LLVMRemarkArgRef
@@ -160,10 +162,11 @@ LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef ArgIt, LLVMRemarkEntryRef Remark) {
   if (ArgIt == nullptr)
     return nullptr;
 
-  auto It = (ArrayRef<Argument>::const_iterator)ArgIt;
+  auto It = (ArrayRef<remarks::Argument>::const_iterator)ArgIt;
   auto Next = std::next(It);
   if (Next == unwrap(Remark)->Args.end())
     return nullptr;
 
-  return reinterpret_cast<LLVMRemarkArgRef>(const_cast<Argument *>(Next));
+  return reinterpret_cast<LLVMRemarkArgRef>(
+      const_cast<remarks::Argument *>(Next));
 }
diff --git a/llvm/lib/Remarks/YAMLRemarkParser.cpp b/llvm/lib/Remarks/YAMLRemarkParser.cpp
index a287ef5742556..f5446fdef69fd 100644
--- a/llvm/lib/Remarks/YAMLRemarkParser.cpp
+++ b/llvm/lib/Remarks/YAMLRemarkParser.cpp
@@ -260,15 +260,16 @@ YAMLRemarkParser::parseRemark(yaml::Document &RemarkEntry) {
   }
 
   // Check if any of the mandatory fields are missing.
-  if (TheRemark.RemarkType == Type::Unknown || TheRemark.PassName.empty() ||
-      TheRemark.RemarkName.empty() || TheRemark.FunctionName.empty())
+  if (TheRemark.RemarkType == remarks::Type::Unknown ||
+      TheRemark.PassName.empty() || TheRemark.RemarkName.empty() ||
+      TheRemark.FunctionName.empty())
     return error("Type, Pass, Name or Function missing.",
                  *RemarkEntry.getRoot());
 
   return std::move(Result);
 }
 
-Expected<Type> YAMLRemarkParser::parseType(yaml::MappingNode &Node) {
+Expected<remarks::Type> YAMLRemarkParser::parseType(yaml::MappingNode &Node) {
   auto Type = StringSwitch<remarks::Type>(Node.getRawTag())
                   .Case("!Passed", remarks::Type::Passed)
                   .Case("!Missed", remarks::Type::Missed)
@@ -362,7 +363,7 @@ YAMLRemarkParser::parseDebugLoc(yaml::KeyValueNode &Node) {
   return RemarkLocation{*File, *Line, *Column};
 }
 
-Expected<Argument> YAMLRemarkParser::parseArg(yaml::Node &Node) {
+Expected<remarks::Argument> YAMLRemarkParser::parseArg(yaml::Node &Node) {
   auto *ArgMap = dyn_cast<yaml::MappingNode>(&Node);
   if (!ArgMap)
     return error("expected a value of mapping type.", Node);
diff --git a/llvm/lib/Remarks/YAMLRemarkSerializer.cpp b/llvm/lib/Remarks/YAMLRemarkSerializer.cpp
index 68285c3dde1bf..b87151040d50d 100644
--- a/llvm/lib/Remarks/YAMLRemarkSerializer.cpp
+++ b/llvm/lib/Remarks/YAMLRemarkSerializer.cpp
@@ -25,7 +25,7 @@ template <typename T>
 static void mapRemarkHeader(yaml::IO &io, T PassName, T RemarkName,
                             std::optional<RemarkLocation> RL, T FunctionName,
                             std::optional<uint64_t> Hotness,
-                            ArrayRef<Argument> Args) {
+                            ArrayRef<remarks::Argument> Args) {
   io.mapRequired("Pass", PassName);
   io.mapRequired("Name", RemarkName);
   io.mapOptional("DebugLoc", RL);
@@ -41,19 +41,23 @@ template <> struct MappingTraits<remarks::Remark *> {
   static void mapping(IO &io, remarks::Remark *&Remark) {
     assert(io.outputting() && "input not yet implemented");
 
-    if (io.mapTag("!Passed", (Remark->RemarkType == Type::Passed)))
+    if (io.mapTag("!Passed", (Remark->RemarkType == remarks::Type::Passed)))
       ;
-    else if (io.mapTag("!Missed", (Remark->RemarkType == Type::Missed)))
+    else if (io.mapTag("!Missed",
+                       (Remark->RemarkType == remarks::Type::Missed)))
       ;
-    else if (io.mapTag("!Analysis", (Remark->RemarkType == Type::Analysis)))
+    else if (io.mapTag("!Analysis",
+                       (Remark->RemarkType == remarks::Type::Analysis)))
       ;
-    else if (io.mapTag("!AnalysisFPCommute",
-                       (Remark->RemarkType == Type::AnalysisFPCommute)))
+    else if (io.mapTag(
+                 "!AnalysisFPCommute",
+                 (Remark->RemarkType == remarks::Type::AnalysisFPCommute)))
       ;
     else if (io.mapTag("!AnalysisAliasing",
-                       (Remark->RemarkType == Type::AnalysisAliasing)))
+                       (Remark->RemarkType == remarks::Type::AnalysisAliasing)))
       ;
-    else if (io.mapTag("!Failure", (Remark->RemarkType == Type::Failure)))
+    else if (io.mapTag("!Failure",
+                       (Remark->RemarkType == remarks::Type::Failure)))
       ;
     else
       llvm_unreachable("Unknown remark type");
@@ -124,7 +128,7 @@ template <> struct BlockScalarTraits<StringBlockVal> {
 /// Keep this in this file so that it doesn't get misused from YAMLTraits.h.
 template <typename T> struct SequenceTraits<ArrayRef<T>> {
   static size_t size(IO &io, ArrayRef<T> &seq) { return seq.size(); }
-  static Argument &element(IO &io, ArrayRef<T> &seq, size_t index) {
+  static remarks::Argument &element(IO &io, ArrayRef<T> &seq, size_t index) {
     assert(io.outputting() && "input not yet implemented");
     // The assert above should make this "safer" to satisfy the YAMLTraits.
     return const_cast<T &>(seq[index]);
@@ -132,8 +136,8 @@ template <typename T> struct SequenceTraits<ArrayRef<T>> {
 };
 
 /// Implement this as a mapping for now to get proper quotation for the value.
-template <> struct MappingTraits<Argument> {
-  static void mapping(IO &io, Argument &A) {
+template <> struct MappingTraits<remarks::Argument> {
+  static void mapping(IO &io, remarks::Argument &A) {
     assert(io.outputting() && "input not yet implemented");
 
     if (auto *Serializer = dyn_cast<YAMLStrTabRemarkSerializer>(
@@ -155,7 +159,7 @@ template <> struct MappingTraits<Argument> {
 } // end namespace yaml
 } // end namespace llvm
 
-LLVM_YAML_IS_SEQUENCE_VECTOR(Argument)
+LLVM_YAML_IS_SEQUENCE_VECTOR(remarks::Argument)
 
 YAMLRemarkSerializer::YAMLRemarkSerializer(raw_ostream &OS, SerializerMode Mode,
                                            std::optional<StringTable> StrTabIn)
diff --git a/llvm/lib/TargetParser/X86TargetParser.cpp b/llvm/lib/TargetParser/X86TargetParser.cpp
index 21f46f576490a..9bac00f8ba45e 100644
--- a/llvm/lib/TargetParser/X86TargetParser.cpp
+++ b/llvm/lib/TargetParser/X86TargetParser.cpp
@@ -20,20 +20,20 @@ using namespace llvm::X86;
 
 namespace {
 
-using FeatureBitset = Bitset<X86::CPU_FEATURE_MAX>;
+using X86FeatureBitset = Bitset<X86::CPU_FEATURE_MAX>;
 
 struct ProcInfo {
   StringLiteral Name;
   X86::CPUKind Kind;
   unsigned KeyFeature;
-  FeatureBitset Features;
+  X86FeatureBitset Features;
   char Mangling;
   bool OnlyForCPUDispatchSpecific;
 };
 
 struct FeatureInfo {
   StringLiteral NameWithPlus;
-  FeatureBitset ImpliedFeatures;
+  X86FeatureBitset ImpliedFeatures;
 
   StringRef getName(bool WithPlus = false) const {
     assert(NameWithPlus[0] == '+' && "Expected string to start with '+'");
@@ -46,176 +46,178 @@ struct FeatureInfo {
 } // end anonymous namespace
 
 #define X86_FEATURE(ENUM, STRING)                                              \
-  constexpr FeatureBitset Feature##ENUM = {X86::FEATURE_##ENUM};
+  constexpr X86FeatureBitset Feature##ENUM = {X86::FEATURE_##ENUM};
 #include "llvm/TargetParser/X86TargetParser.def"
 
 // Pentium with MMX.
-constexpr FeatureBitset FeaturesPentiumMMX =
+constexpr X86FeatureBitset FeaturesPentiumMMX =
     FeatureX87 | FeatureCMPXCHG8B | FeatureMMX;
 
 // Pentium 2 and 3.
-constexpr FeatureBitset FeaturesPentium2 =
+constexpr X86FeatureBitset FeaturesPentium2 =
     FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | FeatureFXSR | FeatureCMOV;
-constexpr FeatureBitset FeaturesPentium3 = FeaturesPentium2 | FeatureSSE;
+constexpr X86FeatureBitset FeaturesPentium3 = FeaturesPentium2 | FeatureSSE;
 
 // Pentium 4 CPUs
-constexpr FeatureBitset FeaturesPentium4 = FeaturesPentium3 | FeatureSSE2;
-constexpr FeatureBitset FeaturesPrescott = FeaturesPentium4 | FeatureSSE3;
-constexpr FeatureBitset FeaturesNocona =
+constexpr X86FeatureBitset FeaturesPentium4 = FeaturesPentium3 | FeatureSSE2;
+constexpr X86FeatureBitset FeaturesPrescott = FeaturesPentium4 | FeatureSSE3;
+constexpr X86FeatureBitset FeaturesNocona =
     FeaturesPrescott | Feature64BIT | FeatureCMPXCHG16B;
 
 // Basic 64-bit capable CPU.
-constexpr FeatureBitset FeaturesX86_64 = FeaturesPentium4 | Feature64BIT;
-constexpr FeatureBitset FeaturesX86_64_V2 = FeaturesX86_64 | FeatureSAHF |
-                                            FeaturePOPCNT | FeatureCRC32 |
-                                            FeatureSSE4_2 | FeatureCMPXCHG16B;
-constexpr FeatureBitset FeaturesX86_64_V3 =
+constexpr X86FeatureBitset FeaturesX86_64 = FeaturesPentium4 | Feature64BIT;
+constexpr X86FeatureBitset FeaturesX86_64_V2 =
+    FeaturesX86_64 | FeatureSAHF | FeaturePOPCNT | FeatureCRC32 |
+    FeatureSSE4_2 | FeatureCMPXCHG16B;
+constexpr X86FeatureBitset FeaturesX86_64_V3 =
     FeaturesX86_64_V2 | FeatureAVX2 | FeatureBMI | FeatureBMI2 | FeatureF16C |
     FeatureFMA | FeatureLZCNT | FeatureMOVBE | FeatureXSAVE;
-constexpr FeatureBitset FeaturesX86_64_V4 = FeaturesX86_64_V3 | FeatureEVEX512 |
-                                            FeatureAVX512BW | FeatureAVX512CD |
-                                            FeatureAVX512DQ | FeatureAVX512VL;
+constexpr X86FeatureBitset FeaturesX86_64_V4 =
+    FeaturesX86_64_V3 | FeatureEVEX512 | FeatureAVX512BW | FeatureAVX512CD |
+    FeatureAVX512DQ | FeatureAVX512VL;
 
 // Intel Core CPUs
-constexpr FeatureBitset FeaturesCore2 =
+constexpr X86FeatureBitset FeaturesCore2 =
     FeaturesNocona | FeatureSAHF | FeatureSSSE3;
-constexpr FeatureBitset FeaturesPenryn = FeaturesCore2 | FeatureSSE4_1;
-constexpr FeatureBitset FeaturesNehalem =
+constexpr X86FeatureBitset FeaturesPenryn = FeaturesCore2 | FeatureSSE4_1;
+constexpr X86FeatureBitset FeaturesNehalem =
     FeaturesPenryn | FeaturePOPCNT | FeatureCRC32 | FeatureSSE4_2;
-constexpr FeatureBitset FeaturesWestmere = FeaturesNehalem | FeaturePCLMUL;
-constexpr FeatureBitset FeaturesSandyBridge =
+constexpr X86FeatureBitset FeaturesWestmere = FeaturesNehalem | FeaturePCLMUL;
+constexpr X86FeatureBitset FeaturesSandyBridge =
     FeaturesWestmere | FeatureAVX | FeatureXSAVE | FeatureXSAVEOPT;
-constexpr FeatureBitset FeaturesIvyBridge =
+constexpr X86FeatureBitset FeaturesIvyBridge =
     FeaturesSandyBridge | FeatureF16C | FeatureFSGSBASE | FeatureRDRND;
-constexpr FeatureBitset FeaturesHaswell =
+constexpr X86FeatureBitset FeaturesHaswell =
     FeaturesIvyBridge | FeatureAVX2 | FeatureBMI | FeatureBMI2 | FeatureFMA |
     FeatureINVPCID | FeatureLZCNT | FeatureMOVBE;
-constexpr FeatureBitset FeaturesBroadwell =
+constexpr X86FeatureBitset FeaturesBroadwell =
     FeaturesHaswell | FeatureADX | FeaturePRFCHW | FeatureRDSEED;
 
 // Intel Knights Landing and Knights Mill
 // Knights Landing has feature parity with Broadwell.
-constexpr FeatureBitset FeaturesKNL =
+constexpr X86FeatureBitset FeaturesKNL =
     FeaturesBroadwell | FeatureAES | FeatureAVX512F | FeatureEVEX512 |
     FeatureAVX512CD | FeatureAVX512ER | FeatureAVX512PF | FeaturePREFETCHWT1;
-constexpr FeatureBitset FeaturesKNM = FeaturesKNL | FeatureAVX512VPOPCNTDQ;
+constexpr X86FeatureBitset FeaturesKNM = FeaturesKNL | FeatureAVX512VPOPCNTDQ;
 
 // Intel Skylake processors.
-constexpr FeatureBitset FeaturesSkylakeClient =
+constexpr X86FeatureBitset FeaturesSkylakeClient =
     FeaturesBroadwell | FeatureAES | FeatureCLFLUSHOPT | FeatureXSAVEC |
     FeatureXSAVES | FeatureSGX;
 // SkylakeServer inherits all SkylakeClient features except SGX.
 // FIXME: That doesn't match gcc.
-constexpr FeatureBitset FeaturesSkylakeServer =
+constexpr X86FeatureBitset FeaturesSkylakeServer =
     (FeaturesSkylakeClient & ~FeatureSGX) | FeatureAVX512F | FeatureEVEX512 |
     FeatureAVX512CD | FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL |
     FeatureCLWB | FeaturePKU;
-constexpr FeatureBitset FeaturesCascadeLake =
+constexpr X86FeatureBitset FeaturesCascadeLake =
     FeaturesSkylakeServer | FeatureAVX512VNNI;
-constexpr FeatureBitset FeaturesCooperLake =
+constexpr X86FeatureBitset FeaturesCooperLake =
     FeaturesCascadeLake | FeatureAVX512BF16;
 
 // Intel 10nm processors.
-constexpr FeatureBitset FeaturesCannonlake =
+constexpr X86FeatureBitset FeaturesCannonlake =
     FeaturesSkylakeClient | FeatureAVX512F | FeatureEVEX512 | FeatureAVX512CD |
     FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL | FeatureAVX512IFMA |
     FeatureAVX512VBMI | FeaturePKU | FeatureSHA;
-constexpr FeatureBitset FeaturesICLClient =
+constexpr X86FeatureBitset FeaturesICLClient =
     FeaturesCannonlake | FeatureAVX512BITALG | FeatureAVX512VBMI2 |
     FeatureAVX512VNNI | FeatureAVX512VPOPCNTDQ | FeatureGFNI | FeatureRDPID |
     FeatureVAES | FeatureVPCLMULQDQ;
-constexpr FeatureBitset FeaturesRocketlake = FeaturesICLClient & ~FeatureSGX;
-constexpr FeatureBitset FeaturesICLServer =
+constexpr X86FeatureBitset FeaturesRocketlake = FeaturesICLClient & ~FeatureSGX;
+constexpr X86FeatureBitset FeaturesICLServer =
     FeaturesICLClient | FeatureCLWB | FeaturePCONFIG | FeatureWBNOINVD;
-constexpr FeatureBitset FeaturesTigerlake =
+constexpr X86FeatureBitset FeaturesTigerlake =
     FeaturesICLClient | FeatureAVX512VP2INTERSECT | FeatureMOVDIR64B |
     FeatureCLWB | FeatureMOVDIRI | FeatureSHSTK | FeatureKL | FeatureWIDEKL;
-constexpr FeatureBitset FeaturesSapphireRapids =
+constexpr X86FeatureBitset FeaturesSapphireRapids =
     FeaturesICLServer | FeatureAMX_BF16 | FeatureAMX_INT8 | FeatureAMX_TILE |
     FeatureAVX512BF16 | FeatureAVX512FP16 | FeatureAVXVNNI | FeatureCLDEMOTE |
     FeatureENQCMD | FeatureMOVDIR64B | FeatureMOVDIRI | FeaturePTWRITE |
     FeatureSERIALIZE | FeatureSHSTK | FeatureTSXLDTRK | FeatureUINTR |
     FeatureWAITPKG;
-constexpr FeatureBitset FeaturesGraniteRapids =
+constexpr X86FeatureBitset FeaturesGraniteRapids =
     FeaturesSapphireRapids | FeatureAMX_FP16 | FeaturePREFETCHI;
 
 // Intel Atom processors.
 // Bonnell has feature parity with Core2 and adds MOVBE.
-constexpr FeatureBitset FeaturesBonnell = FeaturesCore2 | FeatureMOVBE;
+constexpr X86FeatureBitset FeaturesBonnell = FeaturesCore2 | FeatureMOVBE;
 // Silvermont has parity with Westmere and Bonnell plus PRFCHW and RDRND.
-constexpr FeatureBitset FeaturesSilvermont =
+constexpr X86FeatureBitset FeaturesSilvermont =
     FeaturesBonnell | FeaturesWestmere | FeaturePRFCHW | FeatureRDRND;
-constexpr FeatureBitset FeaturesGoldmont =
+constexpr X86FeatureBitset FeaturesGoldmont =
     FeaturesSilvermont | FeatureAES | FeatureCLFLUSHOPT | FeatureFSGSBASE |
     FeatureRDSEED | FeatureSHA | FeatureXSAVE | FeatureXSAVEC |
     FeatureXSAVEOPT | FeatureXSAVES;
-constexpr FeatureBitset FeaturesGoldmontPlus =
+constexpr X86FeatureBitset FeaturesGoldmontPlus =
     FeaturesGoldmont | FeaturePTWRITE | FeatureRDPID | FeatureSGX;
-constexpr FeatureBitset FeaturesTremont =
+constexpr X86FeatureBitset FeaturesTremont =
     FeaturesGoldmontPlus | FeatureCLWB | FeatureGFNI;
-constexpr FeatureBitset FeaturesAlderlake =
+constexpr X86FeatureBitset FeaturesAlderlake =
     FeaturesTremont | FeatureADX | FeatureBMI | FeatureBMI2 | FeatureF16C |
     FeatureFMA | FeatureINVPCID | FeatureLZCNT | FeaturePCONFIG | FeaturePKU |
     FeatureSERIALIZE | FeatureSHSTK | FeatureVAES | FeatureVPCLMULQDQ |
     FeatureCLDEMOTE | FeatureMOVDIR64B | FeatureMOVDIRI | FeatureWAITPKG |
     FeatureAVXVNNI | FeatureHRESET | FeatureWIDEKL;
-constexpr FeatureBitset FeaturesSierraforest =
+constexpr X86FeatureBitset FeaturesSierraforest =
     FeaturesAlderlake | FeatureCMPCCXADD | FeatureAVXIFMA | FeatureUINTR |
     FeatureENQCMD | FeatureAVXNECONVERT | FeatureAVXVNNIINT8;
-constexpr FeatureBitset FeaturesArrowlakeS = FeaturesSierraforest |
-    FeatureAVXVNNIINT16 | FeatureSHA512 | FeatureSM3 | FeatureSM4;
-constexpr FeatureBitset FeaturesPantherlake =
+constexpr X86FeatureBitset FeaturesArrowlakeS =
+    FeaturesSierraforest | FeatureAVXVNNIINT16 | FeatureSHA512 | FeatureSM3 |
+    FeatureSM4;
+constexpr X86FeatureBitset FeaturesPantherlake =
     FeaturesArrowlakeS | FeaturePREFETCHI;
-constexpr FeatureBitset FeaturesClearwaterforest =
+constexpr X86FeatureBitset FeaturesClearwaterforest =
     FeaturesArrowlakeS | FeatureUSERMSR | FeaturePREFETCHI;
 
 // Geode Processor.
-constexpr FeatureBitset FeaturesGeode =
+constexpr X86FeatureBitset FeaturesGeode =
     FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | Feature3DNOW | Feature3DNOWA;
 
 // K6 processor.
-constexpr FeatureBitset FeaturesK6 = FeatureX87 | FeatureCMPXCHG8B | FeatureMMX;
+constexpr X86FeatureBitset FeaturesK6 =
+    FeatureX87 | FeatureCMPXCHG8B | FeatureMMX;
 
 // K7 and K8 architecture processors.
-constexpr FeatureBitset FeaturesAthlon =
+constexpr X86FeatureBitset FeaturesAthlon =
     FeatureX87 | FeatureCMPXCHG8B | FeatureMMX | Feature3DNOW | Feature3DNOWA;
-constexpr FeatureBitset FeaturesAthlonXP =
+constexpr X86FeatureBitset FeaturesAthlonXP =
     FeaturesAthlon | FeatureFXSR | FeatureSSE;
-constexpr FeatureBitset FeaturesK8 =
+constexpr X86FeatureBitset FeaturesK8 =
     FeaturesAthlonXP | FeatureSSE2 | Feature64BIT;
-constexpr FeatureBitset FeaturesK8SSE3 = FeaturesK8 | FeatureSSE3;
-constexpr FeatureBitset FeaturesAMDFAM10 =
+constexpr X86FeatureBitset FeaturesK8SSE3 = FeaturesK8 | FeatureSSE3;
+constexpr X86FeatureBitset FeaturesAMDFAM10 =
     FeaturesK8SSE3 | FeatureCMPXCHG16B | FeatureLZCNT | FeaturePOPCNT |
     FeaturePRFCHW | FeatureSAHF | FeatureSSE4_A;
 
 // Bobcat architecture processors.
-constexpr FeatureBitset FeaturesBTVER1 =
+constexpr X86FeatureBitset FeaturesBTVER1 =
     FeatureX87 | FeatureCMPXCHG8B | FeatureCMPXCHG16B | Feature64BIT |
     FeatureFXSR | FeatureLZCNT | FeatureMMX | FeaturePOPCNT | FeaturePRFCHW |
     FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_A |
     FeatureSAHF;
-constexpr FeatureBitset FeaturesBTVER2 =
+constexpr X86FeatureBitset FeaturesBTVER2 =
     FeaturesBTVER1 | FeatureAES | FeatureAVX | FeatureBMI | FeatureCRC32 |
     FeatureF16C | FeatureMOVBE | FeaturePCLMUL | FeatureXSAVE | FeatureXSAVEOPT;
 
 // AMD Bulldozer architecture processors.
-constexpr FeatureBitset FeaturesBDVER1 =
+constexpr X86FeatureBitset FeaturesBDVER1 =
     FeatureX87 | FeatureAES | FeatureAVX | FeatureCMPXCHG8B |
     FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT | FeatureFMA4 |
     FeatureFXSR | FeatureLWP | FeatureLZCNT | FeatureMMX | FeaturePCLMUL |
     FeaturePOPCNT | FeaturePRFCHW | FeatureSAHF | FeatureSSE | FeatureSSE2 |
     FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 | FeatureSSE4_2 | FeatureSSE4_A |
     FeatureXOP | FeatureXSAVE;
-constexpr FeatureBitset FeaturesBDVER2 =
+constexpr X86FeatureBitset FeaturesBDVER2 =
     FeaturesBDVER1 | FeatureBMI | FeatureFMA | FeatureF16C | FeatureTBM;
-constexpr FeatureBitset FeaturesBDVER3 =
+constexpr X86FeatureBitset FeaturesBDVER3 =
     FeaturesBDVER2 | FeatureFSGSBASE | FeatureXSAVEOPT;
-constexpr FeatureBitset FeaturesBDVER4 = FeaturesBDVER3 | FeatureAVX2 |
-                                         FeatureBMI2 | FeatureMOVBE |
-                                         FeatureMWAITX | FeatureRDRND;
+constexpr X86FeatureBitset FeaturesBDVER4 = FeaturesBDVER3 | FeatureAVX2 |
+                                            FeatureBMI2 | FeatureMOVBE |
+                                            FeatureMWAITX | FeatureRDRND;
 
 // AMD Zen architecture processors.
-constexpr FeatureBitset FeaturesZNVER1 =
+constexpr X86FeatureBitset FeaturesZNVER1 =
     FeatureX87 | FeatureADX | FeatureAES | FeatureAVX | FeatureAVX2 |
     FeatureBMI | FeatureBMI2 | FeatureCLFLUSHOPT | FeatureCLZERO |
     FeatureCMPXCHG8B | FeatureCMPXCHG16B | FeatureCRC32 | Feature64BIT |
@@ -225,13 +227,13 @@ constexpr FeatureBitset FeaturesZNVER1 =
     FeatureSSE | FeatureSSE2 | FeatureSSE3 | FeatureSSSE3 | FeatureSSE4_1 |
     FeatureSSE4_2 | FeatureSSE4_A | FeatureXSAVE | FeatureXSAVEC |
     FeatureXSAVEOPT | FeatureXSAVES;
-constexpr FeatureBitset FeaturesZNVER2 = FeaturesZNVER1 | FeatureCLWB |
-                                         FeatureRDPID | FeatureRDPRU |
-                                         FeatureWBNOINVD;
-static constexpr FeatureBitset FeaturesZNVER3 = FeaturesZNVER2 |
-                                                FeatureINVPCID | FeaturePKU |
-                                                FeatureVAES | FeatureVPCLMULQDQ;
-static constexpr FeatureBitset FeaturesZNVER4 =
+constexpr X86FeatureBitset FeaturesZNVER2 = FeaturesZNVER1 | FeatureCLWB |
+                                            FeatureRDPID | FeatureRDPRU |
+                                            FeatureWBNOINVD;
+static constexpr X86FeatureBitset FeaturesZNVER3 =
+    FeaturesZNVER2 | FeatureINVPCID | FeaturePKU | FeatureVAES |
+    FeatureVPCLMULQDQ;
+static constexpr X86FeatureBitset FeaturesZNVER4 =
     FeaturesZNVER3 | FeatureAVX512F | FeatureEVEX512 | FeatureAVX512CD |
     FeatureAVX512DQ | FeatureAVX512BW | FeatureAVX512VL | FeatureAVX512IFMA |
     FeatureAVX512VBMI | FeatureAVX512VBMI2 | FeatureAVX512VNNI |
@@ -475,164 +477,165 @@ ProcessorFeatures llvm::X86::getKeyFeature(X86::CPUKind Kind) {
 }
 
 // Features with no dependencies.
-constexpr FeatureBitset ImpliedFeatures64BIT = {};
-constexpr FeatureBitset ImpliedFeaturesADX = {};
-constexpr FeatureBitset ImpliedFeaturesBMI = {};
-constexpr FeatureBitset ImpliedFeaturesBMI2 = {};
-constexpr FeatureBitset ImpliedFeaturesCLDEMOTE = {};
-constexpr FeatureBitset ImpliedFeaturesCLFLUSHOPT = {};
-constexpr FeatureBitset ImpliedFeaturesCLWB = {};
-constexpr FeatureBitset ImpliedFeaturesCLZERO = {};
-constexpr FeatureBitset ImpliedFeaturesCMOV = {};
-constexpr FeatureBitset ImpliedFeaturesCMPXCHG16B = {};
-constexpr FeatureBitset ImpliedFeaturesCMPXCHG8B = {};
-constexpr FeatureBitset ImpliedFeaturesCRC32 = {};
-constexpr FeatureBitset ImpliedFeaturesENQCMD = {};
-constexpr FeatureBitset ImpliedFeaturesFSGSBASE = {};
-constexpr FeatureBitset ImpliedFeaturesFXSR = {};
-constexpr FeatureBitset ImpliedFeaturesINVPCID = {};
-constexpr FeatureBitset ImpliedFeaturesLWP = {};
-constexpr FeatureBitset ImpliedFeaturesLZCNT = {};
-constexpr FeatureBitset ImpliedFeaturesMWAITX = {};
-constexpr FeatureBitset ImpliedFeaturesMOVBE = {};
-constexpr FeatureBitset ImpliedFeaturesMOVDIR64B = {};
-constexpr FeatureBitset ImpliedFeaturesMOVDIRI = {};
-constexpr FeatureBitset ImpliedFeaturesPCONFIG = {};
-constexpr FeatureBitset ImpliedFeaturesPOPCNT = {};
-constexpr FeatureBitset ImpliedFeaturesPKU = {};
-constexpr FeatureBitset ImpliedFeaturesPREFETCHWT1 = {};
-constexpr FeatureBitset ImpliedFeaturesPRFCHW = {};
-constexpr FeatureBitset ImpliedFeaturesPTWRITE = {};
-constexpr FeatureBitset ImpliedFeaturesRDPID = {};
-constexpr FeatureBitset ImpliedFeaturesRDPRU = {};
-constexpr FeatureBitset ImpliedFeaturesRDRND = {};
-constexpr FeatureBitset ImpliedFeaturesRDSEED = {};
-constexpr FeatureBitset ImpliedFeaturesRTM = {};
-constexpr FeatureBitset ImpliedFeaturesSAHF = {};
-constexpr FeatureBitset ImpliedFeaturesSERIALIZE = {};
-constexpr FeatureBitset ImpliedFeaturesSGX = {};
-constexpr FeatureBitset ImpliedFeaturesSHSTK = {};
-constexpr FeatureBitset ImpliedFeaturesTBM = {};
-constexpr FeatureBitset ImpliedFeaturesTSXLDTRK = {};
-constexpr FeatureBitset ImpliedFeaturesUINTR = {};
-constexpr FeatureBitset ImpliedFeaturesUSERMSR = {};
-constexpr FeatureBitset ImpliedFeaturesWAITPKG = {};
-constexpr FeatureBitset ImpliedFeaturesWBNOINVD = {};
-constexpr FeatureBitset ImpliedFeaturesVZEROUPPER = {};
-constexpr FeatureBitset ImpliedFeaturesX87 = {};
-constexpr FeatureBitset ImpliedFeaturesXSAVE = {};
+constexpr X86FeatureBitset ImpliedFeatures64BIT = {};
+constexpr X86FeatureBitset ImpliedFeaturesADX = {};
+constexpr X86FeatureBitset ImpliedFeaturesBMI = {};
+constexpr X86FeatureBitset ImpliedFeaturesBMI2 = {};
+constexpr X86FeatureBitset ImpliedFeaturesCLDEMOTE = {};
+constexpr X86FeatureBitset ImpliedFeaturesCLFLUSHOPT = {};
+constexpr X86FeatureBitset ImpliedFeaturesCLWB = {};
+constexpr X86FeatureBitset ImpliedFeaturesCLZERO = {};
+constexpr X86FeatureBitset ImpliedFeaturesCMOV = {};
+constexpr X86FeatureBitset ImpliedFeaturesCMPXCHG16B = {};
+constexpr X86FeatureBitset ImpliedFeaturesCMPXCHG8B = {};
+constexpr X86FeatureBitset ImpliedFeaturesCRC32 = {};
+constexpr X86FeatureBitset ImpliedFeaturesENQCMD = {};
+constexpr X86FeatureBitset ImpliedFeaturesFSGSBASE = {};
+constexpr X86FeatureBitset ImpliedFeaturesFXSR = {};
+constexpr X86FeatureBitset ImpliedFeaturesINVPCID = {};
+constexpr X86FeatureBitset ImpliedFeaturesLWP = {};
+constexpr X86FeatureBitset ImpliedFeaturesLZCNT = {};
+constexpr X86FeatureBitset ImpliedFeaturesMWAITX = {};
+constexpr X86FeatureBitset ImpliedFeaturesMOVBE = {};
+constexpr X86FeatureBitset ImpliedFeaturesMOVDIR64B = {};
+constexpr X86FeatureBitset ImpliedFeaturesMOVDIRI = {};
+constexpr X86FeatureBitset ImpliedFeaturesPCONFIG = {};
+constexpr X86FeatureBitset ImpliedFeaturesPOPCNT = {};
+constexpr X86FeatureBitset ImpliedFeaturesPKU = {};
+constexpr X86FeatureBitset ImpliedFeaturesPREFETCHWT1 = {};
+constexpr X86FeatureBitset ImpliedFeaturesPRFCHW = {};
+constexpr X86FeatureBitset ImpliedFeaturesPTWRITE = {};
+constexpr X86FeatureBitset ImpliedFeaturesRDPID = {};
+constexpr X86FeatureBitset ImpliedFeaturesRDPRU = {};
+constexpr X86FeatureBitset ImpliedFeaturesRDRND = {};
+constexpr X86FeatureBitset ImpliedFeaturesRDSEED = {};
+constexpr X86FeatureBitset ImpliedFeaturesRTM = {};
+constexpr X86FeatureBitset ImpliedFeaturesSAHF = {};
+constexpr X86FeatureBitset ImpliedFeaturesSERIALIZE = {};
+constexpr X86FeatureBitset ImpliedFeaturesSGX = {};
+constexpr X86FeatureBitset ImpliedFeaturesSHSTK = {};
+constexpr X86FeatureBitset ImpliedFeaturesTBM = {};
+constexpr X86FeatureBitset ImpliedFeaturesTSXLDTRK = {};
+constexpr X86FeatureBitset ImpliedFeaturesUINTR = {};
+constexpr X86FeatureBitset ImpliedFeaturesUSERMSR = {};
+constexpr X86FeatureBitset ImpliedFeaturesWAITPKG = {};
+constexpr X86FeatureBitset ImpliedFeaturesWBNOINVD = {};
+constexpr X86FeatureBitset ImpliedFeaturesVZEROUPPER = {};
+constexpr X86FeatureBitset ImpliedFeaturesX87 = {};
+constexpr X86FeatureBitset ImpliedFeaturesXSAVE = {};
 
 // Not really CPU features, but need to be in the table because clang uses
 // target features to communicate them to the backend.
-constexpr FeatureBitset ImpliedFeaturesRETPOLINE_EXTERNAL_THUNK = {};
-constexpr FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_BRANCHES = {};
-constexpr FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_CALLS = {};
-constexpr FeatureBitset ImpliedFeaturesLVI_CFI = {};
-constexpr FeatureBitset ImpliedFeaturesLVI_LOAD_HARDENING = {};
+constexpr X86FeatureBitset ImpliedFeaturesRETPOLINE_EXTERNAL_THUNK = {};
+constexpr X86FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_BRANCHES = {};
+constexpr X86FeatureBitset ImpliedFeaturesRETPOLINE_INDIRECT_CALLS = {};
+constexpr X86FeatureBitset ImpliedFeaturesLVI_CFI = {};
+constexpr X86FeatureBitset ImpliedFeaturesLVI_LOAD_HARDENING = {};
 
 // XSAVE features are dependent on basic XSAVE.
-constexpr FeatureBitset ImpliedFeaturesXSAVEC = FeatureXSAVE;
-constexpr FeatureBitset ImpliedFeaturesXSAVEOPT = FeatureXSAVE;
-constexpr FeatureBitset ImpliedFeaturesXSAVES = FeatureXSAVE;
+constexpr X86FeatureBitset ImpliedFeaturesXSAVEC = FeatureXSAVE;
+constexpr X86FeatureBitset ImpliedFeaturesXSAVEOPT = FeatureXSAVE;
+constexpr X86FeatureBitset ImpliedFeaturesXSAVES = FeatureXSAVE;
 
 // MMX->3DNOW->3DNOWA chain.
-constexpr FeatureBitset ImpliedFeaturesMMX = {};
-constexpr FeatureBitset ImpliedFeatures3DNOW = FeatureMMX;
-constexpr FeatureBitset ImpliedFeatures3DNOWA = Feature3DNOW;
+constexpr X86FeatureBitset ImpliedFeaturesMMX = {};
+constexpr X86FeatureBitset ImpliedFeatures3DNOW = FeatureMMX;
+constexpr X86FeatureBitset ImpliedFeatures3DNOWA = Feature3DNOW;
 
 // SSE/AVX/AVX512F chain.
-constexpr FeatureBitset ImpliedFeaturesSSE = {};
-constexpr FeatureBitset ImpliedFeaturesSSE2 = FeatureSSE;
-constexpr FeatureBitset ImpliedFeaturesSSE3 = FeatureSSE2;
-constexpr FeatureBitset ImpliedFeaturesSSSE3 = FeatureSSE3;
-constexpr FeatureBitset ImpliedFeaturesSSE4_1 = FeatureSSSE3;
-constexpr FeatureBitset ImpliedFeaturesSSE4_2 = FeatureSSE4_1;
-constexpr FeatureBitset ImpliedFeaturesAVX = FeatureSSE4_2;
-constexpr FeatureBitset ImpliedFeaturesAVX2 = FeatureAVX;
-constexpr FeatureBitset ImpliedFeaturesEVEX512 = {};
-constexpr FeatureBitset ImpliedFeaturesAVX512F =
+constexpr X86FeatureBitset ImpliedFeaturesSSE = {};
+constexpr X86FeatureBitset ImpliedFeaturesSSE2 = FeatureSSE;
+constexpr X86FeatureBitset ImpliedFeaturesSSE3 = FeatureSSE2;
+constexpr X86FeatureBitset ImpliedFeaturesSSSE3 = FeatureSSE3;
+constexpr X86FeatureBitset ImpliedFeaturesSSE4_1 = FeatureSSSE3;
+constexpr X86FeatureBitset ImpliedFeaturesSSE4_2 = FeatureSSE4_1;
+constexpr X86FeatureBitset ImpliedFeaturesAVX = FeatureSSE4_2;
+constexpr X86FeatureBitset ImpliedFeaturesAVX2 = FeatureAVX;
+constexpr X86FeatureBitset ImpliedFeaturesEVEX512 = {};
+constexpr X86FeatureBitset ImpliedFeaturesAVX512F =
     FeatureAVX2 | FeatureF16C | FeatureFMA;
 
 // Vector extensions that build on SSE or AVX.
-constexpr FeatureBitset ImpliedFeaturesAES = FeatureSSE2;
-constexpr FeatureBitset ImpliedFeaturesF16C = FeatureAVX;
-constexpr FeatureBitset ImpliedFeaturesFMA = FeatureAVX;
-constexpr FeatureBitset ImpliedFeaturesGFNI = FeatureSSE2;
-constexpr FeatureBitset ImpliedFeaturesPCLMUL = FeatureSSE2;
-constexpr FeatureBitset ImpliedFeaturesSHA = FeatureSSE2;
-constexpr FeatureBitset ImpliedFeaturesVAES = FeatureAES | FeatureAVX2;
-constexpr FeatureBitset ImpliedFeaturesVPCLMULQDQ = FeatureAVX | FeaturePCLMUL;
-constexpr FeatureBitset ImpliedFeaturesSM3 = FeatureAVX;
-constexpr FeatureBitset ImpliedFeaturesSM4 = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesAES = FeatureSSE2;
+constexpr X86FeatureBitset ImpliedFeaturesF16C = FeatureAVX;
+constexpr X86FeatureBitset ImpliedFeaturesFMA = FeatureAVX;
+constexpr X86FeatureBitset ImpliedFeaturesGFNI = FeatureSSE2;
+constexpr X86FeatureBitset ImpliedFeaturesPCLMUL = FeatureSSE2;
+constexpr X86FeatureBitset ImpliedFeaturesSHA = FeatureSSE2;
+constexpr X86FeatureBitset ImpliedFeaturesVAES = FeatureAES | FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesVPCLMULQDQ =
+    FeatureAVX | FeaturePCLMUL;
+constexpr X86FeatureBitset ImpliedFeaturesSM3 = FeatureAVX;
+constexpr X86FeatureBitset ImpliedFeaturesSM4 = FeatureAVX2;
 
 // AVX512 features.
-constexpr FeatureBitset ImpliedFeaturesAVX512CD = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512BW = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512DQ = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512ER = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512PF = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512VL = FeatureAVX512F;
-
-constexpr FeatureBitset ImpliedFeaturesAVX512BF16 = FeatureAVX512BW;
-constexpr FeatureBitset ImpliedFeaturesAVX512BITALG = FeatureAVX512BW;
-constexpr FeatureBitset ImpliedFeaturesAVX512IFMA = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512VNNI = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512VPOPCNTDQ = FeatureAVX512F;
-constexpr FeatureBitset ImpliedFeaturesAVX512VBMI = FeatureAVX512BW;
-constexpr FeatureBitset ImpliedFeaturesAVX512VBMI2 = FeatureAVX512BW;
-constexpr FeatureBitset ImpliedFeaturesAVX512VP2INTERSECT = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512CD = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512BW = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512DQ = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512ER = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512PF = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512VL = FeatureAVX512F;
+
+constexpr X86FeatureBitset ImpliedFeaturesAVX512BF16 = FeatureAVX512BW;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512BITALG = FeatureAVX512BW;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512IFMA = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512VNNI = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512VPOPCNTDQ = FeatureAVX512F;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512VBMI = FeatureAVX512BW;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512VBMI2 = FeatureAVX512BW;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512VP2INTERSECT = FeatureAVX512F;
 
 // FIXME: These two aren't really implemented and just exist in the feature
 // list for __builtin_cpu_supports. So omit their dependencies.
-constexpr FeatureBitset ImpliedFeaturesAVX5124FMAPS = {};
-constexpr FeatureBitset ImpliedFeaturesAVX5124VNNIW = {};
+constexpr X86FeatureBitset ImpliedFeaturesAVX5124FMAPS = {};
+constexpr X86FeatureBitset ImpliedFeaturesAVX5124VNNIW = {};
 
 // SSE4_A->FMA4->XOP chain.
-constexpr FeatureBitset ImpliedFeaturesSSE4_A = FeatureSSE3;
-constexpr FeatureBitset ImpliedFeaturesFMA4 = FeatureAVX | FeatureSSE4_A;
-constexpr FeatureBitset ImpliedFeaturesXOP = FeatureFMA4;
+constexpr X86FeatureBitset ImpliedFeaturesSSE4_A = FeatureSSE3;
+constexpr X86FeatureBitset ImpliedFeaturesFMA4 = FeatureAVX | FeatureSSE4_A;
+constexpr X86FeatureBitset ImpliedFeaturesXOP = FeatureFMA4;
 
 // AMX Features
-constexpr FeatureBitset ImpliedFeaturesAMX_TILE = {};
-constexpr FeatureBitset ImpliedFeaturesAMX_BF16 = FeatureAMX_TILE;
-constexpr FeatureBitset ImpliedFeaturesAMX_FP16 = FeatureAMX_TILE;
-constexpr FeatureBitset ImpliedFeaturesAMX_INT8 = FeatureAMX_TILE;
-constexpr FeatureBitset ImpliedFeaturesAMX_COMPLEX = FeatureAMX_TILE;
-constexpr FeatureBitset ImpliedFeaturesHRESET = {};
-
-constexpr FeatureBitset ImpliedFeaturesPREFETCHI = {};
-constexpr FeatureBitset ImpliedFeaturesCMPCCXADD = {};
-constexpr FeatureBitset ImpliedFeaturesRAOINT = {};
-constexpr FeatureBitset ImpliedFeaturesAVXVNNIINT16 = FeatureAVX2;
-constexpr FeatureBitset ImpliedFeaturesAVXVNNIINT8 = FeatureAVX2;
-constexpr FeatureBitset ImpliedFeaturesAVXIFMA = FeatureAVX2;
-constexpr FeatureBitset ImpliedFeaturesAVXNECONVERT = FeatureAVX2;
-constexpr FeatureBitset ImpliedFeaturesSHA512 = FeatureAVX2;
-constexpr FeatureBitset ImpliedFeaturesAVX512FP16 =
+constexpr X86FeatureBitset ImpliedFeaturesAMX_TILE = {};
+constexpr X86FeatureBitset ImpliedFeaturesAMX_BF16 = FeatureAMX_TILE;
+constexpr X86FeatureBitset ImpliedFeaturesAMX_FP16 = FeatureAMX_TILE;
+constexpr X86FeatureBitset ImpliedFeaturesAMX_INT8 = FeatureAMX_TILE;
+constexpr X86FeatureBitset ImpliedFeaturesAMX_COMPLEX = FeatureAMX_TILE;
+constexpr X86FeatureBitset ImpliedFeaturesHRESET = {};
+
+constexpr X86FeatureBitset ImpliedFeaturesPREFETCHI = {};
+constexpr X86FeatureBitset ImpliedFeaturesCMPCCXADD = {};
+constexpr X86FeatureBitset ImpliedFeaturesRAOINT = {};
+constexpr X86FeatureBitset ImpliedFeaturesAVXVNNIINT16 = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesAVXVNNIINT8 = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesAVXIFMA = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesAVXNECONVERT = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesSHA512 = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesAVX512FP16 =
     FeatureAVX512BW | FeatureAVX512DQ | FeatureAVX512VL;
 // Key Locker Features
-constexpr FeatureBitset ImpliedFeaturesKL = FeatureSSE2;
-constexpr FeatureBitset ImpliedFeaturesWIDEKL = FeatureKL;
+constexpr X86FeatureBitset ImpliedFeaturesKL = FeatureSSE2;
+constexpr X86FeatureBitset ImpliedFeaturesWIDEKL = FeatureKL;
 
 // AVXVNNI Features
-constexpr FeatureBitset ImpliedFeaturesAVXVNNI = FeatureAVX2;
+constexpr X86FeatureBitset ImpliedFeaturesAVXVNNI = FeatureAVX2;
 
 // AVX10 Features
-constexpr FeatureBitset ImpliedFeaturesAVX10_1 =
+constexpr X86FeatureBitset ImpliedFeaturesAVX10_1 =
     FeatureAVX512CD | FeatureAVX512VBMI | FeatureAVX512IFMA |
     FeatureAVX512VNNI | FeatureAVX512BF16 | FeatureAVX512VPOPCNTDQ |
     FeatureAVX512VBMI2 | FeatureAVX512BITALG | FeatureVAES | FeatureVPCLMULQDQ |
     FeatureAVX512FP16;
-constexpr FeatureBitset ImpliedFeaturesAVX10_1_512 =
+constexpr X86FeatureBitset ImpliedFeaturesAVX10_1_512 =
     FeatureAVX10_1 | FeatureEVEX512;
 
 // APX Features
-constexpr FeatureBitset ImpliedFeaturesEGPR = {};
-constexpr FeatureBitset ImpliedFeaturesPush2Pop2 = {};
-constexpr FeatureBitset ImpliedFeaturesPPX = {};
-constexpr FeatureBitset ImpliedFeaturesNDD = {};
-constexpr FeatureBitset ImpliedFeaturesCCMP = {};
-constexpr FeatureBitset ImpliedFeaturesCF = {};
+constexpr X86FeatureBitset ImpliedFeaturesEGPR = {};
+constexpr X86FeatureBitset ImpliedFeaturesPush2Pop2 = {};
+constexpr X86FeatureBitset ImpliedFeaturesPPX = {};
+constexpr X86FeatureBitset ImpliedFeaturesNDD = {};
+constexpr X86FeatureBitset ImpliedFeaturesCCMP = {};
+constexpr X86FeatureBitset ImpliedFeaturesCF = {};
 
 constexpr FeatureInfo FeatureInfos[X86::CPU_FEATURE_MAX] = {
 #define X86_FEATURE(ENUM, STR) {{"+" STR}, ImpliedFeatures##ENUM},
@@ -646,7 +649,7 @@ void llvm::X86::getFeaturesForCPU(StringRef CPU,
                          [&](const ProcInfo &P) { return P.Name == CPU; });
   assert(I != std::end(Processors) && "Processor not found!");
 
-  FeatureBitset Bits = I->Features;
+  X86FeatureBitset Bits = I->Features;
 
   // Remove the 64-bit feature which we only use to validate if a CPU can
   // be used with 64-bit mode.
@@ -659,12 +662,12 @@ void llvm::X86::getFeaturesForCPU(StringRef CPU,
 }
 
 // For each feature that is (transitively) implied by this feature, set it.
-static void getImpliedEnabledFeatures(FeatureBitset &Bits,
-                                      const FeatureBitset &Implies) {
+static void getImpliedEnabledFeatures(X86FeatureBitset &Bits,
+                                      const X86FeatureBitset &Implies) {
   // Fast path: Implies is often empty.
   if (!Implies.any())
     return;
-  FeatureBitset Prev;
+  X86FeatureBitset Prev;
   Bits |= Implies;
   do {
     Prev = Bits;
@@ -676,10 +679,10 @@ static void getImpliedEnabledFeatures(FeatureBitset &Bits,
 
 /// Create bit vector of features that are implied disabled if the feature
 /// passed in Value is disabled.
-static void getImpliedDisabledFeatures(FeatureBitset &Bits, unsigned Value) {
+static void getImpliedDisabledFeatures(X86FeatureBitset &Bits, unsigned Value) {
   // Check all features looking for any dependent on this feature. If we find
   // one, mark it and recursively find any feature that depend on it.
-  FeatureBitset Prev;
+  X86FeatureBitset Prev;
   Bits.set(Value);
   do {
     Prev = Bits;
@@ -701,7 +704,7 @@ void llvm::X86::updateImpliedFeatures(
     return;
   }
 
-  FeatureBitset ImpliedBits;
+  X86FeatureBitset ImpliedBits;
   if (Enabled)
     getImpliedEnabledFeatures(ImpliedBits, I->ImpliedFeatures);
   else
diff --git a/llvm/lib/TextAPI/TextStubV5.cpp b/llvm/lib/TextAPI/TextStubV5.cpp
index b072c0b5d69d0..a44de94b7b05b 100644
--- a/llvm/lib/TextAPI/TextStubV5.cpp
+++ b/llvm/lib/TextAPI/TextStubV5.cpp
@@ -225,7 +225,7 @@ Error collectFromArray(TBDKey Key, const Object *Obj,
     return Error::success();
   }
 
-  for (const Value &Val : *Values) {
+  for (const json::Value &Val : *Values) {
     auto ValStr = Val.getAsString();
     if (!ValStr.has_value())
       return make_error<JSONStubError>(getParseErrorMsg(Key));
@@ -258,7 +258,7 @@ Expected<TargetList> getTargets(const Object *Section) {
     return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Targets));
 
   TargetList IFTargets;
-  for (const Value &JSONTarget : *Targets) {
+  for (const json::Value &JSONTarget : *Targets) {
     auto TargetStr = JSONTarget.getAsString();
     if (!TargetStr.has_value())
       return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Target));
@@ -276,7 +276,7 @@ Expected<TargetList> getTargetsSection(const Object *Section) {
     return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Targets));
 
   TargetList IFTargets;
-  for (const Value &JSONTarget : *Targets) {
+  for (const json::Value &JSONTarget : *Targets) {
     const auto *Obj = JSONTarget.getAsObject();
     if (!Obj)
       return make_error<JSONStubError>(getParseErrorMsg(TBDKey::Target));
@@ -1024,8 +1024,8 @@ Error MachO::serializeInterfaceFileToJSON(raw_ostream &OS,
   if (!TextFile)
     return TextFile.takeError();
   if (Compact)
-    OS << formatv("{0}", Value(std::move(*TextFile))) << "\n";
+    OS << formatv("{0}", json::Value(std::move(*TextFile))) << "\n";
   else
-    OS << formatv("{0:2}", Value(std::move(*TextFile))) << "\n";
+    OS << formatv("{0:2}", json::Value(std::move(*TextFile))) << "\n";
   return Error::success();
 }



More information about the llvm-commits mailing list