PoorMansEATest.java revision 12657:6ef01bd40ce2
1/*
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23package org.graalvm.compiler.core.test.ea;
24
25import org.junit.Test;
26
27import org.graalvm.compiler.core.test.GraalCompilerTest;
28import org.graalvm.compiler.debug.Debug;
29import org.graalvm.compiler.debug.Debug.Scope;
30import org.graalvm.compiler.debug.DebugDumpScope;
31import org.graalvm.compiler.graph.Node;
32import org.graalvm.compiler.nodes.FrameState;
33import org.graalvm.compiler.nodes.StructuredGraph;
34import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions;
35import org.graalvm.compiler.nodes.java.AbstractNewObjectNode;
36import org.graalvm.compiler.nodes.java.NewInstanceNode;
37import org.graalvm.compiler.nodes.spi.LoweringTool;
38import org.graalvm.compiler.phases.common.CanonicalizerPhase;
39import org.graalvm.compiler.phases.common.LoweringPhase;
40import org.graalvm.compiler.phases.common.inlining.InliningPhase;
41import org.graalvm.compiler.phases.tiers.HighTierContext;
42import org.graalvm.compiler.phases.tiers.PhaseContext;
43
44/**
45 * Tests {@link AbstractNewObjectNode#simplify(org.graalvm.compiler.graph.spi.SimplifierTool)}.
46 *
47 */
48public class PoorMansEATest extends GraalCompilerTest {
49    public static class A {
50        public A obj;
51    }
52
53    public static A test1Snippet() {
54        A a = new A();
55        a.obj = a;
56        return null;
57    }
58
59    @Test
60    public void test1() {
61        test("test1Snippet");
62    }
63
64    @SuppressWarnings("try")
65    private void test(final String snippet) {
66        try (Scope s = Debug.scope("PoorMansEATest", new DebugDumpScope(snippet))) {
67            StructuredGraph graph = parseEager(snippet, AllowAssumptions.NO);
68            HighTierContext highTierContext = getDefaultHighTierContext();
69            new InliningPhase(new CanonicalizerPhase()).apply(graph, highTierContext);
70            PhaseContext context = new PhaseContext(getProviders());
71            new LoweringPhase(new CanonicalizerPhase(), LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context);
72
73            // remove framestates in order to trigger the simplification.
74            cleanup: for (FrameState fs : graph.getNodes(FrameState.TYPE).snapshot()) {
75                for (Node input : fs.inputs()) {
76                    if (input instanceof NewInstanceNode) {
77                        fs.replaceAtUsages(null);
78                        fs.safeDelete();
79                        continue cleanup;
80                    }
81                }
82            }
83            new CanonicalizerPhase().apply(graph, context);
84        } catch (Throwable e) {
85            throw Debug.handle(e);
86        }
87    }
88}
89