-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[TableGen][RISCV] Add initial support for marking profiles as experimental #91993
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-backend-risc-v Author: Alex Bradbury (asb) ChangesThis is just the TableGen-side changes, split out as the minimal testable unit. It doesn't yet transition RVA23 and friends to be experimental (and add the necessary other changes for this to work). Although choosing not to emit the SupportedExperimentalProfiles array if no experimental profiles are present isn't consistent with what we do for experimental extensions, we need to do this in order to avoid adding a warning for the empty array when building LLVM for as long as we don't have any experimental profiles defined. Full diff: https://github.com/llvm/llvm-project/pull/91993.diff 3 Files Affected:
diff --git a/llvm/lib/Target/RISCV/RISCVProfiles.td b/llvm/lib/Target/RISCV/RISCVProfiles.td
index 5c13710faf65b..031f0a3881f75 100644
--- a/llvm/lib/Target/RISCV/RISCVProfiles.td
+++ b/llvm/lib/Target/RISCV/RISCVProfiles.td
@@ -8,7 +8,16 @@
class RISCVProfile<string name, list<SubtargetFeature> features>
: SubtargetFeature<name, "Is" # NAME, "true",
- "RISC-V " # name # " profile", features>;
+ "RISC-V " # name # " profile", features> {
+ // Indicates if the profile is not yet ratified, so should be treated as
+ // experimental.
+ bit Experimental = false;
+}
+
+class RISCVExperimentalProfile<string name, list<SubtargetFeature> features>
+ : RISCVProfile<"experimental-"#name, features> {
+ let Experimental = true;
+}
defvar RVI20U32Features = [Feature32Bit, FeatureStdExtI];
defvar RVI20U64Features = [Feature64Bit, FeatureStdExtI];
diff --git a/llvm/test/TableGen/riscv-target-def.td b/llvm/test/TableGen/riscv-target-def.td
index 7f3d9bdb278ca..e328a6e3b5834 100644
--- a/llvm/test/TableGen/riscv-target-def.td
+++ b/llvm/test/TableGen/riscv-target-def.td
@@ -53,12 +53,19 @@ def FeatureDummy
class RISCVProfile<string name, list<SubtargetFeature> features>
: SubtargetFeature<name, "Is" # NAME, "true",
- "RISC-V " # name # " profile", features>;
+ "RISC-V " # name # " profile", features> {
+ bit Experimental = false;
+}
+class RISCVExperimentalProfile<string name, list<SubtargetFeature> features>
+ : RISCVProfile<"experimental-"#name, features> {
+ let Experimental = true;
+}
def RVI20U32 : RISCVProfile<"rvi20u32", [Feature32Bit, FeatureStdExtI]>;
def RVI20U64 : RISCVProfile<"rvi20u64", [Feature64Bit, FeatureStdExtI]>;
def ProfileDummy : RISCVProfile<"dummy", [Feature64Bit, FeatureStdExtI,
FeatureStdExtF, FeatureStdExtZidummy]>;
+def RVI99U64 : RISCVExperimentalProfile<"rvi99u64", [Feature64Bit, FeatureStdExtI]>;
class RISCVProcessorModel<string n,
SchedMachineModel m,
@@ -139,6 +146,10 @@ def ROCKET : RISCVTuneProcessorModel<"rocket",
// CHECK-NEXT: {"rvi20u64","rv64i2p1"},
// CHECK-NEXT: };
+// CHECK: static constexpr RISCVProfile SupportedExperimentalProfiles[] = {
+// CHECK-NEXT: {"experimental-rvi99u64","rv64i2p1"},
+// CHECK-NEXT: };
+
// CHECK: #endif // GET_SUPPORTED_PROFILES
// CHECK: #ifndef PROC
diff --git a/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp b/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp
index bb409ea6ea692..d174b1961344f 100644
--- a/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/RISCVTargetDefEmitter.cpp
@@ -122,6 +122,26 @@ static void printMArch(raw_ostream &OS, const std::vector<Record *> &Features) {
OS << LS << Ext.first << Ext.second.Major << 'p' << Ext.second.Minor;
}
+static void printProfileTable(raw_ostream &OS,
+ const std::vector<Record *> &Profiles,
+ bool Experimental) {
+ OS << "static constexpr RISCVProfile Supported";
+ if (Experimental)
+ OS << "Experimental";
+ OS << "Profiles[] = {\n";
+
+ for (const Record *Rec : Profiles) {
+ if (Rec->getValueAsBit("Experimental") != Experimental)
+ continue;
+
+ OS.indent(4) << "{\"" << Rec->getValueAsString("Name") << "\",\"";
+ printMArch(OS, Rec->getValueAsListOfDefs("Implies"));
+ OS << "\"},\n";
+ }
+
+ OS << "};\n\n";
+}
+
static void emitRISCVProfiles(RecordKeeper &Records, raw_ostream &OS) {
OS << "#ifdef GET_SUPPORTED_PROFILES\n";
OS << "#undef GET_SUPPORTED_PROFILES\n\n";
@@ -129,15 +149,12 @@ static void emitRISCVProfiles(RecordKeeper &Records, raw_ostream &OS) {
auto Profiles = Records.getAllDerivedDefinitionsIfDefined("RISCVProfile");
if (!Profiles.empty()) {
- llvm::sort(Profiles, LessRecordFieldName());
- OS << "static constexpr RISCVProfile SupportedProfiles[] = {\n";
- for (const Record *Rec : Profiles) {
- OS.indent(4) << "{\"" << Rec->getValueAsString("Name") << "\",\"";
- printMArch(OS, Rec->getValueAsListOfDefs("Implies"));
- OS << "\"},\n";
- }
-
- OS << "};\n\n";
+ printProfileTable(OS, Profiles, /*Experimental=*/false);
+ bool HasExperimentalProfiles = any_of(Profiles, [&](auto &Rec) {
+ return Rec->getValueAsBit("Experimental");
+ });
+ if (HasExperimentalProfiles)
+ printProfileTable(OS, Profiles, /*Experimental=*/true);
}
OS << "#endif // GET_SUPPORTED_PROFILES\n\n";
|
…ental This is just the TableGen-side changes, split out as the minimal testable unit it doesn't yet transition RVA23 and friends to be experimental (and add the necessary other changes for this to work). Although choosing not to emit the SupportedExperimentalProfiles array if no experimental profiles are present isn't consistent with what we do for experimental extensions, we need to do this in order to avoid adding a warning for the empty array when building LLVM for as long as we don't have any experimental profiles defined.
757d2fc
to
63b5416
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
…ortedExperimentalProfiles This matches what we do for extensions, and saves us having to do it in RISCVISAInfo. This is a minor tweak to what I added in #91993.
…ons (#92167) As discussed in the last sync-up call, because these profiles are not yet finalised they shouldn't be exposed to users unless they opt-in to them (much like experimental extensions). We may later want to add a more specific flag, but reusing `-menable-experimental-extensions` solves the immediate problem. This is implemented using the new support for marking profiles s experimental added in #91993 to move the unratified profiles to RISCVExperimentalProfile and making the necessary changes to logic in RISCVISAInfo to handle this.
This is just the TableGen-side changes, split out as the minimal testable unit. It doesn't yet transition RVA23 and friends to be experimental (and add the necessary other changes for this to work).
Although choosing not to emit the SupportedExperimentalProfiles array if no experimental profiles are present isn't consistent with what we do for experimental extensions, we need to do this in order to avoid adding a warning for the empty array when building LLVM for as long as we don't have any experimental profiles defined.