From 2680111125a4cce28e530f401760b778ea62a786 Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Tue, 18 May 2021 14:22:16 +0300 Subject: [PATCH] [K/N] Fix order of lowerings to enable when on enum optimisation EnumWhenLowering searches for pattern, which is destroyed by BuiltinOperatorLowering, so first one should happen before second. --- .../backend/konan/KonanLoweringPhases.kt | 23 +++++++++++++++---- .../kotlin/backend/konan/ToplevelPhases.kt | 2 ++ .../backend/konan/lower/EnumClassLowering.kt | 8 ------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt index 8c4587e6225..ef7e0c00c6b 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanLoweringPhases.kt @@ -288,13 +288,28 @@ internal val functionReferencePhase = makeKonanFileLoweringPhase( prerequisite = setOf(delegationPhase, localFunctionsPhase) // TODO: make weak dependency on `testProcessorPhase` ) -internal val enumClassPhase = makeKonanFileOpPhase( - { context, irFile -> EnumClassLowering(context).run(irFile) }, +internal val enumWhenPhase = makeKonanFileLoweringPhase( + ::NativeEnumWhenLowering, + name = "EnumWhen", + description = "Enum when lowering", + prerequisite = setOf(enumConstructorsPhase, functionReferencePhase) +) + +internal val enumClassPhase = makeKonanFileLoweringPhase( + ::EnumClassLowering, name = "Enums", description = "Enum classes lowering", - prerequisite = setOf(enumConstructorsPhase, functionReferencePhase) // TODO: make weak dependency on `testProcessorPhase` + prerequisite = setOf(enumConstructorsPhase, functionReferencePhase, enumWhenPhase) // TODO: make weak dependency on `testProcessorPhase` ) +internal val enumUsagePhase = makeKonanFileLoweringPhase( + ::EnumUsageLowering, + name = "EnumUsage", + description = "Enum usage lowering", + prerequisite = setOf(enumConstructorsPhase, functionReferencePhase, enumClassPhase) +) + + internal val singleAbstractMethodPhase = makeKonanFileLoweringPhase( ::NativeSingleAbstractMethodLowering, name = "SingleAbstractMethod", @@ -306,7 +321,7 @@ internal val builtinOperatorPhase = makeKonanFileLoweringPhase( ::BuiltinOperatorLowering, name = "BuiltinOperators", description = "BuiltIn operators lowering", - prerequisite = setOf(defaultParameterExtentPhase, singleAbstractMethodPhase) + prerequisite = setOf(defaultParameterExtentPhase, singleAbstractMethodPhase, enumWhenPhase) ) internal val interopPhase = makeKonanFileLoweringPhase( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 9f00fba0f2a..b6ca06e7320 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -217,9 +217,11 @@ internal val allLoweringsPhase = NamedCompilerPhase( delegationPhase, functionReferencePhase, singleAbstractMethodPhase, + enumWhenPhase, builtinOperatorPhase, finallyBlocksPhase, enumClassPhase, + enumUsagePhase, interopPhase, varargPhase, compileTimeEvaluatePhase, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index 78c0623c439..4843cb4d0b9 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -120,14 +120,6 @@ internal class EnumUsageLowering(val context: Context) internal class EnumClassLowering(val context: Context) : FileLoweringPass { - fun run(irFile: IrFile) { - // EnumWhenLowering should be performed before EnumUsageLowering because - // the latter performs lowering of IrGetEnumValue - NativeEnumWhenLowering(context).lower(irFile) - lower(irFile) - EnumUsageLowering(context).lower(irFile) - } - override fun lower(irFile: IrFile) { irFile.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitClass(declaration: IrClass): IrStatement {