< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core/src/org/graalvm/compiler/core/gen/NodeLIRBuilder.java
Print this page
@@ -46,10 +46,11 @@
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.core.match.ComplexMatchValue;
import org.graalvm.compiler.core.match.MatchPattern;
import org.graalvm.compiler.core.match.MatchRuleRegistry;
import org.graalvm.compiler.core.match.MatchStatement;
+import org.graalvm.compiler.debug.DebugCloseable;
import org.graalvm.compiler.debug.DebugContext;
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.debug.TTY;
import org.graalvm.compiler.graph.GraalGraphError;
import org.graalvm.compiler.graph.Node;
@@ -253,11 +254,11 @@
ValueNode node = phi.valueAt(i);
Value value = getOperand(node);
// get ValueKind for input
final LIRKind valueKind;
- if (value != null) {
+ if (value != null && !(value instanceof ComplexMatchValue)) {
valueKind = value.getValueKind(LIRKind.class);
} else {
assert isPhiInputFromBackedge(phi, i) : String.format("Input %s to phi node %s is not yet available although it is not coming from a loop back edge", node, phi);
LIRKind kind = gen.getLIRKind(node.stamp(NodeView.DEFAULT));
valueKind = gen.toRegisterKind(kind);
@@ -356,14 +357,10 @@
}
doBlockPrologue(block, options);
List<Node> nodes = blockMap.get(block);
- // Allow NodeLIRBuilder subclass to specialize code generation of any interesting groups
- // of instructions
- matchComplexExpressions(nodes);
-
boolean trace = traceLIRGeneratorLevel >= 3;
for (int i = 0; i < nodes.size(); i++) {
Node node = nodes.get(i);
if (node instanceof ValueNode) {
setSourcePosition(node.getNodeSourcePosition());
@@ -417,15 +414,27 @@
assert verifyBlock(gen.getResult().getLIR(), block);
}
}
+ @Override
@SuppressWarnings("try")
- protected void matchComplexExpressions(List<Node> nodes) {
+ public void matchBlock(Block block, StructuredGraph graph, StructuredGraph.ScheduleResult schedule) {
+ try (DebugCloseable matchScope = gen.getMatchScope(block)) {
+ // Allow NodeLIRBuilder subclass to specialize code generation of any interesting groups
+ // of instructions
+ matchComplexExpressions(block, schedule);
+ }
+ }
+
+ @SuppressWarnings("try")
+ protected void matchComplexExpressions(Block block, StructuredGraph.ScheduleResult schedule) {
+
if (matchRules != null) {
DebugContext debug = gen.getResult().getLIR().getDebug();
try (DebugContext.Scope s = debug.scope("MatchComplexExpressions")) {
+ List<Node> nodes = schedule.getBlockToNodesMap().get(block);
if (LogVerbose.getValue(nodeOperands.graph().getOptions())) {
int i = 0;
for (Node node : nodes) {
debug.log("%d: (%s) %1S", i++, node.getUsageCount(), node);
}
@@ -439,11 +448,11 @@
}
// See if this node is the root of any MatchStatements
List<MatchStatement> statements = matchRules.get(node.getClass());
if (statements != null) {
for (MatchStatement statement : statements) {
- if (statement.generate(this, index, node, nodes)) {
+ if (statement.generate(this, index, node, block, schedule)) {
// Found a match so skip to the next
break;
}
}
}
< prev index next >