From de74ca59020cb4193e4a208ace1ffc1c63f952e9 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Fri, 8 Mar 2024 14:31:55 +0100 Subject: [PATCH] [FIR] FirLocalVariableAssignmentAnalyzer: do not try to propagate empty information `recordAssignments` merges properties into all parents which is redundant work in the case of empty `VariableAssignments`. This redundant work leads to critically poor performance in cases with many local declarations. ^KT-66416 Fixed --- .../fir/resolve/dfa/FirLocalVariableAssignmentAnalyzer.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirLocalVariableAssignmentAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirLocalVariableAssignmentAnalyzer.kt index 0bff6fbf497..03aac383220 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirLocalVariableAssignmentAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirLocalVariableAssignmentAnalyzer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -10,12 +10,12 @@ import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.expressions.explicitReceiver import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol -import org.jetbrains.kotlin.fir.expressions.explicitReceiver import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.typeContext import org.jetbrains.kotlin.fir.visitors.FirVisitor @@ -327,6 +327,8 @@ internal class FirLocalVariableAssignmentAnalyzer { fun retain(properties: Set) { assignments.keys.retainAll(properties) } + + fun isEmpty(): Boolean = assignments.isEmpty() } private class MiniFlow(val parents: Set) { @@ -480,6 +482,8 @@ internal class FirLocalVariableAssignmentAnalyzer { } private fun MiniFlow.recordAssignments(properties: VariableAssignments) { + if (properties.isEmpty()) return + assignedLater.merge(properties) parents.forEach { it.recordAssignments(properties) } }