From a8135c60cedd428da0d45137078f1f8a46ac53de Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Sun, 7 May 2023 14:04:53 +0300 Subject: [PATCH] [K/N] Turn on optimistic escape analysis For new MM (with tracing GC), it is safe to turn it on --- .../org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt | 3 ++- .../kotlin/backend/konan/optimizations/EscapeAnalysis.kt | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 9c880c2f5b4..f6d8641eb73 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1710,7 +1710,8 @@ internal class CodeGeneratorVisitor( private fun needLifetimeConstraintsCheck(valueToAssign: LLVMValueRef, irClass: IrClass): Boolean { // TODO: Likely, we don't need isFrozen check here at all. - return functionGenerationContext.isObjectType(valueToAssign.type) && !irClass.isFrozen(context) + return context.config.memoryModel != MemoryModel.EXPERIMENTAL + && functionGenerationContext.isObjectType(valueToAssign.type) && !irClass.isFrozen(context) } private fun isZeroConstValue(value: IrExpression): Boolean { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt index 2da18ac5eaa..57592074280 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt @@ -1812,10 +1812,7 @@ internal object EscapeAnalysis { val intraproceduralAnalysisResult = IntraproceduralAnalysis(context, moduleDFG, externalModulesDFG, callGraph).analyze() InterproceduralAnalysis(context, generationState, callGraph, intraproceduralAnalysisResult, externalModulesDFG, lifetimes, - // TODO: This is a bit conservative, but for more aggressive option some support from runtime is - // needed (namely, determining that a pointer is from the stack; this is easy for x86 or x64, - // but what about all other platforms?). - propagateExiledToHeapObjects = true + propagateExiledToHeapObjects = context.config.memoryModel != MemoryModel.EXPERIMENTAL ).analyze() } catch (t: Throwable) { val extraUserInfo =