Let's take a look at each of these internal representations of code, and document which of the fields are relevant to each consumer. This is not necessarily the current state, but rather the intended future state.
Definitions
First we have Method: this seems fairly self-explanatory. This represents a user-defined dispatch entry target.
Next we have MethodInstance: this is the pair of details: (Method, specialization types) which uniquely defines each object by egal and type-equality.
Next we have CodeInfo: this describes a precise input to codegen. It might be unspecialized (just the direct output of code lowering) or optimized. It contains the statements of the function, and some metadata for each of the statements. It may contain some extra data unused by codegen, but generally that data may not be available.
Next we have IRCode: this represents a superset of the information in CodeInfo, but also in particular represents it in a exploded way that is easier to mutate. The CodeInfo representation is optimized for size when compressed instead. It might not be easy to mutate this further (though it can be appoximately converted back to an IRCode with some effort)