diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 70a0979..776a646 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -1109,10 +1109,16 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, // Add vscale_range attribute if appropriate. llvm::StringMap<bool> FeatureMap; - bool IsArmStreaming = false; + auto IsArmStreaming = TargetInfo::ArmStreamingKind::NotStreaming; if (FD) { getContext().getFunctionFeatureMap(FeatureMap, FD); - IsArmStreaming = IsArmStreamingFunction(FD, true); + if (const auto *T = FD->getType()->getAs<FunctionProtoType>()) + if (T->getAArch64SMEAttributes() & + FunctionType::SME_PStateSMCompatibleMask) + IsArmStreaming = TargetInfo::ArmStreamingKind::StreamingCompatible; + + if (IsArmStreamingFunction(FD, true)) + IsArmStreaming = TargetInfo::ArmStreamingKind::Streaming; } std::optional<std::pair<unsigned, unsigned>> VScaleRange = getContext().getTargetInfo().getVScaleRange(getLangOpts(), IsArmStreaming, |