[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -1206,6 +1233,47 @@ std::string Triple::normalize(StringRef Str) { } } + // Normalize DXIL triple if it does not include DXIL version number. + // Determine DXIL version number using the minor version number of Shader + // Model version specified in target triple, if any. Prior to decoupling DXIL + // version numbering from that of Shader Model DXIL version 1.Y corresponds to + // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull + if (Components[0] == "dxil") { +if (Components.size() > 4) { + Components.resize(4); +} +// Add DXIL version only if shadermodel is specified in the triple +if (OS == Triple::ShaderModel) { + VersionTuple Ver = + parseVersionFromName(Components[2].drop_front(strlen("shadermodel"))); + // Default DXIL minor version when Shader Model version is anything other + // than 6.[0...8] or 6.x (which translates to latest current SM version) + // DXIL version corresponding to Shader Model version other than 6.x + // is 1.0 + unsigned DXILMinor = 0; + const unsigned SMMajor = 6; + const unsigned LatestCurrentDXILMinor = 8; + if (!Ver.empty()) { +if (Ver.getMajor() == SMMajor) { + if (std::optional SMMinor = Ver.getMinor()) { +DXILMinor = *SMMinor; +// Ensure specified minor version is supported +if (DXILMinor > LatestCurrentDXILMinor) { + report_fatal_error("Unsupported Shader Model version", false); +} + } +} + } else { +// Special case: DXIL minor version is set to LatestCurrentDXILMinor for +// shadermodel6.x is +if (Components[2] == "shadermodel6.x") { + DXILMinor = LatestCurrentDXILMinor; +} + } + Components[0] = + Components[0].str().append("v1.").append(std::to_string(DXILMinor)); llvm-beanz wrote: @bharadwajy this is your asan failure. You’re setting a stringref to a locally modified string temporary. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy closed https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 3b74e41492aeb916487105b05316f8db255c57c3 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/7] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 558e4db46f8182..8286e3be21803f 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs(Res.getAPINotesOpts(), Args, Diags); @@ -4901,7 +4902,7 @@ std:
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 94204f59e92473bb19333f40a2250b64a398191a e739a33712f15e0d1fe1d9a121a564418a449437 -- clang/lib/Basic/Targets.cpp clang/lib/Driver/ToolChains/HLSL.cpp clang/test/CodeGenHLSL/basic-target.c clang/unittests/Driver/DXCModeTest.cpp llvm/include/llvm/TargetParser/Triple.h llvm/lib/IR/Verifier.cpp llvm/lib/TargetParser/Triple.cpp llvm/unittests/TargetParser/TripleTest.cpp `` View the diff from clang-format here. ``diff diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 59a2cfd4eb..a6989790a9 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -1244,10 +1244,12 @@ std::string Triple::normalize(StringRef Str) { } // Add DXIL version only if shadermodel is specified in the triple if (OS == Triple::ShaderModel) { - VersionTuple Ver = parseVersionFromName(Components[2].drop_front(strlen("shadermodel"))); - // Default DXIL minor version when Shader Model version is anything other than - // 6.[0...8] or 6.x (which translates to latest current SM version) - // DXIL version corresponding to Shader Model version other than 6.x is 1.0 + VersionTuple Ver = + parseVersionFromName(Components[2].drop_front(strlen("shadermodel"))); + // Default DXIL minor version when Shader Model version is anything other + // than 6.[0...8] or 6.x (which translates to latest current SM version) + // DXIL version corresponding to Shader Model version other than 6.x + // is 1.0 unsigned DXILMinor = 0; const unsigned SMMajor = 6; const unsigned LatestCurrentDXILMinor = 8; diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index 025e3faa4b..3112014d9e 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -2467,6 +2467,7 @@ TEST(TripleTest, DXILNormaizeWithVersion) { EXPECT_EQ("dxilv1.8-unknown-shadermodel6.x-unknown", Triple::normalize("dxil-unknown-shadermodel6.x-unknown")); EXPECT_EQ("dxil-unknown-unknown-unknown", Triple::normalize("dxil---")); - EXPECT_EQ("dxilv1.0-pc-shadermodel5.0-compute", Triple::normalize("dxil-shadermodel5.0-pc-compute")); + EXPECT_EQ("dxilv1.0-pc-shadermodel5.0-compute", +Triple::normalize("dxil-shadermodel5.0-pc-compute")); } } // end anonymous namespace `` https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 3b74e41492aeb916487105b05316f8db255c57c3 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/6] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 558e4db46f8182..8286e3be21803f 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs(Res.getAPINotesOpts(), Args, Diags); @@ -4901,7 +4902,7 @@ std:
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -2454,4 +2454,19 @@ TEST(TripleTest, isArmMClass) { EXPECT_TRUE(T.isArmMClass()); } } + +TEST(TripleTest, DXILNormaizeWithVersion) { + EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0", +Triple::normalize("dxilv1.0--shadermodel6.0")); bharadwajy wrote: > Do we need a rule for what is legal or not? I expect such validation to be part of later compiler passes. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -2454,4 +2454,19 @@ TEST(TripleTest, isArmMClass) { EXPECT_TRUE(T.isArmMClass()); } } + +TEST(TripleTest, DXILNormaizeWithVersion) { + EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0", +Triple::normalize("dxilv1.0--shadermodel6.0")); bharadwajy wrote: > So Triple::normalize("dxilv1.2--shadermodel6.0") will get > "dxilv1.2-unknown-shadermodel6.0"? Yes. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -2454,4 +2454,19 @@ TEST(TripleTest, isArmMClass) { EXPECT_TRUE(T.isArmMClass()); } } + +TEST(TripleTest, DXILNormaizeWithVersion) { + EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0", +Triple::normalize("dxilv1.0--shadermodel6.0")); python3kgae wrote: Do we need a rule for what is legal or not? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -2454,4 +2454,19 @@ TEST(TripleTest, isArmMClass) { EXPECT_TRUE(T.isArmMClass()); } } + +TEST(TripleTest, DXILNormaizeWithVersion) { + EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0", +Triple::normalize("dxilv1.0--shadermodel6.0")); python3kgae wrote: So Triple::normalize("dxilv1.2--shadermodel6.0") will get "dxilv1.2-unknown-shadermodel6.0"? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy edited https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -2454,4 +2454,19 @@ TEST(TripleTest, isArmMClass) { EXPECT_TRUE(T.isArmMClass()); } } + +TEST(TripleTest, DXILNormaizeWithVersion) { + EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0", +Triple::normalize("dxilv1.0--shadermodel6.0")); bharadwajy wrote: > What will Triple::normalize("dxilv1.0--shadermodel6.2") expect equal? > "dxilv1.2-unknown-shadermodel6.2"? No. Since DXIL version is specified in the triple, it is honored as is. So, it will be `dxilv1.0-unknown-shadermodel6.2` https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -2454,4 +2454,19 @@ TEST(TripleTest, isArmMClass) { EXPECT_TRUE(T.isArmMClass()); } } + +TEST(TripleTest, DXILNormaizeWithVersion) { + EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0", +Triple::normalize("dxilv1.0--shadermodel6.0")); python3kgae wrote: What will Triple::normalize("dxilv1.0--shadermodel6.2") expect equal? "dxilv1.2-unknown-shadermodel6.2"? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/llvm-beanz approved this pull request. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -115,6 +115,30 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::dxil: +switch (SubArch) { +case Triple::NoSubArch: +case Triple::DXILSubArch_v1_0: + return "dxilv1.0"; +case Triple::DXILSubArch_v1_1: + return "dxilv1.1"; +case Triple::DXILSubArch_v1_2: + return "dxilv1.2"; +case Triple::DXILSubArch_v1_3: + return "dxilv1.3"; +case Triple::DXILSubArch_v1_4: + return "dxilv1.4"; +case Triple::DXILSubArch_v1_5: + return "dxilv1.5"; +case Triple::DXILSubArch_v1_6: + return "dxilv1.6"; +case Triple::DXILSubArch_v1_7: + return "dxilv1.7"; +case Triple::DXILSubArch_v1_8: + return "dxilv1.8"; +default: + return ""; bharadwajy wrote: > I would argue that returning an empty string here is just as inconsistent as > erroring out/crashing. We should probably just do (2) even though it's > obviously ridiculous, since for other architectures if you provide an invalid > subarch they are indeed just as ridiculous. OK. Pushed a change that uses option (2). https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -744,7 +744,7 @@ void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, Expected> codegen::createTargetMachineForTriple(StringRef TargetTriple, CodeGenOptLevel OptLevel) { - Triple TheTriple(TargetTriple); + Triple TheTriple(TargetTriple.str()); bharadwajy wrote: > This looks redundant - doesn't Triple's constructor do the conversion to > `std::string` from Twine internally? Thanks for flagging my incomplete restoration. Fixed. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 1b6bb5bf115c9f72adde27b6d77d957edbc49321 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/6] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -744,7 +744,7 @@ void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, Expected> codegen::createTargetMachineForTriple(StringRef TargetTriple, CodeGenOptLevel OptLevel) { - Triple TheTriple(TargetTriple); + Triple TheTriple(TargetTriple.str()); bogner wrote: This looks redundant - doesn't Triple's constructor do the conversion to `std::string` from Twine internally? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bogner approved this pull request. Other than [my comment here](https://github.com/llvm/llvm-project/pull/90809/files#r1589771652) about what to do in getArchName this looks reasonable. The string handling in `normalize` feels a bit unwieldy, but I don't have any obvious thoughts for how to simplify it. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bogner edited https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -630,7 +630,7 @@ extern "C" int optMain( } } - Triple ModuleTriple(M->getTargetTriple()); + Triple ModuleTriple(Triple::normalize(M->getTargetTriple())); bharadwajy wrote: > Similarly to my concern about updating `createTargetMachineForTriple`, I > don't think opt should messing with the triple it's given. Deleted call to `normalize()`. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 1b6bb5bf115c9f72adde27b6d77d957edbc49321 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/5] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -744,7 +744,7 @@ void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, Expected> codegen::createTargetMachineForTriple(StringRef TargetTriple, CodeGenOptLevel OptLevel) { - Triple TheTriple(TargetTriple); + Triple TheTriple(llvm::Triple::normalize(TargetTriple.str())); bharadwajy wrote: > It's a bit of a grey area because this function is only really used by > testing tools but I don't think we should normalize here. If someone is > running llvm-reduce or one of the fuzzers on a module with an invalid triple > they may well be doing that intentionally. OK. Deleted the call to `normalize()` and restored the MIR test. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 1b6bb5bf115c9f72adde27b6d77d957edbc49321 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/4] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); bharadwajy wrote: > IIUC `getTargetOpts().Triple` should _already_ be normalized. The definition > of the option includes a "Normalizer", like so: Thanks for pointing this out. deleted the extraneously added calls to `normalize()`. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 1b6bb5bf115c9f72adde27b6d77d957edbc49321 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/3] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy edited https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -1200,6 +1224,27 @@ std::string Triple::normalize(StringRef Str) { } } + // Normalize DXIL triple if it does not include DXIL version number. + // Determine DXIL version number using the minor version number of Shader + // Model version specified in target triple, if any. Prior to decoupling DXIL + // version numbering from that of Shader Model DXIL version 1.Y corresponds to + // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull + if (Components[0] == "dxil") { +std::string DXILVerStr{"dxilv1."}; +if (Components.size() > 2) { + // OS component specified + if (Components[2].starts_with("shadermodel6.")) { +Components[0] = DXILVerStr.append( +Components[2].drop_front(strlen("shadermodel6."))); + } else if (Components[2].starts_with("shadermodel")) { +// If shader model specified is other than 6.x, set DXIL Version to 1.0 +Components[0] = DXILVerStr.append("0"); + } +} +// DXIL version is not set for a non-specified OS string or one that does +// not starts with shadermodel. + } + bharadwajy wrote: > We should add unit tests to test the normalization. Additional unit tests added. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -1200,6 +1224,27 @@ std::string Triple::normalize(StringRef Str) { } } + // Normalize DXIL triple if it does not include DXIL version number. + // Determine DXIL version number using the minor version number of Shader + // Model version specified in target triple, if any. Prior to decoupling DXIL + // version numbering from that of Shader Model DXIL version 1.Y corresponds to + // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull + if (Components[0] == "dxil") { +std::string DXILVerStr{"dxilv1."}; +if (Components.size() > 2) { + // OS component specified + if (Components[2].starts_with("shadermodel6.")) { +Components[0] = DXILVerStr.append( +Components[2].drop_front(strlen("shadermodel6."))); + } else if (Components[2].starts_with("shadermodel")) { +// If shader model specified is other than 6.x, set DXIL Version to 1.0 +Components[0] = DXILVerStr.append("0"); + } +} bharadwajy wrote: The function `normalize` does not parse for `SubArch`. So, `SubArch` is not available for checking. An input DXIL triple string `Str` with or without version (e.g., `dxil-pc-shadermodel6.3` or `dxilv1.3-pc-shadermodel6.3` will set `Arch` to `Triple::dxil`. Implicit deduction and insertion of DXIL version should be done only is `Component[0] == "dxil"` and not otherwise. Hence the string equivalence check for "dxil" and not for `Arch == Triple::dxil`. However, made code changes to leverage Arch and OS values already parsed as suggested. A couple of additional sanity checks are also added. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy updated https://github.com/llvm/llvm-project/pull/90809 >From 1b6bb5bf115c9f72adde27b6d77d957edbc49321 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH 1/2] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case OfflineLibMinor: +// Always consider minor version x as the latest supported DXIL version +SubArch = llvm::Triple::LatestDXILSubArch; +break; + default: +// No DXIL Version corresponding to specified Shader Model version found +return std::nullopt; + } + T.setArch(Triple::ArchType::dxil, SubArch); T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() + VersionTuple(Major, Minor).getAsString()); T.setEnvironment(Kind); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 8312abc3603953..a2600174e02296 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -587,7 +587,8 @@ static bool FixupInvocation(CompilerInvocation &Invocation, LangOpts.SpeculativeLoadHardening = CodeGenOpts.SpeculativeLoadHardening; LangOpts.CurrentModule = LangOpts.ModuleName; - llvm::Triple T(TargetOpts.Triple); + llvm::Triple T(llvm::Triple::normalize(TargetOpts.Triple)); + llvm::Triple::ArchType Arch = T.getArch(); CodeGenOpts.CodeModel = TargetOpts.CodeModel; @@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); ParseAPINotesArgs
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -115,6 +115,30 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::dxil: +switch (SubArch) { +case Triple::NoSubArch: +case Triple::DXILSubArch_v1_0: + return "dxilv1.0"; +case Triple::DXILSubArch_v1_1: + return "dxilv1.1"; +case Triple::DXILSubArch_v1_2: + return "dxilv1.2"; +case Triple::DXILSubArch_v1_3: + return "dxilv1.3"; +case Triple::DXILSubArch_v1_4: + return "dxilv1.4"; +case Triple::DXILSubArch_v1_5: + return "dxilv1.5"; +case Triple::DXILSubArch_v1_6: + return "dxilv1.6"; +case Triple::DXILSubArch_v1_7: + return "dxilv1.7"; +case Triple::DXILSubArch_v1_8: + return "dxilv1.8"; +default: + return ""; bogner wrote: I would argue that returning an empty string here is just as inconsistent as erroring out/crashing. We should probably just do (2) even though it's obviously ridiculous, since for other architectures if you provide an invalid subarch they are indeed just as ridiculous. If we want to shore this up so that invalid sub architectures do something more sensible we should do it for all targets and in a separate change. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -744,7 +744,7 @@ void codegen::setFunctionAttributes(StringRef CPU, StringRef Features, Expected> codegen::createTargetMachineForTriple(StringRef TargetTriple, CodeGenOptLevel OptLevel) { - Triple TheTriple(TargetTriple); + Triple TheTriple(llvm::Triple::normalize(TargetTriple.str())); bogner wrote: It's a bit of a grey area because this function is only really used by testing tools but I don't think we should normalize here. If someone is running llvm-reduce or one of the fuzzers on a module with an invalid triple they may well be doing that intentionally. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -1200,6 +1224,27 @@ std::string Triple::normalize(StringRef Str) { } } + // Normalize DXIL triple if it does not include DXIL version number. + // Determine DXIL version number using the minor version number of Shader + // Model version specified in target triple, if any. Prior to decoupling DXIL + // version numbering from that of Shader Model DXIL version 1.Y corresponds to + // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull + if (Components[0] == "dxil") { +std::string DXILVerStr{"dxilv1."}; +if (Components.size() > 2) { + // OS component specified + if (Components[2].starts_with("shadermodel6.")) { +Components[0] = DXILVerStr.append( +Components[2].drop_front(strlen("shadermodel6."))); + } else if (Components[2].starts_with("shadermodel")) { +// If shader model specified is other than 6.x, set DXIL Version to 1.0 +Components[0] = DXILVerStr.append("0"); + } +} bogner wrote: This doesn't look right. We've already parsed `Arch` and `OS` above, so I would expect this logic to look something like: ```c++ if (Arch == Triple::DXIL && SubArch == Triple::NoSubArch) { VersionTuple Ver = OS != Triple::UnknownOS ? parseVersionFromName(Components[2]) : VersionTuple(); if (Ver) Components[0] = Components[0].append("1.").append(Ver.Minor); else (Ver) // default case... } ``` https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -630,7 +630,7 @@ extern "C" int optMain( } } - Triple ModuleTriple(M->getTargetTriple()); + Triple ModuleTriple(Triple::normalize(M->getTargetTriple())); bogner wrote: Similarly to my concern about updating `createTargetMachineForTriple`, I don't think opt should messing with the triple it's given. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); bogner wrote: IIUC `getTargetOpts().Triple` should *already* be normalized. The definition of the option includes a "Normalizer", like so: ``` def triple : Separate<["-"], "triple">, HelpText<"Specify target triple (e.g. i686-apple-darwin9)">, MarshallingInfoString, "llvm::Triple::normalize(llvm::sys::getDefaultTargetTriple())">, AlwaysEmit, Normalizer<"normalizeTriple">; ``` So I think we shouldn't need the call to normalizer in CompilerInvocation at all, and we should look at the other places we're adding it to make sure they all make sense. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/llvm-beanz commented: Given that @bogner had concerns about the other approach I think we should get him to review this before moving forward. That said, other than some missing unit test coverage I think this approach looks fine. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -1200,6 +1224,27 @@ std::string Triple::normalize(StringRef Str) { } } + // Normalize DXIL triple if it does not include DXIL version number. + // Determine DXIL version number using the minor version number of Shader + // Model version specified in target triple, if any. Prior to decoupling DXIL + // version numbering from that of Shader Model DXIL version 1.Y corresponds to + // SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull + if (Components[0] == "dxil") { +std::string DXILVerStr{"dxilv1."}; +if (Components.size() > 2) { + // OS component specified + if (Components[2].starts_with("shadermodel6.")) { +Components[0] = DXILVerStr.append( +Components[2].drop_front(strlen("shadermodel6."))); + } else if (Components[2].starts_with("shadermodel")) { +// If shader model specified is other than 6.x, set DXIL Version to 1.0 +Components[0] = DXILVerStr.append("0"); + } +} +// DXIL version is not set for a non-specified OS string or one that does +// not starts with shadermodel. + } + llvm-beanz wrote: We should add unit tests to test the normalization. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bob80905 approved this pull request. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); bharadwajy wrote: > Looks like part of this change is to normalize `Res.getTargetOpts().Triple` > in many places where it is used. > > Would it be possible to arrange it so that this is normalized in one place > earlier on, so all users of `getTargetOpts()` can assume that it is > normalized already? I believe the triple accessible using the expression `getTargetOpts().Triple` denotes the target options specified for the compilation. It seems appropriate to leave it unmodified (un-normalized) for reference or other purposes during compilation. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -115,6 +115,30 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::dxil: +switch (SubArch) { +case Triple::NoSubArch: bharadwajy wrote: > Why default is dxil1.0? No specific reason other than choose the most basic version. Your comment [here](https://github.com/llvm/llvm-project/pull/89823#discussion_r1581541937) appeared to indicate a similar default choice for SPIRV (viz., spirv32 being equivalent to spirv32_v1.0). I am open to suggestions for alternate default DXIL version choices. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -115,6 +115,30 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::dxil: +switch (SubArch) { +case Triple::NoSubArch: python3kgae wrote: Why default is dxil1.0? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); bharadwajy wrote: > I see. It is trying to add subarch for dxil. Could we allow Triple::NoSubArch > for dxil? `setArch(dxil, Triple::NoSubArch)` should work. > Backend could do the job to translate NoSubArch to the version based on > shader model. One of the principles I tried to adhere to in the implementation of part (2) is to pass an appropriately constructed DXIL target triple string at creation-time of (DXIL) TargetMachine instance to maintain consistency between all the fields of the instance of DXIL `Triple` viz., Data, Arch, SubArch etc. Delegating or expecting the backend to do the same may lead to inconsistencies in the Triple instance. What benefit do you see in letting Backend perform the same steps that can be performed at creation time? Of course, if the backend needs to change the triple information for any reason, it is still free to do so - but I think it should expect to have the target triple information that reflects command-line or IR module specification of target triple. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -115,6 +115,30 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::dxil: +switch (SubArch) { +case Triple::NoSubArch: +case Triple::DXILSubArch_v1_0: + return "dxilv1.0"; +case Triple::DXILSubArch_v1_1: + return "dxilv1.1"; +case Triple::DXILSubArch_v1_2: + return "dxilv1.2"; +case Triple::DXILSubArch_v1_3: + return "dxilv1.3"; +case Triple::DXILSubArch_v1_4: + return "dxilv1.4"; +case Triple::DXILSubArch_v1_5: + return "dxilv1.5"; +case Triple::DXILSubArch_v1_6: + return "dxilv1.6"; +case Triple::DXILSubArch_v1_7: + return "dxilv1.7"; +case Triple::DXILSubArch_v1_8: + return "dxilv1.8"; +default: + return ""; bharadwajy wrote: > Would we want to llvm_unreachable or otherwise fail here, or does the caller > handle this case well? The `default` case would be true for a call such as `getArchName(Triple::dxil, Triple::)`, where `NonDXILSubArch` is something other than `DXILSubArch_v1_[0..8]` (e.g., `MipsSubArch_r6`). I considered 3 options to handle this case: 1. Report failure / crash with a message indicating incorrect DXIL `SubArch`: not chosen as such behavior is not consistent with other `SuArch`s as pointed out [here](https://github.com/llvm/llvm-project/pull/89823/files#r1581314588) in the feedback for PR #89823. 2. Fall through to return the value of `getArchTypeName(Kind)` where `Kind` is `Triple::dxil` to return the string "dxil": not chosen since "dxil" does **not** represent the `ArchTypeName` for the `Arch/SubArch` combination of `Triple::dxil/Triple::` (e.g., `Triple::dxil//Triple::MipsSubArch_r6`) and returning "dxil" would indicate that it is a valid `ArchTypeName`. 3. Return null string (""): chosen to indicate that there is no valid `ArchTypeName` for the `Arch/SubArch` combination of `Triple::dxil/Triple::`(e.g., `Triple::dxil/Triple::MipsSubArch_r6`). The consumer of the Triple checks for validity of Arch to issue an error for a non-viable empty architecture name as I think it is a cleaner option compared to either reporting a failure or asserting here. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -4675,7 +4676,7 @@ bool CompilerInvocation::CreateFromArgsImpl( // FIXME: We shouldn't have to pass the DashX option around here InputKind DashX = Res.getFrontendOpts().DashX; ParseTargetArgs(Res.getTargetOpts(), Args, Diags); - llvm::Triple T(Res.getTargetOpts().Triple); + llvm::Triple T(llvm::Triple::normalize(Res.getTargetOpts().Triple)); damyanp wrote: Looks like part of this change is to normalize `Res.getTargetOpts().Triple` in many places where it is used. Would it be possible to arrange it so that this is normalized in one place earlier on, so all users of `getTargetOpts()` can assume that it is normalized already? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/damyanp approved this pull request. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/damyanp edited https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); python3kgae wrote: I see. It is trying to add subarch for dxil. Could we allow Triple::NoSubArch for dxil? Backend could do the job to translate NoSubArch to the version based on shader model. https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); python3kgae wrote: Why do we need to call llvm::Triple::normalize here? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
@@ -115,6 +115,30 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::dxil: +switch (SubArch) { +case Triple::NoSubArch: +case Triple::DXILSubArch_v1_0: + return "dxilv1.0"; +case Triple::DXILSubArch_v1_1: + return "dxilv1.1"; +case Triple::DXILSubArch_v1_2: + return "dxilv1.2"; +case Triple::DXILSubArch_v1_3: + return "dxilv1.3"; +case Triple::DXILSubArch_v1_4: + return "dxilv1.4"; +case Triple::DXILSubArch_v1_5: + return "dxilv1.5"; +case Triple::DXILSubArch_v1_6: + return "dxilv1.6"; +case Triple::DXILSubArch_v1_7: + return "dxilv1.7"; +case Triple::DXILSubArch_v1_8: + return "dxilv1.8"; +default: + return ""; bob80905 wrote: Would we want to llvm_unreachable or otherwise fail here, or does the caller handle this case well? https://github.com/llvm/llvm-project/pull/90809 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
llvmbot wrote: @llvm/pr-subscribers-llvm-ir @llvm/pr-subscribers-hlsl Author: S. Bharadwaj Yadavalli (bharadwajy) Changes An earlier commit provided a way to decouple DXIL version from Shader Model version by representing the DXIL version as `SubArch` in the DXIL Target Triple and adding corresponding valid DXIL Arch types. This change constructs DXIL target triple with DXIL version that is deduced from Shader Model version specified in the following scenarios: 1. When compilation target profile is specified: For e.g., DXIL target triple `dxilv1.8-unknown-shader6.8-library` is constructed when `-T lib_6_8` is specified. 2. When DXIL target triple without DXIL version is specified: For e.g., DXIL target triple `dxilv1.8-pc-shadermodel6.8-library` is constructed when `-mtriple=dxil-pc-shadermodel6.8-library` is specified. Note that this is an alternate / expanded implementation to that proposed in PR #89823. PR #89823 implements functionality (1) above. However, it requires any DXIL target triple to explicitly include DXIL version anywhere DXIL target triple is expected (e.g., `dxilv1.8-pc-shadermodel6.8-library`) while a triple without DXIL version (e.g., `dxil-pc-shadermodel6.8-library`) is considered invalid. This functionality is implemented as a change to `tryParseProfile()` and is included in this PR. This PR adds the functionality (2) to eliminate the above requirement to explicitly specify DXIL version in the target triple thereby considering a triple without DXIL version ( e.g., `dxil-pc-shadermodel6.8-library`) to be valid. A triple with DXIL version is inferred based on the shader mode version specified. If no shader model version is specified, DXIL version is defaulted to 1.0. This functionality is implemented in the "Special case logic ..." section of `Triple::normalize()`. Updated relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. Validated that Clang (`check-clang`) and LLVM (`check-llvm`) regression tests pass. --- Full diff: https://github.com/llvm/llvm-project/pull/90809.diff 13 Files Affected: - (modified) clang/lib/Basic/Targets.cpp (+1-1) - (modified) clang/lib/Driver/ToolChains/HLSL.cpp (+42-2) - (modified) clang/lib/Frontend/CompilerInvocation.cpp (+4-3) - (modified) clang/test/CodeGenHLSL/basic-target.c (+1-1) - (modified) clang/test/Driver/dxc_dxv_path.hlsl (+3-3) - (modified) clang/test/Options/enable_16bit_types_validation.hlsl (+2-2) - (modified) clang/unittests/Driver/DXCModeTest.cpp (+12-10) - (modified) llvm/include/llvm/TargetParser/Triple.h (+1) - (modified) llvm/lib/CodeGen/CommandFlags.cpp (+1-1) - (modified) llvm/lib/IR/Verifier.cpp (+2-2) - (modified) llvm/lib/TargetParser/Triple.cpp (+45) - (modified) llvm/test/tools/llvm-reduce/mir/infer-triple-unknown-target.mir (+1-1) - (modified) llvm/tools/opt/optdriver.cpp (+1-1) ``diff diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DXILSubArch_v1_4; +break; + case 5: +SubArch = llvm::Triple::DXILSubArch_v1_5; +break; + case 6: +SubArch = llvm::Triple::DXILSubArch_v1_6; +break; + case 7: +SubArch = llvm::Triple::DXILSubArch_v1_7; +break; + case 8: +SubArch = llvm::Triple::DXILSubArch_v1_8; +break; + case Offlin
[clang] [llvm] [DirectX][DXIL] Set DXIL Version in DXIL target triple based on shader model version (PR #90809)
https://github.com/bharadwajy created https://github.com/llvm/llvm-project/pull/90809 An earlier commit provided a way to decouple DXIL version from Shader Model version by representing the DXIL version as `SubArch` in the DXIL Target Triple and adding corresponding valid DXIL Arch types. This change constructs DXIL target triple with DXIL version that is deduced from Shader Model version specified in the following scenarios: 1. When compilation target profile is specified: For e.g., DXIL target triple `dxilv1.8-unknown-shader6.8-library` is constructed when `-T lib_6_8` is specified. 2. When DXIL target triple without DXIL version is specified: For e.g., DXIL target triple `dxilv1.8-pc-shadermodel6.8-library` is constructed when `-mtriple=dxil-pc-shadermodel6.8-library` is specified. Note that this is an alternate / expanded implementation to that proposed in PR #89823. PR #89823 implements functionality (1) above. However, it requires any DXIL target triple to explicitly include DXIL version anywhere DXIL target triple is expected (e.g., `dxilv1.8-pc-shadermodel6.8-library`) while a triple without DXIL version (e.g., `dxil-pc-shadermodel6.8-library`) is considered invalid. This functionality is implemented as a change to `tryParseProfile()` and is included in this PR. This PR adds the functionality (2) to eliminate the above requirement to explicitly specify DXIL version in the target triple thereby considering a triple without DXIL version ( e.g., `dxil-pc-shadermodel6.8-library`) to be valid. A triple with DXIL version is inferred based on the shader mode version specified. If no shader model version is specified, DXIL version is defaulted to 1.0. This functionality is implemented in the "Special case logic ..." section of `Triple::normalize()`. Updated relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. Validated that Clang (`check-clang`) and LLVM (`check-llvm`) regression tests pass. >From 1b6bb5bf115c9f72adde27b6d77d957edbc49321 Mon Sep 17 00:00:00 2001 From: Bharadwaj Yadavalli Date: Wed, 1 May 2024 14:42:42 -0400 Subject: [PATCH] Set DXIL Version in DXIL target triple based on shader model version a) specified as compilation target profile or b) specified as target triple string Update relevant HLSL tests that check for target triple. Update one MIR test to reflect use of normalized target triple. --- clang/lib/Basic/Targets.cpp | 2 +- clang/lib/Driver/ToolChains/HLSL.cpp | 44 +- clang/lib/Frontend/CompilerInvocation.cpp | 7 +-- clang/test/CodeGenHLSL/basic-target.c | 2 +- clang/test/Driver/dxc_dxv_path.hlsl | 6 +-- .../enable_16bit_types_validation.hlsl| 4 +- clang/unittests/Driver/DXCModeTest.cpp| 22 - llvm/include/llvm/TargetParser/Triple.h | 1 + llvm/lib/CodeGen/CommandFlags.cpp | 2 +- llvm/lib/IR/Verifier.cpp | 4 +- llvm/lib/TargetParser/Triple.cpp | 45 +++ .../mir/infer-triple-unknown-target.mir | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 13 files changed, 116 insertions(+), 27 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index e3283510c6aac7..dc1792b3471e6c 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -760,7 +760,7 @@ using namespace clang::targets; TargetInfo * TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr &Opts) { - llvm::Triple Triple(Opts->Triple); + llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple)); // Construct the target std::unique_ptr Target = AllocateTarget(Triple, *Opts); diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp index 1169b5d8c92dd6..c4c92613f44723 100644 --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -98,9 +98,49 @@ std::optional tryParseProfile(StringRef Profile) { else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor)) return std::nullopt; - // dxil-unknown-shadermodel-hull + // Determine DXIL version using the minor version number of Shader + // Model version specified in target profile. Prior to decoupling DXIL version + // numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y. + // E.g., dxilv1.Y-unknown-shadermodelX.Y-hull llvm::Triple T; - T.setArch(Triple::ArchType::dxil); + Triple::SubArchType SubArch = llvm::Triple::NoSubArch; + switch (Minor) { + case 0: +SubArch = llvm::Triple::DXILSubArch_v1_0; +break; + case 1: +SubArch = llvm::Triple::DXILSubArch_v1_1; +break; + case 2: +SubArch = llvm::Triple::DXILSubArch_v1_2; +break; + case 3: +SubArch = llvm::Triple::DXILSubArch_v1_3; +break; + case 4: +SubArch = llvm::Triple::DX