From 0026a73ca0a4f7329ef7ffaf41e15ca935a7120f Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Wed, 3 Jun 2026 08:41:33 +0100 Subject: [PATCH] Optimize DPI import argument passing (#7704) Pass inputs to DPI import wrappers by reference (unless fits in a register). This eliminates a lot of temporary constructors/destructors. --- src/V3Task.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/V3Task.cpp b/src/V3Task.cpp index bb0c00032..0238f89cb 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -1405,6 +1405,13 @@ class TaskVisitor final : public VNVisitor { unlinkAndClone(nodep, portp, false); portp->funcLocal(true); cfuncp->addArgsp(portp); + // Pass inputs to DPI import wrappers by reference, unless fits in register + if (cfuncp->dpiImportWrapper() && portp->isReadOnly()) { + AstNodeDType* const dtypep = portp->dtypep()->skipRefp(); + if (dtypep->isCompound() || dtypep->isWide()) { + portp->direction(VDirection::CONSTREF); + } + } } else { // "Normal" variable, mark inside function portp->funcLocal(true);