KT-55005 Do not generate CHECKCAST before AASTORE
This commit is contained in:
committed by
Space Team
parent
d26b96afe1
commit
06d3e1d8bd
+1
@@ -61,6 +61,7 @@ class OptimizationMethodVisitor(
|
||||
RedundantGotoMethodTransformer(),
|
||||
RedundantNopsCleanupMethodTransformer(),
|
||||
NegatedJumpsMethodTransformer(),
|
||||
RedundantCheckcastsBeforeAastoreMethodTransformer,
|
||||
MethodVerifier("AFTER optimizations", generationState)
|
||||
)
|
||||
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.codegen.optimization
|
||||
|
||||
import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.Companion.isOperationReifiedMarker
|
||||
import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer
|
||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
||||
|
||||
object RedundantCheckcastsBeforeAastoreMethodTransformer : MethodTransformer() {
|
||||
override fun transform(internalClassName: String, methodNode: MethodNode) {
|
||||
val iter = methodNode.instructions.iterator()
|
||||
while (iter.hasNext()) {
|
||||
val insn = iter.next()
|
||||
if (insn.opcode == Opcodes.CHECKCAST && insn.next?.opcode == Opcodes.AASTORE) {
|
||||
val isReified = isOperationReifiedMarker(insn.previous)
|
||||
iter.remove()
|
||||
if (isReified) {
|
||||
for (i in 1..3) {
|
||||
iter.previous()
|
||||
iter.remove()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
@@ -4853,6 +4853,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/casts/kt54802.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt55005.kt")
|
||||
public void testKt55005() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/casts/kt55005.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lambdaToUnitCast.kt")
|
||||
public void testLambdaToUnitCast() throws Exception {
|
||||
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// CHECK_BYTECODE_TEXT
|
||||
// WITH_STDLIB
|
||||
|
||||
import kotlin.test.*
|
||||
|
||||
inline fun <reified T> foo(x: Any) = arrayOf<T>(x as T)
|
||||
|
||||
fun box(): String {
|
||||
val a: Array<String> = arrayOf("")
|
||||
|
||||
assertFailsWith<ArrayStoreException> {
|
||||
(a as Array<Any>)[0] = Any()
|
||||
}
|
||||
assertFailsWith<ArrayStoreException> {
|
||||
(a as Array<Any>)[0] = 1
|
||||
}
|
||||
assertFailsWith<ArrayStoreException> {
|
||||
(a as Array<CharSequence>)[0] = StringBuilder()
|
||||
}
|
||||
assertFailsWith<ArrayStoreException> {
|
||||
foo<String>(Any())
|
||||
}
|
||||
return "OK"
|
||||
}
|
||||
|
||||
// 0 CHECKCAST
|
||||
+6
@@ -4853,6 +4853,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/casts/kt54802.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt55005.kt")
|
||||
public void testKt55005() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/casts/kt55005.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lambdaToUnitCast.kt")
|
||||
public void testLambdaToUnitCast() throws Exception {
|
||||
|
||||
@@ -258,7 +258,6 @@ public final class ListOfUsers : java/lang/Object {
|
||||
GETSTATIC (User$$serializer, INSTANCE, LUser$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (0)
|
||||
PUTSTATIC (ListOfUsers, $childSerializers, [Lkotlinx/serialization/KSerializer;)
|
||||
@@ -381,7 +380,6 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ
|
||||
ALOAD (1)
|
||||
ICONST_0
|
||||
GETSTATIC (User$$serializer, INSTANCE, LUser$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ARETURN
|
||||
@@ -760,12 +758,10 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in
|
||||
ALOAD (1)
|
||||
ICONST_0
|
||||
GETSTATIC (kotlinx/serialization/internal/StringSerializer, INSTANCE, Lkotlinx/serialization/internal/StringSerializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ICONST_1
|
||||
GETSTATIC (kotlinx/serialization/internal/StringSerializer, INSTANCE, Lkotlinx/serialization/internal/StringSerializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ARETURN
|
||||
|
||||
@@ -342,7 +342,6 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ
|
||||
DUP
|
||||
ICONST_0
|
||||
GETSTATIC (User$$serializer, INSTANCE, LUser$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ARETURN
|
||||
LABEL (L1)
|
||||
@@ -696,12 +695,10 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in
|
||||
DUP
|
||||
ICONST_0
|
||||
GETSTATIC (kotlinx/serialization/internal/StringSerializer, INSTANCE, Lkotlinx/serialization/internal/StringSerializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (kotlinx/serialization/internal/StringSerializer, INSTANCE, Lkotlinx/serialization/internal/StringSerializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ARETURN
|
||||
LABEL (L1)
|
||||
|
||||
@@ -346,12 +346,10 @@ final class Result$Companion$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/function
|
||||
ICONST_0
|
||||
ANEWARRAY (java/lang/annotation/Annotation)
|
||||
INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, <init>, (Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/annotation/Annotation;)V)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ICONST_0
|
||||
@@ -536,7 +534,6 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati
|
||||
ALOAD (1)
|
||||
ICONST_0
|
||||
GETSTATIC (kotlinx/serialization/internal/StringSerializer, INSTANCE, Lkotlinx/serialization/internal/StringSerializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ARETURN
|
||||
@@ -863,12 +860,10 @@ public final class X$Companion : java/lang/Object {
|
||||
ICONST_0
|
||||
ANEWARRAY (java/lang/annotation/Annotation)
|
||||
INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, <init>, (Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/annotation/Annotation;)V)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ALOAD (1)
|
||||
ICONST_0
|
||||
|
||||
@@ -74,7 +74,6 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, <init>, (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V)
|
||||
AASTORE
|
||||
@@ -133,7 +132,6 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, <init>, (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V)
|
||||
ALOAD (5)
|
||||
@@ -187,7 +185,6 @@ public final class Container$$serializer : java/lang/Object, kotlinx/serializati
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, <init>, (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V)
|
||||
ALOAD (5)
|
||||
@@ -365,7 +362,6 @@ public final class Container : java/lang/Object {
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, <init>, (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V)
|
||||
ALOAD (0)
|
||||
@@ -428,7 +424,6 @@ final class Result$Companion$serializer$1 : kotlin/jvm/internal/Lambda, kotlin/j
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, <init>, (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V)
|
||||
ARETURN
|
||||
@@ -615,7 +610,6 @@ public final class Result$OK$$serializer : java/lang/Object, kotlinx/serializati
|
||||
DUP
|
||||
ICONST_0
|
||||
GETSTATIC (kotlinx/serialization/internal/StringSerializer, INSTANCE, Lkotlinx/serialization/internal/StringSerializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
ARETURN
|
||||
LABEL (L1)
|
||||
@@ -931,7 +925,6 @@ public final class X$Companion : java/lang/Object {
|
||||
DUP
|
||||
ICONST_1
|
||||
GETSTATIC (Result$OK$$serializer, INSTANCE, LResult$OK$$serializer;)
|
||||
CHECKCAST (kotlinx/serialization/KSerializer)
|
||||
AASTORE
|
||||
INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, <init>, (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V)
|
||||
ARETURN
|
||||
|
||||
Reference in New Issue
Block a user