================
@@ -485,6 +485,24 @@ ABIArgInfo AArch64ABIInfo::classifyArgumentType(QualType 
Ty, bool IsVariadicFn,
     }
     Size = llvm::alignTo(Size, Alignment);
 
+    // If the Aggregate is made up of pointers, use an array of pointers for 
the
+    // coerced type. This prevents having to convert ptr2int->int2ptr through
+    // the call, allowing alias analysis to produce better code.
+    if (const RecordType *RT = Ty->getAs<RecordType>()) {
+      if (const RecordDecl *RD = RT->getDecl()) {
+        if (all_of(RD->fields(), [](FieldDecl *FD) {
+              return FD->getType()->isPointerOrReferenceType();
----------------
efriedma-quic wrote:

Correctly collecting all the relevant information is much more complicated than 
this, in general.  See ABIInfo::isHomogeneousAggregate.  This mostly results in 
missed optimizations, probably, but I'm concerned this could impact correctness 
in some C++ corner cases.

You also need to worry about pointers that aren't 64 bits wide.

Please add some testcases for unions. (I don't care if we're conservative for 
now, just make sure it doesn't explode.)

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

Reply via email to