From 6ee1aba8acc1255a6eb9e34788a2376c6357458b Mon Sep 17 00:00:00 2001 From: River Riddle Date: Mon, 26 Jun 2023 11:36:06 -0700 Subject: [mlir][bytecode] Fix lazy loading of non-isolated regions The bytecode reader currently assumes all regions can be lazy loaded, which breaks reading any non-isolated region. This patch fixes that by properly handling nested non-lazy regions, and only considers isolated regions as lazy. Differential Revision: https://reviews.llvm.org/D153795 --- mlir/lib/Bytecode/Reader/BytecodeReader.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'mlir/lib/Bytecode/Reader/BytecodeReader.cpp') diff --git a/mlir/lib/Bytecode/Reader/BytecodeReader.cpp b/mlir/lib/Bytecode/Reader/BytecodeReader.cpp index 5aa24ba..5b313af 100644 --- a/mlir/lib/Bytecode/Reader/BytecodeReader.cpp +++ b/mlir/lib/Bytecode/Reader/BytecodeReader.cpp @@ -1317,11 +1317,11 @@ private: regionStack.push_back(std::move(it->getSecond()->second)); lazyLoadableOps.erase(it->getSecond()); lazyLoadableOpsMap.erase(it); - auto result = parseRegions(regionStack, regionStack.back()); - assert((regionStack.empty() || failed(result)) && - "broken invariant: regionStack should be empty when parseRegions " - "succeeds"); - return result; + + while (!regionStack.empty()) + if (failed(parseRegions(regionStack, regionStack.back()))) + return failure(); + return success(); } /// Return the context for this config. @@ -2094,14 +2094,11 @@ BytecodeReader::Impl::parseRegions(std::vector ®ionStack, childState.owningReader = std::make_unique(sectionData, fileLoc); childState.reader = childState.owningReader.get(); - } - if (lazyLoading) { - // If the user has a callback set, they have the opportunity - // to control lazyloading as we go. - if (!lazyOpsCallback || !lazyOpsCallback(*op)) { - lazyLoadableOps.push_back( - std::make_pair(*op, std::move(childState))); + // If the user has a callback set, they have the opportunity to + // control lazyloading as we go. + if (lazyLoading && (!lazyOpsCallback || !lazyOpsCallback(*op))) { + lazyLoadableOps.emplace_back(*op, std::move(childState)); lazyLoadableOpsMap.try_emplace(*op, std::prev(lazyLoadableOps.end())); continue; -- cgit v1.1