summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2007-06-07 14:36:46 +0000
committerIulian Dragos <jaguarul@gmail.com>2007-06-07 14:36:46 +0000
commit278f89bf2ffe945028056d8d4e120bae47598e09 (patch)
tree862199b6bb472a7b558704d34469669436ad73b0
parentc66f4b816233ddac84b6bfd80589dda505e1fe44 (diff)
downloadscala-278f89bf2ffe945028056d8d4e120bae47598e09.tar.gz
scala-278f89bf2ffe945028056d8d4e120bae47598e09.tar.bz2
scala-278f89bf2ffe945028056d8d4e120bae47598e09.zip
Fixed duplicated local vars and wrong eliminati...
Fixed duplicated local vars and wrong elimination of useful closure classes.
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
index accd7d5aec..c36b8b4d42 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala
@@ -41,6 +41,7 @@ abstract class DeadCodeElimination extends SubComponent {
class DeadCode {
def analyzeClass(cls: IClass): Unit = {
+ liveClosures.clear
cls.methods.foreach { m =>
this.method = m
// analyzeMethod(m);
@@ -62,6 +63,9 @@ abstract class DeadCodeElimination extends SubComponent {
/** what local variables have been accessed at least once? */
var accessedLocals: List[Local] = Nil
+ /** closures that are instantiated at least once, after dead code elimination */
+ val liveClosures: mutable.Set[Symbol] = new mutable.HashSet()
+
/** the current method. */
var method: IMethod = _
@@ -74,6 +78,7 @@ abstract class DeadCodeElimination extends SubComponent {
collectRDef(m)
mark
sweep(m)
+ accessedLocals = accessedLocals.removeDuplicates
if (m.locals.diff(accessedLocals).length > 0) {
log("Removed dead locals: " + m.locals.diff(accessedLocals))
m.locals = accessedLocals.reverse
@@ -126,9 +131,11 @@ abstract class DeadCodeElimination extends SubComponent {
for ((l2, bb1, idx1) <- defs((bb, idx)) if l1 == l2; if !useful(bb1)(idx1))
worklist += ((bb1, idx1))
- case nw @ NEW(_) =>
+ case nw @ NEW(REFERENCE(sym)) =>
assert(nw.init ne null, "null new.init at: " + bb + ": " + idx + "(" + instr + ")")
worklist += findInstruction(bb, nw.init)
+ if (inliner.isClosureClass(sym))
+ liveClosures += sym
case LOAD_EXCEPTION() =>
()
@@ -168,10 +175,10 @@ abstract class DeadCodeElimination extends SubComponent {
} else {
i match {
case NEW(REFERENCE(sym)) =>
- log("skipped object creation: " + sym)
- //Console.println("skipping class file altogether: " + sym.fullNameString)
- if (inliner.isClosureClass(sym))
+ log("skipped object creation: " + sym + "inside " + m)
+ if (inliner.isClosureClass(sym) && !liveClosures(sym)) {
icodes.classes -= sym
+ }
case _ => ()
}
if (settings.debug.value) log("Skipped: bb_" + bb + ": " + idx + "( " + i + ")")