Skip to content

Commit a2face4

Browse files
authored
[DXIL] Add DXIL SubArch to correspond to version number (#89125)
This change is in line with similar notation in SPIRV. Decoupling version numbering of DXIL and of Shader Model is intended to enable accurate specification of DXIL features that can be targeted by different Shader Model versions.
1 parent 0dcabba commit a2face4

File tree

3 files changed

+110
-1
lines changed

3 files changed

+110
-1
lines changed

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,17 @@ class Triple {
165165
SPIRVSubArch_v14,
166166
SPIRVSubArch_v15,
167167
SPIRVSubArch_v16,
168+
169+
// DXIL sub-arch corresponds to its version.
170+
DXILSubArch_v1_0,
171+
DXILSubArch_v1_1,
172+
DXILSubArch_v1_2,
173+
DXILSubArch_v1_3,
174+
DXILSubArch_v1_4,
175+
DXILSubArch_v1_5,
176+
DXILSubArch_v1_6,
177+
DXILSubArch_v1_7,
178+
DXILSubArch_v1_8,
168179
};
169180
enum VendorType {
170181
UnknownVendor,

llvm/lib/TargetParser/Triple.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,9 @@ static Triple::ArchType parseArch(StringRef ArchName) {
573573
.Case("csky", Triple::csky)
574574
.Case("loongarch32", Triple::loongarch32)
575575
.Case("loongarch64", Triple::loongarch64)
576-
.Case("dxil", Triple::dxil)
576+
.Cases("dxil", "dxilv1.0", "dxilv1.1", "dxilv1.2", "dxilv1.3",
577+
"dxilv1.4", "dxilv1.5", "dxilv1.6", "dxilv1.7", "dxilv1.8",
578+
Triple::dxil)
577579
.Case("xtensa", Triple::xtensa)
578580
.Default(Triple::UnknownArch);
579581

@@ -741,6 +743,19 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) {
741743
.EndsWith("v1.6", Triple::SPIRVSubArch_v16)
742744
.Default(Triple::NoSubArch);
743745

746+
if (SubArchName.starts_with("dxil"))
747+
return StringSwitch<Triple::SubArchType>(SubArchName)
748+
.EndsWith("v1.0", Triple::DXILSubArch_v1_0)
749+
.EndsWith("v1.1", Triple::DXILSubArch_v1_1)
750+
.EndsWith("v1.2", Triple::DXILSubArch_v1_2)
751+
.EndsWith("v1.3", Triple::DXILSubArch_v1_3)
752+
.EndsWith("v1.4", Triple::DXILSubArch_v1_4)
753+
.EndsWith("v1.5", Triple::DXILSubArch_v1_5)
754+
.EndsWith("v1.6", Triple::DXILSubArch_v1_6)
755+
.EndsWith("v1.7", Triple::DXILSubArch_v1_7)
756+
.EndsWith("v1.8", Triple::DXILSubArch_v1_8)
757+
.Default(Triple::NoSubArch);
758+
744759
StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
745760

746761
// For now, this is the small part. Early return.

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,109 +868,192 @@ TEST(TripleTest, ParsedIDs) {
868868

869869
T = Triple("dxil-unknown-shadermodel-pixel");
870870
EXPECT_EQ(Triple::dxil, T.getArch());
871+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
871872
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
872873
EXPECT_EQ(Triple::ShaderModel, T.getOS());
873874
EXPECT_EQ(Triple::Pixel, T.getEnvironment());
874875
EXPECT_FALSE(T.supportsCOMDAT());
875876

876877
T = Triple("dxil-unknown-shadermodel-vertex");
877878
EXPECT_EQ(Triple::dxil, T.getArch());
879+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
878880
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
879881
EXPECT_EQ(Triple::ShaderModel, T.getOS());
880882
EXPECT_EQ(Triple::Vertex, T.getEnvironment());
881883
EXPECT_FALSE(T.supportsCOMDAT());
882884

883885
T = Triple("dxil-unknown-shadermodel-geometry");
884886
EXPECT_EQ(Triple::dxil, T.getArch());
887+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
885888
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
886889
EXPECT_EQ(Triple::ShaderModel, T.getOS());
887890
EXPECT_EQ(Triple::Geometry, T.getEnvironment());
888891
EXPECT_FALSE(T.supportsCOMDAT());
889892

890893
T = Triple("dxil-unknown-shadermodel-hull");
891894
EXPECT_EQ(Triple::dxil, T.getArch());
895+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
892896
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
893897
EXPECT_EQ(Triple::ShaderModel, T.getOS());
894898
EXPECT_EQ(Triple::Hull, T.getEnvironment());
895899
EXPECT_FALSE(T.supportsCOMDAT());
896900

897901
T = Triple("dxil-unknown-shadermodel-domain");
898902
EXPECT_EQ(Triple::dxil, T.getArch());
903+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
899904
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
900905
EXPECT_EQ(Triple::ShaderModel, T.getOS());
901906
EXPECT_EQ(Triple::Domain, T.getEnvironment());
902907
EXPECT_FALSE(T.supportsCOMDAT());
903908

904909
T = Triple("dxil-unknown-shadermodel-compute");
905910
EXPECT_EQ(Triple::dxil, T.getArch());
911+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
906912
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
907913
EXPECT_EQ(Triple::ShaderModel, T.getOS());
908914
EXPECT_EQ(Triple::Compute, T.getEnvironment());
909915
EXPECT_FALSE(T.supportsCOMDAT());
910916

911917
T = Triple("dxil-unknown-shadermodel-library");
912918
EXPECT_EQ(Triple::dxil, T.getArch());
919+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
913920
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
914921
EXPECT_EQ(Triple::ShaderModel, T.getOS());
915922
EXPECT_EQ(Triple::Library, T.getEnvironment());
916923
EXPECT_FALSE(T.supportsCOMDAT());
917924

918925
T = Triple("dxil-unknown-shadermodel-raygeneration");
919926
EXPECT_EQ(Triple::dxil, T.getArch());
927+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
920928
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
921929
EXPECT_EQ(Triple::ShaderModel, T.getOS());
922930
EXPECT_EQ(Triple::RayGeneration, T.getEnvironment());
923931
EXPECT_FALSE(T.supportsCOMDAT());
924932

925933
T = Triple("dxil-unknown-shadermodel-intersection");
926934
EXPECT_EQ(Triple::dxil, T.getArch());
935+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
927936
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
928937
EXPECT_EQ(Triple::ShaderModel, T.getOS());
929938
EXPECT_EQ(Triple::Intersection, T.getEnvironment());
930939
EXPECT_FALSE(T.supportsCOMDAT());
931940

932941
T = Triple("dxil-unknown-shadermodel-anyhit");
933942
EXPECT_EQ(Triple::dxil, T.getArch());
943+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
934944
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
935945
EXPECT_EQ(Triple::ShaderModel, T.getOS());
936946
EXPECT_EQ(Triple::AnyHit, T.getEnvironment());
937947
EXPECT_FALSE(T.supportsCOMDAT());
938948

939949
T = Triple("dxil-unknown-shadermodel-closesthit");
940950
EXPECT_EQ(Triple::dxil, T.getArch());
951+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
941952
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
942953
EXPECT_EQ(Triple::ShaderModel, T.getOS());
943954
EXPECT_EQ(Triple::ClosestHit, T.getEnvironment());
944955
EXPECT_FALSE(T.supportsCOMDAT());
945956

946957
T = Triple("dxil-unknown-shadermodel-miss");
947958
EXPECT_EQ(Triple::dxil, T.getArch());
959+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
948960
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
949961
EXPECT_EQ(Triple::ShaderModel, T.getOS());
950962
EXPECT_EQ(Triple::Miss, T.getEnvironment());
951963
EXPECT_FALSE(T.supportsCOMDAT());
952964

953965
T = Triple("dxil-unknown-shadermodel-callable");
954966
EXPECT_EQ(Triple::dxil, T.getArch());
967+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
955968
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
956969
EXPECT_EQ(Triple::ShaderModel, T.getOS());
957970
EXPECT_EQ(Triple::Callable, T.getEnvironment());
958971
EXPECT_FALSE(T.supportsCOMDAT());
959972

960973
T = Triple("dxil-unknown-shadermodel-mesh");
961974
EXPECT_EQ(Triple::dxil, T.getArch());
975+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
962976
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
963977
EXPECT_EQ(Triple::ShaderModel, T.getOS());
964978
EXPECT_EQ(Triple::Mesh, T.getEnvironment());
965979
EXPECT_FALSE(T.supportsCOMDAT());
966980

967981
T = Triple("dxil-unknown-shadermodel-amplification");
968982
EXPECT_EQ(Triple::dxil, T.getArch());
983+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
969984
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
970985
EXPECT_EQ(Triple::ShaderModel, T.getOS());
971986
EXPECT_EQ(Triple::Amplification, T.getEnvironment());
972987
EXPECT_FALSE(T.supportsCOMDAT());
973988

989+
T = Triple("dxilv1.0-unknown-unknown");
990+
EXPECT_EQ(Triple::dxil, T.getArch());
991+
EXPECT_EQ(Triple::DXILSubArch_v1_0, T.getSubArch());
992+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
993+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
994+
995+
T = Triple("dxilv1.1-unknown-unknown");
996+
EXPECT_EQ(Triple::dxil, T.getArch());
997+
EXPECT_EQ(Triple::DXILSubArch_v1_1, T.getSubArch());
998+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
999+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1000+
1001+
T = Triple("dxilv1.2-unknown-unknown");
1002+
EXPECT_EQ(Triple::dxil, T.getArch());
1003+
EXPECT_EQ(Triple::DXILSubArch_v1_2, T.getSubArch());
1004+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1005+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1006+
1007+
T = Triple("dxilv1.3-unknown-unknown");
1008+
EXPECT_EQ(Triple::dxil, T.getArch());
1009+
EXPECT_EQ(Triple::DXILSubArch_v1_3, T.getSubArch());
1010+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1011+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1012+
1013+
T = Triple("dxilv1.4-unknown-unknown");
1014+
EXPECT_EQ(Triple::dxil, T.getArch());
1015+
EXPECT_EQ(Triple::DXILSubArch_v1_4, T.getSubArch());
1016+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1017+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1018+
1019+
T = Triple("dxilv1.5-unknown-unknown");
1020+
EXPECT_EQ(Triple::dxil, T.getArch());
1021+
EXPECT_EQ(Triple::DXILSubArch_v1_5, T.getSubArch());
1022+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1023+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1024+
1025+
T = Triple("dxilv1.6-unknown-unknown");
1026+
EXPECT_EQ(Triple::dxil, T.getArch());
1027+
EXPECT_EQ(Triple::DXILSubArch_v1_6, T.getSubArch());
1028+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1029+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1030+
1031+
T = Triple("dxilv1.7-unknown-unknown");
1032+
EXPECT_EQ(Triple::dxil, T.getArch());
1033+
EXPECT_EQ(Triple::DXILSubArch_v1_7, T.getSubArch());
1034+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1035+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1036+
1037+
T = Triple("dxilv1.8-unknown-unknown");
1038+
EXPECT_EQ(Triple::dxil, T.getArch());
1039+
EXPECT_EQ(Triple::DXILSubArch_v1_8, T.getSubArch());
1040+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1041+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1042+
1043+
// Check specification of unknown SubArch results in
1044+
// unknown architecture.
1045+
T = Triple("dxilv1.999-unknown-unknown");
1046+
EXPECT_EQ(Triple::UnknownArch, T.getArch());
1047+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
1048+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1049+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1050+
1051+
T = Triple("dxil-unknown-unknown");
1052+
EXPECT_EQ(Triple::dxil, T.getArch());
1053+
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
1054+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1055+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
1056+
9741057
T = Triple("xtensa");
9751058
EXPECT_EQ(Triple::xtensa, T.getArch());
9761059
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());

0 commit comments

Comments
 (0)