https://github.com/asb updated https://github.com/llvm/llvm-project/pull/92167
>From 5159fce9b2cca245335e124f7f0cd2149cdbcb2a Mon Sep 17 00:00:00 2001 From: Alex Bradbury <a...@igalia.com> Date: Tue, 14 May 2024 20:45:41 +0100 Subject: [PATCH] [RISCV] Gate unratified profiles behind -menable-experimental-extensions 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. --- clang/test/Driver/riscv-profiles.c | 10 +++++-- llvm/lib/Target/RISCV/RISCVProfiles.td | 14 +++++---- llvm/lib/TargetParser/RISCVISAInfo.cpp | 29 +++++++++++++++---- llvm/test/CodeGen/RISCV/attributes.ll | 10 +++---- .../TargetParser/RISCVISAInfoTest.cpp | 13 +++++++-- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/clang/test/Driver/riscv-profiles.c b/clang/test/Driver/riscv-profiles.c index 298f301de3feb..55aa5b398cee9 100644 --- a/clang/test/Driver/riscv-profiles.c +++ b/clang/test/Driver/riscv-profiles.c @@ -111,7 +111,7 @@ // RVA22S64: "-target-feature" "+svinval" // RVA22S64: "-target-feature" "+svpbmt" -// RUN: %clang --target=riscv64 -### -c %s 2>&1 -march=rva23u64 \ +// RUN: %clang --target=riscv64 -### -c %s 2>&1 -march=rva23u64 -menable-experimental-extensions \ // RUN: | FileCheck -check-prefix=RVA23U64 %s // RVA23U64: "-target-feature" "+m" // RVA23U64: "-target-feature" "+a" @@ -207,7 +207,7 @@ // RVA23S64: "-target-feature" "+svnapot" // RVA23S64: "-target-feature" "+svpbmt" -// RUN: %clang --target=riscv64 -### -c %s 2>&1 -march=rvb23u64 \ +// RUN: %clang --target=riscv64 -### -c %s 2>&1 -march=rvb23u64 -menable-experimental-extensions \ // RUN: | FileCheck -check-prefix=RVB23U64 %s // RVB23U64: "-target-feature" "+m" // RVB23U64: "-target-feature" "+a" @@ -284,7 +284,7 @@ // RVB23S64: "-target-feature" "+svnapot" // RVB23S64: "-target-feature" "+svpbmt" -// RUN: %clang --target=riscv32 -### -c %s 2>&1 -march=rvm23u32 \ +// RUN: %clang --target=riscv32 -### -c %s 2>&1 -march=rvm23u32 -menable-experimental-extensions \ // RUN: | FileCheck -check-prefix=RVM23U32 %s // RVM23U32: "-target-feature" "+m" // RVM23U32: "-target-feature" "+zicbop" @@ -322,3 +322,7 @@ // RUN: not %clang --target=riscv64 -### -c %s 2>&1 -march=rva22u64zfa | FileCheck -check-prefix=INVALID-ADDITIONAL %s // INVALID-ADDITIONAL: error: invalid arch name 'rva22u64zfa', additional extensions must be after separator '_' + +// RUN: not %clang --target=riscv64 -### -c %s 2>&1 -march=rva23u64 | FileCheck -check-prefix=EXPERIMENTAL-NOFLAG %s +// EXPERIMENTAL-NOFLAG: error: invalid arch name 'rva23u64' +// EXPERIMENTAL-NOFLAG: requires '-menable-experimental-extensions' for profile 'rva23u64' diff --git a/llvm/lib/Target/RISCV/RISCVProfiles.td b/llvm/lib/Target/RISCV/RISCVProfiles.td index e56df33bd8cb0..c4a64681f5f12 100644 --- a/llvm/lib/Target/RISCV/RISCVProfiles.td +++ b/llvm/lib/Target/RISCV/RISCVProfiles.td @@ -13,6 +13,10 @@ class RISCVProfile<string name, list<SubtargetFeature> features> // 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]; @@ -201,8 +205,8 @@ def RVA20U64 : RISCVProfile<"rva20u64", RVA20U64Features>; def RVA20S64 : RISCVProfile<"rva20s64", RVA20S64Features>; def RVA22U64 : RISCVProfile<"rva22u64", RVA22U64Features>; def RVA22S64 : RISCVProfile<"rva22s64", RVA22S64Features>; -def RVA23U64 : RISCVProfile<"rva23u64", RVA23U64Features>; -def RVA23S64 : RISCVProfile<"rva23s64", RVA23S64Features>; -def RVB23U64 : RISCVProfile<"rvb23u64", RVB23U64Features>; -def RVB23S64 : RISCVProfile<"rvb23s64", RVB23S64Features>; -def RVM23U32 : RISCVProfile<"rvm23u32", RVM23U32Features>; +def RVA23U64 : RISCVExperimentalProfile<"rva23u64", RVA23U64Features>; +def RVA23S64 : RISCVExperimentalProfile<"rva23s64", RVA23S64Features>; +def RVB23U64 : RISCVExperimentalProfile<"rvb23u64", RVB23U64Features>; +def RVB23S64 : RISCVExperimentalProfile<"rvb23s64", RVB23S64Features>; +def RVM23U32 : RISCVExperimentalProfile<"rvm23u32", RVM23U32Features>; diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp index 575c9dbad5156..706b2853cd2c5 100644 --- a/llvm/lib/TargetParser/RISCVISAInfo.cpp +++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp @@ -102,6 +102,10 @@ void llvm::riscvExtensionsHelp(StringMap<StringRef> DescMap) { for (const auto &P : SupportedProfiles) outs().indent(4) << P.Name << "\n"; + outs() << "\nExperimental Profiles\n"; + for (const auto &P : SupportedExperimentalProfiles) + outs().indent(4) << P.Name << "\n"; + outs() << "\nUse -march to specify the target's extension.\n" "For example, clang -march=rv32i_v1p0\n"; } @@ -608,12 +612,25 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension, XLen = 64; } else { // Try parsing as a profile. - auto I = llvm::upper_bound(SupportedProfiles, Arch, - [](StringRef Arch, const RISCVProfile &Profile) { - return Arch < Profile.Name; - }); - - if (I != std::begin(SupportedProfiles) && Arch.starts_with((--I)->Name)) { + auto ProfileCmp = [](StringRef Arch, const RISCVProfile &Profile) { + return Arch < Profile.Name; + }; + auto I = llvm::upper_bound(SupportedProfiles, Arch, ProfileCmp); + bool FoundProfile = I != std::begin(SupportedProfiles) && + Arch.starts_with(std::prev(I)->Name); + if (!FoundProfile) { + I = llvm::upper_bound(SupportedExperimentalProfiles, Arch, ProfileCmp); + FoundProfile = (I != std::begin(SupportedExperimentalProfiles) && + Arch.starts_with(std::prev(I)->Name)); + if (FoundProfile && !EnableExperimentalExtension) { + return createStringError(errc::invalid_argument, + "requires '-menable-experimental-extensions' " + "for profile '" + + std::prev(I)->Name + "'"); + } + } + if (FoundProfile) { + --I; std::string NewArch = I->MArch.str(); StringRef ArchWithoutProfile = Arch.drop_front(I->Name.size()); if (!ArchWithoutProfile.empty()) { diff --git a/llvm/test/CodeGen/RISCV/attributes.ll b/llvm/test/CodeGen/RISCV/attributes.ll index 8f49f6648ad28..953ed5ee3795b 100644 --- a/llvm/test/CodeGen/RISCV/attributes.ll +++ b/llvm/test/CodeGen/RISCV/attributes.ll @@ -265,11 +265,11 @@ ; RUN: llc -mtriple=riscv64 -mattr=+rva20s64 %s -o - | FileCheck --check-prefix=RVA20S64 %s ; RUN: llc -mtriple=riscv64 -mattr=+rva22u64 %s -o - | FileCheck --check-prefix=RVA22U64 %s ; RUN: llc -mtriple=riscv64 -mattr=+rva22s64 %s -o - | FileCheck --check-prefix=RVA22S64 %s -; RUN: llc -mtriple=riscv64 -mattr=+rva23u64 %s -o - | FileCheck --check-prefix=RVA23U64 %s -; RUN: llc -mtriple=riscv64 -mattr=+rva23s64 %s -o - | FileCheck --check-prefix=RVA23S64 %s -; RUN: llc -mtriple=riscv64 -mattr=+rvb23u64 %s -o - | FileCheck --check-prefix=RVB23U64 %s -; RUN: llc -mtriple=riscv64 -mattr=+rvb23s64 %s -o - | FileCheck --check-prefix=RVB23S64 %s -; RUN: llc -mtriple=riscv32 -mattr=+rvm23u32 %s -o - | FileCheck --check-prefix=RVM23U32 %s +; RUN: llc -mtriple=riscv64 -mattr=+experimental-rva23u64 %s -o - | FileCheck --check-prefix=RVA23U64 %s +; RUN: llc -mtriple=riscv64 -mattr=+experimental-rva23s64 %s -o - | FileCheck --check-prefix=RVA23S64 %s +; RUN: llc -mtriple=riscv64 -mattr=+experimental-rvb23u64 %s -o - | FileCheck --check-prefix=RVB23U64 %s +; RUN: llc -mtriple=riscv64 -mattr=+experimental-rvb23s64 %s -o - | FileCheck --check-prefix=RVB23S64 %s +; RUN: llc -mtriple=riscv32 -mattr=+experimental-rvm23u32 %s -o - | FileCheck --check-prefix=RVM23U32 %s ; CHECK: .attribute 4, 16 diff --git a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp index d04f21fa20063..22fe31809319f 100644 --- a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp +++ b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp @@ -726,6 +726,13 @@ TEST(ParseArchString, "duplicated standard user-level extension 'zicntr'"); } +TEST(ParseArchString, + RejectsExperimentalProfilesIfEnableExperimentalExtensionsNotSet) { + EXPECT_EQ( + toString(RISCVISAInfo::parseArchString("rva23u64", false).takeError()), + "requires '-menable-experimental-extensions' for profile 'rva23u64'"); +} + TEST(ToFeatures, IIsDroppedAndExperimentalExtensionsArePrefixed) { auto MaybeISAInfo1 = RISCVISAInfo::parseArchString("rv64im_ztso", true, false); @@ -1073,12 +1080,14 @@ Supported Profiles rva20u64 rva22s64 rva22u64 + rvi20u32 + rvi20u64 + +Experimental Profiles rva23s64 rva23u64 rvb23s64 rvb23u64 - rvi20u32 - rvi20u64 rvm23u32 Use -march to specify the target's extension. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits