-
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
Report duplicates in the IR after each pass #11873
Draft
JaroslavTulach
wants to merge
5
commits into
develop
Choose a base branch
from
wip/jtulach/CheckDuplicates9165
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
0a620db
Report duplicates in the IR after each pass
JaroslavTulach 0c214f6
Rely on IR == when putting them into Map. Otherwise we burn too much …
JaroslavTulach 6c4abd8
Checking duplicates in IRHelpers
JaroslavTulach bb4aff2
Eliminate duplicated references to Main
JaroslavTulach b4f3973
Not enabled, when it throws exception
JaroslavTulach File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
79 changes: 79 additions & 0 deletions
79
engine/runtime-compiler/src/main/java/org/enso/compiler/pass/IRHelpers.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
package org.enso.compiler.pass; | ||
|
||
import java.util.ArrayDeque; | ||
import java.util.HashSet; | ||
import java.util.IdentityHashMap; | ||
import java.util.Set; | ||
import org.enso.compiler.core.IR; | ||
import org.enso.scala.wrapper.ScalaConversions; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
final class IRHelpers { | ||
private static final Logger LOG = LoggerFactory.getLogger(IRHelpers.class); | ||
private static HashSet<Integer> reportedIdentityHashCodes; | ||
|
||
private IRHelpers() {} | ||
|
||
/** | ||
* Processes whole IR subtree to find (top most) elements that are referenced multiple times. | ||
* | ||
* @param root the root of IR tree to process | ||
* @return set of IR elements that appear at least twice | ||
*/ | ||
private static Set<IR> findTopMostDuplicates(IR root) { | ||
var foundIR = new IdentityHashMap<IR, Integer>(); | ||
var irToProcess = new ArrayDeque<IR>(); | ||
irToProcess.add(root); | ||
while (!irToProcess.isEmpty()) { | ||
var ir = irToProcess.remove(); | ||
if (foundIR.containsKey(ir)) { | ||
foundIR.put(ir, 1); | ||
} else { | ||
foundIR.put(ir, 0); | ||
irToProcess.addAll(ScalaConversions.asJava(ir.children())); | ||
} | ||
} | ||
var it = foundIR.entrySet().iterator(); | ||
while (it.hasNext()) { | ||
if (it.next().getValue() == 0) { | ||
it.remove(); | ||
} | ||
} | ||
return foundIR.keySet(); | ||
} | ||
|
||
static <IRType extends IR> IRType checkDuplicates(String msg, IRType ir) { | ||
var duplicates = findTopMostDuplicates(ir); | ||
if (duplicates.isEmpty()) { | ||
return ir; | ||
} else { | ||
if (reportedIdentityHashCodes == null) { | ||
reportedIdentityHashCodes = new HashSet<>(); | ||
} | ||
var all = ir.preorder(); | ||
for (var dupl : duplicates) { | ||
if (!reportedIdentityHashCodes.add(System.identityHashCode(dupl))) { | ||
continue; | ||
} | ||
LOG.error("Duplicate found after " + msg + ": " + toString(dupl)); | ||
all.foreach( | ||
e -> { | ||
if (e.children().contains(dupl)) { | ||
LOG.error(" referenced by " + toString(e)); | ||
} | ||
return null; | ||
}); | ||
} | ||
} | ||
return ir; | ||
} | ||
|
||
private static String toString(IR ir) { | ||
return ir.getClass().getName() | ||
+ "@" | ||
+ Integer.toHexString(System.identityHashCode(ir)) | ||
+ ":" | ||
+ ir.showCode(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,8 +22,11 @@ class TruffleLoggerWrapper(name: String, masking: Masking) extends Logger { | |
|
||
override def getName: String = underlying.getName | ||
|
||
private def isEnabled(level: Level): Boolean = | ||
private def isEnabled(level: Level): Boolean = try { | ||
underlying.isLoggable(level) | ||
} catch { | ||
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 a runtime-instrument-common/testOnly *ChangesetBuilderTest failure which gets fixed by b4f3973 |
||
case _: IllegalStateException => false | ||
} | ||
|
||
private def log( | ||
level: Level, | ||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
There was a report:
and with bb4aff2 it is gone.