Take constant instructions in entry to be source of canonicalization
Bug: b/235319568
Change-Id: If4f0c15b2445ea61ff48cb393805cd9da95ce2fc
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index bf34207..6551955 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -218,43 +218,47 @@
Instruction canonicalizedConstant = entry.getKey();
assert canonicalizedConstant.instructionTypeCanBeCanonicalized();
Instruction newConst;
- switch (canonicalizedConstant.opcode()) {
- case CONST_CLASS:
- if (Log.ENABLED) {
- numberOfConstClassCanonicalization++;
- }
- newConst = ConstClass.copyOf(code, canonicalizedConstant.asConstClass());
- break;
- case CONST_NUMBER:
- if (Log.ENABLED) {
- numberOfConstNumberCanonicalization++;
- }
- newConst = ConstNumber.copyOf(code, canonicalizedConstant.asConstNumber());
- break;
- case CONST_STRING:
- if (Log.ENABLED) {
- numberOfConstStringCanonicalization++;
- }
- newConst = ConstString.copyOf(code, canonicalizedConstant.asConstString());
- break;
- case DEX_ITEM_BASED_CONST_STRING:
- if (Log.ENABLED) {
- numberOfDexItemBasedConstStringCanonicalization++;
- }
- newConst =
- DexItemBasedConstString.copyOf(
- code, canonicalizedConstant.asDexItemBasedConstString());
- break;
- case STATIC_GET:
- if (Log.ENABLED) {
- numberOfEffectivelyFinalFieldCanonicalization++;
- }
- newConst = StaticGet.copyOf(code, canonicalizedConstant.asStaticGet());
- break;
- default:
- throw new Unreachable();
+ if (canonicalizedConstant.getBlock().isEntry()) {
+ newConst = canonicalizedConstant;
+ } else {
+ switch (canonicalizedConstant.opcode()) {
+ case CONST_CLASS:
+ if (Log.ENABLED) {
+ numberOfConstClassCanonicalization++;
+ }
+ newConst = ConstClass.copyOf(code, canonicalizedConstant.asConstClass());
+ break;
+ case CONST_NUMBER:
+ if (Log.ENABLED) {
+ numberOfConstNumberCanonicalization++;
+ }
+ newConst = ConstNumber.copyOf(code, canonicalizedConstant.asConstNumber());
+ break;
+ case CONST_STRING:
+ if (Log.ENABLED) {
+ numberOfConstStringCanonicalization++;
+ }
+ newConst = ConstString.copyOf(code, canonicalizedConstant.asConstString());
+ break;
+ case DEX_ITEM_BASED_CONST_STRING:
+ if (Log.ENABLED) {
+ numberOfDexItemBasedConstStringCanonicalization++;
+ }
+ newConst =
+ DexItemBasedConstString.copyOf(
+ code, canonicalizedConstant.asDexItemBasedConstString());
+ break;
+ case STATIC_GET:
+ if (Log.ENABLED) {
+ numberOfEffectivelyFinalFieldCanonicalization++;
+ }
+ newConst = StaticGet.copyOf(code, canonicalizedConstant.asStaticGet());
+ break;
+ default:
+ throw new Unreachable();
+ }
+ insertCanonicalizedConstant(code, newConst);
}
- insertCanonicalizedConstant(code, newConst);
for (Value outValue : entry.getValue()) {
outValue.replaceUsers(newConst.outValue());
}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index b148604..14dd120 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -945,7 +945,7 @@
// If non null it must be and passed to the consumer.
public StringConsumer mainDexListConsumer = null;
- // If null, no proguad map needs to be computed.
+ // If null, no proguard map needs to be computed.
// If non null it must be and passed to the consumer.
public StringConsumer proguardMapConsumer = null;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java
index f0901e8..7d99b55 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java
@@ -6,7 +6,6 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.NeverInline;
@@ -61,8 +60,7 @@
.filter(InstructionSubject::isMonitorEnter)
.findFirst();
assertTrue(insertedMonitor.isPresent());
- // TODO(b/235319568): Should not be line number 0.
- assertEquals(0, testSubject.getLineNumberForInstruction(insertedMonitor.get()));
+ assertTrue(testSubject.getLineNumberForInstruction(insertedMonitor.get()) > 0);
});
}