--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.match.processor/src/org/graalvm/compiler/core/match/processor/MatchProcessor.java Thu Mar 28 11:06:00 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.match.processor/src/org/graalvm/compiler/core/match/processor/MatchProcessor.java Thu Mar 28 19:39:14 2019 +0100
@@ -348,9 +348,15 @@
*/
final boolean shareable;
+ /**
+ * Can this node be subsumed into a match even if there are side effecting nodes between
+ * this node and the match.
+ */
+ final boolean ignoresSideEffects;
+
final Set<Element> originatingElements = new HashSet<>();
- TypeDescriptor(TypeMirror mirror, String shortName, String nodeClass, String nodePackage, List<String> inputs, boolean commutative, boolean shareable) {
+ TypeDescriptor(TypeMirror mirror, String shortName, String nodeClass, String nodePackage, List<String> inputs, boolean commutative, boolean shareable, boolean ignoresSideEffects) {
this.mirror = mirror;
this.shortName = shortName;
this.nodeClass = nodeClass;
@@ -358,6 +364,7 @@
this.inputs = inputs;
this.commutative = commutative;
this.shareable = shareable;
+ this.ignoresSideEffects = ignoresSideEffects;
assert !commutative || inputs.size() == 2;
}
}
@@ -369,8 +376,9 @@
private TypeDescriptor valueType;
- private void declareType(TypeMirror mirror, String shortName, String nodeClass, String nodePackage, List<String> inputs, boolean commutative, boolean shareable, Element element) {
- TypeDescriptor descriptor = new TypeDescriptor(mirror, shortName, nodeClass, nodePackage, inputs, commutative, shareable);
+ private void declareType(TypeMirror mirror, String shortName, String nodeClass, String nodePackage, List<String> inputs, boolean commutative, boolean shareable, boolean ignoresSideEffects,
+ Element element) {
+ TypeDescriptor descriptor = new TypeDescriptor(mirror, shortName, nodeClass, nodePackage, inputs, commutative, shareable, ignoresSideEffects);
descriptor.originatingElements.add(element);
knownTypes.put(shortName, descriptor);
}
@@ -453,7 +461,7 @@
private String formatPrefix() {
if (nodeType == valueType) {
- return String.format("new MatchPattern(%s, false", name != null ? ("\"" + name + "\"") : "null");
+ return String.format("new MatchPattern(%s, false, false", name != null ? ("\"" + name + "\"") : "null");
} else {
return String.format("new MatchPattern(%s.class, %s", nodeType.nodeClass, name != null ? ("\"" + name + "\"") : "null");
}
@@ -462,13 +470,13 @@
private String formatSuffix() {
if (nodeType != null) {
if (inputs.length != nodeType.inputs.size()) {
- return ", true)";
+ return ", true, " + nodeType.ignoresSideEffects + ")";
} else {
if (nodeType.inputs.size() > 0) {
- return ", " + nodeType.nodeClass + "_positions, " + !nodeType.shareable + ")";
+ return ", " + nodeType.nodeClass + "_positions, " + !nodeType.shareable + ", " + nodeType.ignoresSideEffects + ")";
}
if (nodeType.shareable) {
- return ", false)";
+ return ", false, " + nodeType.ignoresSideEffects + ")";
}
}
}
@@ -721,7 +729,7 @@
// Define a TypeDescriptor for the generic node but don't enter it into the nodeTypes
// table since it shouldn't be mentioned in match rules.
TypeMirror valueTypeMirror = getTypeElement(VALUE_NODE_CLASS_NAME).asType();
- valueType = new TypeDescriptor(valueTypeMirror, "Value", "ValueNode", "org.graalvm.compiler.nodes", Collections.emptyList(), false, false);
+ valueType = new TypeDescriptor(valueTypeMirror, "Value", "ValueNode", "org.graalvm.compiler.nodes", Collections.emptyList(), false, false, false);
Map<TypeElement, MatchRuleDescriptor> map = new HashMap<>();
@@ -831,7 +839,8 @@
boolean commutative = getAnnotationValue(matchable, "commutative", Boolean.class);
boolean shareable = getAnnotationValue(matchable, "shareable", Boolean.class);
- declareType(nodeClassMirror, shortName, nodeClass, nodePackage, inputs, commutative, shareable, element);
+ boolean ignoresSideEffects = getAnnotationValue(matchable, "ignoresSideEffects", Boolean.class);
+ declareType(nodeClassMirror, shortName, nodeClass, nodePackage, inputs, commutative, shareable, ignoresSideEffects, element);
}
private void processMatchRules(Map<TypeElement, MatchRuleDescriptor> map, Element element, List<AnnotationMirror> matchRules) {