-
Notifications
You must be signed in to change notification settings - Fork 323
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix inline compilation benchmarks and Improve searching Graph.Link performance #9520
Changes from 2 commits
82a32a1
7aa8a14
86dda53
33c2183
e34e229
6fc958b
bddd484
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -5,14 +5,17 @@ import org.enso.syntax.text.Debug | |||||||||||
import org.enso.compiler.pass.analyse.alias.Graph.{Occurrence, Scope} | ||||||||||||
|
||||||||||||
import java.util.UUID | ||||||||||||
import scala.collection.immutable.HashMap | ||||||||||||
import scala.collection.mutable | ||||||||||||
import scala.reflect.ClassTag | ||||||||||||
|
||||||||||||
/** A graph containing aliasing information for a given root scope in Enso. */ | ||||||||||||
sealed class Graph extends Serializable { | ||||||||||||
var rootScope: Graph.Scope = new Graph.Scope() | ||||||||||||
var links: Set[Graph.Link] = Set() | ||||||||||||
var nextIdCounter = 0 | ||||||||||||
var rootScope: Graph.Scope = new Graph.Scope() | ||||||||||||
private var links: Set[Graph.Link] = Set() | ||||||||||||
private var sourceLinks: Map[Graph.Id, Set[Graph.Link]] = new HashMap() | ||||||||||||
private var targetLinks: Map[Graph.Id, Set[Graph.Link]] = new HashMap() | ||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is an implementation of serialization logic for the enso/engine/runtime-compiler/src/main/java/org/enso/compiler/pass/analyse/PassPersistance.java Lines 153 to 157 in 6665c22
Please make sure that it works correctly with the newly added fields and probably update the serialization id There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should work correctly as I'm reproducing |
||||||||||||
var nextIdCounter = 0 | ||||||||||||
|
||||||||||||
private var globalSymbols: Map[Graph.Symbol, Occurrence.Global] = | ||||||||||||
Map() | ||||||||||||
|
@@ -24,11 +27,26 @@ sealed class Graph extends Serializable { | |||||||||||
val copy = new Graph | ||||||||||||
copy.rootScope = this.rootScope.deepCopy(scope_mapping) | ||||||||||||
copy.links = this.links | ||||||||||||
copy.sourceLinks = this.sourceLinks | ||||||||||||
copy.targetLinks = this.targetLinks | ||||||||||||
copy.globalSymbols = this.globalSymbols | ||||||||||||
copy.nextIdCounter = this.nextIdCounter | ||||||||||||
copy | ||||||||||||
} | ||||||||||||
|
||||||||||||
def initLinks(links: Set[Graph.Link]): Unit = { | ||||||||||||
hubertp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||
links.foreach { link => | ||||||||||||
hubertp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||
sourceLinks = sourceLinks.updatedWith(link.source)(v => | ||||||||||||
v.map(s => s + link).orElse(Some(Set(link))) | ||||||||||||
hubertp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||
) | ||||||||||||
targetLinks = targetLinks.updatedWith(link.target)(v => | ||||||||||||
v.map(s => s + link).orElse(Some(Set(link))) | ||||||||||||
) | ||||||||||||
} | ||||||||||||
} | ||||||||||||
|
||||||||||||
def getLinks(): Set[Graph.Link] = links | ||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wouldn't it be better to remove the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I kind of like that |
||||||||||||
|
||||||||||||
/** Registers a requested global symbol in the aliasing scope. | ||||||||||||
* | ||||||||||||
* @param sym the symbol occurrence | ||||||||||||
|
@@ -46,6 +64,8 @@ sealed class Graph extends Serializable { | |||||||||||
def copy: Graph = { | ||||||||||||
val graph = new Graph | ||||||||||||
graph.links = links | ||||||||||||
graph.sourceLinks = sourceLinks | ||||||||||||
graph.targetLinks = targetLinks | ||||||||||||
graph.rootScope = rootScope.deepCopy(mutable.Map()) | ||||||||||||
graph.nextIdCounter = nextIdCounter | ||||||||||||
|
||||||||||||
|
@@ -85,6 +105,12 @@ sealed class Graph extends Serializable { | |||||||||||
): Option[Graph.Link] = { | ||||||||||||
scopeFor(occurrence.id).flatMap(_.resolveUsage(occurrence).map { link => | ||||||||||||
links += link | ||||||||||||
sourceLinks = sourceLinks.updatedWith(link.source)(v => | ||||||||||||
hubertp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||
v.map(s => s + link).orElse(Some(Set(link))) | ||||||||||||
) | ||||||||||||
targetLinks = targetLinks.updatedWith(link.target)(v => | ||||||||||||
v.map(s => s + link).orElse(Some(Set(link))) | ||||||||||||
) | ||||||||||||
link | ||||||||||||
}) | ||||||||||||
} | ||||||||||||
|
@@ -129,7 +155,10 @@ sealed class Graph extends Serializable { | |||||||||||
* @return a list of links in which `id` occurs | ||||||||||||
*/ | ||||||||||||
def linksFor(id: Graph.Id): Set[Graph.Link] = { | ||||||||||||
links.filter(l => l.source == id || l.target == id) | ||||||||||||
sourceLinks.getOrElse(id, Set.empty[Graph.Link]) ++ targetLinks.getOrElse( | ||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Great finding. Good fix. Thank you. |
||||||||||||
id, | ||||||||||||
Set() | ||||||||||||
) | ||||||||||||
} | ||||||||||||
|
||||||||||||
/** Finds all links in the graph where `symbol` appears in the role | ||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If
initXyz
is better pattern than callingg.rootScope_$eq(rootScope);
- thenrootScope
could be made private as well, possibly.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tried and looks like a lot more stuff depends on it being public. I tried to keep the PR succinct for now.