[llvm-branch-commits] [clang] [CIR] Implement Direct+canFlatten in CallConvLowering (PR #201719)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jun 12 09:05:24 PDT 2026
================
@@ -419,6 +458,63 @@ void insertArgCoercion(FunctionOpInterface funcOp,
BlockArgument blockArg = entry.getArgument(blockArgIdx);
+ if (auto flatTy = getFlattenedCoercedType(ac)) {
+ // Direct + canFlatten: the coerced type is a struct whose fields become
+ // individual wire arguments. The reconstruction mirrors the Expand path
+ // — replace the single block arg with N scalar block args, store them
+ // into an alloca of the coerced struct type, reload — but then applies
+ // an additional coercion from the coerced struct type to the original
+ // argument type if the two differ in layout.
+ unsigned numFields = flatTy.getNumElements();
+ assert(numFields >= 2 && "getFlattenedCoercedType guarantees >1 fields");
+ Type origTy = blockArg.getType();
+ Location loc = funcOp.getLoc();
+
+ // Change slot 0 to field 0's type; insert slots 1..N-1 after it.
+ blockArg.setType(flatTy.getElementType(0));
+ for (unsigned f = 1; f < numFields; ++f)
+ entry.insertArgument(blockArgIdx + f, flatTy.getElementType(f), loc);
----------------
adams381 wrote:
Kept the index-based loop instead. The iterator overload `Block::insertArgument(args_iterator, Type, Location)` is implemented as `insertArgument(it->getArgNumber(), ...)`, so it dereferences the iterator. This arm appends the trailing fields, so after slot 0 the insertion point is `args_end()` (for a single-arg callee `args_begin() + blockArgIdx + 1` already is `args_end()`), and `it->getArgNumber()` there is out of bounds. The `unsigned` overload asserts `index <= arguments.size()`, so appending is only valid through the index form. Also `cir::RecordType` exposes `getMembers()`, not `getElements()`, so the suggestion as written wouldn't compile.
https://github.com/llvm/llvm-project/pull/201719
More information about the llvm-branch-commits
mailing list