diff options
| author | Andrew Waterman | 2016-04-13 15:00:01 -0700 |
|---|---|---|
| committer | Andrew Waterman | 2016-04-14 15:45:47 -0700 |
| commit | 87121519908ca0a1f7479408d949f81d065f5c86 (patch) | |
| tree | 8ddf411d92540ff38fbb62e36ce315b9fafd55ec /src | |
| parent | 30091a8a9f965502c96926591af0cc95a5e3c746 (diff) | |
Improve performance of CSE pass
Repeated calls to hashCode take most of the runtime, so cache it.
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/Utils.scala | 13 | ||||
| -rw-r--r-- | src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/Utils.scala b/src/main/scala/firrtl/Utils.scala index 390a99a7..bcf75882 100644 --- a/src/main/scala/firrtl/Utils.scala +++ b/src/main/scala/firrtl/Utils.scala @@ -954,3 +954,16 @@ object Utils { ("PRINTF_COND" -> true) + ("VCS" -> true) } + +object MemoizedHash { + implicit def convertTo[T](e: T): MemoizedHash[T] = new MemoizedHash(e) + implicit def convertFrom[T](f: MemoizedHash[T]): T = f.t +} + +class MemoizedHash[T](val t: T) { + override lazy val hashCode = t.hashCode + override def equals(that: Any) = that match { + case x: MemoizedHash[_] => t equals x.t + case _ => false + } +} diff --git a/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala b/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala index 7dbc805a..717d95e8 100644 --- a/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala +++ b/src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala @@ -38,7 +38,7 @@ object CommonSubexpressionElimination extends Pass { private def cseOnce(s: Stmt): (Stmt, Long) = { var nEliminated = 0L - val expressions = collection.mutable.HashMap[Expression, String]() + val expressions = collection.mutable.HashMap[MemoizedHash[Expression], String]() val nodes = collection.mutable.HashMap[String, Expression]() def recordNodes(s: Stmt): Stmt = s match { |
