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();
     }