Skip to content

Commit 2aa0f0a

Browse files
[AArch64] Add option -msve-streaming-vector-bits= . (#144611)
This is similar to -msve-vector-bits, but for streaming mode: it constrains the legal values of "vscale", allowing optimizations based on that constraint. This also fixes conversions between SVE vectors and fixed-width vectors in streaming functions with -msve-vector-bits and -msve-streaming-vector-bits. This rejects any use of arm_sve_vector_bits types in streaming functions; if it becomes relevant, we could add arm_sve_streaming_vector_bits types in the future. This doesn't touch the __ARM_FEATURE_SVE_BITS define.
1 parent 3c13257 commit 2aa0f0a

22 files changed

+324
-56
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,8 @@ Arm and AArch64 Support
972972

973973
- For AArch64, added support for generating executable-only code sections by using the
974974
``-mexecute-only`` or ``-mpure-code`` compiler flags. (#GH125688)
975+
- Added ``-msve-streaming-vector-bits=`` flag, which allows specifying the
976+
SVE vector width in streaming mode.
975977

976978
Android Support
977979
^^^^^^^^^^^^^^^

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3332,6 +3332,9 @@ def err_sve_vector_in_non_sve_target : Error<
33323332
"SVE vector type %0 cannot be used in a target without sve">;
33333333
def err_sve_vector_in_non_streaming_function : Error<
33343334
"SVE vector type %0 cannot be used in a non-streaming function">;
3335+
def err_sve_fixed_vector_in_streaming_function
3336+
: Error<"fixed width SVE vector type %0 cannot be used in a "
3337+
"%select{streaming|streaming-compatible}1 function">;
33353338
def err_attribute_riscv_rvv_bits_unsupported : Error<
33363339
"%0 is only supported when '-mrvv-vector-bits=<bits>' is specified with a "
33373340
"value of \"zvl\" or a power 2 in the range [64,65536]">;

clang/include/clang/Basic/LangOptions.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,9 @@ LANGOPT(OmitVTableRTTI, 1, 0,
503503
LANGOPT(VScaleMin, 32, 0, "Minimum vscale value")
504504
LANGOPT(VScaleMax, 32, 0, "Maximum vscale value")
505505

506+
LANGOPT(VScaleStreamingMin, 32, 0, "Minimum streaming vscale value")
507+
LANGOPT(VScaleStreamingMax, 32, 0, "Maximum streaming vscale value")
508+
506509
ENUM_LANGOPT(ExtendIntArgs, ExtendArgsKind, 1, ExtendArgsKind::ExtendTo32,
507510
"Controls how scalar integer arguments are extended in calls "
508511
"to unprototyped and varargs functions")

clang/include/clang/Basic/TargetInfo.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,9 +1034,15 @@ class TargetInfo : public TransferrableTargetInfo,
10341034
/// set of primary and secondary targets.
10351035
virtual llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const = 0;
10361036

1037+
enum class ArmStreamingKind {
1038+
NotStreaming,
1039+
StreamingCompatible,
1040+
Streaming,
1041+
};
1042+
10371043
/// Returns target-specific min and max values VScale_Range.
10381044
virtual std::optional<std::pair<unsigned, unsigned>>
1039-
getVScaleRange(const LangOptions &LangOpts, bool IsArmStreamingFunction,
1045+
getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode,
10401046
llvm::StringMap<bool> *FeatureMap = nullptr) const {
10411047
return std::nullopt;
10421048
}

clang/include/clang/Driver/Options.td

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5218,6 +5218,14 @@ def msve_vector_bits_EQ : Joined<["-"], "msve-vector-bits=">, Group<m_aarch64_Fe
52185218
Visibility<[ClangOption, FlangOption]>,
52195219
HelpText<"Specify the size in bits of an SVE vector register. Defaults to the"
52205220
" vector length agnostic value of \"scalable\". (AArch64 only)">;
5221+
def msve_streaming_vector_bits_EQ
5222+
: Joined<["-"], "msve-streaming-vector-bits=">,
5223+
Group<m_aarch64_Features_Group>,
5224+
Visibility<[ClangOption, FlangOption]>,
5225+
HelpText<
5226+
"Specify the size in bits of an SVE vector register in streaming "
5227+
"mode. Defaults to the vector length agnostic value of "
5228+
"\"scalable\". (AArch64 only)">;
52215229
} // let Flags = [TargetSpecific]
52225230

52235231
def mvscale_min_EQ : Joined<["-"], "mvscale-min=">,
@@ -5229,6 +5237,17 @@ def mvscale_max_EQ : Joined<["-"], "mvscale-max=">,
52295237
HelpText<"Specify the vscale maximum. Defaults to the"
52305238
" vector length agnostic value of \"0\". (AArch64/RISC-V only)">,
52315239
MarshallingInfoInt<LangOpts<"VScaleMax">>;
5240+
def mvscale_streaming_min_EQ
5241+
: Joined<["-"], "mvscale-streaming-min=">,
5242+
Visibility<[CC1Option, FC1Option]>,
5243+
HelpText<"Specify the vscale minimum. Defaults to \"1\". (AArch64 only)">,
5244+
MarshallingInfoInt<LangOpts<"VScaleStreamingMin">>;
5245+
def mvscale_streaming_max_EQ
5246+
: Joined<["-"], "mvscale-streaming-max=">,
5247+
Visibility<[CC1Option, FC1Option]>,
5248+
HelpText<"Specify the vscale maximum. Defaults to the"
5249+
" vector length agnostic value of \"0\". (AArch64 only)">,
5250+
MarshallingInfoInt<LangOpts<"VScaleStreamingMax">>;
52325251

52335252
def msign_return_address_EQ : Joined<["-"], "msign-return-address=">,
52345253
Visibility<[ClangOption, CC1Option]>,

clang/lib/AST/ASTContext.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10513,8 +10513,8 @@ bool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
1051310513
/// getRVVTypeSize - Return RVV vector register size.
1051410514
static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty) {
1051510515
assert(Ty->isRVVVLSBuiltinType() && "Invalid RVV Type");
10516-
auto VScale =
10517-
Context.getTargetInfo().getVScaleRange(Context.getLangOpts(), false);
10516+
auto VScale = Context.getTargetInfo().getVScaleRange(
10517+
Context.getLangOpts(), TargetInfo::ArmStreamingKind::NotStreaming);
1051810518
if (!VScale)
1051910519
return 0;
1052010520

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4273,7 +4273,8 @@ void CXXNameMangler::mangleRISCVFixedRVVVectorType(const VectorType *T) {
42734273

42744274
// Apend the LMUL suffix.
42754275
auto VScale = getASTContext().getTargetInfo().getVScaleRange(
4276-
getASTContext().getLangOpts(), false);
4276+
getASTContext().getLangOpts(),
4277+
TargetInfo::ArmStreamingKind::NotStreaming);
42774278
unsigned VLen = VScale->first * llvm::RISCV::RVVBitsPerBlock;
42784279

42794280
if (T->getVectorKind() == VectorKind::RVVFixedLengthData) {

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -750,16 +750,36 @@ AArch64TargetInfo::getTargetBuiltins() const {
750750

751751
std::optional<std::pair<unsigned, unsigned>>
752752
AArch64TargetInfo::getVScaleRange(const LangOptions &LangOpts,
753-
bool IsArmStreamingFunction,
753+
ArmStreamingKind Mode,
754754
llvm::StringMap<bool> *FeatureMap) const {
755-
if (LangOpts.VScaleMin || LangOpts.VScaleMax)
755+
if (Mode == ArmStreamingKind::NotStreaming &&
756+
(LangOpts.VScaleMin || LangOpts.VScaleMax))
756757
return std::pair<unsigned, unsigned>(
757-
LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax);
758+
LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
759+
LangOpts.VScaleMax ? LangOpts.VScaleMax : 16);
760+
761+
if (Mode == ArmStreamingKind::Streaming &&
762+
(LangOpts.VScaleStreamingMin || LangOpts.VScaleStreamingMax))
763+
return std::pair<unsigned, unsigned>(
764+
LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1,
765+
LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
766+
767+
if (Mode == ArmStreamingKind::StreamingCompatible &&
768+
((LangOpts.VScaleMin && LangOpts.VScaleStreamingMin) ||
769+
(LangOpts.VScaleMax && LangOpts.VScaleStreamingMax))) {
770+
unsigned Min =
771+
std::min(LangOpts.VScaleMin ? LangOpts.VScaleMin : 1,
772+
LangOpts.VScaleStreamingMin ? LangOpts.VScaleStreamingMin : 1);
773+
unsigned Max = std::max(
774+
LangOpts.VScaleMax ? LangOpts.VScaleMax : 16,
775+
LangOpts.VScaleStreamingMax ? LangOpts.VScaleStreamingMax : 16);
776+
return std::pair(Min, Max);
777+
}
758778

759779
if (hasFeature("sve") || (FeatureMap && (FeatureMap->lookup("sve"))))
760780
return std::pair<unsigned, unsigned>(1, 16);
761781

762-
if (IsArmStreamingFunction &&
782+
if (Mode == ArmStreamingKind::Streaming &&
763783
(hasFeature("sme") || (FeatureMap && (FeatureMap->lookup("sme")))))
764784
return std::pair<unsigned, unsigned>(1, 16);
765785

clang/lib/Basic/Targets/AArch64.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
196196
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;
197197

198198
std::optional<std::pair<unsigned, unsigned>>
199-
getVScaleRange(const LangOptions &LangOpts, bool IsArmStreamingFunction,
199+
getVScaleRange(const LangOptions &LangOpts, ArmStreamingKind Mode,
200200
llvm::StringMap<bool> *FeatureMap = nullptr) const override;
201201
bool doesFeatureAffectCodeGen(StringRef Name) const override;
202202
bool validateCpuSupports(StringRef FeatureStr) const override;

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
222222
// Currently we support the v1.0 RISC-V V intrinsics.
223223
Builder.defineMacro("__riscv_v_intrinsic", Twine(getVersionValue(1, 0)));
224224

225-
auto VScale = getVScaleRange(Opts, false);
225+
auto VScale = getVScaleRange(Opts, ArmStreamingKind::NotStreaming);
226226
if (VScale && VScale->first && VScale->first == VScale->second)
227227
Builder.defineMacro("__riscv_v_fixed_vlen",
228228
Twine(VScale->first * llvm::RISCV::RVVBitsPerBlock));
@@ -367,7 +367,7 @@ bool RISCVTargetInfo::initFeatureMap(
367367

368368
std::optional<std::pair<unsigned, unsigned>>
369369
RISCVTargetInfo::getVScaleRange(const LangOptions &LangOpts,
370-
bool IsArmStreamingFunction,
370+
ArmStreamingKind IsArmStreamingFunction,
371371
llvm::StringMap<bool> *FeatureMap) const {
372372
// RISCV::RVVBitsPerBlock is 64.
373373
unsigned VScaleMin = ISAInfo->getMinVLen() / llvm::RISCV::RVVBitsPerBlock;

0 commit comments

Comments
 (0)