If the instruction we're hoisting out of a loop into its preheader is
guaranteed to have executed in the loop, then the metadata associated
with the instruction (e.g. !range or !dereferenceable) is valid in the
preheader. This is because once we're in the preheader, we know we're
eventually going to reach the location the metadata was valid at.
This change makes LICM smarter around this, and helps it recognize cases
like these:
do { int a = *ptr; !range !0 ... } while (i++ < N);
to
int a = *ptr; !range !0 do { ... } while (i++ < N);
Earlier we'd drop the !range metadata after hoisting the load from
ptr.