Move buildArgumentsWithUnusedArgumentStubs
Bug: 147860220
Change-Id: I13bbb99c8698b6c9c06c8b23f1f1eb3444d0a9da
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index a7c90fe..8f6ea1e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -385,7 +385,7 @@
inPrelude = true;
state.buildPrelude(canonicalPositions.getPreamblePosition());
setLocalVariableLists();
- DexSourceCode.buildArgumentsWithUnusedArgumentStubs(builder, 0, method, state::write);
+ builder.buildArgumentsWithUnusedArgumentStubs(0, method, state::write);
// Add debug information for all locals at the initial label.
Int2ReferenceMap<DebugLocalInfo> locals = getLocalVariables(0).locals;
if (!locals.isEmpty()) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index a16e20e..2436ed1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -40,10 +40,6 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfo;
-import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfoCollection;
-import com.android.tools.r8.ir.analysis.type.Nullability;
-import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.code.CanonicalPositions;
import com.android.tools.r8.ir.code.CatchHandlers;
import com.android.tools.r8.ir.code.Position;
@@ -141,8 +137,7 @@
if (code.incomingRegisterSize == 0) {
return;
}
- buildArgumentsWithUnusedArgumentStubs(
- builder,
+ builder.buildArgumentsWithUnusedArgumentStubs(
code.registerSize - code.incomingRegisterSize,
method,
DexSourceCode::doNothingWriteConsumer);
@@ -152,58 +147,6 @@
// Intentionally empty.
}
- public static void buildArgumentsWithUnusedArgumentStubs(
- IRBuilder builder,
- int register,
- DexEncodedMethod method,
- BiConsumer<Integer, DexType> writeCallback) {
- RemovedArgumentInfoCollection removedArgumentsInfo =
- builder.getPrototypeChanges().getRemovedArgumentInfoCollection();
-
- // Fill in the Argument instructions (incomingRegisterSize last registers) in the argument
- // block.
- int argumentIndex = 0;
-
- if (!method.isStatic()) {
- writeCallback.accept(register, method.method.holder);
- builder.addThisArgument(register);
- ++argumentIndex;
- ++register;
- }
-
- int numberOfArguments =
- method.method.proto.parameters.values.length
- + removedArgumentsInfo.numberOfRemovedArguments()
- + (method.isStatic() ? 0 : 1);
-
- for (int usedArgumentIndex = 0; argumentIndex < numberOfArguments; ++argumentIndex) {
- TypeLatticeElement type;
- if (removedArgumentsInfo.isArgumentRemoved(argumentIndex)) {
- RemovedArgumentInfo argumentInfo = removedArgumentsInfo.getArgumentInfo(argumentIndex);
- writeCallback.accept(register, argumentInfo.getType());
- type =
- TypeLatticeElement.fromDexType(
- argumentInfo.getType(), Nullability.maybeNull(), builder.appView);
- builder.addConstantOrUnusedArgument(register, argumentInfo);
- } else {
- DexType dexType = method.method.proto.parameters.values[usedArgumentIndex++];
- writeCallback.accept(register, dexType);
- type =
- TypeLatticeElement.fromDexType(
- dexType,
- Nullability.maybeNull(),
- builder.appView);
- if (dexType.isBooleanType()) {
- builder.addBooleanNonThisArgument(register);
- } else {
- builder.addNonThisArgument(register, type);
- }
- }
- register += type.requiredRegisters();
- }
- builder.flushArgumentInstructions();
- }
-
@Override
public void buildPostlude(IRBuilder builder) {
// Intentionally left empty. (Needed in the Java bytecode frontend for synchronization support.)
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 d60b1e7..7995fdb 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
@@ -36,6 +36,7 @@
import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.graph.RewrittenPrototypeDescription;
import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfo;
+import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.type.Nullability;
import com.android.tools.r8.ir.analysis.type.PrimitiveTypeLatticeElement;
import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
@@ -135,6 +136,7 @@
import java.util.Map;
import java.util.Queue;
import java.util.Set;
+import java.util.function.BiConsumer;
/**
* Builder object for constructing high-level IR from dex bytecode.
@@ -504,6 +506,53 @@
currentBlock = block;
}
+ public void buildArgumentsWithUnusedArgumentStubs(
+ int register, DexEncodedMethod method, BiConsumer<Integer, DexType> writeCallback) {
+ RemovedArgumentInfoCollection removedArgumentsInfo =
+ prototypeChanges.getRemovedArgumentInfoCollection();
+
+ // Fill in the Argument instructions (incomingRegisterSize last registers) in the argument
+ // block.
+ int argumentIndex = 0;
+
+ if (!method.isStatic()) {
+ writeCallback.accept(register, method.method.holder);
+ addThisArgument(register);
+ argumentIndex++;
+ register++;
+ }
+
+ int numberOfArguments =
+ method.method.proto.parameters.values.length
+ + removedArgumentsInfo.numberOfRemovedArguments()
+ + (method.isStatic() ? 0 : 1);
+
+ int usedArgumentIndex = 0;
+ while (argumentIndex < numberOfArguments) {
+ TypeLatticeElement type;
+ if (removedArgumentsInfo.isArgumentRemoved(argumentIndex)) {
+ RemovedArgumentInfo argumentInfo = removedArgumentsInfo.getArgumentInfo(argumentIndex);
+ writeCallback.accept(register, argumentInfo.getType());
+ type =
+ TypeLatticeElement.fromDexType(
+ argumentInfo.getType(), Nullability.maybeNull(), appView);
+ addConstantOrUnusedArgument(register, argumentInfo);
+ } else {
+ DexType dexType = method.method.proto.parameters.values[usedArgumentIndex++];
+ writeCallback.accept(register, dexType);
+ type = TypeLatticeElement.fromDexType(dexType, Nullability.maybeNull(), appView);
+ if (dexType.isBooleanType()) {
+ addBooleanNonThisArgument(register);
+ } else {
+ addNonThisArgument(register, type);
+ }
+ }
+ register += type.requiredRegisters();
+ argumentIndex++;
+ }
+ flushArgumentInstructions();
+ }
+
/**
* Build the high-level IR in SSA form.
*
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
index 98e83c4..ed47e54 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SyntheticSourceCode.java
@@ -156,11 +156,8 @@
@Override
public final void buildPrelude(IRBuilder builder) {
- DexSourceCode.buildArgumentsWithUnusedArgumentStubs(
- builder,
- 0,
- builder.getMethod(),
- DexSourceCode::doNothingWriteConsumer);
+ builder.buildArgumentsWithUnusedArgumentStubs(
+ 0, builder.getMethod(), DexSourceCode::doNothingWriteConsumer);
}
@Override