summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-01-24 18:15:23 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-01-24 18:15:23 +0000
commit7140e9c3ad9c60a0a55aee63ecd20940534375d4 (patch)
treea2b604db331837bcb259cde32bf2ab26acae0a97
parent7d4cea0a9919f3cb08ef1e7b981015d446c74fd3 (diff)
downloadscala-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.scala18
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))
+ }
}
}
}