From cc940e9012c4856bf9235ec4ac582709de1c16c7 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Tue, 15 Sep 2020 12:50:18 +0500 Subject: [PATCH] [IR][optmz] Added hint in case of EA failure --- .../konan/optimizations/EscapeAnalysis.kt | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt index e348b1ab11a..3b11d81e9af 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt @@ -8,12 +8,13 @@ package org.jetbrains.kotlin.backend.konan.optimizations import org.jetbrains.kotlin.backend.common.atMostOne import org.jetbrains.kotlin.backend.common.pop import org.jetbrains.kotlin.backend.common.push +import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.DirectedGraphCondensationBuilder import org.jetbrains.kotlin.backend.konan.DirectedGraphMultiNode import org.jetbrains.kotlin.backend.konan.llvm.Lifetime -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.logMultiple +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass import kotlin.math.min @@ -1661,13 +1662,30 @@ internal object EscapeAnalysis { callGraph: CallGraph, lifetimes: MutableMap) { assert(lifetimes.isEmpty()) - val intraproceduralAnalysisResult = - IntraproceduralAnalysis(context, moduleDFG, externalModulesDFG, callGraph).analyze() - InterproceduralAnalysis(context, 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 - ).analyze() + try { + val intraproceduralAnalysisResult = + IntraproceduralAnalysis(context, moduleDFG, externalModulesDFG, callGraph).analyze() + InterproceduralAnalysis(context, 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 + ).analyze() + } catch (t: Throwable) { + val extraUserInfo = + """ + Please try to disable escape analysis and rerun the build. To do it add the following snippet to the gradle script: + + kotlin.targets.withType { + binaries.all { + freeCompilerArgs += "-Xdisable-phases=EscapeAnalysis" + } + } + + In case of using command line compiler add this option: "-Xdisable-phases=EscapeAnalysis". + Also, consider filing an issue with full Gradle log here: https://kotl.in/issue + """.trimIndent() + context.reportCompilationError("Escape analysis failure:\n$extraUserInfo\n\n${t.message}\n${t.stackTraceToString()}") + } } } \ No newline at end of file