================
@@ -63,6 +64,19 @@ class CIRABIRewriteContext : public
mlir::abi::ABIRewriteContext {
private:
mlir::ModuleOp module;
const mlir::DataLayout &dl;
+
+ /// Each block argument rewriteFunctionDefinition has rewritten into a
+ /// non-byval indirect parameter, mapped to the alignment its classification
+ /// states, so rewriteCallSite can forward such a parameter rather than copy
+ /// it. Recorded where the classification says so rather than read back
+ /// from an emitted attribute, which would tie the pass to whichever
+ /// attribute is unique to this case today.
+ ///
+ /// Sound for one run over one module only. A recorded argument is retyped
+ /// but never erased, so the keys stay valid, but a value freed with one
+ /// module can be recycled by the next, and a stale hit would forward the
+ /// caller's object where a copy is required. Do not promote to pass state.
+ llvm::DenseMap<mlir::BlockArgument, uint64_t> nonByvalParams;
----------------
adams381 wrote:
Per-function on its own would not have worked, since the driver rewrites F and
then every call to F, so when a call inside G is rewritten the current function
is F while the question is about G's parameters.
However, the map is only there because `insertArgCoercion` replaces the CIRGen
spill alloca with the incoming pointer and erases it as soon as it rewrites the
signature, which leaves the call site holding a block argument with no defining
operation to inspect. Deferring the replacement and erase to the end of the
pass keeps the alloca in place while call sites are rewritten, so
`getUnderlyingAlloca` answers every case and both the map and its
block-argument arm go away.
https://github.com/llvm/llvm-project/pull/222445
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits