[clang] [Clang][AArch64] Warn when calling streaming/non-streaming about vect… (PR #79842)

Dinar Temirbulatov via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 4 05:42:19 PST 2024


================
@@ -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);
+      }
----------------
dtemirbulatov wrote:

Done.

https://github.com/llvm/llvm-project/pull/79842


More information about the cfe-commits mailing list