[InstCombine] Look through PHIs, GEPs, IntToPtrs and PtrToInts to expose more constan...
authorSilviu Baranga <silviu.baranga@arm.com>
Thu, 7 Jan 2016 14:56:08 +0000 (14:56 +0000)
committerSilviu Baranga <silviu.baranga@arm.com>
Thu, 7 Jan 2016 14:56:08 +0000 (14:56 +0000)
commitf3ba9f9b6a25e346e1633c405868c96d8b102a8a
treecaaf450e3076ed6197b0309462c9ab38262bf6fb
parent83fc76e8ebb4a81ff3142035d29275e60afa3ada
[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257064 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/indexed-gep-compares.ll [new file with mode: 0644]