diff options
| author | River Riddle <riddleriver@gmail.com> | 2023-06-26 11:36:06 -0700 |
|---|---|---|
| committer | River Riddle <riddleriver@gmail.com> | 2023-06-26 16:33:20 -0700 |
| commit | 6ee1aba8acc1255a6eb9e34788a2376c6357458b (patch) | |
| tree | 77a9a49931d896d0fd850d83de59b4a30b298e7c /mlir/lib/Bytecode/Reader/BytecodeReader.cpp | |
| parent | a18266473be1439d324059afa0e8b124f0466428 (diff) | |
| download | llvm-6ee1aba8acc1255a6eb9e34788a2376c6357458b.zip llvm-6ee1aba8acc1255a6eb9e34788a2376c6357458b.tar.gz llvm-6ee1aba8acc1255a6eb9e34788a2376c6357458b.tar.bz2 | |
[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
Diffstat (limited to 'mlir/lib/Bytecode/Reader/BytecodeReader.cpp')
| -rw-r--r-- | mlir/lib/Bytecode/Reader/BytecodeReader.cpp | 21 |
1 files changed, 9 insertions, 12 deletions
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<RegionReadState> ®ionStack, childState.owningReader = std::make_unique<EncodingReader>(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; |
