: 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
+ [ [ \ ##safepoint new-insn ] dip push ]
[ [ \ ##epilogue new-insn ] dip push ]
- [ _ dip push ] bi
+ [ _ dip push ] tri
]
[ 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* ] [ [ \ ##branch new-insn ] dip push ] tri ]
+ [
+ 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 ;