diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmSafeCallChainFoldingLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmSafeCallChainFoldingLowering.kt index 4f9092f5014..d1b332c7a7b 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmSafeCallChainFoldingLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmSafeCallChainFoldingLowering.kt @@ -347,7 +347,14 @@ internal class SafeCallInfo( ) internal fun IrBlock.parseSafeCall(irBuiltIns: IrBuiltIns): SafeCallInfo? { - if (this.origin != IrStatementOrigin.SAFE_CALL) return null + // { + // val tmp = + // when { + // tmp == null -> null + // else -> + // } + // } + if (this.statements.size != 2) return null val tmpVal = this.statements[0] as? IrVariable ?: return null val whenExpr = this.statements[1] as? IrWhen ?: return null @@ -377,7 +384,14 @@ internal class ElvisInfo( ) internal fun IrBlock.parseElvis(irBuiltIns: IrBuiltIns): ElvisInfo? { - if (this.origin != IrStatementOrigin.ELVIS) return null + // { + // val tmp = + // when { + // tmp == null -> + // else -> tmp + // } + // } + if (this.statements.size != 2) return null val tmpVal = this.statements[0] as? IrVariable ?: return null val whenExpr = this.statements[1] as? IrWhen ?: return null @@ -394,5 +408,9 @@ internal fun IrBlock.parseElvis(irBuiltIns: IrBuiltIns): ElvisInfo? { if (arg1 !is IrConst<*> || arg1.value != null) return null val elvisRhs = ifNullBranch.result + val ifNonNullBranch = whenExpr.branches[1] + val ifNonNullBranchResult = ifNonNullBranch.result + if (ifNonNullBranchResult !is IrGetValue || ifNonNullBranchResult.symbol != tmpVal.symbol) return null + return ElvisInfo(this, tmpVal, elvisLhs, elvisRhs) } diff --git a/compiler/testData/codegen/bytecodeText/sam/samWrapperForNullableInitialization.kt b/compiler/testData/codegen/bytecodeText/sam/samWrapperForNullableInitialization.kt index 73980bdade3..46486da6df2 100644 --- a/compiler/testData/codegen/bytecodeText/sam/samWrapperForNullableInitialization.kt +++ b/compiler/testData/codegen/bytecodeText/sam/samWrapperForNullableInitialization.kt @@ -27,6 +27,6 @@ fun test() { // JVM_IR_TEMPLATES // @TestKt.class // 0 NEW -// 1 IFNONNULL -// 0 IFNULL +// 0 IFNONNULL +// 1 IFNULL // 2 ACONST_NULL