diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2007-07-11 14:09:31 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2007-07-11 14:09:31 +0000 |
commit | 9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69 (patch) | |
tree | 8e5b8f8622e78662e27844f942475a7de525bc94 /src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala | |
parent | 802a3e3a8f11c7fc41d40f2270154237ca9cc9c1 (diff) | |
download | scala-9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69.tar.gz scala-9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69.tar.bz2 scala-9f2ea1b3421df7b6e4a3e5f60af9d96167cf8f69.zip |
Fixed linearization order and a small inefficie...
Fixed linearization order and a small inefficiency regarding null
literals
Diffstat (limited to 'src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala b/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala index cdc1023f88..835f41dd7e 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Linearizers.scala @@ -8,7 +8,7 @@ package scala.tools.nsc.backend.icode; import scala.tools.nsc.ast._; -import scala.collection.mutable.{Stack, HashSet}; +import scala.collection.mutable.{Stack, HashSet, BitSet}; trait Linearizers { self: ICodes => import opcodes._; @@ -141,10 +141,12 @@ trait Linearizers { self: ICodes => class ReversePostOrderLinearizer extends Linearizer { var blocks: List[BasicBlock] = Nil; var visited: HashSet[BasicBlock] = new HashSet; + val added: BitSet = new BitSet def linearize(m: IMethod): List[BasicBlock] = { blocks = Nil; visited.clear; + added.clear; m.exh foreach (b => rpo(b.startBlock)); rpo(m.code.startBlock); @@ -160,6 +162,8 @@ trait Linearizers { self: ICodes => def linearizeAt(m: IMethod, start: BasicBlock): List[BasicBlock] = { blocks = Nil visited.clear + added.clear + rpo(start) blocks } @@ -177,8 +181,10 @@ trait Linearizers { self: ICodes => * @return Returns true if the block was added. */ def add(b: BasicBlock) = - if (!blocks.contains(b)) + if (!added(b.label)) { + added += b.label blocks = b :: blocks; + } } /** A 'dump' of the blocks in this method, which does not |