X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/1144856ba9d6018d9922c6ede7e97779a0fe6373..5c79bb689ab446551bc7ec4497e6c9b75582837e:/optimize/labelcoalescing.sml diff --git a/optimize/labelcoalescing.sml b/optimize/labelcoalescing.sml new file mode 100644 index 0000000..5188e95 --- /dev/null +++ b/optimize/labelcoalescing.sml @@ -0,0 +1,28 @@ +structure LabelCoalescing :> OPTIMIZATION = +struct + structure X = x86 + + structure LabelMap = SplayMapFn(struct + type ord_key = Label.label + val compare = Label.compare + end) + + fun coalesce insns = + let + fun lmap (SOME(a)) ((X.LABEL l)::is) = let val (m, il) = lmap (SOME(a)) is in (LabelMap.insert(m, l, a), il) end + | lmap (NONE) ((X.LABEL l)::is) = let val (m, il) = lmap (SOME(l)) is in (LabelMap.insert(m, l, l), (X.LABEL l)::il) end + | lmap _ (i::is) = let val (m, il) = lmap NONE is in (m, i::il) end + | lmap _ nil = (LabelMap.empty, nil) + + val (labelmap, insns') = lmap NONE insns + + fun convert ((X.Jcc(c,l))::is) = (X.Jcc(c, valOf(LabelMap.find(labelmap,l))))::(convert is) + | convert ((X.JMP(l))::is) = (X.JMP(valOf(LabelMap.find(labelmap,l))))::(convert is) + | convert (i::is) = i::(convert is) + | convert nil = nil + in + convert insns' + end + + val optimizer = { shortname = "labelcoalescing", description = "Coalesces adjacent labels", func = Optimizer.PRELIVENESS coalesce } +end