File: cfgCountCopies.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (43 lines) | stat: -rw-r--r-- 1,572 bytes parent folder | download
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
(*
 * This module counts the number of copies (in bytes)  
 * generated after register allocation.  Mainly useful for fine-tuning.
 *)
functor CFGCountCopies
   ( structure CFG : CONTROL_FLOW_GRAPH
     structure InsnProps : INSN_PROPERTIES (* where I = CFG.I *)
                           where type I.addressing_mode = CFG.I.addressing_mode
                             and type I.ea = CFG.I.ea
                             and type I.instr = CFG.I.instr
                             and type I.instruction = CFG.I.instruction
                             and type I.operand = CFG.I.operand
     structure SdiJumps : SDI_JUMPS (* where I = CFG.I *)
                          where type I.addressing_mode = CFG.I.addressing_mode
                            and type I.ea = CFG.I.ea
                            and type I.instr = CFG.I.instr
                            and type I.instruction = CFG.I.instruction
                            and type I.operand = CFG.I.operand
    ) : CFG_OPTIMIZATION =
struct
   structure CFG = CFG
   structure G   = Graph

   val name = "count copies"

   val copies = MLRiscControl.mkCounter ("copies", "copy count")

   fun run (cfg as G.GRAPH graph) = let
     val blocks = map #2 (#nodes graph ())
     fun loc _ = 0
     fun count(CFG.BLOCK{insns, ...}, n) = let
       fun scan([], n) = n
	 | scan(i::is, n) = 
	    if InsnProps.moveInstr i then
	      scan(is, n + SdiJumps.sdiSize(i, loc, 0)) 
	    else scan(is, n)
     in  scan(!insns, n) 
     end
   in
       copies := !copies + foldr count 0 blocks;
       cfg
   end
end