llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-amdgpu

Author: Kunal Dubey  (xakep8)

<details>
<summary>Changes</summary>

Implemented AArch64 argument classification for fixed-size aggregates.

---

Patch is 49.77 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/229202.diff


15 Files Affected:

- (modified) clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp (+5-2) 
- (modified) clang/lib/CodeGen/QualTypeMapper.cpp (+26-13) 
- (modified) clang/lib/CodeGen/QualTypeMapper.h (+3-1) 
- (added) clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m (+46) 
- (modified) clang/test/CodeGen/AArch64/abi-classify-arg-types.c (+80-14) 
- (modified) clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp (+22-8) 
- (modified) clang/unittests/CodeGen/QualTypeMapperTest.cpp (+71) 
- (modified) llvm/include/llvm/ABI/Types.h (+27-4) 
- (modified) llvm/lib/ABI/Targets/AArch64.cpp (+54-2) 
- (modified) llvm/lib/ABI/Targets/AMDGPU.cpp (+3-3) 
- (modified) llvm/unittests/ABI/AArch64TargetInfoTest.cpp (+205-2) 
- (modified) llvm/unittests/ABI/AMDGPUTargetInfoTest.cpp (+6-3) 
- (modified) llvm/unittests/ABI/TypesTest.cpp (+23-1) 
- (modified) llvm/unittests/ABI/X86TargetInfoTest.cpp (+9-3) 
- (modified) mlir/lib/ABI/ABITypeMapper.cpp (+2-1) 


``````````diff
diff --git a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp 
b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
index 402cd09afd637..4d320aa159da9 100644
--- a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
@@ -361,16 +361,19 @@ static const llvm::abi::Type *mapCIRType(mlir::Type type,
                 dyn_cast_if_present<cir::TargetAddressSpaceAttr>(
                     ptrTy.getAddrSpace()))
           addrSpace = targetAsAttr.getValue();
+        // CIR does not preserve source-level pointer-kind information.
         return tb.getPointerType(dl.getTypeSizeInBits(type),
                                  llvm::Align(dl.getTypeABIAlignment(type)),
-                                 addrSpace);
+                                 addrSpace, llvm::abi::PointerFlags::None);
       })
       .Case([&](cir::VPtrType) {
         // cir::VPtrType carries no address-space parameter yet, so this
         // always maps into the default one until that gap closes.
         assert(!cir::MissingFeatures::addressSpace());
         return tb.getPointerType(dl.getTypeSizeInBits(type),
-                                 llvm::Align(dl.getTypeABIAlignment(type)));
+                                 llvm::Align(dl.getTypeABIAlignment(type)),
+                                 /*Addrspace=*/0,
+                                 
llvm::abi::PointerFlags::IsPointerOrReference);
       })
       .Case([&](cir::BoolType) {
         return tb.getIntegerType(dl.getTypeSizeInBits(type),
diff --git a/clang/lib/CodeGen/QualTypeMapper.cpp 
b/clang/lib/CodeGen/QualTypeMapper.cpp
index 5044883a49ca2..841e0dcdc9055 100644
--- a/clang/lib/CodeGen/QualTypeMapper.cpp
+++ b/clang/lib/CodeGen/QualTypeMapper.cpp
@@ -103,11 +103,14 @@ const llvm::abi::Type 
*QualTypeMapper::convertTypeImpl(QualType QT) {
   case Type::Builtin:
     return convertBuiltinType(cast<BuiltinType>(QT));
   case Type::Pointer:
-    return 
createPointerTypeForPointee(cast<PointerType>(QT)->getPointeeType());
+    return createPointerTypeForPointee(
+        cast<PointerType>(QT)->getPointeeType(),
+        llvm::abi::PointerFlags::IsPointerOrReference);
   case Type::LValueReference:
   case Type::RValueReference:
     return createPointerTypeForPointee(
-        cast<ReferenceType>(QT)->getPointeeType());
+        cast<ReferenceType>(QT)->getPointeeType(),
+        llvm::abi::PointerFlags::IsPointerOrReference);
   case Type::ConstantArray:
   case Type::ArrayParameter:
   case Type::IncompleteArray:
@@ -129,7 +132,8 @@ const llvm::abi::Type 
*QualTypeMapper::convertTypeImpl(QualType QT) {
   }
   case Type::BlockPointer:
   case Type::Pipe:
-    return createPointerTypeForPointee(ASTCtx.VoidPtrTy);
+    return createPointerTypeForPointee(ASTCtx.VoidPtrTy,
+                                       llvm::abi::PointerFlags::None);
   case Type::ConstantMatrix: {
     const auto *MT = cast<ConstantMatrixType>(QT);
     return Builder.getArrayType(convertType(MT->getElementType()),
@@ -146,13 +150,18 @@ const llvm::abi::Type 
*QualTypeMapper::convertTypeImpl(QualType QT) {
   }
   case Type::ObjCObject:
   case Type::ObjCInterface:
-  case Type::ObjCObjectPointer:
+  case Type::ObjCObjectPointer: {
     // Objective-C objects are represented as pointers in the ABI.
+    llvm::abi::PointerFlags Flags = llvm::abi::PointerFlags::None;
+    if (QT.hasAddressSpace())
+      Flags |= llvm::abi::PointerFlags::IsPointeeAddressSpaceQualified;
     return Builder.getPointerType(
         ASTCtx.getTargetInfo().getPointerWidth(QT.getAddressSpace()),
         llvm::Align(
             ASTCtx.getTargetInfo().getPointerAlign(QT.getAddressSpace()) / 8),
-        ASTCtx.getTargetInfo().getTargetAddressSpace(QT.getAddressSpace()));
+        ASTCtx.getTargetInfo().getTargetAddressSpace(QT.getAddressSpace()),
+        Flags);
+  }
   case Type::OverflowBehavior:
     return convertType(cast<OverflowBehaviorType>(QT)->getUnderlyingType());
   case Type::Auto:
@@ -178,7 +187,7 @@ QualTypeMapper::convertBuiltinType(const BuiltinType *BT) {
     return Builder.getVoidType();
 
   case BuiltinType::NullPtr:
-    return createPointerTypeForPointee(QT);
+    return createPointerTypeForPointee(QT, llvm::abi::PointerFlags::None);
 
   case BuiltinType::Bool:
     return Builder.getIntegerType(1, getTypeAlign(QT), /*Signed=*/false,
@@ -265,13 +274,13 @@ QualTypeMapper::convertBuiltinType(const BuiltinType *BT) 
{
   case BuiltinType::OCLClkEvent:
   case BuiltinType::OCLQueue:
   case BuiltinType::OCLReserveID:
-    return createPointerTypeForPointee(QT);
+    return createPointerTypeForPointee(QT, llvm::abi::PointerFlags::None);
 
   // Objective-C builtin types are represented as opaque pointers.
   case BuiltinType::ObjCId:
   case BuiltinType::ObjCClass:
   case BuiltinType::ObjCSel:
-    return createPointerTypeForPointee(QT);
+    return createPointerTypeForPointee(QT, llvm::abi::PointerFlags::None);
 
     // AArch64 SVE data and predicate types, including the x2/x3/x4 tuples.
 #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId)                    
\
@@ -356,7 +365,8 @@ QualTypeMapper::convertArrayType(const clang::ArrayType 
*AT) {
   if (isa<IncompleteArrayType>(AT))
     return Builder.getArrayType(ElementType, 0, 0);
   if (const auto *VAT = dyn_cast<VariableArrayType>(AT))
-    return createPointerTypeForPointee(VAT->getPointeeType());
+    return createPointerTypeForPointee(VAT->getPointeeType(),
+                                       llvm::abi::PointerFlags::None);
   llvm::reportFatalInternalError(
       "unexpected array type in ABI lowering (dependent array types should be "
       "resolved before reaching this point)");
@@ -480,8 +490,8 @@ QualTypeMapper::convertCXXRecordType(const CXXRecordDecl 
*RD) {
 
   // Add vtable pointer for polymorphic classes
   if (RD->isPolymorphic()) {
-    const llvm::abi::Type *VtablePointer =
-        createPointerTypeForPointee(ASTCtx.VoidPtrTy);
+    const llvm::abi::Type *VtablePointer = createPointerTypeForPointee(
+        ASTCtx.VoidPtrTy, llvm::abi::PointerFlags::IsPointerOrReference);
     Fields.emplace_back(VtablePointer, 0);
   }
 
@@ -620,7 +630,8 @@ llvm::Align QualTypeMapper::getTypeAlign(QualType QT) const 
{
 }
 
 const llvm::abi::Type *
-QualTypeMapper::createPointerTypeForPointee(QualType PointeeType) {
+QualTypeMapper::createPointerTypeForPointee(QualType PointeeType,
+                                            llvm::abi::PointerFlags Flags) {
   auto AddrSpace = PointeeType.getAddressSpace();
   auto PointerSize = ASTCtx.getTargetInfo().getPointerWidth(AddrSpace);
   llvm::Align Alignment =
@@ -632,8 +643,10 @@ QualTypeMapper::createPointerTypeForPointee(QualType 
PointeeType) {
       PointeeType->isFunctionType() && !PointeeType.hasAddressSpace()
           ? DL.getProgramAddressSpace()
           : ASTCtx.getTargetInfo().getTargetAddressSpace(AddrSpace);
+  if (PointeeType.hasAddressSpace())
+    Flags |= llvm::abi::PointerFlags::IsPointeeAddressSpaceQualified;
   return Builder.getPointerType(PointerSize, llvm::Align(Alignment.value() / 
8),
-                                TargetAddrSpace);
+                                TargetAddrSpace, Flags);
 }
 
 /// Processes the fields of a record (struct/class/union) and populates
diff --git a/clang/lib/CodeGen/QualTypeMapper.h 
b/clang/lib/CodeGen/QualTypeMapper.h
index f6bb43482c705..c909468fc04bb 100644
--- a/clang/lib/CodeGen/QualTypeMapper.h
+++ b/clang/lib/CodeGen/QualTypeMapper.h
@@ -51,7 +51,9 @@ class QualTypeMapper {
 
   const llvm::abi::RecordType *convertStructType(const clang::RecordDecl *RD);
   const llvm::abi::RecordType *convertUnionType(const clang::RecordDecl *RD);
-  const llvm::abi::Type *createPointerTypeForPointee(QualType PointeeType);
+  const llvm::abi::Type *
+  createPointerTypeForPointee(QualType PointeeType,
+                              llvm::abi::PointerFlags Flags);
   const llvm::abi::RecordType *convertCXXRecordType(const CXXRecordDecl *RD);
 
   void computeFieldInfo(const clang::RecordDecl *RD,
diff --git a/clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m 
b/clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m
new file mode 100644
index 0000000000000..feea53e9c9b2f
--- /dev/null
+++ b/clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m
@@ -0,0 +1,46 @@
+// RUN: %clang_cc1 -triple aarch64-linux-gnu -fblocks -emit-llvm -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -triple aarch64-linux-gnu -fblocks 
-fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s 
--implicit-check-not="not yet implemented"
+
+// Objective-C object pointers and block pointers are pointer representations,
+// but they are not ordinary C/C++ pointers or references and therefore use
+// integer coercions for aggregate arguments.
+
+@class Object;
+
+typedef struct {
+  id value;
+} ObjCIdAgg;
+void arg_objc_id(ObjCIdAgg a) {}
+// CHECK: define{{.*}} void @arg_objc_id(i64 %{{.*}})
+
+typedef struct {
+  Class value;
+} ObjCClassAgg;
+void arg_objc_class(ObjCClassAgg a) {}
+// CHECK: define{{.*}} void @arg_objc_class(i64 %{{.*}})
+
+typedef struct {
+  SEL value;
+} ObjCSelAgg;
+void arg_objc_sel(ObjCSelAgg a) {}
+// SEL canonicalizes to an ordinary pointer type.
+// CHECK: define{{.*}} void @arg_objc_sel(ptr %{{.*}})
+
+typedef struct {
+  Object *value;
+} ObjCObjectPointerAgg;
+void arg_objc_object_pointer(ObjCObjectPointerAgg a) {}
+// CHECK: define{{.*}} void @arg_objc_object_pointer(i64 %{{.*}})
+
+typedef struct {
+  id first;
+  id second;
+} ObjCIdPairAgg;
+void arg_objc_id_pair(ObjCIdPairAgg a) {}
+// CHECK: define{{.*}} void @arg_objc_id_pair([2 x i64] %{{.*}})
+
+typedef struct {
+  void (^value)(void);
+} BlockPointerAgg;
+void arg_block_pointer(BlockPointerAgg a) {}
+// CHECK: define{{.*}} void @arg_block_pointer(i64 %{{.*}})
diff --git a/clang/test/CodeGen/AArch64/abi-classify-arg-types.c 
b/clang/test/CodeGen/AArch64/abi-classify-arg-types.c
index 274c6010ea7e4..7950e3320d379 100644
--- a/clang/test/CodeGen/AArch64/abi-classify-arg-types.c
+++ b/clang/test/CodeGen/AArch64/abi-classify-arg-types.c
@@ -1,17 +1,17 @@
-// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID
-// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 
-fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID 
--implicit-check-not="not yet implemented"
-// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | 
FileCheck %s --check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID
-// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 
-fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID 
--implicit-check-not="not yet implemented"
-// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID
-// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID 
--implicit-check-not="not yet implemented"
-// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID
-// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID 
--implicit-check-not="not yet implemented"
-// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID
-// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID 
--implicit-check-not="not yet implemented"
-// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID
-// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID 
--implicit-check-not="not yet implemented"
-// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID
-// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | 
FileCheck %s 
--check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64
+// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 
-fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | 
FileCheck %s 
--check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID,PTR32
+// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs 
-fenable-matrix -fexperimental-max-bitint-width=1024 
-fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID,PTR32 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64
+// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64
+// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID,PTR64
+// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID,PTR64 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64
+// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 
--implicit-check-not="not yet implemented"
+// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64
+// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix 
-fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o 
- %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 
--implicit-check-not="not yet implemented"
 
 // This test is verifying that the LLVM ABI library classifies argument types 
in
 // the same way that Clang does without the library.
@@ -113,6 +113,72 @@ void arg_bitint128(_BitInt(128) x) {}
 void arg_bitint129(_BitInt(129) x) {}
 // CHECK: define{{.*}} void @arg_bitint129(ptr nofreeobj noundef align 16 
dead_on_return dereferenceable(32) %{{.*}})
 
+// Non-homogeneous fixed-size aggregates of at most 16 bytes are passed
+// directly. Larger aggregates are passed indirectly.
+typedef struct {
+  char x[3];
+} Agg3;
+void arg_agg3(Agg3 a) {}
+// PTR64: define{{.*}} void @arg_agg3(i64 %{{.*}})
+// PTR32: define{{.*}} void @arg_agg3(i32 %{{.*}})
+
+typedef struct {
+  char x[9];
+} Agg9;
+void arg_agg9(Agg9 a) {}
+// PTR64: define{{.*}} void @arg_agg9([2 x i64] %{{.*}})
+// PTR32: define{{.*}} void @arg_agg9([3 x i32] %{{.*}})
+
+typedef struct {
+  long long x, y;
+} Agg16;
+void arg_agg16(Agg16 a) {}
+// CHECK: define{{.*}} void @arg_agg16([2 x i64] %{{.*}})
+
+typedef struct {
+  _Alignas(16) char x[16];
+} Agg16Align16;
+void arg_agg16_align16(Agg16Align16 a) {}
+// CHECK: define{{.*}} void @arg_agg16_align16(i128 %{{.*}})
+
+typedef struct {
+  char x[17];
+} Agg17;
+void arg_agg17(Agg17 a) {}
+// CHECK: define{{.*}} void @arg_agg17(ptr nofreeobj noundef align 1 
{{(dead_on_return )?}}dereferenceable(17) %{{.*}})
+
+// Aggregates made entirely of 64-bit default-address-space pointers retain
+// pointer types in their coercion.
+typedef struct {
+  int *p;
+} PtrAgg1;
+void arg_ptr_agg1(PtrAgg1 a) {}
+// PTR64: define{{.*}} void @arg_ptr_agg1(ptr %{{.*}})
+// PTR32: define{{.*}} void @arg_ptr_agg1(i32 %{{.*}})
+
+typedef struct {
+  int *p, *q;
+} PtrAgg2;
+void arg_ptr_agg2(PtrAgg2 a) {}
+// PTR64: define{{.*}} void @arg_ptr_agg2([2 x ptr] %{{.*}})
+// PTR32: define{{.*}} void @arg_ptr_agg2([2 x i32] %{{.*}})
+
+typedef int __attribute__((address_space(0))) as0_int;
+typedef struct {
+  as0_int *p;
+} ExplicitAS0PtrAgg;
+void arg_explicit_as0_ptr_agg(ExplicitAS0PtrAgg a) {}
+// PTR64: define{{.*}} void @arg_explicit_as0_ptr_agg(i64 %{{.*}})
+// PTR32: define{{.*}} void @arg_explicit_as0_ptr_agg(i32 %{{.*}})
+
+typedef int __attribute__((address_space(1))) as1_int;
+typedef struct {
+  as1_int *p;
+} NonDefaultASPtrAgg;
+void arg_nondefault_as_ptr_agg(NonDefaultASPtrAgg a) {}
+// PTR64: define{{.*}} void @arg_nondefault_as_ptr_agg(i64 %{{.*}})
+// PTR32: define{{.*}} void @arg_nondefault_as_ptr_agg(i32 %{{.*}})
+
 // Homogeneous floating-point aggregates are coerced to an array of the base
 // type. AAPCS sets alignstack from unadjusted alignment (8, or 16 if the
 // unadjusted alignment is at least 16). DarwinPCS and Win64 do not.
diff --git a/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp 
b/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp
index 8e0bbb0e06b57..fa384187a43eb 100644
--- a/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp
+++ b/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp
@@ -1,11 +1,11 @@
-// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -std=c++20 
-emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,NOHFAALIGN
-// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -std=c++20 
-fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s 
--check-prefixes=CHECK,NOHFAALIGN --implicit-check-not="n...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/229202
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to