================
@@ -7513,6 +7516,36 @@ void Sema::checkCall(NamedDecl *FDecl, const
FunctionProtoType *Proto,
}
}
+ auto *CallerFD = dyn_cast<FunctionDecl>(CurContext);
+ bool IsCalleeStreaming =
+ (ExtInfo.AArch64SMEAttributes & FunctionType::SME_PStateSMEnabledMask);
+ bool IsCalleeStreamingCompatible =
+ (ExtInfo.AArch64SMEAttributes &
+ FunctionType::SME_PStateSMCompatibleMask);
+ bool IsBuiltin = (FD && FD->getBuiltinID());
+ AnyScalableArgsOrRet |= Proto->getReturnType()->isSizelessVectorType();
+
+ // If the caller is a function and the callee has a different
+ // non-compitable streaming attribute. If it passed any VL-based arguments
+ // or return VL-based value, then warn that the streaming and non-streaming
+ // vector lengths may be different.
+ if (CallerFD && Context.getTargetInfo().hasFeature("sme") && !IsBuiltin) {
+ ArmStreamingType CallerFnType = getArmStreamingFnType(CallerFD);
+ if (CallerFnType != ArmStreaming &&
+ CallerFnType != ArmStreamingCompatible) {
+ if (IsCalleeStreaming && AnyScalableArgsOrRet)
+ Diag(Loc, diag::warn_sme_streaming_pass_return_vl_to_non_streaming);
+ } else if (CallerFnType == ArmStreaming && !IsCalleeStreaming &&
+ !IsCalleeStreamingCompatible) {
+ if (AnyScalableArgsOrRet)
+ Diag(Loc, diag::warn_sme_streaming_pass_return_vl_to_non_streaming);
+ } else if (CallerFnType == ArmStreamingCompatible) {
+ if ((IsCalleeStreaming || !IsCalleeStreamingCompatible) &&
+ AnyScalableArgsOrRet)
+ Diag(Loc, diag::warn_sme_streaming_pass_return_vl_to_non_streaming);
+ }
----------------
sdesmalen-arm wrote:
Do you think you can simplify this code?
https://github.com/llvm/llvm-project/pull/79842
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits