[clang] [ABI] Add CanBeFlattened to ArgInfo for Direct struct coerces (PR #220579)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 15 22:04:54 PDT 2026
https://github.com/skc7 updated https://github.com/llvm/llvm-project/pull/220579
>From 8a512d66582c61547659896cb15979f90b9f0808 Mon Sep 17 00:00:00 2001
From: skc7 <Krishna.Sankisa at amd.com>
Date: Wed, 16 Sep 2026 10:24:00 +0530
Subject: [PATCH] [CIR][ABI] Honor abi::ArgInfo::CanBeFlattened in the
call-conv lowering
---
.../CIR/Dialect/Transforms/CallConvLoweringPass.cpp | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
index f51ee6f9169a3..4310466ac5841 100644
--- a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp
@@ -538,9 +538,10 @@ static const llvm::abi::Type *mapCIRType(mlir::Type type,
/// unpacked into the register(s) holding it, a scalar too wide for one register
/// split into a tuple of them, a scalar the classifier widens to fill its
/// eightbyte, and a value whose live bytes start partway into its storage
-/// because a leading eightbyte holds no field (getDirectOffset). getDirect
-/// keeps canFlatten set so the rewriter can split a multi-field coerced
-/// struct into individual wire arguments. Any other scalar passes in its
+/// because a leading eightbyte holds no field (getDirectOffset). canFlatten
+/// follows the classifier's CanBeFlattened, so the rewriter splits a
+/// multi-field coerced struct into individual wire arguments unless the
+/// classifier asked to keep it intact. Any other scalar passes in its
/// natural CIR type, which a null coercion denotes. A coercion this bridge
/// cannot represent yields std::nullopt so the caller reports NYI rather than
/// silently passing the value unchanged.
@@ -601,7 +602,10 @@ convertABIArgInfo(const llvm::abi::ArgInfo &info, MLIRContext *ctx,
// trip for nothing.
if (comparesAgainstCoerce && coerced == origTy)
return ArgClassification::getDirect();
- return ArgClassification::getDirect(coerced, offset);
+ ArgClassification classified =
+ ArgClassification::getDirect(coerced, offset);
+ classified.canFlatten = info.getCanBeFlattened();
+ return classified;
}
// An extended value is always read from byte 0 of its own storage, so
// there is no offset to honor here.
More information about the cfe-commits
mailing list