bugfix: cope when a source reg is dead at a join point
authorSimon Marlow <marlowsd@gmail.com>
Wed, 18 Jul 2012 12:33:45 +0000 (13:33 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 30 Jul 2012 10:42:14 +0000 (11:42 +0100)
We didn't trip over this one until I started generating code without
proc-point splitting, which has more join points and loops.

compiler/nativeGen/RegAlloc/Linear/JoinToTargets.hs

index 3bf49a3..c17b65d 100644 (file)
@@ -235,16 +235,10 @@ joinToTargets_again
 --
 makeRegMovementGraph :: RegMap Loc -> RegMap Loc -> [(Unique, Loc, [Loc])]
 makeRegMovementGraph adjusted_assig dest_assig
- = let
-       mkNodes src vreg
-        = expandNode vreg src
-        $ lookupWithDefaultUFM_Directly
-               dest_assig
-                (panic "RegAllocLinear.makeRegMovementGraph")
-               vreg
-
-   in  [ node  | (vreg, src) <- ufmToList adjusted_assig
-               , node <- mkNodes src vreg ]
+ = [ node       | (vreg, src) <- ufmToList adjusted_assig
+                    -- source reg might not be needed at the dest:
+                , Just loc <- [lookupUFM_Directly dest_assig vreg]
+                , node <- expandNode vreg src loc ]
 
 
 -- | Expand out the destination, so InBoth destinations turn into