I think that it's because 1) when the input isn't a string, CheckEqualsInternalizedString will almost always deopt because it will treat it as a string and it's very unlikely that reading random fields from a random objects produces the expected string, and 2) we were still inserting a CheckString (as far as I can see) but after the CheckEqualsInternalizedString, so even if by chance we had a random object that passed CheckEqualsInternalizedString, then we would have deopted afterwards on the CheckString.
My fix is mainly to make the graph more sound, and to avoid loading string fields from non-string objects.