This revision was automatically updated to reflect the committed changes.
Closed by commit rGcea0eea28e71: [llvm] Split out DenseMapInfo<variant>
specialization (authored by IncludeGuardian).
Herald added a project: Flang.
Changed prior to commit:
https://reviews.llvm.org/D150997?vs=532038&id=533470#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D150997/new/
https://reviews.llvm.org/D150997
Files:
clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h
flang/include/flang/Optimizer/HLFIR/HLFIROps.h
llvm/include/llvm/ADT/DenseMapInfo.h
llvm/include/llvm/ADT/DenseMapInfoVariant.h
llvm/include/llvm/CodeGen/CallingConvLower.h
llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
llvm/include/llvm/Object/DXContainer.h
llvm/include/llvm/Transforms/Scalar/SROA.h
llvm/unittests/ADT/DenseMapTest.cpp
mlir/include/mlir/IR/AsmState.h
mlir/include/mlir/Transforms/SROA.h
Index: mlir/include/mlir/Transforms/SROA.h
===================================================================
--- mlir/include/mlir/Transforms/SROA.h
+++ mlir/include/mlir/Transforms/SROA.h
@@ -13,6 +13,7 @@
#include "mlir/Interfaces/MemorySlotInterfaces.h"
#include "mlir/Support/LogicalResult.h"
#include "llvm/ADT/Statistic.h"
+#include <variant>
namespace mlir {
Index: mlir/include/mlir/IR/AsmState.h
===================================================================
--- mlir/include/mlir/IR/AsmState.h
+++ mlir/include/mlir/IR/AsmState.h
@@ -20,6 +20,7 @@
#include "llvm/ADT/StringMap.h"
#include <memory>
+#include <variant>
namespace mlir {
class AsmResourcePrinter;
Index: llvm/unittests/ADT/DenseMapTest.cpp
===================================================================
--- llvm/unittests/ADT/DenseMapTest.cpp
+++ llvm/unittests/ADT/DenseMapTest.cpp
@@ -8,6 +8,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseMapInfo.h"
+#include "llvm/ADT/DenseMapInfoVariant.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <map>
Index: llvm/include/llvm/Transforms/Scalar/SROA.h
===================================================================
--- llvm/include/llvm/Transforms/Scalar/SROA.h
+++ llvm/include/llvm/Transforms/Scalar/SROA.h
@@ -21,6 +21,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/ValueHandle.h"
+#include <variant>
#include <vector>
namespace llvm {
Index: llvm/include/llvm/Object/DXContainer.h
===================================================================
--- llvm/include/llvm/Object/DXContainer.h
+++ llvm/include/llvm/Object/DXContainer.h
@@ -21,6 +21,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/TargetParser/Triple.h"
+#include <variant>
namespace llvm {
namespace object {
Index: llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
===================================================================
--- llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
+++ llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h
@@ -22,6 +22,7 @@
#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ThreadPool.h"
+#include <variant>
namespace llvm {
namespace orc {
Index: llvm/include/llvm/CodeGen/CallingConvLower.h
===================================================================
--- llvm/include/llvm/CodeGen/CallingConvLower.h
+++ llvm/include/llvm/CodeGen/CallingConvLower.h
@@ -19,6 +19,8 @@
#include "llvm/CodeGen/TargetCallingConv.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/Support/Alignment.h"
+#include <variant>
+#include <vector>
namespace llvm {
Index: llvm/include/llvm/ADT/DenseMapInfoVariant.h
===================================================================
--- /dev/null
+++ llvm/include/llvm/ADT/DenseMapInfoVariant.h
@@ -0,0 +1,71 @@
+//===- DenseMapInfoVariant.h - Type traits for DenseMap<variant> *- 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 defines DenseMapInfo traits for DenseMap<std::variant<Ts...>>.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ADT_DENSEMAPINFOVARIANT_H
+#define LLVM_ADT_DENSEMAPINFOVARIANT_H
+
+#include "llvm/ADT/DenseMapInfo.h"
+#include <utility>
+#include <variant>
+
+namespace llvm {
+
+// Provide DenseMapInfo for variants whose all alternatives have DenseMapInfo.
+template <typename... Ts> struct DenseMapInfo<std::variant<Ts...>> {
+ using Variant = std::variant<Ts...>;
+ using FirstT = std::variant_alternative_t<0, Variant>;
+
+ static inline Variant getEmptyKey() {
+ return Variant(std::in_place_index<0>, DenseMapInfo<FirstT>::getEmptyKey());
+ }
+
+ static inline Variant getTombstoneKey() {
+ return Variant(std::in_place_index<0>,
+ DenseMapInfo<FirstT>::getTombstoneKey());
+ }
+
+ static unsigned getHashValue(const Variant &Val) {
+ return std::visit(
+ [&Val](auto &&Alternative) {
+ using T = std::decay_t<decltype(Alternative)>;
+ // Include index in hash to make sure same value as different
+ // alternatives don't collide.
+ return DenseMapInfo<std::pair<size_t, T>>::getHashValuePiecewise(
+ Val.index(), Alternative);
+ },
+ Val);
+ }
+
+ static bool isEqual(const Variant &LHS, const Variant &RHS) {
+ if (LHS.index() != RHS.index())
+ return false;
+ if (LHS.valueless_by_exception())
+ return true;
+ // We want to dispatch to DenseMapInfo<T>::isEqual(LHS.get(I), RHS.get(I))
+ // We know the types are the same, but std::visit(V, LHS, RHS) doesn't.
+ // We erase the type held in LHS to void*, and dispatch over RHS.
+ const void *ErasedLHS =
+ std::visit([](const auto &LHS) -> const void * { return &LHS; }, LHS);
+ return std::visit(
+ [&](const auto &RHS) -> bool {
+ using T = std::remove_cv_t<std::remove_reference_t<decltype(RHS)>>;
+ return DenseMapInfo<T>::isEqual(*static_cast<const T *>(ErasedLHS),
+ RHS);
+ },
+ RHS);
+ }
+};
+
+} // end namespace llvm
+
+#endif // LLVM_ADT_DENSEMAPINFOVARIANT_H
Index: llvm/include/llvm/ADT/DenseMapInfo.h
===================================================================
--- llvm/include/llvm/ADT/DenseMapInfo.h
+++ llvm/include/llvm/ADT/DenseMapInfo.h
@@ -20,7 +20,6 @@
#include <tuple>
#include <type_traits>
#include <utility>
-#include <variant>
namespace llvm {
@@ -234,6 +233,14 @@
SecondInfo::getHashValue(PairVal.second));
}
+ // Expose an additional function intended to be used by other
+ // specializations of DenseMapInfo without needing to know how
+ // to combine hash values manually
+ static unsigned getHashValuePiecewise(const T &First, const U &Second) {
+ return detail::combineHashValue(FirstInfo::getHashValue(First),
+ SecondInfo::getHashValue(Second));
+ }
+
static bool isEqual(const Pair &LHS, const Pair &RHS) {
return FirstInfo::isEqual(LHS.first, RHS.first) &&
SecondInfo::isEqual(LHS.second, RHS.second);
@@ -290,52 +297,6 @@
}
};
-// Provide DenseMapInfo for variants whose all alternatives have DenseMapInfo.
-template <typename... Ts> struct DenseMapInfo<std::variant<Ts...>> {
- using Variant = std::variant<Ts...>;
- using FirstT = std::variant_alternative_t<0, Variant>;
-
- static inline Variant getEmptyKey() {
- return Variant(std::in_place_index<0>, DenseMapInfo<FirstT>::getEmptyKey());
- }
-
- static inline Variant getTombstoneKey() {
- return Variant(std::in_place_index<0>,
- DenseMapInfo<FirstT>::getTombstoneKey());
- }
-
- static unsigned getHashValue(const Variant &Val) {
- return std::visit(
- [&Val](auto &&Alternative) {
- using T = std::decay_t<decltype(Alternative)>;
- // Include index in hash to make sure same value as different
- // alternatives don't collide.
- return detail::combineHashValue(
- DenseMapInfo<size_t>::getHashValue(Val.index()),
- DenseMapInfo<T>::getHashValue(Alternative));
- },
- Val);
- }
-
- static bool isEqual(const Variant &LHS, const Variant &RHS) {
- if (LHS.index() != RHS.index())
- return false;
- if (LHS.valueless_by_exception())
- return true;
- // We want to dispatch to DenseMapInfo<T>::isEqual(LHS.get(I), RHS.get(I))
- // We know the types are the same, but std::visit(V, LHS, RHS) doesn't.
- // We erase the type held in LHS to void*, and dispatch over RHS.
- const void *ErasedLHS =
- std::visit([](const auto &LHS) -> const void * { return &LHS; }, LHS);
- return std::visit(
- [&](const auto &RHS) -> bool {
- using T = std::remove_cv_t<std::remove_reference_t<decltype(RHS)>>;
- return DenseMapInfo<T>::isEqual(*static_cast<const T *>(ErasedLHS),
- RHS);
- },
- RHS);
- }
-};
} // end namespace llvm
#endif // LLVM_ADT_DENSEMAPINFO_H
Index: flang/include/flang/Optimizer/HLFIR/HLFIROps.h
===================================================================
--- flang/include/flang/Optimizer/HLFIR/HLFIROps.h
+++ flang/include/flang/Optimizer/HLFIR/HLFIROps.h
@@ -19,6 +19,7 @@
#include "mlir/IR/PatternMatch.h"
#include "mlir/Interfaces/InferTypeOpInterface.h"
#include "mlir/Interfaces/SideEffectInterfaces.h"
+#include <variant>
#include "flang/Optimizer/HLFIR/HLFIROpInterfaces.h.inc"
#define GET_OP_CLASSES
Index: clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h
===================================================================
--- clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h
+++ clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h
@@ -26,10 +26,12 @@
#include "clang/Tooling/Inclusions/StandardLibrary.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/DenseMapInfoVariant.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include <memory>
#include <utility>
+#include <variant>
#include <vector>
namespace llvm {
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits