Refactor insertion of read cast type
Change-Id: I72ea5a6e6d99f94a7e9a623f6cfc109c741574d4
diff --git a/src/main/java/com/android/tools/r8/ir/code/FieldGet.java b/src/main/java/com/android/tools/r8/ir/code/FieldGet.java
index c1dee99..5a42ddc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FieldGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FieldGet.java
@@ -17,6 +17,8 @@
TypeElement getOutType();
+ FieldInstruction asFieldInstruction();
+
boolean isInstanceGet();
InstanceGet asInstanceGet();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 13ce76b..ca0f4269 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -76,6 +76,7 @@
import com.android.tools.r8.ir.code.ConstMethodHandle;
import com.android.tools.r8.ir.code.ConstMethodType;
import com.android.tools.r8.ir.code.DexItemBasedConstString;
+import com.android.tools.r8.ir.code.FieldGet;
import com.android.tools.r8.ir.code.FieldInstruction;
import com.android.tools.r8.ir.code.FieldPut;
import com.android.tools.r8.ir.code.IRCode;
@@ -626,21 +627,8 @@
}
if (newOutValue != null) {
if (lookup.hasReadCastType() && newOutValue.hasNonDebugUsers()) {
- TypeElement castType =
- TypeElement.fromDexType(
- lookup.getReadCastType(), newOutValue.getType().nullability(), appView);
- Value castOutValue = code.createValue(castType);
- newOutValue.replaceUsers(castOutValue);
- CheckCast checkCast =
- SafeCheckCast.builder()
- .setCastType(lookup.getReadCastType())
- .setObject(newOutValue)
- .setOutValue(castOutValue)
- .setPosition(instanceGet)
- .build();
- iterator.addThrowingInstructionToPossiblyThrowingBlock(
- code, blocks, checkCast, options);
- affectedPhis.addAll(checkCast.outValue().uniquePhiUsers());
+ insertReadCast(
+ code, blocks, iterator, instanceGet, lookup, newOutValue, affectedPhis);
} else if (newOutValue.getType() != instanceGet.getOutType()) {
affectedPhis.addAll(newOutValue.uniquePhiUsers());
}
@@ -684,21 +672,8 @@
}
if (newOutValue != null) {
if (lookup.hasReadCastType() && newOutValue.hasNonDebugUsers()) {
- TypeElement castType =
- TypeElement.fromDexType(
- lookup.getReadCastType(), newOutValue.getType().nullability(), appView);
- Value castOutValue = code.createValue(castType);
- newOutValue.replaceUsers(castOutValue);
- CheckCast checkCast =
- SafeCheckCast.builder()
- .setCastType(lookup.getReadCastType())
- .setObject(newOutValue)
- .setOutValue(castOutValue)
- .setPosition(staticGet)
- .build();
- iterator.addThrowingInstructionToPossiblyThrowingBlock(
- code, blocks, checkCast, options);
- affectedPhis.addAll(checkCast.outValue().uniquePhiUsers());
+ insertReadCast(
+ code, blocks, iterator, staticGet, lookup, newOutValue, affectedPhis);
} else if (newOutValue.getType() != staticGet.getOutType()) {
affectedPhis.addAll(newOutValue.uniquePhiUsers());
}
@@ -1067,6 +1042,30 @@
instructionIterator.removeOrReplaceByDebugLocalRead();
}
+ private void insertReadCast(
+ IRCode code,
+ BasicBlockIterator blocks,
+ InstructionListIterator iterator,
+ FieldGet fieldGet,
+ FieldLookupResult lookup,
+ Value newOutValue,
+ Set<Phi> affectedPhis) {
+ TypeElement castTypeElement =
+ TypeElement.fromDexType(
+ lookup.getReadCastType(), newOutValue.getType().nullability(), appView);
+ Value castOutValue = code.createValue(castTypeElement);
+ newOutValue.replaceUsers(castOutValue);
+ CheckCast checkCast =
+ SafeCheckCast.builder()
+ .setCastType(lookup.getReadCastType())
+ .setObject(newOutValue)
+ .setOutValue(castOutValue)
+ .setPosition(fieldGet.asFieldInstruction())
+ .build();
+ iterator.addThrowingInstructionToPossiblyThrowingBlock(code, blocks, checkCast, options);
+ affectedPhis.addAll(checkCast.outValue().uniquePhiUsers());
+ }
+
private Argument rewriteArgumentType(
IRCode code,
Argument argument,