From 98c6bbfe1f3a348633e5e4c192a0134891fe3849 Mon Sep 17 00:00:00 2001 From: Rahul Joshi Date: Wed, 4 Sep 2024 15:04:10 -0700 Subject: [PATCH] [TableGen] Refactor Intrinsics record (#106986) Eliminate unused `isTarget` field in Intrinsic record. Eliminate `isOverloaded`, `Types` and `TypeSig` fields from the record, as they are already available through the `TypeInfo` field. Change intrinsic emitter code to look for this info using fields of the `TypeInfo` record attached to the `Intrinsic` record. Fix several intrinsic related unit tests to source the `Intrinsic` class def from Intrinsics.td as opposed to defining a skeleton in the test. This eliminates some duplication of information in the Intrinsic class, as well as reduces the memory allocated for record fields, resulting in ~2% reduction (though that's not the main goal). --- llvm/include/llvm/IR/Intrinsics.td | 5 -- llvm/test/TableGen/intrinsic-attrs.td | 52 +------------------ llvm/test/TableGen/intrinsic-long-name.td | 36 ++----------- llvm/test/TableGen/intrinsic-struct.td | 37 ++----------- .../TableGen/searchabletables-intrinsic.td | 37 ++----------- .../TableGen/Basic/CodeGenIntrinsics.cpp | 23 ++++---- llvm/utils/TableGen/IntrinsicEmitter.cpp | 11 ++-- 7 files changed, 35 insertions(+), 166 deletions(-) diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td index 232d6be1073f49..1bc895eee60f1a 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -669,12 +669,7 @@ class Intrinsic ret_types, // IntrinsicProperty<1> bit DisableDefaultAttributes = disable_default_attributes; - bit isTarget = false; - TypeInfoGen TypeInfo = TypeInfoGen; - bit isOverloaded = TypeInfo.isOverloaded; - list Types = TypeInfo.Types; - list> TypeSig = TypeInfo.TypeSig; } // Intrinsic with default attributes (disable_default_attributes = false). diff --git a/llvm/test/TableGen/intrinsic-attrs.td b/llvm/test/TableGen/intrinsic-attrs.td index 29e8cb1e89bb01..3228b32405103e 100644 --- a/llvm/test/TableGen/intrinsic-attrs.td +++ b/llvm/test/TableGen/intrinsic-attrs.td @@ -1,54 +1,6 @@ -// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include %s | FileCheck %s +// RUN: llvm-tblgen -gen-intrinsic-impl -I %p/../../include -DTEST_INTRINSICS_SUPPRESS_DEFS %s | FileCheck %s -// Get the minimum blurb necessary to process ... -include "llvm/CodeGen/ValueTypes.td" -include "llvm/CodeGen/SDNodeProperties.td" - -class LLVMType { - ValueType VT = vt; - int isAny = 0; -} - -def llvm_i32_ty : LLVMType; -def llvm_ptr_ty : LLVMType; - -class AttrIndex { - int Value = idx; -} - -def FuncIndex : AttrIndex<-1>; -def RetIndex : AttrIndex<0>; -class ArgIndex : AttrIndex; - -class IntrinsicProperty { - bit IsDefault = is_default; -} - -def IntrNoMem : IntrinsicProperty; -def IntrHasSideEffects : IntrinsicProperty; -class Dereferenceable : IntrinsicProperty { - int ArgNo = idx.Value; - int Bytes = bytes; -} - -class Intrinsic ret_types, - list param_types = [], - list intr_properties = [], - string name = "", - list sd_properties = [], - bit disable_default_attributes = 0> : SDPatternOperator { - string LLVMName = name; - string TargetPrefix = ""; - list RetTypes = ret_types; - list ParamTypes = param_types; - list IntrProperties = intr_properties; - let Properties = sd_properties; - bit DisableDefaultAttributes = 1; - - - bit isTarget = 0; - bit DisableDefaultAttributes = disable_default_attributes; -} +include "llvm/IR/Intrinsics.td" // ... this intrinsic. def int_random_gen : Intrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrHasSideEffects]>; diff --git a/llvm/test/TableGen/intrinsic-long-name.td b/llvm/test/TableGen/intrinsic-long-name.td index d66173202302ba..c19910d474ed10 100644 --- a/llvm/test/TableGen/intrinsic-long-name.td +++ b/llvm/test/TableGen/intrinsic-long-name.td @@ -1,38 +1,10 @@ -// RUN: llvm-tblgen -gen-intrinsic-enums %s | FileCheck %s +// RUN: llvm-tblgen -gen-intrinsic-enums -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS | FileCheck %s // XFAIL: vg_leak -class IntrinsicProperty { - bit IsDefault = is_default; -} - -class SDNodeProperty; - -class ValueType { - string Namespace = "MVT"; - int Size = size; - int Value = value; -} - -class LLVMType { - ValueType VT = vt; -} - -class Intrinsic param_types = []> { - string LLVMName = name; - bit isTarget = 0; - string TargetPrefix = ""; - list RetTypes = []; - list ParamTypes = param_types; - list IntrProperties = []; - list Properties = []; - bit DisableDefaultAttributes = 1; -} - -def iAny : ValueType<0, 253>; -def llvm_anyint_ty : LLVMType; +include "llvm/IR/Intrinsics.td" // Make sure we generate the long name without crashing // CHECK: this_is_a_really_long_intrinsic_name_but_we_should_still_not_crash, // llvm.this.is.a.really.long.intrinsic.name.but.we.should.still.not.crash -def int_foo : Intrinsic<"llvm.foo", [llvm_anyint_ty]>; -def int_this_is_a_really_long_intrinsic_name_but_we_should_still_not_crash : Intrinsic<"llvm.this.is.a.really.long.intrinsic.name.but.we.should.still.not.crash", [llvm_anyint_ty]>; +def int_foo : Intrinsic<[llvm_anyint_ty], [], [], "llvm.foo">; +def int_this_is_a_really_long_intrinsic_name_but_we_should_still_not_crash : Intrinsic<[llvm_anyint_ty], [], [], "llvm.this.is.a.really.long.intrinsic.name.but.we.should.still.not.crash">; diff --git a/llvm/test/TableGen/intrinsic-struct.td b/llvm/test/TableGen/intrinsic-struct.td index bc044a4a6f858e..f23a7a7643af27 100644 --- a/llvm/test/TableGen/intrinsic-struct.td +++ b/llvm/test/TableGen/intrinsic-struct.td @@ -1,38 +1,11 @@ -// RUN: llvm-tblgen -gen-intrinsic-enums %s | FileCheck %s +// RUN: llvm-tblgen -gen-intrinsic-enums -I %p/../../include %s -DTEST_INTRINSICS_SUPPRESS_DEFS | FileCheck %s // XFAIL: vg_leak -class IntrinsicProperty { - bit IsDefault = is_default; -} - -class SDNodeProperty; - -class ValueType { - string Namespace = "MVT"; - int Size = size; - int Value = value; -} - -class LLVMType { - ValueType VT = vt; -} - -class Intrinsic ret_types = []> { - string LLVMName = name; - bit isTarget = 0; - string TargetPrefix = ""; - list RetTypes = ret_types; - list ParamTypes = []; - list IntrProperties = []; - list Properties = []; - bit DisableDefaultAttributes = 1; -} - -def iAny : ValueType<0, 253>; -def llvm_anyint_ty : LLVMType; +include "llvm/IR/Intrinsics.td" // Make sure we can return up to 8 values // CHECK: returns_8_results = {{[0-9]+}}, // llvm.returns.8.results -def int_returns_8_results : Intrinsic<"llvm.returns.8.results", +def int_returns_8_results : Intrinsic< [llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty, - llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty]>; + llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty, llvm_anyint_ty], + [], [], "llvm.returns.8.results">; diff --git a/llvm/test/TableGen/searchabletables-intrinsic.td b/llvm/test/TableGen/searchabletables-intrinsic.td index 75722d19b16e99..d4ec105f0243b1 100644 --- a/llvm/test/TableGen/searchabletables-intrinsic.td +++ b/llvm/test/TableGen/searchabletables-intrinsic.td @@ -1,48 +1,19 @@ -// RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include %s | FileCheck %s +// RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include -DTEST_INTRINSICS_SUPPRESS_DEFS %s | FileCheck %s // XFAIL: vg_leak include "llvm/TableGen/SearchableTable.td" - -class IntrinsicProperty { - bit IsDefault = is_default; -} - -class SDNodeProperty; - -class ValueType { - string Namespace = "MVT"; - int Size = size; - int Value = value; -} - -class LLVMType { - ValueType VT = vt; -} - -class Intrinsic param_types = []> { - string LLVMName = ""; - bit isTarget = 0; - string TargetPrefix = ""; - list RetTypes = []; - list ParamTypes = param_types; - list IntrProperties = []; - list Properties = []; - bit DisableDefaultAttributes = 1; -} - -def iAny : ValueType<0, 253>; -def llvm_anyint_ty : LLVMType; +include "llvm/IR/Intrinsics.td" def int_abc : Intrinsic<[llvm_anyint_ty]>; def int_xyz : Intrinsic<[llvm_anyint_ty]>; -let isTarget = 1, TargetPrefix = "gtarget" in { +let TargetPrefix = "gtarget" in { def int_gtarget_def : Intrinsic<[llvm_anyint_ty]>; def int_gtarget_defg : Intrinsic<[llvm_anyint_ty]>; def int_gtarget_uvw : Intrinsic<[llvm_anyint_ty]>; } -let isTarget = 1, TargetPrefix = "ftarget" in { +let TargetPrefix = "ftarget" in { def int_ftarget_ghi : Intrinsic<[llvm_anyint_ty]>; def int_ftarget_ghi_x : Intrinsic<[llvm_anyint_ty]>; def int_ftarget_rst : Intrinsic<[llvm_anyint_ty]>; diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp index c0edbf0f01523a..a30a7577408f86 100644 --- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp +++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.cpp @@ -106,17 +106,22 @@ CodeGenIntrinsic::CodeGenIntrinsic(const Record *R, TargetPrefix + ".'!"); } - if (auto *Types = R->getValue("Types")) { - auto *TypeList = cast(Types->getValue()); - isOverloaded = R->getValueAsBit("isOverloaded"); + const Record *TypeInfo = R->getValueAsDef("TypeInfo"); + if (!TypeInfo->isSubClassOf("TypeInfoGen")) + PrintFatalError(DefLoc, "TypeInfo field in " + DefName + + " should be of subclass of TypeInfoGen!"); - unsigned I = 0; - for (unsigned E = R->getValueAsListInit("RetTypes")->size(); I < E; ++I) - IS.RetTys.push_back(TypeList->getElementAsRecord(I)); + isOverloaded = TypeInfo->getValueAsBit("isOverloaded"); + const ListInit *TypeList = TypeInfo->getValueAsListInit("Types"); - for (unsigned E = TypeList->size(); I < E; ++I) - IS.ParamTys.push_back(TypeList->getElementAsRecord(I)); - } + // Types field is a concatenation of Return types followed by Param types. + unsigned Idx = 0; + unsigned NumRet = R->getValueAsListInit("RetTypes")->size(); + for (; Idx < NumRet; ++Idx) + IS.RetTys.push_back(TypeList->getElementAsRecord(Idx)); + + for (unsigned E = TypeList->size(); Idx < E; ++Idx) + IS.ParamTys.push_back(TypeList->getElementAsRecord(Idx)); // Parse the intrinsic properties. ListInit *PropList = R->getValueAsListInit("IntrProperties"); diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp index 0f4d7bf8db2173..bda97c61d3d581 100644 --- a/llvm/utils/TableGen/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -273,11 +273,12 @@ using TypeSigTy = SmallVector; /// Computes type signature of the intrinsic \p Int. static TypeSigTy ComputeTypeSignature(const CodeGenIntrinsic &Int) { TypeSigTy TypeSig; - if (const auto *R = Int.TheDef->getValue("TypeSig")) { - for (const auto *a : cast(R->getValue())->getValues()) { - for (const auto *b : cast(a)->getValues()) - TypeSig.emplace_back(cast(b)->getValue()); - } + const Record *TypeInfo = Int.TheDef->getValueAsDef("TypeInfo"); + const ListInit *OuterList = TypeInfo->getValueAsListInit("TypeSig"); + + for (const auto *Outer : OuterList->getValues()) { + for (const auto *Inner : cast(Outer)->getValues()) + TypeSig.emplace_back(cast(Inner)->getValue()); } return TypeSig; }