Fork Guard Elimination
Implements the fork-guard elimination pass. The optimization is divided into an analysis step which we run on each node in the function which determines whether it is a guarded fork and if it is identifies the nodes that need to be removed and the nodes that need to be replaced (this is mostly the phi nodes which are replaced by the reduce nodes and the region which joins the guard's branches with the join node of the fork).