Model intrinsics checkNotNullParameter and throwParameterIsNullNPE
Bug: 139276374
Change-Id: If7651b00eafa33af2a41626937b1e6b37f3d4aa1
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 1e69a6b..40c2ce3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -113,7 +113,11 @@
this.extraNeverInlineMethods =
appView.options().kotlinOptimizationOptions().disableKotlinSpecificOptimizations
? ImmutableSet.of()
- : ImmutableSet.of(intrinsics.throwNpe, intrinsics.throwParameterIsNullException);
+ : ImmutableSet.of(
+ intrinsics.throwNpe,
+ intrinsics.throwParameterIsNullException,
+ intrinsics.throwParameterIsNullNPE,
+ intrinsics.throwParameterIsNullIAE);
this.lensCodeRewriter = lensCodeRewriter;
this.mainDexInfo = appView.appInfo().getMainDexInfo();
this.singleInlineCallers =
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index b5ced8c..d994add 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -101,6 +101,7 @@
import com.android.tools.r8.ir.optimize.info.initializer.NonTrivialInstanceInitializerInfo;
import com.android.tools.r8.ir.optimize.typechecks.CheckCastAndInstanceOfMethodSpecialization;
import com.android.tools.r8.kotlin.Kotlin;
+import com.android.tools.r8.kotlin.Kotlin.Intrinsics;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
@@ -744,11 +745,13 @@
}
// We need to ignore the holder, since Kotlin adds different versions of null-check machinery,
// e.g., kotlin.collections.ArraysKt___ArraysKt... or kotlin.jvm.internal.ArrayIteratorKt...
- DexMethod checkParameterIsNotNullMethod =
- appView.dexItemFactory().kotlin.intrinsics.checkParameterIsNotNull;
+ Intrinsics intrinsics = appView.dexItemFactory().kotlin.intrinsics;
DexMethod originalInvokedMethod =
appView.graphLens().getOriginalMethodSignature(invoke.getInvokedMethod());
- return originalInvokedMethod.match(checkParameterIsNotNullMethod)
+ boolean isCheckNotNullMethod =
+ originalInvokedMethod.match(intrinsics.checkParameterIsNotNull)
+ || originalInvokedMethod.match(intrinsics.checkNotNullParameter);
+ return isCheckNotNullMethod
&& invoke.getFirstArgument() == value
&& originalInvokedMethod.getHolderType().getPackageDescriptor().startsWith(Kotlin.NAME);
}
@@ -763,11 +766,11 @@
}
// We need to ignore the holder, since Kotlin adds different versions of null-check machinery,
// e.g., kotlin.collections.ArraysKt___ArraysKt... or kotlin.jvm.internal.ArrayIteratorKt...
- DexMethod throwParameterIsNullExceptionMethod =
- appView.dexItemFactory().kotlin.intrinsics.throwParameterIsNullException;
+ Intrinsics intrinsics = appView.dexItemFactory().kotlin.intrinsics;
DexMethod originalInvokedMethod =
appView.graphLens().getOriginalMethodSignature(invoke.getInvokedMethod());
- return originalInvokedMethod.match(throwParameterIsNullExceptionMethod)
+ return (originalInvokedMethod.match(intrinsics.throwParameterIsNullException)
+ || originalInvokedMethod.match(intrinsics.throwParameterIsNullNPE))
&& originalInvokedMethod.getHolderType().getPackageDescriptor().startsWith(Kotlin.NAME);
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
index 9470367..eb3af79 100644
--- a/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
+++ b/src/main/java/com/android/tools/r8/kotlin/Kotlin.java
@@ -164,9 +164,24 @@
public final DexType type = factory.createType(PACKAGE_PREFIX + "jvm/internal/Intrinsics;");
public final DexMethod throwParameterIsNullException = factory.createMethod(type,
factory.createProto(factory.voidType, factory.stringType), "throwParameterIsNullException");
+ public final DexMethod throwParameterIsNullNPE =
+ factory.createMethod(
+ type,
+ factory.createProto(factory.voidType, factory.stringType),
+ "throwParameterIsNullNPE");
+ public final DexMethod throwParameterIsNullIAE =
+ factory.createMethod(
+ type,
+ factory.createProto(factory.voidType, factory.stringType),
+ "throwParameterIsNullIAE");
public final DexMethod checkParameterIsNotNull = factory.createMethod(type,
factory.createProto(factory.voidType, factory.objectType, factory.stringType),
"checkParameterIsNotNull");
+ public final DexMethod checkNotNullParameter =
+ factory.createMethod(
+ type,
+ factory.createProto(factory.voidType, factory.objectType, factory.stringType),
+ "checkNotNullParameter");
public final DexMethod throwNpe = factory.createMethod(
type, factory.createProto(factory.voidType), "throwNpe");
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java
index 4fcc710..802be75 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java
@@ -81,8 +81,7 @@
assertEquals(allowAccessModification ? 0 : 1, checkParameterIsNotNull);
assertEquals(0, checkNotNullParameter);
} else {
- // TODO(b/139276374): Update such that this is call is inlined.
- assertEquals(1, checkNotNullParameter);
+ assertEquals(allowAccessModification ? 0 : 1, checkNotNullParameter);
assertEquals(0, checkParameterIsNotNull);
}
});