1/*
2 * Copyright (c) 2013, 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.phases.common.inlining.info;
24
25import org.graalvm.compiler.graph.Node;
26import org.graalvm.compiler.nodes.Invoke;
27import org.graalvm.compiler.nodes.StructuredGraph;
28import org.graalvm.compiler.options.OptionValues;
29import org.graalvm.compiler.phases.common.CanonicalizerPhase;
30import org.graalvm.compiler.phases.common.inlining.InliningUtil;
31import org.graalvm.compiler.phases.common.inlining.info.elem.Inlineable;
32import org.graalvm.compiler.phases.common.inlining.info.elem.InlineableGraph;
33import org.graalvm.compiler.phases.tiers.HighTierContext;
34import org.graalvm.util.EconomicSet;
35
36import jdk.vm.ci.meta.ResolvedJavaMethod;
37
38public abstract class AbstractInlineInfo implements InlineInfo {
39
40    protected final Invoke invoke;
41
42    public AbstractInlineInfo(Invoke invoke) {
43        this.invoke = invoke;
44    }
45
46    @Override
47    public StructuredGraph graph() {
48        return invoke.asNode().graph();
49    }
50
51    @Override
52    public Invoke invoke() {
53        return invoke;
54    }
55
56    @SuppressWarnings("try")
57    protected static EconomicSet<Node> inline(Invoke invoke, ResolvedJavaMethod concrete, Inlineable inlineable, boolean receiverNullCheck) {
58        assert inlineable instanceof InlineableGraph;
59        StructuredGraph calleeGraph = ((InlineableGraph) inlineable).getGraph();
60        return InliningUtil.inlineForCanonicalization(invoke, calleeGraph, receiverNullCheck, concrete);
61    }
62
63    @Override
64    @SuppressWarnings("try")
65    public final void populateInlinableElements(HighTierContext context, StructuredGraph caller, CanonicalizerPhase canonicalizer, OptionValues options) {
66        for (int i = 0; i < numberOfMethods(); i++) {
67            Inlineable elem = Inlineable.getInlineableElement(methodAt(i), invoke, context, canonicalizer);
68            setInlinableElement(i, elem);
69        }
70    }
71
72    @Override
73    public final int determineNodeCount() {
74        int nodes = 0;
75        for (int i = 0; i < numberOfMethods(); i++) {
76            Inlineable elem = inlineableElementAt(i);
77            if (elem != null) {
78                nodes += elem.getNodeCount();
79            }
80        }
81        return nodes;
82    }
83}
84