From cd0cae2fd1b0c765b90bc51f87025bb11196c6c4 Mon Sep 17 00:00:00 2001 From: Hideto Ueno Date: Tue, 24 Jan 2023 23:11:42 +0900 Subject: [PATCH] [LowerTypes] Fix a race condition (#4582) This PR fixes a race condition in LowerTypes with aggregate preservation mode. In the instance op lowering, linkage of referenced module is checked, however it is not allowed to read attributes from different threads. --- lib/Dialect/FIRRTL/Transforms/LowerTypes.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/Dialect/FIRRTL/Transforms/LowerTypes.cpp b/lib/Dialect/FIRRTL/Transforms/LowerTypes.cpp index ffae4b702005..2da968cbfc1c 100644 --- a/lib/Dialect/FIRRTL/Transforms/LowerTypes.cpp +++ b/lib/Dialect/FIRRTL/Transforms/LowerTypes.cpp @@ -451,8 +451,12 @@ TypeLoweringVisitor::getPreservatinoModeForModule(FModuleLike module) { // We cannot preserve external module ports. if (!isa(module)) return PreserveAggregate::None; + + // If `module` is a top-module, we have to lower ports. Don't read attributes + // of `module` since the attributes could be mutated in a different thread. if (aggregatePreservationMode != PreserveAggregate::None && - preservePublicTypes && cast(*module).isPublic()) + preservePublicTypes && + module->getParentOfType().getMainModule(&symTbl) == module) return PreserveAggregate::None; return aggregatePreservationMode; }