1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
(*
* This module can be used to build a stripped down SSA graph directly from
* an MLTREE stream.
*)
functor SSAGen
(structure MLTree : MLTREE
structure CFG : CONTROL_FLOW_GRAPH
structure InsnProps : INSN_PROPERTIES
structure SSA : SSA
where CFG = CFG
where I.Constant = MLTree.Constant
sharing InsnProps.I = CFG.I
sharing MLTree.Stream.P = CFG.P
) : FLOWGRAPH_GEN =
struct
structure T = MLTree
structure I = SSA.I
structure C = I.C
structure S = T.Stream
structure Builder = ControlFlowGraphGen
(structure CFG = CFG
structure Stream = S
structure InsnProps = InsnProps
)
type flowgraph = CFG.cfg
fun error msg = MLRiscErrorMsg.error("SSAGen",msg)
fun newStream{compile, flowgraph} =
let val cfg = case flowgraph of
SOME cfg => cfg
| NONE => CFG.new(C.regmap())
val {stream,next} = Builder.builder cfg
val S.STREAM{beginCluster,endCluster,pseudoOp,
emit,exitBlock,comment,annotation,defineLabel,
entryLabel,alias,...} = stream
fun endCFG a = (endCluster a;
next(CFG.new(C.regmap()));
compile cfg
)
fun phi _ = error "phi"
in S.STREAM{beginCluster= beginCluster,
endCluster = endCFG,
pseudoOp = pseudoOp,
emit = emit,
exitBlock = exitBlock,
comment = comment,
annotation = annotation,
defineLabel = defineLabel,
entryLabel = entryLabel,
alias = alias,
phi = phi
}
end
end
|