diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2010-01-24 18:15:23 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2010-01-24 18:15:23 +0000 |
commit | 7140e9c3ad9c60a0a55aee63ecd20940534375d4 (patch) | |
tree | a2b604db331837bcb259cde32bf2ab26acae0a97 | |
parent | 7d4cea0a9919f3cb08ef1e7b981015d446c74fd3 (diff) | |
download | scala-7140e9c3ad9c60a0a55aee63ecd20940534375d4.tar.gz scala-7140e9c3ad9c60a0a55aee63ecd20940534375d4.tar.bz2 scala-7140e9c3ad9c60a0a55aee63ecd20940534375d4.zip |
Fixed dead code elimination to satisfy YourKit'...
Fixed dead code elimination to satisfy YourKit's instrumentation: a drop
for a newly initialized object is always added after the constructor
call, instead of immediately after a DUP
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala index 3fdfc62b8e..00eea9b0f3 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala @@ -218,7 +218,7 @@ abstract class DeadCodeElimination extends SubComponent { private def computeCompensations(m: IMethod): mutable.Map[(BasicBlock, Int), List[Instruction]] = { val compensations: mutable.Map[(BasicBlock, Int), List[Instruction]] = new mutable.HashMap - for (bb <- m.code.blocks.toList) { + for (bb <- m.code.blocks) { assert(bb.closed, "Open block in computeCompensations") for ((i, idx) <- bb.toList.zipWithIndex) { if (!useful(bb)(idx)) { @@ -226,8 +226,20 @@ abstract class DeadCodeElimination extends SubComponent { log("Finding definitions of: " + i + "\n\t" + consumedType + " at depth: " + depth) val defs = rdef.findDefs(bb, idx, 1, depth) for (d <- defs) { - if (!compensations.isDefinedAt(d)) - compensations(d) = List(DROP(consumedType)) + val (bb, idx) = d + bb(idx) match { + case DUP(_) if idx > 0 => + bb(idx - 1) match { + case nw @ NEW(_) => + val init = findInstruction(bb, nw.init) + log("Moving DROP to after <init> call: " + nw.init) + compensations(init) = List(DROP(consumedType)) + case _ => + compensations(d) = List(DROP(consumedType)) + } + case _ => + compensations(d) = List(DROP(consumedType)) + } } } } |