diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt index eda35e00acc..b5366f64f2d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxingInterpreter.kt @@ -174,17 +174,20 @@ open class BoxingInterpreter( when { v == StrictBasicValue.UNINITIALIZED_VALUE || w == StrictBasicValue.UNINITIALIZED_VALUE -> StrictBasicValue.UNINITIALIZED_VALUE - v is BoxedBasicValue && w is BoxedBasicValue -> { - onMergeSuccess(v, w) - when { - v is TaintedBoxedValue -> v - w is TaintedBoxedValue -> w - v.type != w.type -> mergeBoxedHazardous(v, w, isLocalVariable) - else -> v // two clean boxed values with the same type are equal + v is BoxedBasicValue -> { + if (w is BoxedBasicValue) { + onMergeSuccess(v, w) + when { + v is TaintedBoxedValue -> v + w is TaintedBoxedValue -> w + v.type != w.type -> mergeBoxedHazardous(v, w, isLocalVariable) + else -> v // two clean boxed values with the same type are equal + } + } else { + mergeBoxedHazardous(v, w, isLocalVariable) } } - v is BoxedBasicValue -> - mergeBoxedHazardous(v, w, isLocalVariable) + w is BoxedBasicValue -> mergeBoxedHazardous(w, v, isLocalVariable) else -> diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ReferenceTrackingInterpreter.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ReferenceTrackingInterpreter.kt index 2b299265cb0..6e5305d2f61 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ReferenceTrackingInterpreter.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ReferenceTrackingInterpreter.kt @@ -30,10 +30,14 @@ abstract class ReferenceTrackingInterpreter : OptimizationBasicInterpreter() { else createTaintedValue(v, w) - v is TrackedReferenceValue && w is TrackedReferenceValue -> - createPossiblyMergedValue(v, w) + v is TrackedReferenceValue -> { + if (w is TrackedReferenceValue) + createPossiblyMergedValue(v, w) + else + createTaintedValue(v, w) + } - v is TrackedReferenceValue || w is TrackedReferenceValue -> + w is TrackedReferenceValue -> createTaintedValue(v, w) else -> diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/nullCheck/NullabilityInterpreter.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/nullCheck/NullabilityInterpreter.kt index 3abf2a4ca97..7034e1fb2a0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/nullCheck/NullabilityInterpreter.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/nullCheck/NullabilityInterpreter.kt @@ -96,20 +96,21 @@ class NullabilityInterpreter(private val generationState: GenerationState) : Opt override fun merge(v: BasicValue, w: BasicValue): BasicValue = when { - v is NullBasicValue && w is NullBasicValue -> - NullBasicValue - v is NullBasicValue || w is NullBasicValue -> - StrictBasicValue.REFERENCE_VALUE - v is ProgressionIteratorBasicValue && w is ProgressionIteratorBasicValue -> - mergeNotNullValuesOfSameKind(v, w) - v is ProgressionIteratorBasicValue && w is NotNullBasicValue -> - NotNullBasicValue.NOT_NULL_REFERENCE_VALUE - w is ProgressionIteratorBasicValue && v is NotNullBasicValue -> - NotNullBasicValue.NOT_NULL_REFERENCE_VALUE - v is NotNullBasicValue && w is NotNullBasicValue -> - mergeNotNullValuesOfSameKind(v, w) - else -> - super.merge(v, w) + v === NullBasicValue -> if (w === NullBasicValue) NullBasicValue else StrictBasicValue.REFERENCE_VALUE + + w === NullBasicValue -> StrictBasicValue.REFERENCE_VALUE + + v is ProgressionIteratorBasicValue -> when (w) { + is ProgressionIteratorBasicValue -> mergeNotNullValuesOfSameKind(v, w) + is NotNullBasicValue -> NotNullBasicValue.NOT_NULL_REFERENCE_VALUE + else -> super.merge(v, w) + } + v is NotNullBasicValue -> when (w) { + is ProgressionIteratorBasicValue -> NotNullBasicValue.NOT_NULL_REFERENCE_VALUE + is NotNullBasicValue -> mergeNotNullValuesOfSameKind(v, w) + else -> super.merge(v, w) + } + else -> super.merge(v, w) } private fun mergeNotNullValuesOfSameKind(v: StrictBasicValue, w: StrictBasicValue) =