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 ->
val isBoxedResult = this is IrValueParameter && parent is IrSimpleFunction &&
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
return if (isBoxedResult) context.irBuiltIns.anyNType else type
}
@@ -371,7 +371,7 @@ internal class JvmInlineClassLowering(
get() {
if (!isSingleFieldValueClass) return false
// 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
}
@@ -134,7 +134,7 @@ object InlineClassAbi {
fun IrType.getRequiresMangling(includeInline: Boolean = true, includeMFVC: Boolean = true): Boolean {
val irClass = erasedUpperBound
return irClass.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME && when {
return !irClass.isClassWithFqName(StandardNames.RESULT_FQ_NAME) && when {
irClass.isSingleFieldValueClass -> includeInline
irClass.isMultiFieldValueClass -> includeMFVC
else -> false
@@ -80,6 +80,9 @@ private fun IrClass.hasFqNameEqualToSignature(signature: IdSignature.CommonSigna
fun IrClassifierSymbol.isClassWithFqName(fqName: FqNameUnsafe): Boolean =
this is IrClassSymbol && classFqNameEquals(this, fqName)
fun IrClass.isClassWithFqName(fqName: FqName): Boolean =
classFqNameEquals(this, fqName)
private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Boolean {
assert(symbol.isBound)
return classFqNameEquals(symbol.owner, fqName)
@@ -107,7 +110,10 @@ val primitiveArrayTypesSignatures: Map<PrimitiveType, IdSignature.CommonSignatur
}
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.isNullableAny(): Boolean = isNullableClassType(IdSignatureValues.any)