Reassociate: add global reassociation algorithm

This algorithm (explained more in the source code) takes into account

global redundancies by building a "pair map" to find common subexprs.

The primary motivation of this is to handle situations like

foo = (a * b) * c

bar = (a * d) * c

where we currently don't identify that "a * c" is redundant.

Accordingly, it prioritizes the emission of a * c so that CSE

can remove the redundant calculation later.

Does not change the actual reassociation algorithm -- only the

order in which the reassociated operand chain is reconstructed.

Gives ~1.5% floating point math instruction count reduction on

a large offline suite of graphics shaders.

llvm-svn: 320515