This is an implementation of PR26223.

Currently optimizeMemoryInst optimization tries to fold address computation

if all possible way to get compute the address are of the form

baseGV + base + scale * Index + offset

where scale and offset are constants and baseGV, base and Index are exactly

the same instructions if defined.

The patch extends this optimization to allow different bases. In this case

it tries to find/build a Phi node merging all possible bases and use this Phi node

as a base for sunk address computation.

The main motivation for this scope extension is GCRelocateInst.

If there is a relocation of derived pointer it will be represented as relocation of base + offset.

Also there will be a Phi node merging address computation for relocated derived pointer

and derived pointer itself. If we have a Phi node merging original base and relocated base

and can fold the address computation of derived pointer then we can potentially reduce

the code size and Phi node for derived pointer. The later can have a positive impact to

register allocator.