Skip to content

Commit e0092ea

Browse files
authored
[RISCV][clang] Optimize memory usage of intrinsic lookup table (#77487)
This patch optimize: 1. Reduce string size of RVVIntrinsicDef. 2. Reduce the type size of the index of intrinsics. I use valgrind --tool=massif to analyze a simple program: ``` #include <riscv_vector.h> vint32m1_t test(vint32m1_t v1, vint32m1_t v2, size_t vl) { return __riscv_vadd(v1, v2, vl); } ``` and before optimization, the peak memory usage is 15.68MB, after optimization, the peak memory usage is 13.69MB.
1 parent fb94c64 commit e0092ea

File tree

3 files changed

+10
-12
lines changed

3 files changed

+10
-12
lines changed

clang/include/clang/Support/RISCVVIntrinsicUtils.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,6 @@ class RVVIntrinsic {
416416
RVVTypePtr getOutputType() const { return OutputType; }
417417
const RVVTypes &getInputTypes() const { return InputTypes; }
418418
llvm::StringRef getBuiltinName() const { return BuiltinName; }
419-
llvm::StringRef getName() const { return Name; }
420-
llvm::StringRef getOverloadedName() const { return OverloadedName; }
421419
bool hasMaskedOffOperand() const { return HasMaskedOffOperand; }
422420
bool hasVL() const { return HasVL; }
423421
bool hasPolicy() const { return Scheme != PolicyScheme::SchemeNone; }

clang/lib/Sema/SemaRISCVVectorLookup.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct RVVIntrinsicDef {
4343

4444
struct RVVOverloadIntrinsicDef {
4545
// Indexes of RISCVIntrinsicManagerImpl::IntrinsicList.
46-
SmallVector<uint32_t, 8> Indexes;
46+
SmallVector<uint16_t, 8> Indexes;
4747
};
4848

4949
} // namespace
@@ -162,7 +162,7 @@ class RISCVIntrinsicManagerImpl : public sema::RISCVIntrinsicManager {
162162
// List of all RVV intrinsic.
163163
std::vector<RVVIntrinsicDef> IntrinsicList;
164164
// Mapping function name to index of IntrinsicList.
165-
StringMap<uint32_t> Intrinsics;
165+
StringMap<uint16_t> Intrinsics;
166166
// Mapping function name to RVVOverloadIntrinsicDef.
167167
StringMap<RVVOverloadIntrinsicDef> OverloadIntrinsics;
168168

@@ -379,14 +379,16 @@ void RISCVIntrinsicManagerImpl::InitRVVIntrinsic(
379379
OverloadedName += "_" + OverloadedSuffixStr.str();
380380

381381
// clang built-in function name, e.g. __builtin_rvv_vadd.
382-
std::string BuiltinName = "__builtin_rvv_" + std::string(Record.Name);
382+
std::string BuiltinName = std::string(Record.Name);
383383

384384
RVVIntrinsic::updateNamesAndPolicy(IsMasked, HasPolicy, Name, BuiltinName,
385385
OverloadedName, PolicyAttrs,
386386
Record.HasFRMRoundModeOp);
387387

388388
// Put into IntrinsicList.
389-
uint32_t Index = IntrinsicList.size();
389+
uint16_t Index = IntrinsicList.size();
390+
assert(IntrinsicList.size() == (size_t)Index &&
391+
"Intrinsics indices overflow.");
390392
IntrinsicList.push_back({BuiltinName, Signature});
391393

392394
// Creating mapping to Intrinsics.
@@ -451,7 +453,8 @@ void RISCVIntrinsicManagerImpl::CreateRVVIntrinsicDecl(LookupResult &LR,
451453
RVVIntrinsicDecl->addAttr(OverloadableAttr::CreateImplicit(Context));
452454

453455
// Setup alias to __builtin_rvv_*
454-
IdentifierInfo &IntrinsicII = PP.getIdentifierTable().get(IDef.BuiltinName);
456+
IdentifierInfo &IntrinsicII =
457+
PP.getIdentifierTable().get("__builtin_rvv_" + IDef.BuiltinName);
455458
RVVIntrinsicDecl->addAttr(
456459
BuiltinAliasAttr::CreateImplicit(S.Context, &IntrinsicII));
457460

@@ -463,6 +466,8 @@ bool RISCVIntrinsicManagerImpl::CreateIntrinsicIfFound(LookupResult &LR,
463466
IdentifierInfo *II,
464467
Preprocessor &PP) {
465468
StringRef Name = II->getName();
469+
if (!Name.consume_front("__riscv_"))
470+
return false;
466471

467472
// Lookup the function name from the overload intrinsics first.
468473
auto OvIItr = OverloadIntrinsics.find(Name);

clang/lib/Support/RISCVVIntrinsicUtils.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,11 +1150,6 @@ void RVVIntrinsic::updateNamesAndPolicy(
11501150
OverloadedName += suffix;
11511151
};
11521152

1153-
// This follows the naming guideline under riscv-c-api-doc to add the
1154-
// `__riscv_` suffix for all RVV intrinsics.
1155-
Name = "__riscv_" + Name;
1156-
OverloadedName = "__riscv_" + OverloadedName;
1157-
11581153
if (HasFRMRoundModeOp) {
11591154
Name += "_rm";
11601155
BuiltinName += "_rm";

0 commit comments

Comments
 (0)