https://github.com/kito-cheng created https://github.com/llvm/llvm-project/pull/156397
For each intrinsic with ManualCodegen block will generate something like below: ```cpp SegInstSEW = 0; ... if (SegInstSEW == (unsigned)-1) { auto PointeeType = E->getArg(4294967295)->getType()->getPointeeType(); SegInstSEW = llvm::Log2_64(getContext().getTypeSize(PointeeType)); } ``` But actually SegInstSEW is table-gen-time constant, so can remove that if-check and directly use the constant. This change reduce riscv_vector_builtin_cg.inc around 6600 lines (30913 to 24305) which is around 20% reduction, however seems this isn't impact the build time much since the redundant dead branch is almost will optimized away by compiler in early stage. >From da7fae506e086f775ca5411e00f7f436f60d5d5f Mon Sep 17 00:00:00 2001 From: Kito Cheng <kito.ch...@sifive.com> Date: Thu, 28 Aug 2025 18:07:01 +0800 Subject: [PATCH] [RISCV] Simplify code gen for riscv_vector_builtin_cg.inc [NFC] For each intrinsic with ManualCodegen block will generate something like below: ```cpp SegInstSEW = 0; ... if (SegInstSEW == (unsigned)-1) { auto PointeeType = E->getArg(4294967295)->getType()->getPointeeType(); SegInstSEW = llvm::Log2_64(getContext().getTypeSize(PointeeType)); } ``` But actually SegInstSEW is table-gen-time constant, so can remove that if-check and directly use the constant. This change reduce riscv_vector_builtin_cg.inc around 6600 lines (30913 to 24305) which is around 20% reduction, however seems this isn't impact the build time much since the redundant dead branch is almost will optimized away by compiler in early stage. --- clang/utils/TableGen/RISCVVEmitter.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/clang/utils/TableGen/RISCVVEmitter.cpp b/clang/utils/TableGen/RISCVVEmitter.cpp index 17f0c8280bdef..f73b0aecc3b6d 100644 --- a/clang/utils/TableGen/RISCVVEmitter.cpp +++ b/clang/utils/TableGen/RISCVVEmitter.cpp @@ -166,6 +166,8 @@ static VectorTypeModifier getTupleVTM(unsigned NF) { static_cast<uint8_t>(VectorTypeModifier::Tuple2) + (NF - 2)); } +static const unsigned UnknownIndex = (unsigned)-1; + static unsigned getIndexedLoadStorePtrIdx(const RVVIntrinsic *RVVI) { // We need a special rule for segment load/store since the data width is not // encoded in the intrinsic name itself. @@ -183,7 +185,7 @@ static unsigned getIndexedLoadStorePtrIdx(const RVVIntrinsic *RVVI) { if (IRName.starts_with("vsoxseg") || IRName.starts_with("vsuxseg")) return RVVI->isMasked() ? 1 : 0; - return (unsigned)-1; + return UnknownIndex; } // This function is used to get the log2SEW of each segment load/store, this @@ -249,19 +251,21 @@ void emitCodeGenSwitchBody(const RVVIntrinsic *RVVI, raw_ostream &OS) { OS << " ID = Intrinsic::riscv_" + RVVI->getIRName() + ";\n"; OS << " PolicyAttrs = " << RVVI->getPolicyAttrsBits() << ";\n"; - OS << " SegInstSEW = " << getSegInstLog2SEW(RVVI->getOverloadedName()) - << ";\n"; + unsigned IndexedLoadStorePtrIdx = getIndexedLoadStorePtrIdx(RVVI); + if (IndexedLoadStorePtrIdx != UnknownIndex) { + OS << " {\n"; + OS << " auto PointeeType = E->getArg(" << IndexedLoadStorePtrIdx + << ")->getType()->getPointeeType();\n"; + OS << " SegInstSEW = " + "llvm::Log2_64(getContext().getTypeSize(PointeeType));\n"; + OS << " }\n"; + } else { + OS << " SegInstSEW = " << getSegInstLog2SEW(RVVI->getOverloadedName()) + << ";\n"; + } if (RVVI->hasManualCodegen()) { OS << "IsMasked = " << (RVVI->isMasked() ? "true" : "false") << ";\n"; - - // Skip the non-indexed load/store and compatible header load/store. - OS << "if (SegInstSEW == (unsigned)-1) {\n"; - OS << " auto PointeeType = E->getArg(" << getIndexedLoadStorePtrIdx(RVVI) - << " )->getType()->getPointeeType();\n"; - OS << " SegInstSEW = " - " llvm::Log2_64(getContext().getTypeSize(PointeeType));\n}\n"; - OS << RVVI->getManualCodegen(); OS << "break;\n"; return; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits