Account for propagated fields in lambda merger

Change-Id: I99080829751fdc4188edf16b073ac295567dcd3f
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
index fbd189c..f868855 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/JStyleLambdaGroup.java
@@ -160,7 +160,7 @@
     }
 
     @Override
-    int getInstanceInitializerSize(List<DexEncodedField> captures) {
+    int getInstanceInitializerMaxSize(List<DexEncodedField> captures) {
       return captures.size() + 2;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
index b5f0eaf..b510e88 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KStyleLambdaGroup.java
@@ -166,7 +166,7 @@
     }
 
     @Override
-    int getInstanceInitializerSize(List<DexEncodedField> captures) {
+    int getInstanceInitializerMaxSize(List<DexEncodedField> captures) {
       return captures.size() + 3;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
index f500c06..3e38f67 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaClassValidator.java
@@ -124,7 +124,7 @@
     }
   }
 
-  abstract int getInstanceInitializerSize(List<DexEncodedField> captures);
+  abstract int getInstanceInitializerMaxSize(List<DexEncodedField> captures);
 
   abstract int validateInstanceInitializerEpilogue(
       com.android.tools.r8.code.Instruction[] instructions, int index) throws LambdaStructureError;
@@ -135,7 +135,7 @@
     com.android.tools.r8.code.Instruction[] instructions = code.asDexCode().instructions;
     int index = 0;
 
-    if (instructions.length != getInstanceInitializerSize(captures)) {
+    if (instructions.length > getInstanceInitializerMaxSize(captures)) {
       throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
     }
 
@@ -148,15 +148,21 @@
     assert index == instructions.length;
   }
 
-  private int validateInstanceInitializerParameterMapping(List<DexEncodedField> captures,
-      Instruction[] instructions, int index) throws LambdaStructureError {
+  private int validateInstanceInitializerParameterMapping(
+      List<DexEncodedField> captures, Instruction[] instructions, int index)
+      throws LambdaStructureError {
+    int dead = 0;
     int wideFieldsSeen = 0;
     for (DexEncodedField field : captures) {
+      if (field.getOptimizationInfo().isDead()) {
+        dead++;
+        continue;
+      }
       switch (field.field.type.toShorty()) {
         case 'Z':
           if (!(instructions[index] instanceof IputBoolean)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           break;
@@ -164,7 +170,7 @@
         case 'B':
           if (!(instructions[index] instanceof IputByte)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           break;
@@ -172,7 +178,7 @@
         case 'S':
           if (!(instructions[index] instanceof IputShort)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           break;
@@ -180,7 +186,7 @@
         case 'C':
           if (!(instructions[index] instanceof IputChar)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           break;
@@ -189,7 +195,7 @@
         case 'F':
           if (!(instructions[index] instanceof Iput)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           break;
@@ -198,7 +204,7 @@
         case 'D':
           if (!(instructions[index] instanceof IputWide)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           wideFieldsSeen++;
@@ -207,7 +213,7 @@
         case 'L':
           if (!(instructions[index] instanceof IputObject)
               || (instructions[index].getField() != field.field)
-              || (((Format22c) instructions[index]).A != (index + 1 + wideFieldsSeen))) {
+              || (((Format22c) instructions[index]).A != (index + 1 + dead + wideFieldsSeen))) {
             throw structureError(LAMBDA_INIT_CODE_VERIFICATION_FAILED);
           }
           break;