Avoid unchanged messages after CrossOver.
diff --git a/src/protobuf_mutator.cc b/src/protobuf_mutator.cc
index 6b91e0c..f31a976 100644
--- a/src/protobuf_mutator.cc
+++ b/src/protobuf_mutator.cc
@@ -166,7 +166,7 @@
       delete_weight_ *= 1 - adjustment;
     }
     Sample(message);
-    assert(mutation() != Mutation::None);
+    assert(mutation() != Mutation::None || !size_increase_hint);
   }
 
   // Returns selected field.
@@ -486,12 +486,22 @@
 
 void ProtobufMutator::CrossOver(const protobuf::Message& message1,
                                 protobuf::Message* message2) {
+  // CrossOver can produce result which still equals to inputs. So we backup
+  // message2 to later comparison. message1 is already constant.
+  std::unique_ptr<protobuf::Message> message2_copy(message2->New());
+  message2_copy->CopyFrom(*message2);
+
   CrossOverImpl(message1, message2);
 
   if (keep_initialized_ && !message2->IsInitialized()) {
     InitializeMessage(message2, kMaxInitializeDepth);
     assert(message2->IsInitialized());
   }
+
+  if (MessageDifferencer::Equals(*message2_copy, *message2) ||
+      MessageDifferencer::Equals(message1, *message2)) {
+    Mutate(message2, 0);
+  }
 }
 
 void ProtobufMutator::CrossOverImpl(const protobuf::Message& message1,