Reassociation of math ops in some contexts (especially vector contexts)
has generally only been happening when the 'fast' FMF was set. This
enables reassoication when only the finer grained controls 'reassoc' and
'nsz' are set.
This also improves many vector reassociation opportunities. It also improves some scalar reassociation, although I haven't looked for tests that can be made more aggressive on the scalar side yet (or written new tests on the scalar side).
This changes Instruction::isAssociative() to use hasAllowReassoc() && hasNoSignedZeros() rather than isFast() for FMul and FAdd ops. I believe that ultimately Instruction::isAssociative() should only check hasAllowReassoc() for these ops, and that transformations that also require nsz should be handled by the callers, as appropriate. Auditing all the callers would be needed to get that correct. I think this improves the situation, without creating a danger.