KnownCase is an optimization pass for the SSA IntermediateLanguage, invoked from SSASimplify.
Description
This pass duplicates and simplifies Case transfers when the
constructor of the scrutinee is known.
Uses Restore.
For example, the program
val rec last =
fn [] => 0
| [x] => x
| _ :: l => last l
val _ = 1 + last [2, 3, 4, 5, 6, 7]
gives rise to the SSA function
fun last_0 (x_142) = loopS_1 ()
loopS_1 ()
loop_11 (x_142)
loop_11 (x_143)
case x_143 of
nil_1 => L_73 | ::_0 => L_74
L_73 ()
return global_5
L_74 (x_145, x_144)
case x_145 of
nil_1 => L_75 | _ => L_76
L_75 ()
return x_144
L_76 ()
loop_11 (x_145)
which is simplified to
fun last_0 (x_142) = loopS_1 ()
loopS_1 ()
case x_142 of
nil_1 => L_73 | ::_0 => L_118
L_73 ()
return global_5
L_118 (x_230, x_229)
L_74 (x_230, x_229, x_142)
L_74 (x_145, x_144, x_232)
case x_145 of
nil_1 => L_75 | ::_0 => L_114
L_75 ()
return x_144
L_114 (x_227, x_226)
L_74 (x_227, x_226, x_145)
Implementation
Details and Notes
One interesting aspect of KnownCase, is that it often has the
effect of unrolling list traversals by one iteration, moving the
nil/:: check to the end of the loop, rather than the beginning.