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; }