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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits