Skip to content

Commit 4d105b5

Browse files
LittleMeepobryanpkc
authored andcommitted
[driver] Allow -msve-vector-bits=<n>+ syntax to mean no maximum vscale
1 parent ad6fce4 commit 4d105b5

File tree

3 files changed

+88
-19
lines changed

3 files changed

+88
-19
lines changed

clang/lib/Driver/ToolChains/ClassicFlang.cpp

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,37 +1030,50 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
10301030
}
10311031

10321032
// Add vscale range
1033-
unsigned vscaleMin = 1U;
1034-
unsigned vscaleMax = 16U;
1035-
bool hasVscaleRange = false;
1033+
unsigned vscaleMin = 0;
1034+
unsigned vscaleMax = 0;
1035+
bool hasSVE = false;
10361036
if (Arg *A = Args.getLastArg(options::OPT_msve_vector_bits_EQ)) {
10371037
StringRef Val = A->getValue();
1038-
1039-
if (Val.equals("scalable"))
1040-
hasVscaleRange = true;
1041-
else {
1042-
unsigned bits = (std::stoul(Val.str()) >> 7U);
1043-
1044-
if ((bits < vscaleMin) || (bits > vscaleMax)) {
1045-
D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
1046-
hasVscaleRange = false;
1047-
} else {
1048-
vscaleMin = vscaleMax = bits;
1049-
hasVscaleRange = true;
1038+
if (Val.equals("128") || Val.equals("256") || Val.equals("512") ||
1039+
Val.equals("1024") || Val.equals("2048") || Val.equals("128+") ||
1040+
Val.equals("256+") || Val.equals("512+") || Val.equals("1024+") ||
1041+
Val.equals("2048+")) {
1042+
unsigned Bits = 0;
1043+
if (Val.endswith("+"))
1044+
Val = Val.substr(0, Val.size() - 1);
1045+
else {
1046+
bool Invalid = Val.getAsInteger(10, Bits); (void)Invalid;
1047+
assert(!Invalid && "Failed to parse value");
1048+
vscaleMax = Bits / 128;
10501049
}
1051-
}
1050+
1051+
bool Invalid = Val.getAsInteger(10, Bits); (void)Invalid;
1052+
assert(!Invalid && "Failed to parse value");
1053+
vscaleMin = Bits / 128;
1054+
} else if (!Val.equals("scalable"))
1055+
getToolChain().getDriver().Diag(diag::warn_drv_clang_unsupported)
1056+
<< A->getOption().getName() << Val;
10521057
}
10531058
for (auto Feature : unifyTargetFeatures(Features)) {
10541059
if (Feature.startswith("+sve")) {
1055-
hasVscaleRange = true;
1060+
hasSVE = true;
10561061
break;
10571062
}
10581063
}
1059-
if (hasVscaleRange) {
1064+
if (vscaleMin || vscaleMax) {
10601065
LowerCmdArgs.push_back("-vscale_range_min");
1061-
LowerCmdArgs.push_back(Args.MakeArgString(std::to_string(vscaleMin)));
1066+
LowerCmdArgs.push_back(Args.MakeArgString(
1067+
std::to_string(vscaleMin ? vscaleMin : 1)));
10621068
LowerCmdArgs.push_back("-vscale_range_max");
10631069
LowerCmdArgs.push_back(Args.MakeArgString(std::to_string(vscaleMax)));
1070+
} else {
1071+
if (hasSVE) {
1072+
LowerCmdArgs.push_back("-vscale_range_min");
1073+
LowerCmdArgs.push_back(Args.MakeArgString(std::to_string(1)));
1074+
LowerCmdArgs.push_back("-vscale_range_max");
1075+
LowerCmdArgs.push_back(Args.MakeArgString(std::to_string(16)));
1076+
}
10641077
}
10651078

10661079
// Set a -x flag for second part of Fortran frontend
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve -msve-vector-bits=128 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE-128 %s
2+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve -msve-vector-bits=128+ %s 2>&1 | FileCheck -check-prefix=CHECK-SVE-128PLUS %s
3+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve -msve-vector-bits=256 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE-256 %s
4+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve -msve-vector-bits=256+ %s 2>&1 | FileCheck -check-prefix=CHECK-SVE-256PLUS %s
5+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2 -msve-vector-bits=512 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2-512 %s
6+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2 -msve-vector-bits=512+ %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2-512PLUS %s
7+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2-sha3 -msve-vector-bits=2048 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2SHA3-2048 %s
8+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2-sha3 -msve-vector-bits=2048+ %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2SHA3-2048PLUS %s
9+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2 -msve-vector-bits=scalable %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2-SCALABLE %s
10+
11+
// CHECK-SVE-128: "-target_features" "+neon,+v8a,+sve"
12+
// CHECK-SVE-128-DAG: "-vscale_range_min" "1" "-vscale_range_max" "1"
13+
// CHECK-SVE-128PLUS: "-target_features" "+neon,+v8a,+sve"
14+
// CHECK-SVE-128PLUS-DAG: "-vscale_range_min" "1" "-vscale_range_max" "0"
15+
// CHECK-SVE-256: "-target_features" "+neon,+v8a,+sve"
16+
// CHECK-SVE-256-DAG: "-vscale_range_min" "2" "-vscale_range_max" "2"
17+
// CHECK-SVE-256PLUS: "-target_features" "+neon,+v8a,+sve"
18+
// CHECK-SVE-256PLUS-DAG: "-vscale_range_min" "2" "-vscale_range_max" "0"
19+
// CHECK-SVE2-512: "-target_features" "+neon,+v8a,+sve2,+sve"
20+
// CHECK-SVE2-512-DAG: "-vscale_range_min" "4" "-vscale_range_max" "4"
21+
// CHECK-SVE2-512PLUS: "-target_features" "+neon,+v8a,+sve2,+sve"
22+
// CHECK-SVE2-512PLUS-DAG: "-vscale_range_min" "4" "-vscale_range_max" "0"
23+
// CHECK-SVE2SHA3-2048: "-target_features" "+neon,+v8a,+sve2-sha3,+sve,+sve2"
24+
// CHECK-SVE2SHA3-2048-DAG: "-vscale_range_min" "16" "-vscale_range_max" "16"
25+
// CHECK-SVE2SHA3-2048PLUS: "-target_features" "+neon,+v8a,+sve2-sha3,+sve,+sve2"
26+
// CHECK-SVE2SHA3-2048PLUS-DAG: "-vscale_range_min" "16" "-vscale_range_max" "0"
27+
// CHECK-SVE2-SCALABLE: "-target_features" "+neon,+v8a,+sve2,+sve"
28+
// CHECK-SVE2-SCALABLE-DAG: "-vscale_range_min" "1" "-vscale_range_max" "16"
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a %s 2>&1 | FileCheck -check-prefix=CHECK-NEON %s
2+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve %s 2>&1 | FileCheck -check-prefix=CHECK-SVE %s
3+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2 %s
4+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2-sha3 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2SHA3 %s
5+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve+nosve %s 2>&1 | FileCheck -check-prefix=CHECK-SVE-NOSVE %s
6+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2+nosve2-sha3 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2-NOSVE2SHA3 %s
7+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2-sha3+nosve2 %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2SHA3-NOSVE2 %s
8+
// RUN: %clang --driver-mode=flang -### -S --target=aarch64 -march=armv8-a+sve2-sha3+nosve %s 2>&1 | FileCheck -check-prefix=CHECK-SVE2SHA3-NOSVE %s
9+
10+
// CHECK-NEON: "-target_features" "+neon,+v8a"
11+
// CHECK-NEON-NOT: "-vscale_range_min"
12+
// CHECK-NEON-NOT: "-vscale_range_max"
13+
// CHECK-SVE: "-target_features" "+neon,+v8a,+sve"
14+
// CHECK-SVE-DAG: "-vscale_range_min" "1" "-vscale_range_max" "16"
15+
// CHECK-SVE2: "-target_features" "+neon,+v8a,+sve2,+sve"
16+
// CHECK-SVE2-DAG: "-vscale_range_min" "1" "-vscale_range_max" "16"
17+
// CHECK-SVE2SHA3: "-target_features" "+neon,+v8a,+sve2-sha3,+sve,+sve2"
18+
// CHECK-SVE2SHA3-DAG: "-vscale_range_min" "1" "-vscale_range_max" "16"
19+
// CHECK-SVE-NOSVE: "-target_features" "+neon,+v8a,-sve,-sve2,-sve2-bitperm,-sve2-sha3,-sve2-aes,-sve2-sm4"
20+
// CHECK-SVE-NOSVE-NOT: "-vscale_range_min"
21+
// CHECK-SVE-NOSVE-NOT: "-vscale_range_max"
22+
// CHECK-SVE2-NOSVE2SHA3: "-target_features" "+neon,+v8a,+sve2,+sve,-sve2-sha3"
23+
// CHECK-SVE2-NOSVE2SHA3-DAG: "-vscale_range_min" "1" "-vscale_range_max" "16"
24+
// CHECK-SVE2SHA3-NOSVE2: "-target_features" "+neon,+v8a,+sve,-sve2,-sve2-bitperm,-sve2-sha3,-sve2-aes,-sve2-sm4"
25+
// CHECK-SVE2SHA3-NOSVE2-DAG: "-vscale_range_min" "1" "-vscale_range_max" "16"
26+
// CHECK-SVE2SHA3-NOSVE: "-target_features" "+neon,+v8a,-sve,-sve2,-sve2-bitperm,-sve2-sha3,-sve2-aes,-sve2-sm4"
27+
// CHECK-SVE2SHA3-NOSVE-NOT: "-vscale_range_min"
28+
// CHECK-SVE2SHA3-NOSVE-NOT: "-vscale_range_max"

0 commit comments

Comments
 (0)