 UNION: neutral-insn
     ##flushable
     ##effect
+    ##loop-entry ;
+
+M: neutral-insn visit , ;
+
+UNION: sync-if-back-edge
     ##branch
-    ##loop-entry
     ##conditional-branch
     ##compare-imm-branch
     ##dispatch ;
 
-M: neutral-insn visit , ;
-
-UNION: sync-if-back-edge
-    ##branch
-    ##conditional-branch
-    ##compare-imm-branch ;
-
 M: sync-if-back-edge visit
-    basic-block get [ successors>> ] [ number>> ] bi '[ number>> _ < ] any?
+    basic-block get [ successors>> ] [ number>> ] bi
+    '[ number>> _ < ] any?
     [ sync-state ] when
     , ;
 

        dup basic-block set
        dup block-in-state
        [ swap set-block-in-state ] [
            [
                [ instructions>> [ visit ] each ]
                [ [ state get ] dip set-block-out-state ]
                [ ]
                tri
            ] with-state
        ] 2bi
    ] V{ } make >>instructions drop ;



ERROR: cannot-merge-poisoned states ;

: multiple-predecessors ( bb states -- state )
    dup [ not ] any? [
        [ <state> ] 2dip
        sift merge-heights
    ] [
        dup [ poisoned?>> ] any? [
            cannot-merge-poisoned
        ] [
            [ state new ] 2dip
            [ predecessors>> ] dip
            {
                [ merge-locs ]
                [ merge-actual-locs ]
                [ merge-heights ]
                [ merge-changed-locs ]
            } 2cleave
        ] if
    ] if ;

: merge-states ( bb states -- state )
    ! If any states are poisoned, save all registers
    ! to the stack in each branch
    dup length {
        { 0 [ initial-state ] }
        { 1 [ single-predecessor ] }
        [ drop multiple-predecessors ]
    } case ;

: block-in-state ( bb -- states )
