From 57f8c02ebb4370b779622a64b8ab387595ddd91b Mon Sep 17 00:00:00 2001 From: Eric Schweitz Date: Fri, 24 Jan 2025 11:57:10 -0800 Subject: [PATCH] Fix issue #2541. Workaround for issue #2539. Signed-off-by: Eric Schweitz --- lib/Optimizer/CodeGen/ConvertToQIRAPI.cpp | 20 +++++++++++--------- python/cudaq/kernel/ast_bridge.py | 1 + runtime/cudaq/builder/kernel_builder.cpp | 2 ++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/Optimizer/CodeGen/ConvertToQIRAPI.cpp b/lib/Optimizer/CodeGen/ConvertToQIRAPI.cpp index b7591f36b10..10c92551436 100644 --- a/lib/Optimizer/CodeGen/ConvertToQIRAPI.cpp +++ b/lib/Optimizer/CodeGen/ConvertToQIRAPI.cpp @@ -1815,17 +1815,19 @@ struct QuakeToQIRAPIPrepPass } void guaranteeMzIsLabeled(quake::MzOp mz, int &counter, OpBuilder &builder) { - if (!mz.getRegisterNameAttr()) { - // Manufacture a bogus name on demand here. - std::string manuName = std::to_string(counter++); - constexpr std::size_t padSize = 5; - manuName = - std::string(padSize - std::min(padSize, manuName.length()), '0') + - manuName; - mz.setRegisterName("r" + manuName); - } else { + if (mz.getRegisterNameAttr() && + /* FIXME: issue 2538: the name should never be empty. */ + !mz.getRegisterNameAttr().getValue().empty()) { mz->setAttr(cudaq::opt::MzAssignedNameAttrName, builder.getUnitAttr()); + return; } + // Manufacture a bogus name on demand here. + std::string manuName = std::to_string(counter++); + constexpr std::size_t padSize = 5; + manuName = + std::string(padSize - std::min(padSize, manuName.length()), '0') + + manuName; + mz.setRegisterName("r" + manuName); } }; diff --git a/python/cudaq/kernel/ast_bridge.py b/python/cudaq/kernel/ast_bridge.py index ba5e664ea85..d64cbdd79ee 100644 --- a/python/cudaq/kernel/ast_bridge.py +++ b/python/cudaq/kernel/ast_bridge.py @@ -930,6 +930,7 @@ def isQuantumTy(ty): ty) or quake.StruqType.isinstance(ty) areQuantumTypes = [isQuantumTy(ty) for ty in self.argTypes] + f.attributes.__setitem__('cudaq-kernel', UnitAttr.get()) if True not in areQuantumTypes and not self.disableEntryPointTag: f.attributes.__setitem__('cudaq-entrypoint', UnitAttr.get()) diff --git a/runtime/cudaq/builder/kernel_builder.cpp b/runtime/cudaq/builder/kernel_builder.cpp index 6bebbf72786..c5a8a15c82e 100644 --- a/runtime/cudaq/builder/kernel_builder.cpp +++ b/runtime/cudaq/builder/kernel_builder.cpp @@ -887,6 +887,8 @@ void tagEntryPoint(ImplicitLocOpBuilder &builder, ModuleOp &module, module.walk([&](func::FuncOp function) { if (function.empty()) return WalkResult::advance(); + if (!function->hasAttr(cudaq::kernelAttrName)) + function->setAttr(cudaq::kernelAttrName, builder.getUnitAttr()); if (!function->hasAttr(cudaq::entryPointAttrName) && !hasAnyQubitTypes(function.getFunctionType()) && (symbolName.empty() || function.getSymName().equals(symbolName)))