import MachCode ( InstrBlock )
import MachMisc ( Instr(..) )
+import PprMach ( pprInstr ) -- Just for debugging
import MachRegs
import RegAllocInfo
-import FiniteMap ( FiniteMap, emptyFM, addListToFM, delListFromFM,
- lookupFM, keysFM, eltsFM, mapFM, addToFM_C, addToFM,
- listToFM, fmToList, lookupWithDefaultFM )
-import Unique ( mkBuiltinUnique )
-import OrdList ( unitOL, appOL, fromOL, concatOL )
+import FiniteMap ( FiniteMap, emptyFM,
+ lookupFM, eltsFM, addToFM_C, addToFM,
+ listToFM, fmToList )
+import OrdList ( fromOL )
import Outputable
import Unique ( Unique, Uniquable(..), mkPseudoUnique3 )
import CLabel ( CLabel, pprCLabel )
+import FastTypes
import List ( mapAccumL, nub, sort )
import Array ( Array, array, (!), bounds )
--)
where
tryGeneral []
- = error "nativeGen: spilling failed. Workaround: compile with -fvia-C.\n"
+ = pprPanic "nativeGen: spilling failed. Workaround: compile with -fvia-C.\n"
+ ( (text "reserves = " <> ppr reserves)
+ $$
+ (text "code = ")
+ $$
+ (vcat (map (docToSDoc.pprInstr) flatInstrs))
+ )
tryGeneral (resv:resvs)
= case generalAlloc resv of
Just success -> success
doGeneralAlloc all_regs reserve_regs instrs
-- succeeded without spilling
- | prespill_ok = Just prespill_insns
+ | prespill_ok
+ = Just prespill_insns
+
-- failed, and no spill regs avail, so pointless to attempt spilling
| null reserve_regs = Nothing
-- success after spilling
= let wrs
= case regUsage i of RU rrr www -> www
new_fes
- = [case ino of { I# inoh ->
- case ino_succ of { I# ino_succh ->
+ = [case iUnbox ino of { inoh ->
+ case iUnbox ino_succ of { ino_succh ->
MkFE inoh ino_succh
}}
| ino_succ <- succ_map ! ino]
= approx
| otherwise
= let fes_to_futures
- = [case ino of { I# inoh ->
- case future_ino of { I# future_inoh ->
+ = [case iUnbox ino of { inoh ->
+ case iUnbox future_ino of { future_inoh ->
MkFE inoh future_inoh
}}
| future_ino <- succ_map ! ino]
= foldr unionRegSets emptyRegSet future_lives
fes_from_histories
- = [case history_ino of { I# history_inoh ->
- case ino of { I# inoh ->
+ = [case iUnbox history_ino of { history_inoh ->
+ case iUnbox ino of { inoh ->
MkFE history_inoh inoh
}}
| history_ino <- pred_map ! ino]
-- A data type for flow edges
data FE
- = MkFE Int# Int# deriving (Eq, Ord)
+ = MkFE FastInt FastInt deriving (Eq, Ord)
-- deriving Show on types with unboxed fields doesn't work
instance Show FE where
showsPrec _ (MkFE s d)
- = showString "MkFE" . shows (I# s) . shows ' ' . shows (I# d)
+ = showString "MkFE" . shows (iBox s) . shows ' ' . shows (iBox d)
-- Blargh. Use ghc stuff soon! Or: perhaps that's not such a good
-- idea. Most of these sets are either empty or very small, and it