Expand description

A pass that duplicates switch-terminated blocks into a new copy for each predecessor, provided the predecessor sets the value being switched over to a constant.

The purpose of this pass is to help constant propagation passes to simplify the switch terminator of the copied blocks into gotos when some predecessors statically determine the output of switches.

    x = 12 ---              ---> something
              \            / 12
               --> switch x
              /            \ otherwise
    x = y  ---              ---> something else


    x = 12 ---> switch x ------> something
                         \ / 12
                         / \ otherwise
    x = y  ---> switch x ------> something else

so it can hopefully later be turned by another pass into

    x = 12 --------------------> something
                           / 12
                         /   otherwise
    x = y  ---- switch x ------> something else

This optimization is meant to cover simple cases like ? desugaring. For now, it thus focuses on simplicity rather than completeness (it notably sometimes duplicates abusively).



Finds a unique place that entirely determines the value of switch_place, if it exists. This is only a heuristic. Ideally we would like to track multiple determining places for some edge cases, but one is enough for a lot of situations.
This function describes a rough heuristic guessing whether a place is last set with a const within the block. Notably, it will be overly pessimistic in cases that are already not handled by separate_const_switch.
Returns the amount of blocks that were duplicated