================ @@ -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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits