src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java

Print this page




   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  */
  23 package org.graalvm.compiler.phases.common.inlining.info;
  24 
  25 import java.util.ArrayList;
  26 import java.util.List;
  27 
  28 import org.graalvm.compiler.core.common.type.StampFactory;
  29 import org.graalvm.compiler.debug.Debug;
  30 import org.graalvm.compiler.graph.Node;
  31 import org.graalvm.compiler.nodes.AbstractBeginNode;
  32 import org.graalvm.compiler.nodes.AbstractMergeNode;
  33 import org.graalvm.compiler.nodes.BeginNode;
  34 import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind;
  35 import org.graalvm.compiler.nodes.DeoptimizeNode;
  36 import org.graalvm.compiler.nodes.EndNode;
  37 import org.graalvm.compiler.nodes.FixedNode;
  38 import org.graalvm.compiler.nodes.FixedWithNextNode;
  39 import org.graalvm.compiler.nodes.FrameState;
  40 import org.graalvm.compiler.nodes.Invoke;
  41 import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
  42 import org.graalvm.compiler.nodes.MergeNode;
  43 import org.graalvm.compiler.nodes.PhiNode;
  44 import org.graalvm.compiler.nodes.PiNode;
  45 import org.graalvm.compiler.nodes.StructuredGraph;
  46 import org.graalvm.compiler.nodes.ValueNode;
  47 import org.graalvm.compiler.nodes.ValuePhiNode;
  48 import org.graalvm.compiler.nodes.extended.LoadHubNode;
  49 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;


 325     private EconomicSet<Node> inlineSingleMethod(StructuredGraph graph, StampProvider stampProvider, ConstantReflectionProvider constantReflection) {
 326         assert concretes.size() == 1 && inlineableElements.length == 1 && ptypes.size() > 1 && !shouldFallbackToInvoke() && notRecordedTypeProbability == 0;
 327 
 328         AbstractBeginNode calleeEntryNode = graph.add(new BeginNode());
 329 
 330         AbstractBeginNode unknownTypeSux = createUnknownTypeSuccessor(graph);
 331         AbstractBeginNode[] successors = new AbstractBeginNode[]{calleeEntryNode, unknownTypeSux};
 332         createDispatchOnTypeBeforeInvoke(graph, successors, false, stampProvider, constantReflection);
 333 
 334         calleeEntryNode.setNext(invoke.asNode());
 335 
 336         return inline(invoke, methodAt(0), inlineableElementAt(0), false);
 337     }
 338 
 339     private boolean createDispatchOnTypeBeforeInvoke(StructuredGraph graph, AbstractBeginNode[] successors, boolean invokeIsOnlySuccessor, StampProvider stampProvider,
 340                     ConstantReflectionProvider constantReflection) {
 341         assert ptypes.size() >= 1;
 342         ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke);
 343         LoadHubNode hub = graph.unique(new LoadHubNode(stampProvider, nonNullReceiver));
 344 
 345         Debug.log("Type switch with %d types", concretes.size());
 346 
 347         ResolvedJavaType[] keys = new ResolvedJavaType[ptypes.size()];
 348         double[] keyProbabilities = new double[ptypes.size() + 1];
 349         int[] keySuccessors = new int[ptypes.size() + 1];
 350         double totalProbability = notRecordedTypeProbability;
 351         for (int i = 0; i < ptypes.size(); i++) {
 352             keys[i] = ptypes.get(i).getType();
 353             keyProbabilities[i] = ptypes.get(i).getProbability();
 354             totalProbability += keyProbabilities[i];
 355             keySuccessors[i] = invokeIsOnlySuccessor ? 0 : typesToConcretes.get(i);
 356             assert keySuccessors[i] < successors.length - 1 : "last successor is the unknownTypeSux";
 357         }
 358         keyProbabilities[keyProbabilities.length - 1] = notRecordedTypeProbability;
 359         keySuccessors[keySuccessors.length - 1] = successors.length - 1;
 360 
 361         // Normalize the probabilities.
 362         for (int i = 0; i < keyProbabilities.length; i++) {
 363             keyProbabilities[i] /= totalProbability;
 364         }
 365 




   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  */
  23 package org.graalvm.compiler.phases.common.inlining.info;
  24 
  25 import java.util.ArrayList;
  26 import java.util.List;
  27 
  28 import org.graalvm.compiler.core.common.type.StampFactory;

  29 import org.graalvm.compiler.graph.Node;
  30 import org.graalvm.compiler.nodes.AbstractBeginNode;
  31 import org.graalvm.compiler.nodes.AbstractMergeNode;
  32 import org.graalvm.compiler.nodes.BeginNode;
  33 import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind;
  34 import org.graalvm.compiler.nodes.DeoptimizeNode;
  35 import org.graalvm.compiler.nodes.EndNode;
  36 import org.graalvm.compiler.nodes.FixedNode;
  37 import org.graalvm.compiler.nodes.FixedWithNextNode;
  38 import org.graalvm.compiler.nodes.FrameState;
  39 import org.graalvm.compiler.nodes.Invoke;
  40 import org.graalvm.compiler.nodes.InvokeWithExceptionNode;
  41 import org.graalvm.compiler.nodes.MergeNode;
  42 import org.graalvm.compiler.nodes.PhiNode;
  43 import org.graalvm.compiler.nodes.PiNode;
  44 import org.graalvm.compiler.nodes.StructuredGraph;
  45 import org.graalvm.compiler.nodes.ValueNode;
  46 import org.graalvm.compiler.nodes.ValuePhiNode;
  47 import org.graalvm.compiler.nodes.extended.LoadHubNode;
  48 import org.graalvm.compiler.nodes.java.ExceptionObjectNode;


 324     private EconomicSet<Node> inlineSingleMethod(StructuredGraph graph, StampProvider stampProvider, ConstantReflectionProvider constantReflection) {
 325         assert concretes.size() == 1 && inlineableElements.length == 1 && ptypes.size() > 1 && !shouldFallbackToInvoke() && notRecordedTypeProbability == 0;
 326 
 327         AbstractBeginNode calleeEntryNode = graph.add(new BeginNode());
 328 
 329         AbstractBeginNode unknownTypeSux = createUnknownTypeSuccessor(graph);
 330         AbstractBeginNode[] successors = new AbstractBeginNode[]{calleeEntryNode, unknownTypeSux};
 331         createDispatchOnTypeBeforeInvoke(graph, successors, false, stampProvider, constantReflection);
 332 
 333         calleeEntryNode.setNext(invoke.asNode());
 334 
 335         return inline(invoke, methodAt(0), inlineableElementAt(0), false);
 336     }
 337 
 338     private boolean createDispatchOnTypeBeforeInvoke(StructuredGraph graph, AbstractBeginNode[] successors, boolean invokeIsOnlySuccessor, StampProvider stampProvider,
 339                     ConstantReflectionProvider constantReflection) {
 340         assert ptypes.size() >= 1;
 341         ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke);
 342         LoadHubNode hub = graph.unique(new LoadHubNode(stampProvider, nonNullReceiver));
 343 
 344         graph.getDebug().log("Type switch with %d types", concretes.size());
 345 
 346         ResolvedJavaType[] keys = new ResolvedJavaType[ptypes.size()];
 347         double[] keyProbabilities = new double[ptypes.size() + 1];
 348         int[] keySuccessors = new int[ptypes.size() + 1];
 349         double totalProbability = notRecordedTypeProbability;
 350         for (int i = 0; i < ptypes.size(); i++) {
 351             keys[i] = ptypes.get(i).getType();
 352             keyProbabilities[i] = ptypes.get(i).getProbability();
 353             totalProbability += keyProbabilities[i];
 354             keySuccessors[i] = invokeIsOnlySuccessor ? 0 : typesToConcretes.get(i);
 355             assert keySuccessors[i] < successors.length - 1 : "last successor is the unknownTypeSux";
 356         }
 357         keyProbabilities[keyProbabilities.length - 1] = notRecordedTypeProbability;
 358         keySuccessors[keySuccessors.length - 1] = successors.length - 1;
 359 
 360         // Normalize the probabilities.
 361         for (int i = 0; i < keyProbabilities.length; i++) {
 362             keyProbabilities[i] /= totalProbability;
 363         }
 364 


src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/inlining/info/MultiTypeGuardInlineInfo.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File