Rename SeparateConstOffsetFromGEP pass to ReassociateGEPs and
expand to include reassociation of loop invariant terms in the
indices of GEPs. This reassociation enables splitting GEPs into
two separate GEPS: one loop invariant and the other loop variant
GEPs. The existing reassociation pass is unable to perform this
transformation because that pass does not reassociate values
across GEP operands.
The renamed pass now performs three related GEP transformations:
- Reassociate and gather constant offsets in GEP sequential index operands.
- Reassociate loop invariant terms in GEP sequential index operands.
- (Optional) Lower GEPs into simpler GEPs or their arithmetic equivalents.
This patch adds (2) and includes significant refactoring to share
code between the constant offset reassociation and the loop
invariant reassociation.
Should we run LICM after ReassociateGEPs?