When using opaque pointers, convert GEPs into offset representation of the form P + V1 * Scale1 + V2 * Scale2 + ... + ConstantOffset. This allows us to recognize equivalent address calculations even if the GEPs don't use the same source element type.
This fixes an opaque pointer codegen regression seen in rustc.
why don't we do this for typed pointers as well?