Fix method removal in replaceMethods()

Change-Id: I15f5a803febea18f7dc6b8842c90f66903b43827
diff --git a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
index 5c41207..d42f6eb 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodMapBacking.java
@@ -115,7 +115,11 @@
 
   @Override
   DexEncodedMethod getMethod(DexProto methodProto, DexString methodName) {
-    return methodMap.get(DexMethodSignature.create(methodName, methodProto));
+    return getMethod(DexMethodSignature.create(methodName, methodProto));
+  }
+
+  DexEncodedMethod getMethod(DexMethodSignature method) {
+    return methodMap.get(method);
   }
 
   private DexEncodedMethod getMethod(Predicate<DexEncodedMethod> predicate) {
@@ -200,7 +204,11 @@
 
   @Override
   DexEncodedMethod removeMethod(DexMethod method) {
-    return methodMap.remove(method.getSignature());
+    return removeMethod(method.getSignature());
+  }
+
+  DexEncodedMethod removeMethod(DexMethodSignature method) {
+    return methodMap.remove(method);
   }
 
   @Override
@@ -263,8 +271,11 @@
     for (DexEncodedMethod method : initialValues) {
       DexEncodedMethod newMethod = replacement.apply(method);
       if (newMethod != method) {
-        removeMethod(method.getReference());
-        addMethod(newMethod);
+        DexMethodSignature signature = method.getSignature();
+        if (getMethod(signature) == method) {
+          removeMethod(signature);
+        }
+        methodMap.put(newMethod.getSignature(), newMethod);
       }
     }
   }