summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-05-14 16:55:29 +0000
committerPaul Phillips <paulp@improving.org>2011-05-14 16:55:29 +0000
commit77207165674431d6c55ccab77733a483e07f01ad (patch)
tree665290639e73f3d0e42f4738c1899fd40b51b6a5
parentce5170fe023fd2a6cef0f2f576ea57b14eb717e5 (diff)
downloadscala-77207165674431d6c55ccab77733a483e07f01ad.tar.gz
scala-77207165674431d6c55ccab77733a483e07f01ad.tar.bz2
scala-77207165674431d6c55ccab77733a483e07f01ad.zip
Some minor cleanups in the inliner, no review.
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/Members.scala3
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/Inliners.scala29
2 files changed, 15 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Members.scala b/src/compiler/scala/tools/nsc/backend/icode/Members.scala
index 630f109bb6..2bcce6527e 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/Members.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/Members.scala
@@ -40,6 +40,9 @@ trait Members { self: ICodes =>
private var currentLabel: Int = 0
private var _touched = false
+ def blockCount = blocks.size
+ def instructionCount = blocks map (_.length) sum
+
def touched = _touched
def touched_=(b: Boolean): Unit = {
if (b)
diff --git a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
index debd33a986..9426067d1f 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/Inliners.scala
@@ -75,7 +75,7 @@ abstract class Inliners extends SubComponent {
*/
class Inliner {
object NonPublicRefs extends Enumeration {
- val Public, Protected, Private = Value
+ val Private, Protected, Public = Value
/** Cache whether a method calls private members. */
val usesNonPublics: mutable.Map[IMethod, Value] = new mutable.HashMap
@@ -113,9 +113,9 @@ abstract class Inliners extends SubComponent {
override def default(k: Symbol) = 0
}
- def analyzeMethod(m: IMethod) {
- var sizeBeforeInlining = if (m.code ne null) m.code.blocks.length else 0
- var instrBeforeInlining = if (m.code ne null) m.code.blocks.foldLeft(0)(_ + _.length) else 0
+ def analyzeMethod(m: IMethod): Unit = {
+ var sizeBeforeInlining = if (m.code ne null) m.code.blockCount else 0
+ var instrBeforeInlining = if (m.code ne null) m.code.instructionCount else 0
var retry = false
var count = 0
fresh.clear()
@@ -229,10 +229,10 @@ abstract class Inliners extends SubComponent {
m.normalize
if (sizeBeforeInlining > 0) {
- val instrAfterInlining = m.code.blocks.foldLeft(0)(_ + _.length)
+ val instrAfterInlining = m.code.instructionCount
val prefix = if ((instrAfterInlining > 2 * instrBeforeInlining) && (instrAfterInlining > 200)) " !! " else ""
log(prefix + " %s blocks before inlining: %d (%d) after: %d (%d)".format(
- m.symbol.fullName, sizeBeforeInlining, instrBeforeInlining, m.code.blocks.length, instrAfterInlining))
+ m.symbol.fullName, sizeBeforeInlining, instrBeforeInlining, m.code.blockCount, instrAfterInlining))
}
}
@@ -521,6 +521,7 @@ abstract class Inliners extends SubComponent {
case Public => true
}
private def sameSymbols = caller.sym == inc.sym
+ private def sameOwner = caller.owner == inc.owner
/** A method is safe to inline when:
* - it does not contain calls to private methods when
@@ -570,17 +571,11 @@ abstract class Inliners extends SubComponent {
case _ => Public
}
- def iterate(): NonPublicRefs.Value = {
- var seenProtected = false
- inc.instructions foreach { i =>
- getAccess(i) match {
- case Private => return Private
- case Protected => seenProtected = true
- case _ => ()
- }
- }
- if (seenProtected) Protected else Public
- }
+ def iterate(): NonPublicRefs.Value = inc.instructions.foldLeft(Public)((res, inc) => getAccess(inc) match {
+ case Private => return Private
+ case Protected => Protected
+ case Public => res
+ })
iterate()
})