CommonSubexp is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.

Description

It eliminates instances of common subexpressions.

Implementation

Details and Notes

In addition to getting the usual sorts of things like

  • (w + 0wx1) + (w + 0wx1)

    rewritten to

    let val w' = w + 0wx1 in w' + w' end

it also gets things like

  • val a = Array_uninit n
    val b = Array_length a

    rewritten to

    val a = Array_uninit n
    val b = n

Arith transfers are handled specially. The result of an Arith transfer can be used in common Arith transfers that it dominates:

  • val l = (n + m) + (n + m)
    
    val k = (l + n) + ((l + m) handle Overflow => ((l + m)
                                                   handle Overflow => l + n))

    is rewritten so that (n + m) is computed exactly once, as are (l + n) and (l + m).