module SPARC.CodeGen.Sanity (
checkBlock
)
where
import GhcPrelude
import SPARC.Instr
import SPARC.Ppr ()
import Instruction
import Cmm
import Outputable
checkBlock :: CmmBlock
-> NatBasicBlock Instr
-> NatBasicBlock Instr
checkBlock :: CmmBlock -> NatBasicBlock Instr -> NatBasicBlock Instr
checkBlock CmmBlock
cmm block :: NatBasicBlock Instr
block@(BasicBlock BlockId
_ [Instr]
instrs)
| [Instr] -> Bool
checkBlockInstrs [Instr]
instrs
= NatBasicBlock Instr
block
| Bool
otherwise
= String -> SDoc -> NatBasicBlock Instr
forall a. HasCallStack => String -> SDoc -> a
pprPanic
(String
"SPARC.CodeGen: bad block\n")
( [SDoc] -> SDoc
vcat [ String -> SDoc
text String
" -- cmm -----------------\n"
, CmmBlock -> SDoc
forall a. Outputable a => a -> SDoc
ppr CmmBlock
cmm
, String -> SDoc
text String
" -- native code ---------\n"
, NatBasicBlock Instr -> SDoc
forall a. Outputable a => a -> SDoc
ppr NatBasicBlock Instr
block ])
checkBlockInstrs :: [Instr] -> Bool
checkBlockInstrs :: [Instr] -> Bool
checkBlockInstrs [Instr]
ii
| Instr
instr : Instr
NOP : [Instr]
_ <- [Instr]
ii
, Instr -> Bool
isUnconditionalJump Instr
instr
= Bool
True
| Instr
instr : Instr
NOP : [Instr]
is <- [Instr]
ii
, Instr -> Bool
forall instr. Instruction instr => instr -> Bool
isJumpishInstr Instr
instr
= [Instr] -> Bool
checkBlockInstrs [Instr]
is
| Instr
_:Instr
i2:[Instr]
is <- [Instr]
ii
= [Instr] -> Bool
checkBlockInstrs (Instr
i2Instr -> [Instr] -> [Instr]
forall a. a -> [a] -> [a]
:[Instr]
is)
| Bool
otherwise
= Bool
False