[llvm-branch-commits] [clang] [llvm] [RISCV] Add subtarget features for profiles (PR #84877)
@@ -65,10 +65,27 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo { VentanaVeyron, }; // clang-format on + + enum RISCVProfileEnum : uint8_t { +Unspecified, +RVI20U32, +RVI20U64, +RVA20U64, +RVA20S64, +RVA22U64, +RVA22S64, +RVA23U64, +RVA23S64, +RVB23U64, +RVB23S64, +RVM23U32, + }; + private: virtual void anchor(); RISCVProcFamilyEnum RISCVProcFamily = Others; + RISCVProfileEnum RISCVProfile = Unspecified; kito-cheng wrote: Same https://github.com/llvm/llvm-project/pull/84877 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang] [llvm] [RISCV] Add subtarget features for profiles (PR #84877)
@@ -65,10 +65,27 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo { VentanaVeyron, }; // clang-format on + + enum RISCVProfileEnum : uint8_t { kito-cheng wrote: This can remove https://github.com/llvm/llvm-project/pull/84877 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang] [llvm] [RISCV] Add subtarget features for profiles (PR #84877)
@@ -138,6 +155,8 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo { /// initializeProperties(). RISCVProcFamilyEnum getProcFamily() const { return RISCVProcFamily; } + RISCVProfileEnum getRISCVProfile() const { return RISCVProfile; } + kito-cheng wrote: Yeah, I incline to remove that for now since no user yet :) https://github.com/llvm/llvm-project/pull/84877 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [compiler-rt] release/18.x: [RISCV] Support rv{32, 64}e in the compiler builtins (#88252) (PR #88525)
https://github.com/kito-cheng approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/88525 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang] 5b6216d - [RISCV] Lazily add RVV C intrinsics.
Author: Kito Cheng Date: 2022-05-11T17:56:59+08:00 New Revision: 5b6216d6aa45c91bd348393eba8952f34735b736 URL: https://github.com/llvm/llvm-project/commit/5b6216d6aa45c91bd348393eba8952f34735b736 DIFF: https://github.com/llvm/llvm-project/commit/5b6216d6aa45c91bd348393eba8952f34735b736.diff LOG: [RISCV] Lazily add RVV C intrinsics. Leverage the method OpenCL uses that adds C intrinsics when the lookup failed. There is no need to define C intrinsics in the header file any more. It could help to avoid the large header file to speed up the compilation of RVV source code. Besides that, only the C intrinsics used by the users will be added into the declaration table. This patch is based on https://reviews.llvm.org/D103228 and inspired by OpenCL implementation. ### Experimental Results TL;DR: - Binary size of clang increase ~200k, which is +0.07% for debug build and +0.13% for release build. - Single file compilation speed up ~33x for debug build and ~8.5x for release build - Regression time reduce ~10% (`ninja check-all`, enable all targets) Header size change ``` | size | LoC | -- Before | 4,434,725 | 69,749 | After | 6,140 | 162 | ``` Single File Compilation Time Testcase: ``` #include vint32m1_t test_vadd_vv_vfloat32m1_t(vint32m1_t op1, vint32m1_t op2, size_t vl) { return vadd(op1, op2, vl); } ``` # Debug build: Before: ``` real0m19.352s user0m19.252s sys 0m0.092s ``` After: ``` real0m0.576s user0m0.552s sys 0m0.024s ``` ~33x speed up for debug build # Release build: Before: ``` real0m0.773s user0m0.741s sys 0m0.032s ``` After: ``` real0m0.092s user0m0.080s sys 0m0.012s ``` ~8.5x speed up for release build Regression time Note: the failed case is `tools/llvm-debuginfod-find/debuginfod.test` which is unrelated to this patch. # Debug build Before: ``` Testing Time: 1358.38s Skipped :11 Unsupported : 446 Passed : 75767 Expectedly Failed: 190 Failed : 1 ``` After ``` Testing Time: 1220.29s Skipped :11 Unsupported : 446 Passed : 75767 Expectedly Failed: 190 Failed : 1 ``` # Release build Before: ``` Testing Time: 381.98s Skipped :12 Unsupported : 1407 Passed : 74765 Expectedly Failed: 176 Failed : 1 ``` After: ``` Testing Time: 346.25s Skipped :12 Unsupported : 1407 Passed : 74765 Expectedly Failed: 176 Failed : 1 ``` Binary size of clang # Debug build Before ``` textdata bss dec hex filename 335261851 12726004 552812 348540667 14c64efb bin/clang ``` After ``` textdata bss dec hex filename 335442803 12798708 552940 348794451 14ca2e53 bin/clang ``` +253K, +0.07% code size # Release build Before ``` textdata bss dec hex filename 144123975 8374648 483140 152981763 91e5103 bin/clang ``` After ``` textdata bss dec hex filename 144255762 8447296 483268 153186326 9217016 bin/clang ``` +204K, +0.13% Authored-by: Kito Cheng Co-Authored-by: Hsiangkai Wang Differential Revision: https://reviews.llvm.org/D111617 Added: clang/lib/Sema/SemaRVVLookup.cpp Modified: clang/include/clang/Basic/CMakeLists.txt clang/include/clang/Basic/TokenKinds.def clang/include/clang/Parse/Parser.h clang/include/clang/Sema/Sema.h clang/include/clang/Support/RISCVVIntrinsicUtils.h clang/lib/Parse/ParsePragma.cpp clang/lib/Sema/CMakeLists.txt clang/lib/Sema/SemaLookup.cpp clang/lib/Support/RISCVVIntrinsicUtils.cpp clang/utils/TableGen/RISCVVEmitter.cpp clang/utils/TableGen/TableGen.cpp clang/utils/TableGen/TableGenBackends.h Removed: diff --git a/clang/include/clang/Basic/CMakeLists.txt b/clang/include/clang/Basic/CMakeLists.txt index 8cd891385a483..b930842ae8cfd 100644 --- a/clang/include/clang/Basic/CMakeLists.txt +++ b/clang/include/clang/Basic/CMakeLists.txt @@ -90,3 +90,6 @@ clang_tablegen(riscv_vector_builtins.inc -gen-riscv-vector-builtins clang_tablegen(riscv_vector_builtin_cg.inc -gen-riscv-vector-builtin-codegen SOURCE riscv_vector.td TARGET ClangRISCVVectorBuiltinCG) +clang_tablegen(riscv_vector_builtin_sema.inc -gen-riscv-vector-builtin-sema + SOURCE riscv_vector.td + TARGET ClangRISCVVectorBuiltinSema) diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index 7b65a15378050..fc159ab3114d0 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -908,6 +908,9 @@ PRAGMA_ANNOTATION(pragma_fp) // Annotation for the attribute pragma
[llvm-branch-commits] [clang] 08dbbaf - [RISCV][NFC] Refactor RISC-V vector intrinsic utils.
Author: Kito Cheng Date: 2022-05-11T17:56:59+08:00 New Revision: 08dbbaf68d88a57e977d0674bddd0142e5d1e0b9 URL: https://github.com/llvm/llvm-project/commit/08dbbaf68d88a57e977d0674bddd0142e5d1e0b9 DIFF: https://github.com/llvm/llvm-project/commit/08dbbaf68d88a57e977d0674bddd0142e5d1e0b9.diff LOG: [RISCV][NFC] Refactor RISC-V vector intrinsic utils. This patch is preparation for D111617, use class/struct/enum rather than char/StringRef to present internal information as possible, that provide more compact way to store those info and also easier to serialize/deserialize. And also that improve readability of the code, e.g. "v" vs TypeProfile::Vector. Differential Revision: https://reviews.llvm.org/D124730 Added: Modified: clang/include/clang/Support/RISCVVIntrinsicUtils.h clang/lib/Support/RISCVVIntrinsicUtils.cpp clang/utils/TableGen/RISCVVEmitter.cpp Removed: diff --git a/clang/include/clang/Support/RISCVVIntrinsicUtils.h b/clang/include/clang/Support/RISCVVIntrinsicUtils.h index 1a4947d0c3df3..ddd46fe1727c9 100644 --- a/clang/include/clang/Support/RISCVVIntrinsicUtils.h +++ b/clang/include/clang/Support/RISCVVIntrinsicUtils.h @@ -9,7 +9,10 @@ #ifndef CLANG_SUPPORT_RISCVVINTRINSICUTILS_H #define CLANG_SUPPORT_RISCVVINTRINSICUTILS_H +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/Optional.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include #include @@ -18,9 +21,128 @@ namespace clang { namespace RISCV { -using BasicType = char; using VScaleVal = llvm::Optional; +// Modifier for vector type. +enum class VectorTypeModifier : uint8_t { + NoModifier, + Log2EEW3, + Log2EEW4, + Log2EEW5, + Log2EEW6, + FixedSEW8, + FixedSEW16, + FixedSEW32, + FixedSEW64, + LFixedLog2LMULN3, + LFixedLog2LMULN2, + LFixedLog2LMULN1, + LFixedLog2LMUL0, + LFixedLog2LMUL1, + LFixedLog2LMUL2, + LFixedLog2LMUL3, + SFixedLog2LMULN3, + SFixedLog2LMULN2, + SFixedLog2LMULN1, + SFixedLog2LMUL0, + SFixedLog2LMUL1, + SFixedLog2LMUL2, + SFixedLog2LMUL3, +}; + +// Similar to basic type but used to describe what's kind of type related to +// basic vector type, used to compute type info of arguments. +enum class PrimitiveType : uint8_t { + Invalid, + Scalar, + Vector, + Widening2XVector, + Widening4XVector, + Widening8XVector, + MaskVector, + Void, + SizeT, + Ptr diff , + UnsignedLong, + SignedLong, +}; + +// Modifier for type, used for both scalar and vector types. +enum class TypeModifier : uint8_t { + NoModifier = 0, + Pointer = 1 << 0, + Const = 1 << 1, + Immediate = 1 << 2, + UnsignedInteger = 1 << 3, + SignedInteger = 1 << 4, + Float = 1 << 5, + LMUL1 = 1 << 6, + MaxOffset = 6, + LLVM_MARK_AS_BITMASK_ENUM(LMUL1), +}; + +// TypeProfile is used to compute type info of arguments or return value. +struct TypeProfile { + constexpr TypeProfile() = default; + constexpr TypeProfile(PrimitiveType PT) : PT(static_cast(PT)) {} + constexpr TypeProfile(PrimitiveType PT, TypeModifier TM) + : PT(static_cast(PT)), TM(static_cast(TM)) {} + constexpr TypeProfile(uint8_t PT, uint8_t VTM, uint8_t TM) + : PT(PT), VTM(VTM), TM(TM) {} + + uint8_t PT = static_cast(PrimitiveType::Invalid); + uint8_t VTM = static_cast(VectorTypeModifier::NoModifier); + uint8_t TM = static_cast(TypeModifier::NoModifier); + + std::string IndexStr() const { +return std::to_string(PT) + "_" + std::to_string(VTM) + "_" + + std::to_string(TM); + }; + + bool operator!=(const TypeProfile ) const { +return TP.PT != PT || TP.VTM != VTM || TP.TM != TM; + } + bool operator>(const TypeProfile ) const { +return !(TP.PT <= PT && TP.VTM <= VTM && TP.TM <= TM); + } + + static const TypeProfile Mask; + static const TypeProfile Vector; + static const TypeProfile VL; + static llvm::Optional + parseTypeProfile(llvm::StringRef PrototypeStr); +}; + +llvm::SmallVector parsePrototypes(llvm::StringRef Prototypes); + +// Basic type of vector type. +enum class BasicType : uint8_t { + Unknown = 0, + Int8 = 1 << 0, + Int16 = 1 << 1, + Int32 = 1 << 2, + Int64 = 1 << 3, + Float16 = 1 << 4, + Float32 = 1 << 5, + Float64 = 1 << 6, + MaxOffset = 6, + LLVM_MARK_AS_BITMASK_ENUM(Float64), +}; + +// Type of vector type. +enum ScalarTypeKind : uint8_t { + Void, + Size_t, + Ptr diff _t, + UnsignedLong, + SignedLong, + Boolean, + SignedInteger, + UnsignedInteger, + Float, + Invalid, +}; + // Exponential LMUL struct LMULType { int Log2LMUL; @@ -32,20 +154,12 @@ struct LMULType { LMULType *=(uint32_t RHS); }; +class RVVType; +using RVVTypePtr = RVVType *; +using RVVTypes = std::vector; + // This class is compact representation of a valid and invalid RVVType. class RVVType { - enum ScalarTypeKind : uint32_t { -Void, -Size_t, -Ptr diff _t, -UnsignedLong, -SignedLong, -Boolean, -