From 278f89bf2ffe945028056d8d4e120bae47598e09 Mon Sep 17 00:00:00 2001 From: Iulian Dragos Date: Thu, 7 Jun 2007 14:36:46 +0000 Subject: Fixed duplicated local vars and wrong eliminati... Fixed duplicated local vars and wrong elimination of useful closure classes. --- .../scala/tools/nsc/backend/opt/DeadCodeElimination.scala | 15 +++++++++++---- 1 file 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 + ")") -- cgit v1.2.3