[llvm] 4ffc3c3 - [CostModel] Templatize EntryCost::Cost to allow custom cost metrics

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 20 07:37:12 PDT 2021


Author: Simon Pilgrim
Date: 2021-07-20T15:31:39+01:00
New Revision: 4ffc3c3726e9fd2fd1be80983d7f0fbbf5a7572c

URL: https://github.com/llvm/llvm-project/commit/4ffc3c3726e9fd2fd1be80983d7f0fbbf5a7572c
DIFF: https://github.com/llvm/llvm-project/commit/4ffc3c3726e9fd2fd1be80983d7f0fbbf5a7572c.diff

LOG: [CostModel] Templatize EntryCost::Cost to allow custom cost metrics

We currently use an unsigned value for our CostTblEntry and TypeConversionCostTblEntry cost tables which is limiting depending on how the target wishes to handle various CostKinds etc.

For instance, targets might wish to store separate instruction count, latency or throughput values etc. On D46276 we have been investigating storing a code snippet to improve latency/throughput cost calculations.

There is a slight problem in that template argument deduction was struggling to match the now templatized Costs[] tables in a ArrayRef constructor - I've added helper wrappers for CostTableLookup/ConvertCostTableLookup which avoids us having to update all existing calls with a template hint.

Differential Revision: https://reviews.llvm.org/D106351

Added: 
    

Modified: 
    llvm/include/llvm/CodeGen/CostTable.h

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/CodeGen/CostTable.h b/llvm/include/llvm/CodeGen/CostTable.h
index 52f3bfaea180b..fc4648c252242 100644
--- a/llvm/include/llvm/CodeGen/CostTable.h
+++ b/llvm/include/llvm/CodeGen/CostTable.h
@@ -21,16 +21,19 @@
 namespace llvm {
 
 /// Cost Table Entry
-struct CostTblEntry {
+template <typename CostType>
+struct CostTblEntryT {
   int ISD;
   MVT::SimpleValueType Type;
-  unsigned Cost;
+  CostType Cost;
 };
+using CostTblEntry = CostTblEntryT<unsigned>;
 
-/// Find in cost table, TypeTy must be comparable to CompareTy by ==
-inline const CostTblEntry *CostTableLookup(ArrayRef<CostTblEntry> Tbl,
-                                           int ISD, MVT Ty) {
-  auto I = find_if(Tbl, [=](const CostTblEntry &Entry) {
+/// Find in cost table.
+template <class CostType>
+inline const CostTblEntryT<CostType> *
+CostTableLookup(ArrayRef<CostTblEntryT<CostType>> Tbl, int ISD, MVT Ty) {
+  auto I = find_if(Tbl, [=](const CostTblEntryT<CostType> &Entry) {
     return ISD == Entry.ISD && Ty == Entry.Type;
   });
   if (I != Tbl.end())
@@ -40,22 +43,32 @@ inline const CostTblEntry *CostTableLookup(ArrayRef<CostTblEntry> Tbl,
   return nullptr;
 }
 
+template <size_t N, class CostType>
+inline const CostTblEntryT<CostType> *
+CostTableLookup(const CostTblEntryT<CostType> (&Table)[N], int ISD, MVT Ty) {
+  // Wrapper to fix template argument deduction failures.
+  return CostTableLookup<CostType>(makeArrayRef(Table), ISD, Ty);
+}
+
 /// Type Conversion Cost Table
-struct TypeConversionCostTblEntry {
+template <typename CostType>
+struct TypeConversionCostTblEntryT {
   int ISD;
   MVT::SimpleValueType Dst;
   MVT::SimpleValueType Src;
-  unsigned Cost;
+  CostType Cost;
 };
+using TypeConversionCostTblEntry = TypeConversionCostTblEntryT<unsigned>;
 
-/// Find in type conversion cost table, TypeTy must be comparable to CompareTy
-/// by ==
-inline const TypeConversionCostTblEntry *
-ConvertCostTableLookup(ArrayRef<TypeConversionCostTblEntry> Tbl,
+/// Find in type conversion cost table.
+template <class CostType>
+inline const TypeConversionCostTblEntryT<CostType> *
+ConvertCostTableLookup(ArrayRef<TypeConversionCostTblEntryT<CostType>> Tbl,
                        int ISD, MVT Dst, MVT Src) {
-  auto I = find_if(Tbl, [=](const TypeConversionCostTblEntry &Entry) {
-    return ISD == Entry.ISD && Src == Entry.Src && Dst == Entry.Dst;
-  });
+  auto I =
+      find_if(Tbl, [=](const TypeConversionCostTblEntryT<CostType> &Entry) {
+        return ISD == Entry.ISD && Src == Entry.Src && Dst == Entry.Dst;
+      });
   if (I != Tbl.end())
     return I;
 
@@ -63,6 +76,14 @@ ConvertCostTableLookup(ArrayRef<TypeConversionCostTblEntry> Tbl,
   return nullptr;
 }
 
+template <size_t N, class CostType>
+inline const TypeConversionCostTblEntryT<CostType> *
+ConvertCostTableLookup(const TypeConversionCostTblEntryT<CostType> (&Table)[N],
+                       int ISD, MVT Dst, MVT Src) {
+  // Wrapper to fix template argument deduction failures.
+  return ConvertCostTableLookup<CostType>(makeArrayRef(Table), ISD, Dst, Src);
+}
+
 } // namespace llvm
 
 #endif /* LLVM_CODEGEN_COSTTABLE_H_ */


        


More information about the llvm-commits mailing list