Add insertConstNumber with typeElement parameter
Bug: 150188380
Change-Id: I61b356018e8275b6c17f246eb4c2ca07ad69e651
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
index 32c5602..f43bb3c 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
@@ -206,17 +206,9 @@
}
@Override
- public Value insertConstNullInstruction(IRCode code, InternalOptions options) {
- ConstNumber constNumberInstruction = code.createConstNull();
- // Note that we only keep position info for throwing instructions in release mode.
- constNumberInstruction.setPosition(options.debug ? current.getPosition() : Position.none());
- add(constNumberInstruction);
- return constNumberInstruction.outValue();
- }
-
- @Override
- public Value insertConstIntInstruction(IRCode code, InternalOptions options, int value) {
- ConstNumber constNumberInstruction = code.createIntConstant(value);
+ public Value insertConstNumberInstruction(
+ IRCode code, InternalOptions options, long value, TypeElement type) {
+ ConstNumber constNumberInstruction = code.createNumberConstant(value, type);
// Note that we only keep position info for throwing instructions in release mode.
constNumberInstruction.setPosition(options.debug ? current.getPosition() : Position.none());
add(constNumberInstruction);
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 064842a..7c8f872 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -1083,14 +1083,20 @@
return createValue(typeLattice, null);
}
+ public ConstNumber createNumberConstant(long value, TypeElement type) {
+ return createNumberConstant(value, type, null);
+ }
+
+ public ConstNumber createNumberConstant(long value, TypeElement type, DebugLocalInfo local) {
+ return new ConstNumber(createValue(type, local), value);
+ }
+
public ConstNumber createDoubleConstant(double value, DebugLocalInfo local) {
- Value out = createValue(TypeElement.getDouble(), local);
- return new ConstNumber(out, Double.doubleToLongBits(value));
+ return createNumberConstant(Double.doubleToLongBits(value), TypeElement.getDouble(), local);
}
public ConstNumber createFloatConstant(float value, DebugLocalInfo local) {
- Value out = createValue(TypeElement.getFloat(), local);
- return new ConstNumber(out, Float.floatToIntBits(value));
+ return createNumberConstant(Float.floatToIntBits(value), TypeElement.getFloat(), local);
}
public ConstNumber createIntConstant(int value) {
@@ -1098,13 +1104,11 @@
}
public ConstNumber createIntConstant(int value, DebugLocalInfo local) {
- Value out = createValue(TypeElement.getInt(), local);
- return new ConstNumber(out, value);
+ return createNumberConstant(value, TypeElement.getInt(), local);
}
public ConstNumber createLongConstant(long value, DebugLocalInfo local) {
- Value out = createValue(TypeElement.getLong(), local);
- return new ConstNumber(out, value);
+ return createNumberConstant(value, TypeElement.getLong(), local);
}
public ConstString createStringConstant(AppView<?> appView, DexString value) {
@@ -1131,13 +1135,11 @@
}
public ConstNumber createConstNull() {
- Value out = createValue(TypeElement.getNull());
- return new ConstNumber(out, 0);
+ return createNumberConstant(0, TypeElement.getNull());
}
public ConstNumber createConstNull(DebugLocalInfo local) {
- Value out = createValue(TypeElement.getNull(), local);
- return new ConstNumber(out, 0);
+ return createNumberConstant(0, TypeElement.getNull(), local);
}
public boolean doAllThrowingInstructionsHavePositions() {
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java
index 03ca81d..b009a8b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.utils.InternalOptions;
import java.util.ListIterator;
import java.util.NoSuchElementException;
@@ -29,13 +30,9 @@
}
@Override
- public Value insertConstNullInstruction(IRCode code, InternalOptions options) {
- return instructionIterator.insertConstNullInstruction(code, options);
- }
-
- @Override
- public Value insertConstIntInstruction(IRCode code, InternalOptions options, int value) {
- return instructionIterator.insertConstIntInstruction(code, options, value);
+ public Value insertConstNumberInstruction(
+ IRCode code, InternalOptions options, long value, TypeElement type) {
+ return instructionIterator.insertConstNumberInstruction(code, options, value, type);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
index 371438e..ccb30e4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.Sets;
import java.util.ListIterator;
@@ -61,9 +62,17 @@
// Intentionally empty.
}
- Value insertConstNullInstruction(IRCode code, InternalOptions options);
+ default Value insertConstNullInstruction(IRCode code, InternalOptions options) {
+ return insertConstNumberInstruction(code, options, 0, TypeElement.getNull());
+ }
- Value insertConstIntInstruction(IRCode code, InternalOptions options, int value);
+ default Value insertConstIntInstruction(IRCode code, InternalOptions options, int value) {
+ return insertConstNumberInstruction(code, options, value, TypeElement.getInt());
+ }
+
+ // This method can be used for any numeric constant, but also for null (value 0, null type).
+ Value insertConstNumberInstruction(
+ IRCode code, InternalOptions options, long value, TypeElement type);
Value insertConstStringInstruction(AppView<?> appView, IRCode code, DexString value);
diff --git a/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java
index 15700bf..0dc3f97 100644
--- a/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.utils.InternalOptions;
import java.util.ListIterator;
import java.util.Set;
@@ -42,13 +43,9 @@
}
@Override
- public Value insertConstNullInstruction(IRCode code, InternalOptions options) {
- return currentBlockIterator.insertConstNullInstruction(code, options);
- }
-
- @Override
- public Value insertConstIntInstruction(IRCode code, InternalOptions options, int value) {
- return currentBlockIterator.insertConstIntInstruction(code, options, value);
+ public Value insertConstNumberInstruction(
+ IRCode code, InternalOptions options, long value, TypeElement type) {
+ return currentBlockIterator.insertConstNumberInstruction(code, options, value, type);
}
@Override
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 21228a9..db7948c 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
@@ -551,10 +551,10 @@
&& initialValue.definition.asConstNumber().isZero()
&& defaultValueHasChanged(oldType, newType)) {
iterator.previous();
- // TODO(b/150188380): Add API to insert a const instruction with a type lattice.
- Value rewrittenDefaultValue = iterator.insertConstIntInstruction(code, appView.options(), 0);
+ Value rewrittenDefaultValue =
+ iterator.insertConstNumberInstruction(
+ code, appView.options(), 0, defaultValueLatticeElement(newType));
iterator.next();
- rewrittenDefaultValue.setType(defaultValueLatticeElement(newType));
return rewrittenDefaultValue;
}
return initialValue;
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
index bbc6c26..111338b 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
@@ -50,12 +50,8 @@
}
@Override
- public Value insertConstNullInstruction(IRCode code, InternalOptions options) {
- throw new Unimplemented();
- }
-
- @Override
- public Value insertConstIntInstruction(IRCode code, InternalOptions options, int value) {
+ public Value insertConstNumberInstruction(
+ IRCode code, InternalOptions options, long value, TypeElement type) {
throw new Unimplemented();
}