From f0c519d2c1b0a1c73994cdb3aabfa33a4a412801 Mon Sep 17 00:00:00 2001 From: Rahul Joshi Date: Tue, 3 Feb 2026 10:56:00 -0800 Subject: [PATCH] [NFC][TableGen] Adopt CodeGenHelpers in IntrinsicEmitter (#179310) - Adopt IfDefEmitter in IntrinsicEmitter. - Remove #undef for various flags in Intrinsics.cpp/Intrinsics.h as the TableGen generated code does that now. --- llvm/include/llvm/IR/Intrinsics.h | 2 - llvm/lib/IR/Intrinsics.cpp | 10 --- llvm/test/TableGen/intrinsic-arginfo.td | 19 +++-- .../utils/TableGen/Basic/IntrinsicEmitter.cpp | 83 +++++++------------ 4 files changed, 40 insertions(+), 74 deletions(-) diff --git a/llvm/include/llvm/IR/Intrinsics.h b/llvm/include/llvm/IR/Intrinsics.h index 2c86a43e114e..5aecec9fd592 100644 --- a/llvm/include/llvm/IR/Intrinsics.h +++ b/llvm/include/llvm/IR/Intrinsics.h @@ -50,7 +50,6 @@ namespace Intrinsic { // Get the intrinsic enums generated from Intrinsics.td #define GET_INTRINSIC_ENUM_VALUES #include "llvm/IR/IntrinsicEnums.inc" -#undef GET_INTRINSIC_ENUM_VALUES }; /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx". @@ -196,7 +195,6 @@ namespace Intrinsic { enum ArgKind { #define GET_INTRINSIC_ARGKIND #include "llvm/IR/IntrinsicEnums.inc" -#undef GET_INTRINSIC_ARGKIND }; unsigned getArgumentNumber() const { diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp index a2189e70abbb..186bd1edb8c5 100644 --- a/llvm/lib/IR/Intrinsics.cpp +++ b/llvm/lib/IR/Intrinsics.cpp @@ -40,7 +40,6 @@ using namespace llvm; /// Table of string intrinsic names indexed by enum value. #define GET_INTRINSIC_NAME_TABLE #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_NAME_TABLE StringRef Intrinsic::getBaseName(ID id) { assert(id < num_intrinsics && "Invalid intrinsic ID!"); @@ -196,7 +195,6 @@ std::string Intrinsic::getNameNoUnnamedTypes(ID Id, ArrayRef Tys) { enum IIT_Info { #define GET_INTRINSIC_IITINFO #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_IITINFO }; static void @@ -434,7 +432,6 @@ DecodeIITType(unsigned &NextElt, ArrayRef Infos, #define GET_INTRINSIC_GENERATOR_GLOBAL #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_GENERATOR_GLOBAL void Intrinsic::getIntrinsicInfoTableEntries( ID id, SmallVectorImpl &T) { @@ -609,19 +606,16 @@ FunctionType *Intrinsic::getType(LLVMContext &Context, ID id, bool Intrinsic::isOverloaded(ID id) { #define GET_INTRINSIC_OVERLOAD_TABLE #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_OVERLOAD_TABLE } bool Intrinsic::hasPrettyPrintedArgs(ID id){ #define GET_INTRINSIC_PRETTY_PRINT_TABLE #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_PRETTY_PRINT_TABLE } /// Table of per-target intrinsic name tables. #define GET_INTRINSIC_TARGET_DATA #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_TARGET_DATA bool Intrinsic::isTargetIntrinsic(Intrinsic::ID IID) { return IID > TargetInfos[0].Count; @@ -735,7 +729,6 @@ Intrinsic::ID Intrinsic::lookupIntrinsicID(StringRef Name) { /// This defines the "Intrinsic::getAttributes(ID id)" method. #define GET_INTRINSIC_ATTRIBUTES #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_ATTRIBUTES static Function *getOrInsertIntrinsicDeclarationImpl(Module *M, Intrinsic::ID id, @@ -812,12 +805,10 @@ Function *Intrinsic::getDeclarationIfExists(Module *M, ID id, // This defines the "Intrinsic::getIntrinsicForClangBuiltin()" method. #define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN // This defines the "Intrinsic::getIntrinsicForMSBuiltin()" method. #define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN bool Intrinsic::isConstrainedFPIntrinsic(ID QID) { switch (QID) { @@ -1204,4 +1195,3 @@ Intrinsic::ID Intrinsic::getDeinterleaveIntrinsicID(unsigned Factor) { #define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS #include "llvm/IR/IntrinsicImpl.inc" -#undef GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS diff --git a/llvm/test/TableGen/intrinsic-arginfo.td b/llvm/test/TableGen/intrinsic-arginfo.td index eab1f5e032bc..795fec0145e9 100644 --- a/llvm/test/TableGen/intrinsic-arginfo.td +++ b/llvm/test/TableGen/intrinsic-arginfo.td @@ -30,15 +30,16 @@ def int_my_fadd_f32 : DefaultAttrsIntrinsic< ArgInfo, [ArgName<"rounding_mode">, ImmArgPrinter<"printRoundingMode">]>, ArgInfo, [ArgName<"saturation_mode">]>]>; -// CHECK: #ifdef GET_INTRINSIC_PRETTY_PRINT_TABLE -// CHECK-NEXT: static constexpr uint8_t PPTable[] = { +// CHECK: #ifdef GET_INTRINSIC_PRETTY_PRINT_TABLE +// CHECK-NEXT: #undef GET_INTRINSIC_PRETTY_PRINT_TABLE +// CHECK: static constexpr uint8_t PPTable[] = { +// CHECK: #endif // GET_INTRINSIC_PRETTY_PRINT_TABLE -// CHECK: #endif // GET_INTRINSIC_PRETTY_PRINT_TABLE +// CHECK: #ifdef GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS +// CHECK-NEXT: #undef GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS +// CHECK: void Intrinsic::printImmArg(ID IID, unsigned ArgIdx, raw_ostream &OS, const Constant *ImmArgVal) { -// CHECK: #ifdef GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS -// CHECK: void Intrinsic::printImmArg(ID IID, unsigned ArgIdx, raw_ostream &OS, const Constant *ImmArgVal) { - -// CHECK: case dummy_foo_bar: +// CHECK: case dummy_foo_bar: // CHECK-NEXT: switch (ArgIdx) { // CHECK-NEXT: case 1: @@ -53,7 +54,7 @@ def int_my_fadd_f32 : DefaultAttrsIntrinsic< // CHECK-NEXT: } // CHECK-NEXT: break; -// CHECK: case my_fadd_f32: +// CHECK: case my_fadd_f32: // CHECK-NEXT: switch (ArgIdx) { // CHECK-NEXT: case 2: @@ -68,4 +69,4 @@ def int_my_fadd_f32 : DefaultAttrsIntrinsic< // CHECK-NEXT: } // CHECK-NEXT: break; -// CHECK: #endif // GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS +// CHECK: #endif // GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS diff --git a/llvm/utils/TableGen/Basic/IntrinsicEmitter.cpp b/llvm/utils/TableGen/Basic/IntrinsicEmitter.cpp index 051bfa05b52a..b8723aff9ebf 100644 --- a/llvm/utils/TableGen/Basic/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/Basic/IntrinsicEmitter.cpp @@ -22,6 +22,7 @@ #include "llvm/Support/ModRef.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/TableGen/CodeGenHelpers.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" #include "llvm/TableGen/StringToOffsetTable.h" @@ -157,13 +158,17 @@ void IntrinsicEmitter::EmitEnumInfo(const CodeGenIntrinsicTable &Ints, } // Generate a complete header for target specific intrinsics. + std::optional IfDef; + std::optional IncGuard; + std::optional NS; + if (IntrinsicPrefix.empty()) { - OS << "#ifdef GET_INTRINSIC_ENUM_VALUES\n"; + IfDef.emplace(OS, "GET_INTRINSIC_ENUM_VALUES"); } else { std::string UpperPrefix = StringRef(IntrinsicPrefix).upper(); - OS << formatv("#ifndef LLVM_IR_INTRINSIC_{}_ENUMS_H\n", UpperPrefix); - OS << formatv("#define LLVM_IR_INTRINSIC_{}_ENUMS_H\n", UpperPrefix); - OS << "namespace llvm::Intrinsic {\n"; + IncGuard.emplace( + OS, formatv("LLVM_IR_INTRINSIC_{}_ENUMS_H", UpperPrefix).str()); + NS.emplace(OS, "llvm::Intrinsic"); OS << formatv("enum {}Intrinsics : unsigned {{\n", UpperPrefix); } @@ -188,34 +193,27 @@ void IntrinsicEmitter::EmitEnumInfo(const CodeGenIntrinsicTable &Ints, } // Emit num_intrinsics into the target neutral enum. - if (IntrinsicPrefix.empty()) { + if (IntrinsicPrefix.empty()) OS << formatv(" num_intrinsics = {}\n", Ints.size() + 1); - OS << "#endif\n\n"; - } else { - OS << R"(}; // enum -} // namespace llvm::Intrinsic -#endif - -)"; - } + else + OS << "}; // enum\n"; } void IntrinsicEmitter::EmitArgKind(raw_ostream &OS) { if (!IntrinsicPrefix.empty()) return; + IfDefEmitter IfDef(OS, "GET_INTRINSIC_ARGKIND"); OS << "// llvm::Intrinsic::IITDescriptor::ArgKind.\n"; - OS << "#ifdef GET_INTRINSIC_ARGKIND\n"; if (const auto RecArgKind = Records.getDef("ArgKind")) { for (const auto &RV : RecArgKind->getValues()) OS << " AK_" << RV.getName() << " = " << *RV.getValue() << ",\n"; } else { OS << "#error \"ArgKind is not defined\"\n"; } - OS << "#endif\n\n"; } void IntrinsicEmitter::EmitIITInfo(raw_ostream &OS) { - OS << "#ifdef GET_INTRINSIC_IITINFO\n"; + IfDefEmitter IfDef(OS, "GET_INTRINSIC_IITINFO"); std::array RecsByNumber; auto IIT_Base = Records.getAllDerivedDefinitionsIfDefined("IIT_Base"); for (const Record *Rec : IIT_Base) { @@ -232,13 +230,12 @@ void IntrinsicEmitter::EmitIITInfo(raw_ostream &OS) { } else { OS << "#error \"class IIT_Base is not defined\"\n"; } - OS << "#endif\n\n"; } void IntrinsicEmitter::EmitTargetInfo(const CodeGenIntrinsicTable &Ints, raw_ostream &OS) { + IfDefEmitter IfDef(OS, "GET_INTRINSIC_TARGET_DATA"); OS << R"(// Target mapping. -#ifdef GET_INTRINSIC_TARGET_DATA struct IntrinsicTargetInfo { StringLiteral Name; size_t Offset; @@ -248,10 +245,7 @@ static constexpr IntrinsicTargetInfo TargetInfos[] = { )"; for (const auto [Name, Offset, Count] : Ints.getTargets()) OS << formatv(" {{\"{}\", {}, {}},\n", Name, Offset, Count); - OS << R"(}; -#endif - -)"; + OS << "};\n"; } /// Helper function to emit a bit table for intrinsic properties. @@ -260,8 +254,8 @@ void IntrinsicEmitter::EmitIntrinsicBitTable( const CodeGenIntrinsicTable &Ints, raw_ostream &OS, StringRef Guard, StringRef TableName, StringRef Comment, function_ref GetProperty) { + IfDefEmitter IfDef(OS, Guard); OS << formatv("// {}\n", Comment); - OS << formatv("#ifdef {}\n", Guard); OS << formatv("static constexpr uint8_t {}[] = {{\n", TableName); OS << " 0\n "; for (auto [I, Int] : enumerate(Ints)) { @@ -274,7 +268,6 @@ void IntrinsicEmitter::EmitIntrinsicBitTable( } OS << "\n};\n\n"; OS << formatv("return ({}[id/8] & (1 << (id%8))) != 0;\n", TableName); - OS << formatv("#endif // {}\n\n", Guard); } void IntrinsicEmitter::EmitIntrinsicToNameTable( @@ -286,8 +279,8 @@ void IntrinsicEmitter::EmitIntrinsicToNameTable( for (const auto &Int : Ints) Table.GetOrAddStringOffset(Int.Name); + IfDefEmitter IfDef(OS, "GET_INTRINSIC_NAME_TABLE"); OS << R"(// Intrinsic ID to name table. -#ifdef GET_INTRINSIC_NAME_TABLE // Note that entry #0 is the invalid intrinsic! )"; @@ -303,12 +296,7 @@ static constexpr unsigned IntrinsicNameOffsetTable[] = { for (const auto &Int : Ints) OS << formatv(" {}, // {}\n", Table.GetStringOffset(Int.Name), Int.Name); - OS << R"( -}; // IntrinsicNameOffsetTable - -#endif - -)"; + OS << "\n}; // IntrinsicNameOffsetTable\n"; } void IntrinsicEmitter::EmitIntrinsicToOverloadTable( @@ -387,8 +375,8 @@ void IntrinsicEmitter::EmitGenerator(const CodeGenIntrinsicTable &Ints, LongEncodingTable.layout(); + IfDefEmitter IfDef(OS, "GET_INTRINSIC_GENERATOR_GLOBAL"); OS << formatv(R"(// Global intrinsic function declaration type table. -#ifdef GET_INTRINSIC_GENERATOR_GLOBAL using FixedEncodingTy = {}; static constexpr FixedEncodingTy IIT_Table[] = {{ )", @@ -426,7 +414,6 @@ static constexpr FixedEncodingTy IIT_Table[] = {{ LongEncodingTable.emit( OS, [](raw_ostream &OS, unsigned char C) { OS << (unsigned)C; }); OS << " 255\n};\n"; - OS << "#endif\n\n"; // End of GET_INTRINSIC_GENERATOR_GLOBAL } /// Returns the effective MemoryEffects for intrinsic \p Int. @@ -525,8 +512,8 @@ static StringRef getArgAttrEnumName(CodeGenIntrinsic::ArgAttrKind Kind) { /// EmitAttributes - This emits the Intrinsic::getAttributes method. void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints, raw_ostream &OS) { + IfDefEmitter IfDef(OS, "GET_INTRINSIC_ATTRIBUTES"); OS << R"(// Add parameter attributes that are not common to all intrinsics. -#ifdef GET_INTRINSIC_ATTRIBUTES static AttributeSet getIntrinsicArgAttributeSet(LLVMContext &C, unsigned ID, Type *ArgType) { unsigned BitWidth = ArgType->getScalarSizeInBits(); @@ -826,8 +813,6 @@ AttributeSet Intrinsic::getFnAttributes(LLVMContext &C, ID id) {{ return AttributeSet(); return getIntrinsicFnAttributeSet(C, FnAttrID); } -#endif // GET_INTRINSIC_ATTRIBUTES - )", UniqAttributesBitSize, MaxNumAttrs, NoFunctionAttrsID, NoFunctionAttrsID); @@ -844,8 +829,8 @@ void IntrinsicEmitter::EmitIntrinsicToPrettyPrintTable( void IntrinsicEmitter::EmitPrettyPrintArguments( const CodeGenIntrinsicTable &Ints, raw_ostream &OS) { + IfDefEmitter IfDef(OS, "GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS"); OS << R"( -#ifdef GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS void Intrinsic::printImmArg(ID IID, unsigned ArgIdx, raw_ostream &OS, const Constant *ImmArgVal) { using namespace Intrinsic; switch (IID) { @@ -874,9 +859,7 @@ void Intrinsic::printImmArg(ID IID, unsigned ArgIdx, raw_ostream &OS, const Cons OS << R"( default: break; } -} -#endif // GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS -)"; +})"; } void IntrinsicEmitter::EmitIntrinsicToBuiltinMap( @@ -931,25 +914,22 @@ void IntrinsicEmitter::EmitIntrinsicToBuiltinMap( } } + IfDefEmitter IfDef( + OS, + formatv("GET_LLVM_INTRINSIC_FOR_{}_BUILTIN", UpperCompilerName).str()); OS << formatv(R"( // Get the LLVM intrinsic that corresponds to a builtin. This is used by the // C front-end. The builtin name is passed in as BuiltinName, and a target // prefix (e.g. 'ppc') is passed in as TargetPrefix. -#ifdef GET_LLVM_INTRINSIC_FOR_{}_BUILTIN Intrinsic::ID Intrinsic::getIntrinsicFor{}Builtin(StringRef TargetPrefix, StringRef BuiltinName) {{ using namespace Intrinsic; )", - UpperCompilerName, CompilerName); + CompilerName); if (BuiltinMap.empty()) { - OS << formatv(R"( - return not_intrinsic; - } -#endif // GET_LLVM_INTRINSIC_FOR_{}_BUILTIN -)", - UpperCompilerName); + OS << "return not_intrinsic;\n"; return; } @@ -1036,7 +1016,7 @@ Intrinsic::getIntrinsicFor{}Builtin(StringRef TargetPrefix, } // If a target independent builtin was not found, lookup the target specific. - OS << formatv(R"( + OS << R"( auto TI = lower_bound(TargetTable, TargetPrefix); if (TI == std::end(TargetTable) || TI->TargetPrefix != TargetPrefix) return not_intrinsic; @@ -1049,10 +1029,7 @@ Intrinsic::getIntrinsicFor{}Builtin(StringRef TargetPrefix, return not_intrinsic; return II->IntrinsicID; } -#endif // GET_LLVM_INTRINSIC_FOR_{}_BUILTIN - -)", - UpperCompilerName); +)"; } static TableGen::Emitter::OptClass>