001/* 002 * Copyright (c) 2015, 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.replacements; 024 025import jdk.internal.jvmci.meta.*; 026 027import com.oracle.graal.api.replacements.*; 028import com.oracle.graal.compiler.common.type.*; 029import com.oracle.graal.graphbuilderconf.*; 030import com.oracle.graal.nodes.*; 031import com.oracle.graal.nodes.calc.*; 032 033/** 034 * A {@link ParameterPlugin} that binds constant values to some parameters. 035 */ 036public class ConstantBindingParameterPlugin implements ParameterPlugin { 037 private final Object[] constantArgs; 038 private final MetaAccessProvider metaAccess; 039 private final SnippetReflectionProvider snippetReflection; 040 041 /** 042 * Creates a plugin that will create {@link ConstantNode}s for each parameter with an index 043 * equal to that of a non-null object in {@code constantArgs} (from which the 044 * {@link ConstantNode} is created if it isn't already a {@link ConstantNode}). 045 */ 046 public ConstantBindingParameterPlugin(Object[] constantArgs, MetaAccessProvider metaAccess, SnippetReflectionProvider snippetReflection) { 047 this.constantArgs = constantArgs; 048 this.metaAccess = metaAccess; 049 this.snippetReflection = snippetReflection; 050 } 051 052 public FloatingNode interceptParameter(GraphBuilderContext b, int index, Stamp stamp) { 053 Object arg = constantArgs[index]; 054 if (arg != null) { 055 ConstantNode constantNode; 056 if (arg instanceof ConstantNode) { 057 constantNode = (ConstantNode) arg; 058 } else if (arg instanceof Constant) { 059 constantNode = ConstantNode.forConstant(stamp, (Constant) arg, metaAccess); 060 } else { 061 constantNode = ConstantNode.forConstant(snippetReflection.forBoxed(stamp.getStackKind(), arg), metaAccess); 062 } 063 return constantNode; 064 } 065 return null; 066 } 067}