Set hint for liveinterval related to checkcast
- Into the IR, checkcast instruction defines a new value, try to allocate
input and output to the same register by setting a hint. It allows to save
around 9ko of the dex file for GMSCore v10 in release mode. Debug mode is
unchanged.
Change-Id: I9f4a44d25c61d33fe70210a31e9b1b45bc9e67b0
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 5783ad4..55ecb45 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.ir.code.And;
import com.android.tools.r8.ir.code.ArithmeticBinop;
import com.android.tools.r8.ir.code.BasicBlock;
+import com.android.tools.r8.ir.code.CheckCast;
import com.android.tools.r8.ir.code.DebugLocalsChange;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
@@ -751,6 +752,7 @@
while (!unhandled.isEmpty()) {
LiveIntervals unhandledInterval = unhandled.poll();
+ setHintForDestRegOfCheckCast(unhandledInterval);
setHintToPromote2AddrInstruction(unhandledInterval);
// If this interval value is the src of an argument move. Fix the registers for the
@@ -804,6 +806,20 @@
return true;
}
+ private void setHintForDestRegOfCheckCast(LiveIntervals unhandledInterval) {
+ if (unhandledInterval.getHint() == null &&
+ unhandledInterval.getValue().definition instanceof CheckCast) {
+ CheckCast checkcast = unhandledInterval.getValue().definition.asCheckCast();
+ Value checkcastInput = checkcast.inValues().get(0);
+ assert checkcastInput != null;
+ if (checkcastInput.getLiveIntervals() != null &&
+ !checkcastInput.getLiveIntervals().overlaps(unhandledInterval) &&
+ checkcastInput.getLocalInfo() == unhandledInterval.getValue().definition.getLocalInfo()) {
+ unhandledInterval.setHint(checkcastInput.getLiveIntervals());
+ }
+ }
+ }
+
/*
* This method tries to promote arithmetic binary instruction to use the 2Addr form.
* To achieve this goal the output interval of the binary instruction is set with an hint
diff --git a/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java b/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
index 5dc1e75..162db06 100644
--- a/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
+++ b/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
@@ -444,6 +444,6 @@
// TODO(sgjesse): Maybe this test is too fragile, as it leaves quite a lot of code, so the
// expectation might need changing with other optimizations.
// TODO(zerny): Consider optimizing the fallthrough branch of conditionals to not be return.
- assertEquals(27, code.instructions.length);
+ assertEquals(26, code.instructions.length);
}
}