Skip to content

Commit

Permalink
Prepare clinit analysis for constructor inlining
Browse files Browse the repository at this point in the history
Change-Id: Id7c09f6b54e7f92e13c58faa39fa5518843fdc31
  • Loading branch information
christofferqa committed May 9, 2023
1 parent 4b8928a commit 34ac3d6
Showing 1 changed file with 17 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndField;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexProgramClass;
Expand All @@ -33,6 +33,7 @@
import com.android.tools.r8.ir.code.StaticPut;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.SetUtils;
import com.android.tools.r8.utils.WorkList;
Expand Down Expand Up @@ -80,12 +81,12 @@
*/
public class ValueMayDependOnEnvironmentAnalysis {

private final AppView<?> appView;
private final AppView<AppInfoWithLiveness> appView;
private final ProgramMethod context;
private final DexItemFactory dexItemFactory;
private final InternalOptions options;

public ValueMayDependOnEnvironmentAnalysis(AppView<?> appView, IRCode code) {
public ValueMayDependOnEnvironmentAnalysis(AppView<AppInfoWithLiveness> appView, IRCode code) {
this.appView = appView;
this.context = code.context();
this.dexItemFactory = appView.dexItemFactory();
Expand Down Expand Up @@ -320,17 +321,27 @@ private boolean addNewInstanceValueToValueGraph(

// Find the single constructor invocation.
InvokeDirect constructorInvoke = newInstance.getUniqueConstructorInvoke(dexItemFactory);
if (constructorInvoke == null || constructorInvoke.getInvokedMethod().holder != clazz.type) {
// Didn't find a (valid) constructor invocation, give up.
if (constructorInvoke == null) {
// Didn't find a constructor invocation, give up.
return false;
}

// Check that it is a trivial initializer (otherwise, the constructor could do anything).
DexEncodedMethod constructor = clazz.lookupMethod(constructorInvoke.getInvokedMethod());
DexClassAndMethod constructor =
appView
.appInfo()
.resolveMethod(
constructorInvoke.getInvokedMethod(), constructorInvoke.getInterfaceBit())
.getResolutionPair();
if (constructor == null) {
return false;
}

if (!options.canInitNewInstanceUsingSuperclassConstructor()
&& constructor.getHolder() != clazz) {
return false;
}

InstanceInitializerInfo initializerInfo =
constructor.getOptimizationInfo().getInstanceInitializerInfo(constructorInvoke);

Expand Down

0 comments on commit 34ac3d6

Please sign in to comment.