Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -422,6 +422,9 @@ - Fixed incorrect ABI lowering of ``_Float16`` in the case of structs containing ``_Float16`` that are eligible for passing via GPR+FPR or FPR+FPR. +- The rules for ordering of extensions in ``-march`` strings were relaxed. A + canonical ordering is no longer enforced on ``z*``, ``s*``, and ``x*`` + prefixed extensions. CUDA/HIP Language Changes ^^^^^^^^^^^^^^^^^^^^^^^^^ Index: clang/test/Driver/riscv-arch.c =================================================================== --- clang/test/Driver/riscv-arch.c +++ clang/test/Driver/riscv-arch.c @@ -333,8 +333,7 @@ // RUN: %clang --target=riscv32-unknown-elf -march=rv32ixdef_sabc -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-X-ORDER %s // RV32-X-ORDER: error: invalid arch name 'rv32ixdef_sabc', -// RV32-X-ORDER: standard supervisor-level extension not given -// RV32-X-ORDER: in canonical order 'sabc' +// RV32-X-ORDER unsupported non-standard user-level extension 'xdef' // RUN: %clang --target=riscv32-unknown-elf -march=rv32ixabc_xabc -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-XDUP %s Index: llvm/lib/Support/RISCVISAInfo.cpp =================================================================== --- llvm/lib/Support/RISCVISAInfo.cpp +++ llvm/lib/Support/RISCVISAInfo.cpp @@ -767,9 +767,6 @@ OtherExts.split(Split, '_'); SmallVector AllExts; - std::array Prefix{"z", "s", "x"}; - auto I = Prefix.begin(); - auto E = Prefix.end(); if (Split.size() > 1 || Split[0] != "") { for (StringRef Ext : Split) { if (Ext.empty()) @@ -789,18 +786,6 @@ "invalid extension prefix '" + Ext + "'"); } - // Check ISA extensions are specified in the canonical order. - while (I != E && *I != Type) - ++I; - - if (I == E) { - if (IgnoreUnknown) - continue; - return createStringError(errc::invalid_argument, - "%s not given in canonical order '%s'", - Desc.str().c_str(), Ext.str().c_str()); - } - if (!IgnoreUnknown && Name.size() == Type.size()) { return createStringError(errc::invalid_argument, "%s name missing after '%s'", Index: llvm/unittests/Support/RISCVISAInfoTest.cpp =================================================================== --- llvm/unittests/Support/RISCVISAInfoTest.cpp +++ llvm/unittests/Support/RISCVISAInfoTest.cpp @@ -192,7 +192,7 @@ EXPECT_EQ(InfoRV64G.getFLen(), 64U); } -TEST(ParseArchString, RequiresCanonicalOrderForExtensions) { +TEST(ParseArchString, RequiresCanonicalOrderForSingleLetterExtensions) { EXPECT_EQ( toString(RISCVISAInfo::parseArchString("rv64idf", true).takeError()), "standard user-level extension not given in canonical order 'f'"); @@ -203,12 +203,10 @@ toString( RISCVISAInfo::parseArchString("rv32i_zfinx_a", true).takeError()), "invalid extension prefix 'a'"); - EXPECT_EQ( - toString(RISCVISAInfo::parseArchString("rv64i_svnapot_zicsr", true) - .takeError()), - "standard user-level extension not given in canonical order 'zicsr'"); + // Canonical ordering not required for z*, s*, and x* extensions. EXPECT_THAT_EXPECTED( - RISCVISAInfo::parseArchString("rv64imafdc_zicsr_svnapot", true), + RISCVISAInfo::parseArchString( + "rv64imafdc_xsfvcp_zicsr_xtheadba_svnapot_zawrs", true), Succeeded()); }