diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2007-06-07 14:36:46 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2007-06-07 14:36:46 +0000 |
commit | 278f89bf2ffe945028056d8d4e120bae47598e09 (patch) | |
tree | 862199b6bb472a7b558704d34469669436ad73b0 /src | |
parent | c66f4b816233ddac84b6bfd80589dda505e1fe44 (diff) | |
download | scala-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala | 15 |
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 + ")") |