Don't lens rewrite known parts of polymorphic invokes.

Change-Id: Ib54df6cf4a246d048e1716efe3e70f15b8c52c27
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
index 8cc10c2..249de08 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -34,6 +34,7 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig;
 import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState;
+import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.structural.CompareToVisitor;
 import com.android.tools.r8.utils.structural.HashingVisitor;
 import com.android.tools.r8.utils.structural.StructuralSpecification;
@@ -111,25 +112,27 @@
       LensCodeRewriterUtils rewriter,
       MethodVisitor visitor) {
     Invoke.Type invokeType = Invoke.Type.fromCfOpcode(opcode, method, context, appView);
-    Invoke.Type rewrittenType;
-    DexMethod rewrittenMethod;
     if (invokeType == Type.POLYMORPHIC) {
-      // The method is one of the java.lang.MethodHandle invokes.
-      // Only the argument signature (getProto()) is to be type rewritten.
-      rewrittenType = Type.POLYMORPHIC;
+      assert dexItemFactory.polymorphicMethods.isPolymorphicInvoke(method);
+      // The method is one of java.lang.MethodHandle.invoke/invokeExact.
+      // Only the method signature (getProto()) is to be type rewritten.
       DexProto rewrittenProto = rewriter.rewriteProto(method.getProto());
-      rewrittenMethod =
-          dexItemFactory.createMethod(method.getHolderType(), rewrittenProto, method.getName());
+      visitor.visitMethodInsn(
+          invokeType.getCfOpcode(),
+          DescriptorUtils.descriptorToInternalName(method.holder.toDescriptorString()),
+          method.getName().toString(),
+          rewrittenProto.toDescriptorString(namingLens),
+          itf);
     } else {
       MethodLookupResult lookup =
           graphLens.lookupMethod(method, context.getReference(), invokeType);
-      rewrittenType = lookup.getType();
-      rewrittenMethod = lookup.getReference();
+      Invoke.Type rewrittenType = lookup.getType();
+      DexMethod rewrittenMethod = lookup.getReference();
+      String owner = namingLens.lookupInternalName(rewrittenMethod.holder);
+      String name = namingLens.lookupName(rewrittenMethod).toString();
+      String desc = rewrittenMethod.proto.toDescriptorString(namingLens);
+      visitor.visitMethodInsn(rewrittenType.getCfOpcode(), owner, name, desc, itf);
     }
-    String owner = namingLens.lookupInternalName(rewrittenMethod.holder);
-    String name = namingLens.lookupName(rewrittenMethod).toString();
-    String desc = rewrittenMethod.proto.toDescriptorString(namingLens);
-    visitor.visitMethodInsn(rewrittenType.getCfOpcode(), owner, name, desc, itf);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
index 8e9a2b0..61a0257 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -122,17 +122,17 @@
       GraphLens graphLens,
       ObjectToOffsetMapping mapping,
       LensCodeRewriterUtils rewriter) {
-    MethodLookupResult lookup =
-        graphLens.lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC);
-    // The method is one of the java.lang.MethodHandle invokes.
-    // Only the argument (getProto()) signature is to be type rewritten.
-    assert lookup.getType() == Type.POLYMORPHIC;
-    assert getMethod() == lookup.getReference();
-    writeFirst(A, G, dest);
-    write16BitReference(lookup.getReference(), dest, mapping);
-    write16BitValue(combineBytes(makeByte(F, E), makeByte(D, C)), dest);
-
+    // The method is one of java.lang.MethodHandle.invoke/invokeExact.
+    // Only the method signature (getProto()) is to be type rewritten.
+    assert rewriter.dexItemFactory().polymorphicMethods.isPolymorphicInvoke(getMethod());
+    assert getMethod()
+        == graphLens
+            .lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC)
+            .getReference();
     DexProto rewrittenProto = rewriter.rewriteProto(getProto());
+    writeFirst(A, G, dest);
+    write16BitReference(getMethod(), dest, mapping);
+    write16BitValue(combineBytes(makeByte(F, E), makeByte(D, C)), dest);
     write16BitReference(rewrittenProto, dest, mapping);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
index 94b043a..b795316 100644
--- a/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
+++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -59,17 +59,17 @@
       GraphLens graphLens,
       ObjectToOffsetMapping mapping,
       LensCodeRewriterUtils rewriter) {
-    MethodLookupResult lookup =
-        graphLens.lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC);
-    // The method is one of the java.lang.MethodHandle invokes.
-    // Only the argument (getProto()) signature is to be type rewritten.
-    assert lookup.getType() == Type.POLYMORPHIC;
-    assert getMethod() == lookup.getReference();
-    writeFirst(AA, dest);
-    write16BitReference(lookup.getReference(), dest, mapping);
-    write16BitValue(CCCC, dest);
-
+    // The method is one of java.lang.MethodHandle.invoke/invokeExact.
+    // Only the method signature (getProto()) is to be type rewritten.
+    assert rewriter.dexItemFactory().polymorphicMethods.isPolymorphicInvoke(getMethod());
+    assert getMethod()
+        == graphLens
+            .lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC)
+            .getReference();
     DexProto rewrittenProto = rewriter.rewriteProto(getProto());
+    writeFirst(AA, dest);
+    write16BitReference(getMethod(), dest, mapping);
+    write16BitValue(CCCC, dest);
     write16BitReference(rewrittenProto, dest, mapping);
   }