llvm optimizes out (Removes) the getelementptr instructions which access the first field of a structure, since this boils down to a zero offset, retaining this would help in understand structure accesses. The following explains this in brief,
If this is semantically relevant for you, the way to handle it is to use intrinsics instead of GEPs, see e.g. the llvm.preserve.struct.access.index intrinsic used by the eBPF target.
GEPs themselves are semantically considered to be pure offset arithmetic, and as such any type information they carry is only preserved incidentally, not intentionally. The only circumstances under which we retain zero index GEPs is if they carry an inrange (as opposed to inbounds) attribute or perform an implicit splat.