================
@@ -11145,7 +11148,24 @@ bool Sema::areMultiversionVariantFunctionsCompatible(
     FunctionType::ExtInfo OldTypeInfo = OldType->getExtInfo();
     FunctionType::ExtInfo NewTypeInfo = NewType->getExtInfo();
 
-    if (OldTypeInfo.getCC() != NewTypeInfo.getCC())
+    const auto *OldFPT = OldFD->getType()->getAs<FunctionProtoType>();
+    const auto *NewFPT = NewFD->getType()->getAs<FunctionProtoType>();
+
+    bool ArmStreamingCCMismatched = false;
+    // Locally streaming does not affect the calling convention.
+    if (OldFPT && NewFPT && !OldFD->hasAttr<ArmLocallyStreamingAttr>() &&
+        !NewFD->hasAttr<ArmLocallyStreamingAttr>()) {
----------------
sdesmalen-arm wrote:

I also think there is no need to disallow cases where one of the functions is 
`__arm_streaming_compatible`, e.g.

```
__attribute__((target_clones("sve", "simd"))) void n_callee(void) {}
__attribute__((target_version("sme2"))) void n_callee(void) 
__arm_streaming_compatible {}
__attribute__((target_version("default"))) void n_callee(void) {}

void s_caller(void) __arm_streaming {
  n_callee();
}
```
because all three versions of `n_callee` can be called from non-streaming mode, 
so from the perspective of the implementation of `s_caller`, it's fine for it 
to just do:
```
smstop
bl n_callee
smstart
```

https://github.com/llvm/llvm-project/pull/100181
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to