JVM IR: optimize comparison with FQ name of kotlin.Result

This commit is contained in:
Alexander Udalov
2023-08-22 12:58:53 +02:00
committed by Space Team
parent 70f48db226
commit f1886f8219
4 changed files with 10 additions and 4 deletions
@@ -795,7 +795,7 @@ class ExpressionCodegen(
get() = parent.let { parent -> get() = parent.let { parent ->
val isBoxedResult = this is IrValueParameter && parent is IrSimpleFunction && val isBoxedResult = this is IrValueParameter && parent is IrSimpleFunction &&
parent.dispatchReceiverParameter != this && parent.dispatchReceiverParameter != this &&
(parent.parent as? IrClass)?.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME && (parent.parent as? IrClass)?.isClassWithFqName(StandardNames.RESULT_FQ_NAME) != true &&
parent.resultIsActuallyAny(index) == true parent.resultIsActuallyAny(index) == true
return if (isBoxedResult) context.irBuiltIns.anyNType else type return if (isBoxedResult) context.irBuiltIns.anyNType else type
} }
@@ -371,7 +371,7 @@ internal class JvmInlineClassLowering(
get() { get() {
if (!isSingleFieldValueClass) return false if (!isSingleFieldValueClass) return false
// Before version 1.4, we cannot rely on the Result.equals-impl0 method // Before version 1.4, we cannot rely on the Result.equals-impl0 method
return fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME || return !isClassWithFqName(StandardNames.RESULT_FQ_NAME) ||
context.state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4 context.state.languageVersionSettings.apiVersion >= ApiVersion.KOTLIN_1_4
} }
@@ -134,7 +134,7 @@ object InlineClassAbi {
fun IrType.getRequiresMangling(includeInline: Boolean = true, includeMFVC: Boolean = true): Boolean { fun IrType.getRequiresMangling(includeInline: Boolean = true, includeMFVC: Boolean = true): Boolean {
val irClass = erasedUpperBound val irClass = erasedUpperBound
return irClass.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME && when { return !irClass.isClassWithFqName(StandardNames.RESULT_FQ_NAME) && when {
irClass.isSingleFieldValueClass -> includeInline irClass.isSingleFieldValueClass -> includeInline
irClass.isMultiFieldValueClass -> includeMFVC irClass.isMultiFieldValueClass -> includeMFVC
else -> false else -> false
@@ -80,6 +80,9 @@ private fun IrClass.hasFqNameEqualToSignature(signature: IdSignature.CommonSigna
fun IrClassifierSymbol.isClassWithFqName(fqName: FqNameUnsafe): Boolean = fun IrClassifierSymbol.isClassWithFqName(fqName: FqNameUnsafe): Boolean =
this is IrClassSymbol && classFqNameEquals(this, fqName) this is IrClassSymbol && classFqNameEquals(this, fqName)
fun IrClass.isClassWithFqName(fqName: FqName): Boolean =
classFqNameEquals(this, fqName)
private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Boolean { private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Boolean {
assert(symbol.isBound) assert(symbol.isBound)
return classFqNameEquals(symbol.owner, fqName) return classFqNameEquals(symbol.owner, fqName)
@@ -107,7 +110,10 @@ val primitiveArrayTypesSignatures: Map<PrimitiveType, IdSignature.CommonSignatur
} }
private fun classFqNameEquals(declaration: IrClass, fqName: FqNameUnsafe): Boolean = private fun classFqNameEquals(declaration: IrClass, fqName: FqNameUnsafe): Boolean =
declaration.hasEqualFqName(fqName.toSafe()) classFqNameEquals(declaration, fqName.toSafe())
private fun classFqNameEquals(declaration: IrClass, fqName: FqName): Boolean =
declaration.hasEqualFqName(fqName)
fun IrType.isAny(): Boolean = isNotNullClassType(IdSignatureValues.any) fun IrType.isAny(): Boolean = isNotNullClassType(IdSignatureValues.any)
fun IrType.isNullableAny(): Boolean = isNullableClassType(IdSignatureValues.any) fun IrType.isNullableAny(): Boolean = isNullableClassType(IdSignatureValues.any)