Use latest graph lens as code lens for inlining IR
Change-Id: I1805381e589ba243c41a3faf6fb2b78688467480
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
index 2e6564d..292178b 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -214,7 +214,7 @@
AppView<?> appView = builder.appView;
ProgramMethod context = builder.getProgramMethod();
canonicalMethod = method;
- type = Invoke.Type.fromInvokeSpecial(method, context, appView);
+ type = Invoke.Type.fromInvokeSpecial(method, context, appView, builder.getCodeLens());
break;
}
case Opcodes.INVOKESTATIC:
@@ -244,7 +244,8 @@
builder.addMoveResult(state.push(method.getReturnType()).register);
}
assert type
- == Invoke.Type.fromCfOpcode(opcode, method, builder.getProgramMethod(), builder.appView);
+ == Invoke.Type.fromCfOpcode(
+ opcode, method, builder.getProgramMethod(), builder.appView, builder.getCodeLens());
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index fd550c1..c043d4a 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -427,7 +427,8 @@
public IRCode buildIR(ProgramMethod method, AppView<?> appView, Origin origin) {
verifyFramesOrRemove(
method.getDefinition(), appView, origin, IRBuilder.lookupPrototypeChanges(appView, method));
- return internalBuildPossiblyWithLocals(method, method, appView, null, null, origin, null);
+ return internalBuildPossiblyWithLocals(
+ method, method, appView, appView.codeLens(), null, null, origin, null);
}
@Override
@@ -435,6 +436,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
@@ -444,7 +446,14 @@
assert protoChanges != null;
verifyFramesOrRemove(method.getDefinition(), appView, origin, protoChanges);
return internalBuildPossiblyWithLocals(
- context, method, appView, valueNumberGenerator, callerPosition, origin, protoChanges);
+ context,
+ method,
+ appView,
+ codeLens,
+ valueNumberGenerator,
+ callerPosition,
+ origin,
+ protoChanges);
}
private void verifyFramesOrRemove(
@@ -465,6 +474,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
@@ -475,13 +485,21 @@
context,
method,
appView,
+ codeLens,
valueNumberGenerator,
callerPosition,
origin,
protoChanges);
} else {
return internalBuildWithLocals(
- context, method, appView, valueNumberGenerator, callerPosition, origin, protoChanges);
+ context,
+ method,
+ appView,
+ codeLens,
+ valueNumberGenerator,
+ callerPosition,
+ origin,
+ protoChanges);
}
}
@@ -490,6 +508,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
@@ -500,6 +519,7 @@
context,
method,
appView,
+ codeLens,
valueNumberGenerator,
callerPosition,
origin,
@@ -511,6 +531,7 @@
context,
method,
appView,
+ codeLens,
valueNumberGenerator,
callerPosition,
origin,
@@ -524,6 +545,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
@@ -544,7 +566,7 @@
} else {
builder =
IRBuilder.createForInlining(
- method, appView, source, origin, valueNumberGenerator, protoChanges);
+ method, appView, codeLens, source, origin, valueNumberGenerator, protoChanges);
}
return builder.build(context);
}
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 8de51ce..205422c 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -21,6 +21,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 2c36882..aa201c2 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -275,6 +275,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
@@ -286,7 +287,7 @@
appView.graphLens().getOriginalMethodSignature(method.getReference()),
callerPosition);
return IRBuilder.createForInlining(
- method, appView, source, origin, valueNumberGenerator, protoChanges)
+ method, appView, codeLens, source, origin, valueNumberGenerator, protoChanges)
.build(context);
}
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index cd91733..0aaa24e 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -235,13 +235,21 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
RewrittenPrototypeDescription protoChanges) {
return asCfCode()
.buildInliningIR(
- context, method, appView, valueNumberGenerator, callerPosition, origin, protoChanges);
+ context,
+ method,
+ appView,
+ codeLens,
+ valueNumberGenerator,
+ callerPosition,
+ origin,
+ protoChanges);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 7e1cd24..c03a7b8 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.ir.code.NumberGenerator;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
+import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.kotlin.KotlinMethodLevelInfo;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.origin.Origin;
@@ -32,10 +33,23 @@
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
- RewrittenPrototypeDescription protoChanges) {
+ MethodProcessor methodProcessor) {
Code code = getDefinition().getCode();
+ GraphLens codeLens = appView.graphLens();
+ RewrittenPrototypeDescription protoChanges = RewrittenPrototypeDescription.none();
+ if (methodProcessor.shouldApplyCodeRewritings(this)) {
+ codeLens = appView.codeLens();
+ protoChanges = appView.graphLens().lookupPrototypeChangesForMethodDefinition(getReference());
+ }
return code.buildInliningIR(
- context, this, appView, valueNumberGenerator, callerPosition, origin, protoChanges);
+ context,
+ this,
+ appView,
+ codeLens,
+ valueNumberGenerator,
+ callerPosition,
+ origin,
+ protoChanges);
}
public void collectIndexedItems(
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
index b3d27a5..8372926 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/code/ClassInitializerMerger.java
@@ -253,6 +253,7 @@
method,
classInitializer,
appView,
+ appView.codeLens(),
valueNumberGenerator,
callerPosition,
classInitializer.getOrigin(),
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
index f595b77..9e6d8a6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -59,11 +59,20 @@
public static Type fromCfOpcode(
int opcode, DexMethod invokedMethod, DexClassAndMethod context, AppView<?> appView) {
+ return fromCfOpcode(opcode, invokedMethod, context, appView, appView.codeLens());
+ }
+
+ public static Type fromCfOpcode(
+ int opcode,
+ DexMethod invokedMethod,
+ DexClassAndMethod context,
+ AppView<?> appView,
+ GraphLens codeLens) {
switch (opcode) {
case Opcodes.INVOKEINTERFACE:
return Type.INTERFACE;
case Opcodes.INVOKESPECIAL:
- return fromInvokeSpecial(invokedMethod, context, appView);
+ return fromInvokeSpecial(invokedMethod, context, appView, codeLens);
case Opcodes.INVOKESTATIC:
return Type.STATIC;
case Opcodes.INVOKEVIRTUAL:
@@ -77,12 +86,19 @@
public static Type fromInvokeSpecial(
DexMethod invokedMethod, DexClassAndMethod context, AppView<?> appView) {
+ return fromInvokeSpecial(invokedMethod, context, appView, appView.codeLens());
+ }
+
+ public static Type fromInvokeSpecial(
+ DexMethod invokedMethod,
+ DexClassAndMethod context,
+ AppView<?> appView,
+ GraphLens codeLens) {
if (invokedMethod.isInstanceInitializer(appView.dexItemFactory())) {
return Type.DIRECT;
}
GraphLens graphLens = appView.graphLens();
- GraphLens codeLens = appView.codeLens();
DexMethod originalContext =
graphLens.getOriginalMethodSignature(context.getReference(), codeLens);
if (invokedMethod.getHolderType() != originalContext.getHolderType()) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 01f1739..8f271a1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -34,6 +34,7 @@
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfo;
@@ -399,6 +400,7 @@
private final ProgramMethod method;
private ProgramMethod context;
public final AppView<?> appView;
+ private final GraphLens codeLens;
private final Origin origin;
private final RewrittenPrototypeDescription prototypeChanges;
private Value receiverValue;
@@ -438,6 +440,7 @@
return new IRBuilder(
method,
appView,
+ appView.codeLens(),
source,
origin,
lookupPrototypeChanges(appView, method),
@@ -447,11 +450,13 @@
public static IRBuilder createForInlining(
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
SourceCode source,
Origin origin,
NumberGenerator valueNumberGenerator,
RewrittenPrototypeDescription protoChanges) {
- return new IRBuilder(method, appView, source, origin, protoChanges, valueNumberGenerator);
+ return new IRBuilder(
+ method, appView, codeLens, source, origin, protoChanges, valueNumberGenerator);
}
public static RewrittenPrototypeDescription lookupPrototypeChanges(
@@ -470,6 +475,7 @@
private IRBuilder(
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
SourceCode source,
Origin origin,
RewrittenPrototypeDescription prototypeChanges,
@@ -480,6 +486,7 @@
this.appView = appView;
this.source = source;
this.origin = origin;
+ this.codeLens = codeLens;
this.prototypeChanges = prototypeChanges;
this.valueNumberGenerator = valueNumberGenerator;
this.basicBlockNumberGenerator = new NumberGenerator();
@@ -489,6 +496,10 @@
return appView.dexItemFactory();
}
+ public GraphLens getCodeLens() {
+ return codeLens;
+ }
+
public DexEncodedMethod getMethod() {
return method.getDefinition();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java
index 35afed1..f348ce7 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/inliner/InliningIRProvider.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.NumberGenerator;
import com.android.tools.r8.ir.code.Position;
-import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.origin.Origin;
import java.util.IdentityHashMap;
@@ -41,12 +40,7 @@
Position position = Position.getPositionForInlining(appView, invoke, context);
Origin origin = method.getOrigin();
return method.buildInliningIR(
- context,
- appView,
- valueNumberGenerator,
- position,
- origin,
- IRBuilder.lookupPrototypeChangesForInlinee(appView, method, methodProcessor));
+ context, appView, valueNumberGenerator, position, origin, methodProcessor);
}
public IRCode getAndCacheInliningIR(InvokeMethod invoke, ProgramMethod method) {
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
index 5c73aee..b750f84 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.UseRegistry;
@@ -48,6 +49,7 @@
ProgramMethod context,
ProgramMethod method,
AppView<?> appView,
+ GraphLens codeLens,
NumberGenerator valueNumberGenerator,
Position callerPosition,
Origin origin,
@@ -55,6 +57,7 @@
return IRBuilder.createForInlining(
method,
appView,
+ codeLens,
getSourceCodeProvider().get(context, callerPosition),
origin,
valueNumberGenerator,