001/* 002 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 004 * 005 * This code is free software; you can redistribute it and/or modify it 006 * under the terms of the GNU General Public License version 2 only, as 007 * published by the Free Software Foundation. 008 * 009 * This code is distributed in the hope that it will be useful, but WITHOUT 010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 011 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 012 * version 2 for more details (a copy is included in the LICENSE file that 013 * accompanied this code). 014 * 015 * You should have received a copy of the GNU General Public License version 016 * 2 along with this work; if not, write to the Free Software Foundation, 017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 018 * 019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 020 * or visit www.oracle.com if you need additional information or have any 021 * questions. 022 */ 023package com.oracle.graal.phases.common.inlining.info; 024 025import java.util.*; 026 027import jdk.internal.jvmci.meta.*; 028 029import com.oracle.graal.graph.*; 030import com.oracle.graal.nodes.*; 031import com.oracle.graal.phases.common.*; 032import com.oracle.graal.phases.common.inlining.*; 033import com.oracle.graal.phases.common.inlining.info.elem.*; 034import com.oracle.graal.phases.tiers.*; 035 036public abstract class AbstractInlineInfo implements InlineInfo { 037 038 protected final Invoke invoke; 039 040 public AbstractInlineInfo(Invoke invoke) { 041 this.invoke = invoke; 042 } 043 044 @Override 045 public StructuredGraph graph() { 046 return invoke.asNode().graph(); 047 } 048 049 @Override 050 public Invoke invoke() { 051 return invoke; 052 } 053 054 protected static Collection<Node> inline(Invoke invoke, ResolvedJavaMethod concrete, Inlineable inlineable, boolean receiverNullCheck) { 055 List<Node> canonicalizeNodes = new ArrayList<>(); 056 assert inlineable instanceof InlineableGraph; 057 StructuredGraph calleeGraph = ((InlineableGraph) inlineable).getGraph(); 058 Map<Node, Node> duplicateMap = InliningUtil.inline(invoke, calleeGraph, receiverNullCheck, canonicalizeNodes); 059 getInlinedParameterUsages(canonicalizeNodes, calleeGraph, duplicateMap); 060 061 StructuredGraph graph = invoke.asNode().graph(); 062 graph.recordInlinedMethod(concrete); 063 return canonicalizeNodes; 064 } 065 066 public static void getInlinedParameterUsages(Collection<Node> parameterUsages, StructuredGraph calleeGraph, Map<Node, Node> duplicateMap) { 067 for (ParameterNode parameter : calleeGraph.getNodes(ParameterNode.TYPE)) { 068 for (Node usage : parameter.usages()) { 069 Node node = duplicateMap.get(usage); 070 if (node != null && node.isAlive()) { 071 parameterUsages.add(node); 072 } 073 } 074 } 075 } 076 077 public final void populateInlinableElements(HighTierContext context, StructuredGraph caller, CanonicalizerPhase canonicalizer) { 078 for (int i = 0; i < numberOfMethods(); i++) { 079 Inlineable elem = Inlineable.getInlineableElement(methodAt(i), invoke, context, canonicalizer); 080 setInlinableElement(i, elem); 081 } 082 } 083 084 public final int determineNodeCount() { 085 int nodes = 0; 086 for (int i = 0; i < numberOfMethods(); i++) { 087 Inlineable elem = inlineableElementAt(i); 088 if (elem != null) { 089 nodes += elem.getNodeCount(); 090 } 091 } 092 return nodes; 093 } 094}