Code instance has associated world ages and function pointers, and method instance has back edges. It’s quite natural that they have separate roles. A method instance can have multiple code instances due to invalidation (for example, you might delete a method then add it back, so you need two separate code instance to represent two disjoint world intervals).
I think it works much like this, but it is quite complicated and I don’t know how it works exactly (I haven’t read that part of code carefully). I do know some splittings are done on types and argument positions. So…