]> Joshua Wise's Git repositories - snipe.git/blobdiff - optimize/labelcoalescing.sml
Initial import of l5c
[snipe.git] / optimize / labelcoalescing.sml
diff --git a/optimize/labelcoalescing.sml b/optimize/labelcoalescing.sml
new file mode 100644 (file)
index 0000000..5188e95
--- /dev/null
@@ -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
This page took 0.021552 seconds and 4 git commands to generate.