Skip to content

Commit f9f7d38

Browse files
committed
fix #316
1 parent 4cad6a5 commit f9f7d38

File tree

1 file changed

+17
-32
lines changed

1 file changed

+17
-32
lines changed
Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,32 @@
11
package analysis
2+
import ir.transforms.ReadWriteAnalysis.*
3+
import ir.transforms.ReadWriteAnalysis
24

35
import ir.{DirectCall, LocalAssign, MemoryLoad, MemoryStore, Procedure, Program, Register}
46

57
import scala.collection.mutable
68

79
class WriteToAnalysis(program: Program) extends Analysis[Map[Procedure, Set[Register]]] {
810

9-
val writesTo: mutable.Map[Procedure, Set[Register]] = mutable.Map()
10-
val mallocRegister = Register("R0", 64)
11-
val paramRegisters: Set[Register] = Set(
12-
mallocRegister,
13-
Register("R1", 64),
14-
Register("R2", 64),
15-
Register("R3", 64),
16-
Register("R4", 64),
17-
Register("R5", 64),
18-
Register("R6", 64),
19-
Register("R7", 64)
20-
)
11+
lazy val result = ir.transforms.ReadWriteAnalysis.readWriteSets(program)
12+
13+
val paramRegisters = ((0 to 7).toSet).map(i => Register(s"R${i}", 64)).toSet
14+
val overApprox = ((0 to 31).toSet -- (19 to 28).toSet).map(i => Register(s"R${i}", 64)).toSet
2115

2216
def getWritesTos(proc: Procedure): Set[Register] = {
23-
if writesTo.contains(proc) then writesTo(proc)
24-
else
25-
val writtenTo: mutable.Set[Register] = mutable.Set()
26-
proc.blocks.foreach { block =>
27-
block.statements.foreach {
28-
case LocalAssign(variable: Register, _, _) if paramRegisters.contains(variable) =>
29-
writtenTo.add(variable)
30-
case MemoryLoad(lhs: Register, _, _, _, _, _) if paramRegisters.contains(lhs) =>
31-
writtenTo.add(lhs)
32-
case DirectCall(target, _, _, _) if target.procName == "malloc" =>
33-
writtenTo.add(mallocRegister)
34-
case d: DirectCall if program.procedures.contains(d.target) =>
35-
writtenTo.addAll(getWritesTos(d.target))
36-
case _ =>
37-
}
17+
result
18+
.get(proc)
19+
.map {
20+
case Some(r) =>
21+
r.writes.collect { case reg: Register =>
22+
reg
23+
}.toSet
24+
case None => overApprox
3825
}
39-
40-
writesTo.update(proc, writtenTo.toSet)
41-
writesTo(proc)
26+
.toSet
27+
.flatten
4228
}
4329

4430
def analyze(): Map[Procedure, Set[Register]] =
45-
program.procedures.foreach(getWritesTos)
46-
writesTo.toMap
31+
result.keySet.map(p => p -> getWritesTos(p)).toMap
4732
}

0 commit comments

Comments
 (0)