Reland fix for incorrect type in class inliner
Change-Id: I86c37b4d5dd071176a925b1298bcd749466e446f
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java
index a16e9a3..e207e50 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/FieldValueHelper.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.ir.optimize.classinliner;
+import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
import com.android.tools.r8.graph.AppView;
@@ -14,6 +15,7 @@
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionIterator;
+import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.Phi;
import com.android.tools.r8.ir.code.Phi.RegisterReadType;
import com.android.tools.r8.ir.code.Value;
@@ -140,12 +142,17 @@
assert root == valueProducingInsn;
if (defaultValue == null) {
+ InstructionListIterator it = block.listIterator(code, root);
// If we met newInstance it means that default value is supposed to be used.
- defaultValue =
- code.createValue(TypeLatticeElement.fromDexType(field.type, maybeNull(), appView));
- ConstNumber defaultValueInsn = new ConstNumber(defaultValue, 0);
- defaultValueInsn.setPosition(root.getPosition());
- block.listIterator(code, root).add(defaultValueInsn);
+ if (field.type.isPrimitiveType()) {
+ defaultValue = code.createValue(
+ TypeLatticeElement.fromDexType(field.type, definitelyNotNull(), appView));
+ ConstNumber defaultValueInsn = new ConstNumber(defaultValue, 0);
+ defaultValueInsn.setPosition(root.getPosition());
+ it.add(defaultValueInsn);
+ } else {
+ defaultValue = it.insertConstNullInstruction(code, appView.options());
+ }
}
return defaultValue;
}