From 75f9532959b922c0bbb993f843036de4bf7bdf61 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Wed, 4 Sep 2019 08:38:54 +0200 Subject: [PATCH] [IR] Avoid duplicate IR elements in for loops lowering. --- .../kotlin/backend/common/lower/loops/HeaderProcessor.kt | 6 +++--- .../backend/common/lower/loops/ProgressionHandlers.kt | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt index f49e3fb5ff7..59745b8c601 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/HeaderProcessor.kt @@ -102,12 +102,12 @@ internal sealed class ForLoopHeader( // // (use `<` if last is exclusive) // (step > 0 && inductionVar <= last) || (step < 0 || last <= inductionVar) val stepKotlinType = progressionType.stepType(builtIns).toKotlinType() - val zero = if (progressionType == ProgressionType.LONG_PROGRESSION) irLong(0) else irInt(0) + val isLong = progressionType == ProgressionType.LONG_PROGRESSION context.oror( context.andand( irCall(builtIns.greaterFunByOperandType[stepKotlinType]!!).apply { putValueArgument(0, irGet(step)) - putValueArgument(1, zero) + putValueArgument(1, if (isLong) irLong(0) else irInt(0)) }, irCall(compFun).apply { putValueArgument(0, irGet(inductionVariable)) @@ -116,7 +116,7 @@ internal sealed class ForLoopHeader( context.andand( irCall(builtIns.lessFunByOperandType[stepKotlinType]!!).apply { putValueArgument(0, irGet(step)) - putValueArgument(1, zero) + putValueArgument(1, if (isLong) irLong(0) else irInt(0)) }, irCall(compFun).apply { putValueArgument(0, irGet(last)) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt index 940be685991..8985adfa6db 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/loops/ProgressionHandlers.kt @@ -153,7 +153,8 @@ internal class UntilHandler(private val context: CommonBackendContext, private v it == null && isAdditionalNotEmptyConditionNeeded(receiverValue.type, untilArg.type) -> // Condition is needed and untilArg is non-const. // Build the additional "not empty" condition: `untilArg != MIN_VALUE`. - irNotEquals(untilArgExpression, minValueIrConst) + // Make sure to copy untilArgExpression as it is also used in `last`. + irNotEquals(untilArgExpression.deepCopyWithSymbols(), minValueIrConst) it == minValueAsLong -> // Hardcode "false" as additional condition so that the progression is considered empty. // The entire lowered loop becomes a candidate for dead code elimination, depending on backend.