From 1d28e4e30704831ed317f37c20a0478942137be9 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 9 Feb 2022 15:42:50 +0300 Subject: [PATCH] JVM_IR fix counter loop optimization with Composable --- .../lower/loops/JavaLikeCounterLoopBuilder.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/JavaLikeCounterLoopBuilder.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/JavaLikeCounterLoopBuilder.kt index 8c269c6941f..8be68de7eb7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/JavaLikeCounterLoopBuilder.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/JavaLikeCounterLoopBuilder.kt @@ -49,17 +49,20 @@ class JavaLikeCounterLoopBuilder(private val context: CommonBackendContext) { // ) val bodyBlock = newBody as? IrContainerExpression ?: throw AssertionError("newBody: ${newBody?.dump()}") - val forLoopNextBlock = bodyBlock.statements[0] as? IrContainerExpression - ?: throw AssertionError("bodyBlock[0]: ${bodyBlock.statements[0].dump()}") - if (forLoopNextBlock.origin != IrStatementOrigin.FOR_LOOP_NEXT) - throw AssertionError("FOR_LOOP_NEXT expected: ${forLoopNextBlock.dump()}") + val forLoopNextBlockIndex = bodyBlock.statements.indexOfFirst { + it is IrContainerExpression && it.origin == IrStatementOrigin.FOR_LOOP_NEXT + } + if (forLoopNextBlockIndex < 0) { + throw AssertionError("No FOR_LOOP_NEXT block in bodyBlock: ${bodyBlock.dump()}") + } + val forLoopNextBlock = bodyBlock.statements[forLoopNextBlockIndex] as IrContainerExpression val inductionVariableUpdate = forLoopNextBlock.statements.last() as? IrSetValue ?: throw AssertionError("forLoopNextBlock.last: ${forLoopNextBlock.statements.last().dump()}") val doWhileLoop = IrDoWhileLoopImpl(oldLoop.startOffset, oldLoop.endOffset, oldLoop.type, loopOrigin) doWhileLoop.label = oldLoop.label - bodyBlock.statements[0] = IrCompositeImpl( + bodyBlock.statements[forLoopNextBlockIndex] = IrCompositeImpl( forLoopNextBlock.startOffset, forLoopNextBlock.endOffset, forLoopNextBlock.type, forLoopNextBlock.origin,