# HG changeset patch # User Christian Wimmer # Date 1367950348 25200 # Node ID 278a50fb49c774a2f398064c7e462c5e96f52fa6 # Parent 20c09d314168f62f0b926ca391b39761699c2095 Create a LoadFieldNode for a getstatic of a static final field in the graph builder, and rely on the canonicalizer for replacing it with the constant value. diff -r 20c09d314168 -r 278a50fb49c7 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Tue May 07 14:04:36 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Tue May 07 11:12:28 2013 -0700 @@ -146,7 +146,7 @@ @Test public void testLoop1() { SchedulePhase schedule = getFinalSchedule("testLoop1Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(7, schedule.getCFG().getBlocks().length); + assertEquals(6, schedule.getCFG().getBlocks().length); assertReadWithinStartBlock(schedule, true); } @@ -170,7 +170,7 @@ @Test public void testLoop2() { SchedulePhase schedule = getFinalSchedule("testLoop2Snippet", TestMode.WITHOUT_FRAMESTATES); - assertEquals(7, schedule.getCFG().getBlocks().length); + assertEquals(6, schedule.getCFG().getBlocks().length); assertReadWithinStartBlock(schedule, false); } @@ -219,11 +219,12 @@ @Override public SchedulePhase call() throws Exception { StructuredGraph graph = parse(snippet); + Assumptions assumptions = new Assumptions(false); + new CanonicalizerPhase.Instance(runtime, assumptions).apply(graph); if (mode == TestMode.INLINED_WITHOUT_FRAMESTATES) { - Assumptions assumptions = new Assumptions(false); new InliningPhase(runtime(), null, replacements, assumptions, null, getDefaultPhasePlan(), OptimisticOptimizations.ALL).apply(graph); } - HighTierContext context = new HighTierContext(runtime(), new Assumptions(false), replacements); + HighTierContext context = new HighTierContext(runtime(), assumptions, replacements); new LoweringPhase(LoweringType.BEFORE_GUARDS).apply(graph, context); if (mode == TestMode.WITHOUT_FRAMESTATES || mode == TestMode.INLINED_WITHOUT_FRAMESTATES) { for (Node node : graph.getNodes()) { diff -r 20c09d314168 -r 278a50fb49c7 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue May 07 14:04:36 2013 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue May 07 11:12:28 2013 -0700 @@ -1003,13 +1003,8 @@ private void genGetStatic(JavaField field) { Kind kind = field.getKind(); if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) { - Constant constantValue = ((ResolvedJavaField) field).readConstantValue(null); - if (constantValue != null) { - frameState.push(constantValue.getKind().getStackKind(), appendConstant(constantValue)); - } else { - LoadFieldNode load = currentGraph.add(new LoadFieldNode(null, (ResolvedJavaField) field)); - appendOptimizedLoadField(kind, load); - } + LoadFieldNode load = currentGraph.add(new LoadFieldNode(null, (ResolvedJavaField) field)); + appendOptimizedLoadField(kind, load); } else { handleUnresolvedLoadField(field, null); } diff -r 20c09d314168 -r 278a50fb49c7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java Tue May 07 14:04:36 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java Tue May 07 11:12:28 2013 -0700 @@ -43,6 +43,10 @@ @Input private ValueNode index; @Input private ValueNode indexScaling; + public static SnippetLocationNode create(ValueNode identity, ValueNode kind, ValueNode displacement, ValueNode index, ValueNode indexScaling, Graph graph) { + return graph.unique(new SnippetLocationNode(identity, kind, displacement, index, indexScaling)); + } + private SnippetLocationNode(ValueNode locationIdentity, ValueNode kind, ValueNode displacement) { this(locationIdentity, kind, displacement, null, null); } diff -r 20c09d314168 -r 278a50fb49c7 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 Tue May 07 14:04:36 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue May 07 11:12:28 2013 -0700 @@ -320,6 +320,10 @@ graphBuilder.apply(graph); new WordTypeVerificationPhase(runtime, target.wordKind).apply(graph); + if (GraalOptions.OptCanonicalizer) { + new WordTypeRewriterPhase(runtime, target.wordKind).apply(graph); + new CanonicalizerPhase.Instance(runtime, assumptions).apply(graph); + } return graph; } diff -r 20c09d314168 -r 278a50fb49c7 graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Tue May 07 14:04:36 2013 +0200 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Tue May 07 11:12:28 2013 -0700 @@ -45,11 +45,13 @@ */ public class WordTypeRewriterPhase extends Phase { + private final MetaAccessProvider metaAccess; private final ResolvedJavaType wordBaseType; private final ResolvedJavaType wordImplType; private final Kind wordKind; public WordTypeRewriterPhase(MetaAccessProvider metaAccess, Kind wordKind) { + this.metaAccess = metaAccess; this.wordKind = wordKind; this.wordBaseType = metaAccess.lookupJavaType(WordBase.class); this.wordImplType = metaAccess.lookupJavaType(Word.class); @@ -157,20 +159,30 @@ replace(invoke, graph.unique(new XorNode(wordKind, arguments.get(0), ConstantNode.forIntegerKind(wordKind, -1, graph)))); break; - case READ: + case READ: { assert arguments.size() == 2 || arguments.size() == 3; Kind readKind = asKind(callTargetNode.returnType()); - LocationIdentity readLocation = arguments.size() == 2 ? LocationNode.ANY_LOCATION : (LocationIdentity) arguments.get(2).asConstant().asObject(); - replace(invoke, readOp(graph, arguments.get(0), arguments.get(1), invoke, readKind, readLocation)); + LocationNode location; + if (arguments.size() == 2) { + location = makeLocation(graph, arguments.get(1), readKind, LocationNode.ANY_LOCATION); + } else { + location = makeLocation(graph, arguments.get(1), readKind, arguments.get(2)); + } + replace(invoke, readOp(graph, arguments.get(0), invoke, location)); break; - - case WRITE: + } + case WRITE: { assert arguments.size() == 3 || arguments.size() == 4; Kind writeKind = asKind(targetMethod.getSignature().getParameterType(1, targetMethod.getDeclaringClass())); - LocationIdentity writeLocation = arguments.size() == 3 ? LocationNode.ANY_LOCATION : (LocationIdentity) arguments.get(3).asConstant().asObject(); - replace(invoke, writeOp(graph, arguments.get(0), arguments.get(1), arguments.get(2), invoke, writeKind, writeLocation)); + LocationNode location; + if (arguments.size() == 3) { + location = makeLocation(graph, arguments.get(1), writeKind, LocationNode.ANY_LOCATION); + } else { + location = makeLocation(graph, arguments.get(1), writeKind, arguments.get(3)); + } + replace(invoke, writeOp(graph, arguments.get(0), arguments.get(2), invoke, location)); break; - + } case ZERO: assert arguments.size() == 0; replace(invoke, ConstantNode.forIntegerKind(wordKind, 0L, graph)); @@ -285,8 +297,18 @@ return materialize; } - private static ValueNode readOp(StructuredGraph graph, ValueNode base, ValueNode offset, Invoke invoke, Kind readKind, LocationIdentity locationIdentity) { - IndexedLocationNode location = IndexedLocationNode.create(locationIdentity, readKind, 0, offset, graph, 1); + private LocationNode makeLocation(StructuredGraph graph, ValueNode offset, Kind readKind, ValueNode locationIdentity) { + if (locationIdentity.isConstant()) { + return makeLocation(graph, offset, readKind, (LocationIdentity) locationIdentity.asConstant().asObject()); + } + return SnippetLocationNode.create(locationIdentity, ConstantNode.forObject(readKind, metaAccess, graph), ConstantNode.forLong(0, graph), offset, ConstantNode.forInt(1, graph), graph); + } + + private static LocationNode makeLocation(StructuredGraph graph, ValueNode offset, Kind readKind, LocationIdentity locationIdentity) { + return IndexedLocationNode.create(locationIdentity, readKind, 0, offset, graph, 1); + } + + private static ValueNode readOp(StructuredGraph graph, ValueNode base, Invoke invoke, LocationNode location) { ReadNode read = graph.add(new ReadNode(base, location, invoke.asNode().stamp())); graph.addBeforeFixed(invoke.asNode(), read); // The read must not float outside its block otherwise it may float above an explicit zero @@ -295,8 +317,7 @@ return read; } - private static ValueNode writeOp(StructuredGraph graph, ValueNode base, ValueNode offset, ValueNode value, Invoke invoke, Kind writeKind, LocationIdentity locationIdentity) { - IndexedLocationNode location = IndexedLocationNode.create(locationIdentity, writeKind, 0, offset, graph, 1); + private static ValueNode writeOp(StructuredGraph graph, ValueNode base, ValueNode value, Invoke invoke, LocationNode location) { WriteNode write = graph.add(new WriteNode(base, value, location, WriteBarrierType.NONE)); write.setStateAfter(invoke.stateAfter()); graph.addBeforeFixed(invoke.asNode(), write);