src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java Thu Oct 31 14:23:06 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/EarlyReadEliminationTest.java Thu Oct 31 16:54:16 2019 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,9 @@
import java.util.List;
import org.graalvm.compiler.core.test.GraalCompilerTest;
+import org.graalvm.compiler.graph.Node;
+import org.graalvm.compiler.nodes.IfNode;
+import org.graalvm.compiler.nodes.LogicConstantNode;
import org.graalvm.compiler.nodes.ProxyNode;
import org.graalvm.compiler.nodes.ReturnNode;
import org.graalvm.compiler.nodes.StructuredGraph;
@@ -37,7 +40,6 @@
import org.graalvm.compiler.nodes.java.StoreFieldNode;
import org.graalvm.compiler.nodes.memory.ReadNode;
import org.graalvm.compiler.nodes.spi.LoweringTool;
-import org.graalvm.compiler.phases.common.CanonicalizerPhase;
import org.graalvm.compiler.phases.common.LoweringPhase;
import org.graalvm.compiler.phases.tiers.HighTierContext;
import org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase;
@@ -47,6 +49,50 @@
public static Object staticField;
+ static void cfgSnippet() {
+ if (staticField != null) {
+ staticField = 12;
+ if (staticField != null) {
+ staticField = 12;
+ }
+ if (staticField != null) {
+ staticField = 12;
+ }
+ if (staticField != null) {
+ staticField = 12;
+ }
+ if (staticField != null) {
+ staticField = 12;
+ }
+ } else {
+ if (staticField != null) {
+ staticField = 12;
+ } else {
+ if (staticField != null) {
+ staticField = 12;
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testDeadBranches() {
+ StructuredGraph graph = parseEager(getResolvedJavaMethod("cfgSnippet"), AllowAssumptions.NO);
+ HighTierContext context = getDefaultHighTierContext();
+ int index = 0;
+ boolean[] conditions = new boolean[]{true, false, false, true, true, true, false};
+ /*
+ * Create a graph with "dead" branches in the beginning.
+ */
+ for (Node n : graph.getNodes()) {
+ if (n instanceof IfNode) {
+ IfNode ifNode = (IfNode) n;
+ ifNode.setCondition(LogicConstantNode.forBoolean(conditions[index++], graph));
+ }
+ }
+ new EarlyReadEliminationPhase(createCanonicalizerPhase()).apply(graph, context);
+ }
+
public static class TestObject {
public int x;
@@ -264,9 +310,9 @@
HighTierContext context = getDefaultHighTierContext();
createInliningPhase().apply(graph, context);
if (doLowering) {
- new LoweringPhase(new CanonicalizerPhase(), LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context);
+ new LoweringPhase(createCanonicalizerPhase(), LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context);
}
- new EarlyReadEliminationPhase(new CanonicalizerPhase()).apply(graph, context);
+ new EarlyReadEliminationPhase(createCanonicalizerPhase()).apply(graph, context);
return graph;
}
}