File: cfgExpandCopies.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 (46 lines) | stat: -rw-r--r-- 1,418 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
44
45
46
(* cfgExpandCopies.sml
 *
 * COPYRIGHT (c) 2001 Bell Labs, Lucent Technologies
 *
 * This module expands all parallel copies into normal instructions
 *)

functor CFGExpandCopies
   (structure CFG    : CONTROL_FLOW_GRAPH
    structure Shuffle : SHUFFLE (* 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 I = CFG.I

    val name = "expand copies"

    fun run (cfg as Graph.GRAPH graph) = let
      fun expand(I.COPY{k,  dst, src, tmp, ...}) = let
	    val shuffle = 
		case k 
                  of CellsBasis.GP => Shuffle.shuffle 
                   | CellsBasis.FP => Shuffle.shufflefp
		   | _ =>  MLRiscErrorMsg.error ("CFGExpandCopies", "shuffle")
          in shuffle{dst=dst, src=src, tmp=tmp}
          end
	| expand(I.ANNOTATION{i,a}) = 
	    map (fn i => I.ANNOTATION{i=i, a=a}) (expand i)
	| expand i = [i]
      
      fun expandInstrs(_, CFG.BLOCK{insns, ...}) = 
	  insns := 
	    List.foldr 
	      (fn (i, rest) => List.revAppend(expand(i), rest))
	      []
	      (!insns)
    in
      #forall_nodes graph expandInstrs;
      cfg
    end
end