[InstCombine] Look through PHIs, GEPs, IntToPtrs and PtrToInts to expose more constants when comparing GEPs

Summary:

When comparing two GEP instructions which have the same base pointer

and one of them has a constant index, it is possible to only compare

indices, transforming it to a compare with a constant. This removes

one use for the GEP instruction with the constant index, can reduce

register pressure and can sometimes lead to removing the comparisson

entirely.

InstCombine was already doing this when comparing two GEPs if the

base pointers were the same. However, in the case where we have

complex pointer arithmetic (GEPs applied to GEPs, PHIs of GEPs,

conversions to or from integers, etc) the value of the original

base pointer will be hidden to the optimizer and this transformation

will be disabled.

This change detects when the two sides of the comparison can be

expressed as GEPs with the same base pointer, even if they don't

appear as such in the IR. The transformation will convert all the

pointer arithmetic to arithmetic done on indices and all the

relevant uses of GEPs to GEPs with a common base pointer. The

GEP comparison will be converted to a comparison done on indices.

Reviewers: majnemer, jmolloy

Subscribers: hfinkel, jevinskie, jmolloy, aadg, llvm-commits

Differential Revision: http://reviews.llvm.org/D15146