Skip to content

Commit 6c33735

Browse files
authored
[RISCV] Allow Zicsr/Zifencei to duplicate with g (#136842)
This matches GCC and we supported it in LLVM 17/18. Fixes #136803
1 parent 0132451 commit 6c33735

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

clang/docs/ReleaseNotes.rst

+2
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,8 @@ RISC-V Support
646646
Qualcomm's `Xqciint` extension to save and restore some GPRs in interrupt
647647
service routines.
648648

649+
- `Zicsr` / `Zifencei` are allowed to be duplicated in the presence of `g` in `-march`.
650+
649651
CUDA/HIP Language Changes
650652
^^^^^^^^^^^^^^^^^^^^^^^^^
651653

llvm/lib/TargetParser/RISCVISAInfo.cpp

+15-3
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@ struct RISCVProfile {
4545

4646
} // end anonymous namespace
4747

48-
static const char *RISCVGImplications[] = {
49-
"i", "m", "a", "f", "d", "zicsr", "zifencei"
50-
};
48+
static const char *RISCVGImplications[] = {"i", "m", "a", "f", "d"};
49+
static const char *RISCVGImplicationsZi[] = {"zicsr", "zifencei"};
5150

5251
#define GET_SUPPORTED_EXTENSIONS
5352
#include "llvm/TargetParser/RISCVTargetParserDef.inc"
@@ -717,6 +716,19 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
717716
} while (!Ext.empty());
718717
}
719718

719+
// We add Zicsr/Zifenci as final to allow duplicated "zicsr"/"zifencei" like
720+
// "rv64g_zicsr_zifencei".
721+
if (Baseline == 'g') {
722+
for (const char *Ext : RISCVGImplicationsZi) {
723+
if (ISAInfo->Exts.count(Ext))
724+
continue;
725+
726+
auto Version = findDefaultVersion(Ext);
727+
assert(Version && "Default extension version not found?");
728+
ISAInfo->Exts[std::string(Ext)] = {Version->Major, Version->Minor};
729+
}
730+
}
731+
720732
return RISCVISAInfo::postProcessAndChecking(std::move(ISAInfo));
721733
}
722734

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,14 @@ TEST(ParseArchString, RejectsDoubleOrTrailingUnderscore) {
512512
}
513513

514514
TEST(ParseArchString, RejectsDuplicateExtensionNames) {
515+
// Zicsr/Zifencei are allowed to duplicate with "g".
516+
ASSERT_THAT_EXPECTED(RISCVISAInfo::parseArchString("rv64g_zicsr", true),
517+
Succeeded());
518+
ASSERT_THAT_EXPECTED(RISCVISAInfo::parseArchString("rv64g_zifencei", true),
519+
Succeeded());
520+
ASSERT_THAT_EXPECTED(
521+
RISCVISAInfo::parseArchString("rv64g_zicsr_zifencei", true), Succeeded());
522+
515523
EXPECT_EQ(toString(RISCVISAInfo::parseArchString("rv64ii", true).takeError()),
516524
"invalid standard user-level extension 'i'");
517525
EXPECT_EQ(toString(RISCVISAInfo::parseArchString("rv32ee", true).takeError()),

0 commit comments

Comments
 (0)