From d902b7fc9319ed1d2f9fbe17f31e08b4339cc966 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Mon, 29 Jan 2018 18:35:29 +0300 Subject: [PATCH] DFG: workers support --- .../backend/konan/optimizations/DFGBuilder.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index ac0f8c64e69..55e9e8bdbae 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -38,12 +38,9 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol +import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.util.getArguments import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid @@ -350,6 +347,14 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag expressions += expression } + if (expression is IrCall && expression.symbol == scheduleImplSymbol) { + // Producer of scheduleImpl is called externally, we need to reflect this somehow. + @Suppress("DEPRECATION") + val producerInvocation = IrCallImpl(expression.startOffset, expression.endOffset, scheduleImplProducerInvokeDescriptor) + producerInvocation.dispatchReceiver = expression.getValueArgument(2) + expressions += producerInvocation + } + if (expression is IrReturnableBlock) { returnableBlocks.put(expression.descriptor, expression) returnableBlockValues.put(expression, mutableListOf()) @@ -412,6 +417,12 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag private val arrayGetSymbol = context.ir.symbols.arrayGet private val arraySetSymbol = context.ir.symbols.arraySet + private val scheduleImplSymbol = context.ir.symbols.scheduleImpl + private val scheduleImplProducerParam = scheduleImplSymbol.descriptor.valueParameters[2].also { + assert(it.name.asString() == "producer") + } + private val scheduleImplProducerInvokeDescriptor = scheduleImplProducerParam.type.memberScope + .getContributedFunctions(Name.identifier("invoke"), NoLookupLocation.FROM_BACKEND).single() private inner class FunctionDFGBuilder(val expressionValuesExtractor: ExpressionValuesExtractor, val variableValues: VariableValues,