aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Waterman2016-04-13 15:00:01 -0700
committerAndrew Waterman2016-04-14 15:45:47 -0700
commit87121519908ca0a1f7479408d949f81d065f5c86 (patch)
tree8ddf411d92540ff38fbb62e36ce315b9fafd55ec /src
parent30091a8a9f965502c96926591af0cc95a5e3c746 (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.scala13
-rw-r--r--src/main/scala/firrtl/passes/CommonSubexpressionElimination.scala2
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 {