JVM_IR KT-49136 don't optimize null checks on fields and calls

This commit is contained in:
Dmitry Petrov
2021-10-07 16:44:29 +03:00
parent 9ef899ef10
commit 27860ef008
13 changed files with 116 additions and 2 deletions
@@ -27486,6 +27486,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@Test
@TestMetadata("kt49136.kt")
public void testKt49136() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136.kt");
}
@Test
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@Test
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
@@ -64,4 +64,7 @@ interface CommonBackendContext : BackendContext, LoggingContext {
val optimizeLoopsOverUnsignedArrays: Boolean
get() = false
val optimizeNullChecksUsingKotlinNullability: Boolean
get() = true
}
@@ -146,9 +146,9 @@ class IfNullExpressionsFusionLowering(val context: CommonBackendContext) : FileL
is IrGetClass ->
false
is IrCall ->
if (!type.isNullable()) false else null
if (context.optimizeNullChecksUsingKotlinNullability && !type.isNullable()) false else null
is IrGetField ->
if (!type.isNullable()) false else null
if (context.optimizeNullChecksUsingKotlinNullability && !type.isNullable()) false else null
is IrBlock -> {
val singleExpr = statements.singleOrNull()
if (singleExpr is IrExpression && singleExpr.type == type)
@@ -221,6 +221,9 @@ class JvmBackendContext(
override val doWhileCounterLoopOrigin: IrStatementOrigin
get() = JvmLoweredStatementOrigin.DO_WHILE_COUNTER_LOOP
override val optimizeNullChecksUsingKotlinNullability: Boolean
get() = false
inner class JvmIr(
irModuleFragment: IrModuleFragment,
symbolTable: SymbolTable
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_REFLECT
class A(val b: B)
class B(val c: String)
fun createByReflection(): A? =
A(B("aaa")).apply {
val field = javaClass.declaredFields.find { it.name == "b" }!!
field.isAccessible = true
field.set(this, null)
}
fun box(): String {
val a = createByReflection()
println(a?.b?.c)
return "OK"
}
@@ -0,0 +1,22 @@
abstract class Z {
init {
check(this)
}
abstract val b: B
}
class A(override val b: B) : Z()
class B(val c: String)
fun use(a: Any?) {}
fun check(z: Z) {
use(z?.b?.c)
}
fun box(): String {
A(B(""))
return "OK"
}
@@ -27348,6 +27348,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@Test
@TestMetadata("kt49136.kt")
public void testKt49136() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136.kt");
}
@Test
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@Test
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
@@ -27486,6 +27486,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@Test
@TestMetadata("kt49136.kt")
public void testKt49136() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136.kt");
}
@Test
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@Test
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
@@ -23199,6 +23199,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@TestMetadata("kt49136.kt")
public void testKt49136() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136.kt");
}
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt7774.kt");
@@ -18138,6 +18138,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt7774.kt");
@@ -17544,6 +17544,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt7774.kt");
@@ -17574,6 +17574,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt7774.kt");
@@ -14323,6 +14323,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt22410.kt");
}
@TestMetadata("kt49136a.kt")
public void testKt49136a() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt49136a.kt");
}
@TestMetadata("kt7774.kt")
public void testKt7774() throws Exception {
runTest("compiler/testData/codegen/box/nullCheckOptimization/kt7774.kt");