From c87b12ec2ff10141b473661e175cf9aa9c413b0e Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Fri, 26 Jun 2020 18:04:21 +0300 Subject: [PATCH] Speed up fir2ir constant evaluation This fix extract IrConstTransformer object to a common variable and all files then use it --- .../org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt | 1 - .../kotlin/fir/backend/evaluate/IrConstTransformer.kt | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index dfc57f6204b..91dc0b3834d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator import org.jetbrains.kotlin.fir.backend.generators.CallAndReferenceGenerator import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator -import org.jetbrains.kotlin.fir.backend.evaluate.IrConstTransformer import org.jetbrains.kotlin.fir.backend.evaluate.evaluateConstants import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt index 56854ead107..841c1f02993 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/evaluate/IrConstTransformer.kt @@ -16,7 +16,8 @@ import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid fun evaluateConstants(irModuleFragment: IrModuleFragment) { - irModuleFragment.files.forEach { it.transformChildren(IrConstTransformer(irModuleFragment), null) } + val irConstTransformer = IrConstTransformer(irModuleFragment) + irModuleFragment.files.forEach { it.transformChildren(irConstTransformer, null) } } //TODO create abstract class that will be common for this and lowering @@ -31,16 +32,15 @@ class IrConstTransformer(irModuleFragment: IrModuleFragment) : IrElementTransfor if (expression.accept(IrCompileTimeChecker(mode = EvaluationMode.ONLY_BUILTINS), null)) { return interpreter.interpret(expression).replaceIfError(expression) } - return super.visitCall(expression) + return expression } override fun visitField(declaration: IrField): IrStatement { val initializer = declaration.initializer val expression = initializer?.expression ?: return declaration if (expression is IrConst<*>) return declaration - val isCompileTimeComputable = expression.accept(IrCompileTimeChecker(declaration, mode = EvaluationMode.ONLY_BUILTINS), null) val isConst = declaration.correspondingPropertySymbol?.owner?.isConst == true - if (isConst && isCompileTimeComputable) { + if (isConst && expression.accept(IrCompileTimeChecker(declaration, mode = EvaluationMode.ONLY_BUILTINS), null)) { initializer.expression = interpreter.interpret(expression).replaceIfError(expression) }