 : return? ( bb -- ? )
     skip-empty-blocks
     instructions>> {
-        [ length 2 = ]
-        [ first ##epilogue? ]
-        [ second ##return? ]
+        [ length 3 = ]
+        [ first ##safepoint? ]
+        [ second ##epilogue? ]
+        [ third ##return? ]
+
+        ! [ length 2 = ]
+        ! [ first ##epilogue? ]
+        ! [ second ##return? ]
     } 1&& ;
 
 : tail-call? ( bb -- ? )

    '[
        instructions>>
        [ pop* ] [ pop ] [ ] tri
        [ [ \ ##epilogue new-insn ] dip push ]
        [ _ dip push ] bi
    ]
    [ successors>> delete-all ]
    bi ; inline


: convert-loop-tail-call ( bb -- )
    ! If a word calls itself, this becomes a loop in the CFG.
    [
        instructions>> {
            [ pop* ]
            [ pop* ]
            [ [ \ ##safepoint new-insn ] dip push ]
            [ [ \ ##branch new-insn ] dip push ]
        } cleave
    ]
    [ successors>> delete-all ]
    [ [ cfg get entry>> successors>> first ] dip successors>> push ]
    tri ;
