# HG changeset patch # User Bernhard Urban # Date 1370509464 -7200 # Node ID 91295caf53b6e6dca7b3d70f87c300362801cc37 # Parent 7e0a3f8fbd70b30d156344f975b5a850abc78996 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290) diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Thu Jun 06 11:04:24 2013 +0200 @@ -140,7 +140,7 @@ new VerifyUsageWithEquals(runtime, Register.class).apply(graph); } - CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); + CanonicalizerPhase canonicalizer = new CanonicalizerPhase(OptCanonicalizeReads.getValue()); HighTierContext highTierContext = new HighTierContext(runtime, assumptions, replacements, canonicalizer); if (OptCanonicalizer.getValue()) { diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyNode.java Thu Jun 06 11:04:24 2013 +0200 @@ -83,7 +83,7 @@ } // the canonicalization before loop unrolling is needed to propagate the length into // additions, etc. - HighTierContext context = new HighTierContext(tool.getRuntime(), tool.assumptions(), tool.getReplacements(), new CanonicalizerPhase()); + HighTierContext context = new HighTierContext(tool.getRuntime(), tool.assumptions(), tool.getReplacements(), new CanonicalizerPhase(true)); context.applyCanonicalizer(snippetGraph); new LoopFullUnrollPhase().apply(snippetGraph, context); context.applyCanonicalizer(snippetGraph); diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java Thu Jun 06 11:04:24 2013 +0200 @@ -61,7 +61,7 @@ while (!loopBegin.isDeleted()) { int mark = graph.getMark(); peel(loop); - new CanonicalizerPhase.Instance(runtime, assumptions, mark, null).apply(graph); + new CanonicalizerPhase.Instance(runtime, assumptions, OptCanonicalizeReads.getValue(), mark, null).apply(graph); if (iterations++ > UNROLL_LIMIT || graph.getNodeCount() > MaximumDesiredSize.getValue() * 3) { throw new BailoutException("FullUnroll : Graph seems to grow out of proportion"); } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Thu Jun 06 11:04:24 2013 +0200 @@ -76,7 +76,7 @@ // Read without usages can be savely removed. return null; } - if (runtime != null && object != null && object.isConstant()) { + if (tool.canonicalizeReads() && runtime != null && object != null && object.isConstant()) { if (location.getLocationIdentity() == LocationIdentity.FINAL_LOCATION && location instanceof ConstantLocationNode) { long displacement = ((ConstantLocationNode) location).getDisplacement(); Kind kind = location.getValueKind(); diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java Thu Jun 06 11:04:24 2013 +0200 @@ -57,7 +57,7 @@ @Override public ValueNode canonical(CanonicalizerTool tool) { MetaAccessProvider runtime = tool.runtime(); - if (runtime != null) { + if (tool.canonicalizeReads() && runtime != null) { Constant constant = null; if (isStatic()) { constant = field().readConstantValue(null); diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/CanonicalizerTool.java Thu Jun 06 11:04:24 2013 +0200 @@ -32,5 +32,7 @@ MetaAccessProvider runtime(); + boolean canonicalizeReads(); + void removeIfUnused(Node node); } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Thu Jun 06 11:04:24 2013 +0200 @@ -47,14 +47,20 @@ private static final DebugMetric METRIC_SIMPLIFICATION_CONSIDERED_NODES = Debug.metric("SimplificationConsideredNodes"); public static final DebugMetric METRIC_GLOBAL_VALUE_NUMBERING_HITS = Debug.metric("GlobalValueNumberingHits"); + private final boolean canonicalizeReads; + public interface CustomCanonicalizer { ValueNode canonicalize(ValueNode node); } + public CanonicalizerPhase(boolean canonicalizeReads) { + this.canonicalizeReads = canonicalizeReads; + } + @Override protected void run(StructuredGraph graph, PhaseContext context) { - new Instance(context.getRuntime(), context.getAssumptions()).run(graph); + new Instance(context.getRuntime(), context.getAssumptions(), canonicalizeReads).run(graph); } public static class Instance extends Phase { @@ -64,12 +70,13 @@ private final MetaAccessProvider runtime; private final CustomCanonicalizer customCanonicalizer; private final Iterable initWorkingSet; + private final boolean canonicalizeReads; private NodeWorkList workList; private Tool tool; - public Instance(MetaAccessProvider runtime, Assumptions assumptions) { - this(runtime, assumptions, null, 0, null); + public Instance(MetaAccessProvider runtime, Assumptions assumptions, boolean canonicalizeReads) { + this(runtime, assumptions, canonicalizeReads, null, 0, null); } /** @@ -79,23 +86,24 @@ * should be an auto-grow node bitmap * @param customCanonicalizer */ - public Instance(MetaAccessProvider runtime, Assumptions assumptions, Iterable workingSet, CustomCanonicalizer customCanonicalizer) { - this(runtime, assumptions, workingSet, 0, customCanonicalizer); + public Instance(MetaAccessProvider runtime, Assumptions assumptions, boolean canonicalizeReads, Iterable workingSet, CustomCanonicalizer customCanonicalizer) { + this(runtime, assumptions, canonicalizeReads, workingSet, 0, customCanonicalizer); } /** * @param newNodesMark only the {@linkplain Graph#getNewNodes(int) new nodes} specified by * this mark are processed otherwise all nodes in the graph are processed */ - public Instance(MetaAccessProvider runtime, Assumptions assumptions, int newNodesMark, CustomCanonicalizer customCanonicalizer) { - this(runtime, assumptions, null, newNodesMark, customCanonicalizer); + public Instance(MetaAccessProvider runtime, Assumptions assumptions, boolean canonicalizeReads, int newNodesMark, CustomCanonicalizer customCanonicalizer) { + this(runtime, assumptions, canonicalizeReads, null, newNodesMark, customCanonicalizer); } - public Instance(MetaAccessProvider runtime, Assumptions assumptions, Iterable workingSet, int newNodesMark, CustomCanonicalizer customCanonicalizer) { + public Instance(MetaAccessProvider runtime, Assumptions assumptions, boolean canonicalizeReads, Iterable workingSet, int newNodesMark, CustomCanonicalizer customCanonicalizer) { super("Canonicalizer"); this.newNodesMark = newNodesMark; this.assumptions = assumptions; this.runtime = runtime; + this.canonicalizeReads = canonicalizeReads; this.customCanonicalizer = customCanonicalizer; this.initWorkingSet = workingSet; } @@ -111,7 +119,7 @@ if (newNodesMark > 0) { workList.addAll(graph.getNewNodes(newNodesMark)); } - tool = new Tool(workList, runtime, assumptions); + tool = new Tool(workList, runtime, assumptions, canonicalizeReads); processWorkSet(graph); } @@ -306,11 +314,13 @@ private final NodeWorkList nodeWorkSet; private final MetaAccessProvider runtime; private final Assumptions assumptions; + private final boolean canonicalizeReads; - public Tool(NodeWorkList nodeWorkSet, MetaAccessProvider runtime, Assumptions assumptions) { + public Tool(NodeWorkList nodeWorkSet, MetaAccessProvider runtime, Assumptions assumptions, boolean canonicalizeReads) { this.nodeWorkSet = nodeWorkSet; this.runtime = runtime; this.assumptions = assumptions; + this.canonicalizeReads = canonicalizeReads; } @Override @@ -342,6 +352,11 @@ public void removeIfUnused(Node node) { tryKillUnused(node); } + + @Override + public boolean canonicalizeReads() { + return canonicalizeReads; + } } } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IncrementalCanonicalizerPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IncrementalCanonicalizerPhase.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IncrementalCanonicalizerPhase.java Thu Jun 06 11:04:24 2013 +0200 @@ -43,6 +43,6 @@ protected void run(StructuredGraph graph, C context) { int mark = graph.getMark(); super.run(graph, context); - new CanonicalizerPhase.Instance(context.getRuntime(), context.getAssumptions(), mark, customCanonicalizer).apply(graph); + new CanonicalizerPhase.Instance(context.getRuntime(), context.getAssumptions(), GraalOptions.OptCanonicalizeReads.getValue(), mark, customCanonicalizer).apply(graph); } } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Thu Jun 06 11:04:24 2013 +0200 @@ -192,7 +192,7 @@ if (OptCanonicalizer.getValue()) { int markBeforeCanonicalization = callerGraph.getMark(); - new CanonicalizerPhase.Instance(runtime, callerAssumptions, invokeUsages, markBeforeInlining, customCanonicalizer).apply(callerGraph); + new CanonicalizerPhase.Instance(runtime, callerAssumptions, OptCanonicalizeReads.getValue(), invokeUsages, markBeforeInlining, customCanonicalizer).apply(callerGraph); // process invokes that are possibly created during canonicalization for (Node newNode : callerGraph.getNewNodes(markBeforeCanonicalization)) { @@ -277,7 +277,7 @@ } if (OptCanonicalizer.getValue()) { - new CanonicalizerPhase.Instance(runtime, assumptions).apply(newGraph); + new CanonicalizerPhase.Instance(runtime, assumptions, OptCanonicalizeReads.getValue()).apply(newGraph); } return newGraph; @@ -304,7 +304,7 @@ new DeadCodeEliminationPhase().apply(newGraph); if (OptCanonicalizer.getValue()) { - new CanonicalizerPhase.Instance(runtime, assumptions).apply(newGraph); + new CanonicalizerPhase.Instance(runtime, assumptions, OptCanonicalizeReads.getValue()).apply(newGraph); } if (CullFrameStates.getValue()) { diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Thu Jun 06 11:04:24 2013 +0200 @@ -691,7 +691,7 @@ metricInliningTailDuplication.increment(); Debug.log("MultiTypeGuardInlineInfo starting tail duplication (%d opportunities)", opportunities); TailDuplicationPhase.tailDuplicate(returnMerge, TailDuplicationPhase.TRUE_DECISION, replacementNodes, new HighTierContext(runtime, assumptions, replacements, - new CanonicalizerPhase())); + new CanonicalizerPhase(OptCanonicalizeReads.getValue()))); } } } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Thu Jun 06 11:04:24 2013 +0200 @@ -44,7 +44,7 @@ if (canonicalizationRoots.isEmpty()) { break; } - new CanonicalizerPhase.Instance(context.getRuntime(), context.getAssumptions(), canonicalizationRoots, null).apply(graph); + new CanonicalizerPhase.Instance(context.getRuntime(), context.getAssumptions(), GraalOptions.OptCanonicalizeReads.getValue(), canonicalizationRoots, null).apply(graph); canonicalizationRoots.clear(); } } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/TailDuplicationPhase.java Thu Jun 06 11:04:24 2013 +0200 @@ -300,7 +300,7 @@ phi.setMerge(mergeAfter); } } - new CanonicalizerPhase.Instance(phaseContext.getRuntime(), phaseContext.getAssumptions(), graph.getNewNodes(startMark), null).apply(graph); + new CanonicalizerPhase.Instance(phaseContext.getRuntime(), phaseContext.getAssumptions(), GraalOptions.OptCanonicalizeReads.getValue(), graph.getNewNodes(startMark), null).apply(graph); Debug.dump(graph, "After tail duplication at %s", merge); } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Thu Jun 06 11:04:24 2013 +0200 @@ -265,6 +265,8 @@ @Option(help = "") public static final OptionValue OptCanonicalizer = new OptionValue<>(true); @Option(help = "") + public static final OptionValue OptCanonicalizeReads = new OptionValue<>(true); + @Option(help = "") public static final OptionValue OptScheduleOutOfLoops = new OptionValue<>(true); @Option(help = "") public static final OptionValue OptEliminateGuards = new OptionValue<>(true); diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Thu Jun 06 11:04:24 2013 +0200 @@ -323,7 +323,7 @@ new WordTypeVerificationPhase(runtime, target.wordKind).apply(graph); if (OptCanonicalizer.getValue()) { new WordTypeRewriterPhase(runtime, target.wordKind).apply(graph); - new CanonicalizerPhase.Instance(runtime, assumptions).apply(graph); + new CanonicalizerPhase.Instance(runtime, assumptions, true).apply(graph); } return graph; @@ -338,7 +338,7 @@ protected void afterInline(StructuredGraph caller, StructuredGraph callee) { if (OptCanonicalizer.getValue()) { new WordTypeRewriterPhase(runtime, target.wordKind).apply(caller); - new CanonicalizerPhase.Instance(runtime, assumptions).apply(caller); + new CanonicalizerPhase.Instance(runtime, assumptions, true).apply(caller); } } @@ -352,7 +352,7 @@ new DeadCodeEliminationPhase().apply(graph); if (OptCanonicalizer.getValue()) { - new CanonicalizerPhase.Instance(runtime, assumptions).apply(graph); + new CanonicalizerPhase.Instance(runtime, assumptions, true).apply(graph); } } diff -r 7e0a3f8fbd70 -r 91295caf53b6 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Thu Jun 06 09:26:02 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Thu Jun 06 11:04:24 2013 +0200 @@ -385,7 +385,7 @@ new NodeIntrinsificationPhase(runtime).apply(snippetCopy); new WordTypeRewriterPhase(runtime, target.wordKind).apply(snippetCopy); - new CanonicalizerPhase.Instance(runtime, replacements.getAssumptions(), 0, null).apply(snippetCopy); + new CanonicalizerPhase.Instance(runtime, replacements.getAssumptions(), true, 0, null).apply(snippetCopy); } NodeIntrinsificationVerificationPhase.verify(snippetCopy); @@ -442,7 +442,7 @@ LoopEx loop = new LoopsData(snippetCopy).loop(loopBegin); int mark = snippetCopy.getMark(); LoopTransformations.fullUnroll(loop, runtime, replacements.getAssumptions()); - new CanonicalizerPhase.Instance(runtime, replacements.getAssumptions(), mark, null).apply(snippetCopy); + new CanonicalizerPhase.Instance(runtime, replacements.getAssumptions(), true, mark, null).apply(snippetCopy); } FixedNode explodeLoopNext = explodeLoop.next(); explodeLoop.clearSuccessors();