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.