--- /dev/null
+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