Skip to content
  • Clemens Fruhwirth's avatar
    joinToTargets to emit fixup code even when movement graph contains cycles · 64f0661e
    Clemens Fruhwirth authored
    First, cycles can only start of with registers and their destination
    must involve a register location. This is because memory locations are
    allocated exclusively for a virtual register and hence can never cause
    a conflict in the assignment, hence need no fixup code. Therefore, we
    only have to deal with InReg -> InReg, or InReg -> InReg/InMem
    movements.  
    
    The strategy is to take the first cycle element, which is guaranteed
    to start with a register, spill it to a fresh memory location, compute
    the fixup for the rest, and restore from the spill slot to its
    destinations. The "rest" will degenerate into an acyclic scc, so we do
    not need take care of the empty list case in CyclicScc. 
     ***END OF DESCRIPTION***
    
    Place the long patch description above the ***END OF DESCRIPTION*** marker.
    The first line of this file will be the patch name.
    
    
    This patch contains the following changes:
    
    M ./compiler/nativeGen/RegisterAlloc.hs -6 +27
    64f0661e