Speed up fir2ir constant evaluation

This fix extract IrConstTransformer object to a common variable and all
files then use it
This commit is contained in:
Ivan Kylchik
2020-06-26 18:04:21 +03:00
parent 032fdd63d9
commit c87b12ec2f
2 changed files with 4 additions and 5 deletions
@@ -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.AnnotationGenerator
import org.jetbrains.kotlin.fir.backend.generators.CallAndReferenceGenerator import org.jetbrains.kotlin.fir.backend.generators.CallAndReferenceGenerator
import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator 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.backend.evaluate.evaluateConstants
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
@@ -16,7 +16,8 @@ import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
fun evaluateConstants(irModuleFragment: IrModuleFragment) { 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 //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)) { if (expression.accept(IrCompileTimeChecker(mode = EvaluationMode.ONLY_BUILTINS), null)) {
return interpreter.interpret(expression).replaceIfError(expression) return interpreter.interpret(expression).replaceIfError(expression)
} }
return super.visitCall(expression) return expression
} }
override fun visitField(declaration: IrField): IrStatement { override fun visitField(declaration: IrField): IrStatement {
val initializer = declaration.initializer val initializer = declaration.initializer
val expression = initializer?.expression ?: return declaration val expression = initializer?.expression ?: return declaration
if (expression is IrConst<*>) 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 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) initializer.expression = interpreter.interpret(expression).replaceIfError(expression)
} }