Search in sources :

Example 1 with SimplifierTool

use of org.graalvm.compiler.nodes.spi.SimplifierTool in project graal by oracle.

the class ConvertDeoptimizeToGuardPhase method propagateFixed.

@SuppressWarnings("try")
private static void propagateFixed(FixedNode from, StaticDeoptimizingNode deopt, CoreProviders providers, LazyValue<LoopsData> lazyLoops) {
    Node current = from;
    while (current != null) {
        if (GraalOptions.GuardPriorities.getValue(from.getOptions()) && current instanceof FixedGuardNode) {
            FixedGuardNode otherGuard = (FixedGuardNode) current;
            if (otherGuard.computePriority().isHigherPriorityThan(deopt.computePriority())) {
                moveAsDeoptAfter(otherGuard, deopt);
                return;
            }
        } else if (current instanceof AbstractBeginNode) {
            if (current instanceof AbstractMergeNode) {
                AbstractMergeNode mergeNode = (AbstractMergeNode) current;
                FixedNode next = mergeNode.next();
                while (mergeNode.isAlive()) {
                    AbstractEndNode end = mergeNode.forwardEnds().first();
                    propagateFixed(end, deopt, providers, lazyLoops);
                }
                if (next.isAlive()) {
                    propagateFixed(next, deopt, providers, lazyLoops);
                }
                return;
            } else if (current.predecessor() instanceof IfNode) {
                AbstractBeginNode begin = (AbstractBeginNode) current;
                IfNode ifNode = (IfNode) current.predecessor();
                if (isOsrLoopExit(begin) || isCountedLoopExit(ifNode, lazyLoops)) {
                    moveAsDeoptAfter(begin, deopt);
                } else {
                    // Prioritize the source position of the IfNode
                    try (DebugCloseable closable = ifNode.withNodeSourcePosition()) {
                        StructuredGraph graph = ifNode.graph();
                        LogicNode conditionNode = ifNode.condition();
                        boolean negateGuardCondition = current == ifNode.trueSuccessor();
                        NodeSourcePosition survivingSuccessorPosition = negateGuardCondition ? ifNode.falseSuccessor().getNodeSourcePosition() : ifNode.trueSuccessor().getNodeSourcePosition();
                        FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.getReason(), deopt.getAction(), deopt.getSpeculation(), negateGuardCondition, survivingSuccessorPosition));
                        FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor();
                        AbstractBeginNode survivingSuccessor;
                        if (negateGuardCondition) {
                            survivingSuccessor = ifNode.falseSuccessor();
                        } else {
                            survivingSuccessor = ifNode.trueSuccessor();
                        }
                        graph.removeSplitPropagate(ifNode, survivingSuccessor);
                        Node newGuard = guard;
                        if (survivingSuccessor instanceof LoopExitNode) {
                            newGuard = ProxyNode.forGuard(guard, (LoopExitNode) survivingSuccessor);
                        }
                        survivingSuccessor.replaceAtUsages(newGuard, InputType.Guard);
                        graph.getDebug().log("Converting deopt on %-5s branch of %s to guard for remaining branch %s.", negateGuardCondition, ifNode, survivingSuccessor);
                        FixedNode next = pred.next();
                        pred.setNext(guard);
                        guard.setNext(next);
                        assert providers != null;
                        SimplifierTool simplifierTool = GraphUtil.getDefaultSimplifier(providers, false, graph.getAssumptions(), graph.getOptions());
                        ((Simplifiable) survivingSuccessor).simplify(simplifierTool);
                    }
                }
                return;
            } else if (current.predecessor() == null || current.predecessor() instanceof ControlSplitNode) {
                assert current.predecessor() != null || (current instanceof StartNode && current == ((AbstractBeginNode) current).graph().start());
                moveAsDeoptAfter((AbstractBeginNode) current, deopt);
                return;
            }
        }
        current = current.predecessor();
    }
}
Also used : FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) StartNode(org.graalvm.compiler.nodes.StartNode) LoopExitNode(org.graalvm.compiler.nodes.LoopExitNode) CompareNode(org.graalvm.compiler.nodes.calc.CompareNode) GuardNode(org.graalvm.compiler.nodes.GuardNode) ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) StartNode(org.graalvm.compiler.nodes.StartNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) ControlSplitNode(org.graalvm.compiler.nodes.ControlSplitNode) StaticDeoptimizingNode(org.graalvm.compiler.nodes.StaticDeoptimizingNode) DeoptimizeNode(org.graalvm.compiler.nodes.DeoptimizeNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) IfNode(org.graalvm.compiler.nodes.IfNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) FixedGuardNode(org.graalvm.compiler.nodes.FixedGuardNode) LogicNode(org.graalvm.compiler.nodes.LogicNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) LoopExitNode(org.graalvm.compiler.nodes.LoopExitNode) Node(org.graalvm.compiler.graph.Node) EndNode(org.graalvm.compiler.nodes.EndNode) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) ProxyNode(org.graalvm.compiler.nodes.ProxyNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) IfNode(org.graalvm.compiler.nodes.IfNode) SimplifierTool(org.graalvm.compiler.nodes.spi.SimplifierTool) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) FixedGuardNode(org.graalvm.compiler.nodes.FixedGuardNode) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) LogicNode(org.graalvm.compiler.nodes.LogicNode) ControlSplitNode(org.graalvm.compiler.nodes.ControlSplitNode) DebugCloseable(org.graalvm.compiler.debug.DebugCloseable) NodeSourcePosition(org.graalvm.compiler.graph.NodeSourcePosition) Simplifiable(org.graalvm.compiler.nodes.spi.Simplifiable)

Example 2 with SimplifierTool

use of org.graalvm.compiler.nodes.spi.SimplifierTool in project graal by oracle.

the class MultiGuardNode method simplify.

@Override
public void simplify(SimplifierTool tool) {
    if (usages().filter(node -> node instanceof ValueAnchorNode).isNotEmpty()) {
        /*
             * For ValueAnchorNode usages, we can optimize MultiGuardNodes away if they depend on
             * zero or one floating nodes (as opposed to fixed nodes).
             */
        Node singleFloatingGuard = null;
        for (ValueNode guard : guards) {
            if (GraphUtil.isFloatingNode(guard)) {
                if (singleFloatingGuard == null) {
                    singleFloatingGuard = guard;
                } else if (singleFloatingGuard != guard) {
                    return;
                }
            }
        }
        for (Node usage : usages().snapshot()) {
            if (usage instanceof ValueAnchorNode) {
                usage.replaceFirstInput(this, singleFloatingGuard);
                tool.addToWorkList(usage);
            }
        }
        if (usages().isEmpty()) {
            GraphUtil.killWithUnusedFloatingInputs(this);
        }
    }
}
Also used : SIZE_0(org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0) FloatingNode(org.graalvm.compiler.nodes.calc.FloatingNode) CYCLES_0(org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0) NodeInfo(org.graalvm.compiler.nodeinfo.NodeInfo) GraphUtil(org.graalvm.compiler.nodes.util.GraphUtil) Simplifiable(org.graalvm.compiler.nodes.spi.Simplifiable) CanonicalizerTool(org.graalvm.compiler.nodes.spi.CanonicalizerTool) Guard(org.graalvm.compiler.nodeinfo.InputType.Guard) NodeBitMap(org.graalvm.compiler.graph.NodeBitMap) SimplifierTool(org.graalvm.compiler.nodes.spi.SimplifierTool) EconomicSet(org.graalvm.collections.EconomicSet) NodeInputList(org.graalvm.compiler.graph.NodeInputList) LIRLowerable(org.graalvm.compiler.nodes.spi.LIRLowerable) NodeLIRBuilderTool(org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool) ArrayList(java.util.ArrayList) Canonicalizable(org.graalvm.compiler.nodes.spi.Canonicalizable) ValueNode(org.graalvm.compiler.nodes.ValueNode) StampFactory(org.graalvm.compiler.core.common.type.StampFactory) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) NodeClass(org.graalvm.compiler.graph.NodeClass) Node(org.graalvm.compiler.graph.Node) FloatingNode(org.graalvm.compiler.nodes.calc.FloatingNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) Node(org.graalvm.compiler.graph.Node) ValueNode(org.graalvm.compiler.nodes.ValueNode)

Example 3 with SimplifierTool

use of org.graalvm.compiler.nodes.spi.SimplifierTool in project graal by oracle.

the class LoopTransformations method fullUnroll.

@SuppressWarnings("try")
public static void fullUnroll(LoopEx loop, CoreProviders context, CanonicalizerPhase canonicalizer) {
    // assert loop.isCounted(); //TODO (gd) strengthen : counted with known trip count
    LoopBeginNode loopBegin = loop.loopBegin();
    StructuredGraph graph = loopBegin.graph();
    int initialNodeCount = graph.getNodeCount();
    SimplifierTool defaultSimplifier = GraphUtil.getDefaultSimplifier(context, canonicalizer.getCanonicalizeReads(), graph.getAssumptions(), graph.getOptions());
    /*
         * IMPORTANT: Canonicalizations inside the body of the remaining loop can introduce new
         * control flow that is not automatically picked up by the control flow graph computation of
         * the original LoopEx data structure, thus we disable simplification and manually simplify
         * conditions in the peeled iteration to simplify the exit path.
         */
    CanonicalizerPhase c = canonicalizer.copyWithoutSimplification();
    EconomicSetNodeEventListener l = new EconomicSetNodeEventListener();
    int peelings = 0;
    try (NodeEventScope ev = graph.trackNodeEvents(l)) {
        while (!loopBegin.isDeleted()) {
            Mark newNodes = graph.getMark();
            /*
                 * Mark is not enough for the canonicalization of the floating nodes in the unrolled
                 * code since pre-existing constants are not new nodes. Therefore, we canonicalize
                 * (without simplification) all floating nodes changed during peeling but only
                 * simplify new (in the peeled iteration) ones.
                 */
            EconomicSetNodeEventListener peeledListener = new EconomicSetNodeEventListener();
            try (NodeEventScope peeledScope = graph.trackNodeEvents(peeledListener)) {
                LoopTransformations.peel(loop);
            }
            graph.getDebug().dump(DebugContext.VERY_DETAILED_LEVEL, graph, "After peeling loop %s", loop);
            c.applyIncremental(graph, context, peeledListener.getNodes());
            loop.invalidateFragmentsAndIVs();
            for (Node n : graph.getNewNodes(newNodes)) {
                if (n.isAlive() && (n instanceof IfNode || n instanceof SwitchNode || n instanceof FixedGuardNode || n instanceof BeginNode)) {
                    Simplifiable s = (Simplifiable) n;
                    s.simplify(defaultSimplifier);
                    graph.getDebug().dump(DebugContext.VERY_DETAILED_LEVEL, graph, "After simplifying if %s", s);
                }
            }
            if (graph.getNodeCount() > initialNodeCount + MaximumDesiredSize.getValue(graph.getOptions()) * 2 || peelings > DefaultLoopPolicies.Options.FullUnrollMaxIterations.getValue(graph.getOptions())) {
                throw new RetryableBailoutException("FullUnroll : Graph seems to grow out of proportion");
            }
            peelings++;
        }
    }
    // Canonicalize with the original canonicalizer to capture all simplifications
    canonicalizer.applyIncremental(graph, context, l.getNodes());
}
Also used : AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) OpaqueNode(org.graalvm.compiler.nodes.extended.OpaqueNode) BeginNode(org.graalvm.compiler.nodes.BeginNode) LoopBeginNode(org.graalvm.compiler.nodes.LoopBeginNode) IfNode(org.graalvm.compiler.nodes.IfNode) VirtualObjectNode(org.graalvm.compiler.nodes.virtual.VirtualObjectNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) FixedGuardNode(org.graalvm.compiler.nodes.FixedGuardNode) LogicNode(org.graalvm.compiler.nodes.LogicNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) CompareNode(org.graalvm.compiler.nodes.calc.CompareNode) AddNode(org.graalvm.compiler.nodes.calc.AddNode) ControlSplitNode(org.graalvm.compiler.nodes.ControlSplitNode) SwitchNode(org.graalvm.compiler.nodes.extended.SwitchNode) ConditionalNode(org.graalvm.compiler.nodes.calc.ConditionalNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) SafepointNode(org.graalvm.compiler.nodes.SafepointNode) ValueProxyNode(org.graalvm.compiler.nodes.ValueProxyNode) GuardPhiNode(org.graalvm.compiler.nodes.GuardPhiNode) LoopExitNode(org.graalvm.compiler.nodes.LoopExitNode) Node(org.graalvm.compiler.graph.Node) EndNode(org.graalvm.compiler.nodes.EndNode) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) PhiNode(org.graalvm.compiler.nodes.PhiNode) ProxyNode(org.graalvm.compiler.nodes.ProxyNode) Mark(org.graalvm.compiler.graph.Graph.Mark) IfNode(org.graalvm.compiler.nodes.IfNode) SimplifierTool(org.graalvm.compiler.nodes.spi.SimplifierTool) SwitchNode(org.graalvm.compiler.nodes.extended.SwitchNode) EconomicSetNodeEventListener(org.graalvm.compiler.phases.common.util.EconomicSetNodeEventListener) FixedGuardNode(org.graalvm.compiler.nodes.FixedGuardNode) LoopBeginNode(org.graalvm.compiler.nodes.LoopBeginNode) NodeEventScope(org.graalvm.compiler.graph.Graph.NodeEventScope) RetryableBailoutException(org.graalvm.compiler.core.common.RetryableBailoutException) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) BeginNode(org.graalvm.compiler.nodes.BeginNode) LoopBeginNode(org.graalvm.compiler.nodes.LoopBeginNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) CanonicalizerPhase(org.graalvm.compiler.phases.common.CanonicalizerPhase) Simplifiable(org.graalvm.compiler.nodes.spi.Simplifiable)

Example 4 with SimplifierTool

use of org.graalvm.compiler.nodes.spi.SimplifierTool in project graal by oracle.

the class IntegerExactOverflowNode method simplify.

@Override
public void simplify(SimplifierTool tool) {
    // Find all ifs that this node feeds into
    for (IfNode ifNode : usages().filter(IfNode.class).snapshot()) {
        // Replace the if with exact split
        AbstractBeginNode next = ifNode.falseSuccessor();
        AbstractBeginNode overflow = ifNode.trueSuccessor();
        ifNode.clearSuccessors();
        // Try to find corresponding exact nodes that could be combined with the split. They
        // would be directly
        // linked to the BeginNode of the false branch.
        List<? extends BinaryNode> coupledNodes = next.usages().filter(getCoupledType()).filter(n -> {
            BinaryNode exact = (BinaryNode) n;
            return exact.getX() == getX() && exact.getY() == getY();
        }).snapshot();
        Stamp splitStamp = x.stamp(NodeView.DEFAULT).unrestricted();
        if (!coupledNodes.isEmpty()) {
            splitStamp = coupledNodes.iterator().next().stamp(NodeView.DEFAULT);
        }
        IntegerExactArithmeticSplitNode split = graph().add(createSplit(splitStamp, next, overflow));
        ifNode.replaceAndDelete(split);
        coupledNodes.forEach(n -> n.replaceAndDelete(split));
    }
}
Also used : NodeInfo(org.graalvm.compiler.nodeinfo.NodeInfo) IfNode(org.graalvm.compiler.nodes.IfNode) Simplifiable(org.graalvm.compiler.nodes.spi.Simplifiable) NodeView(org.graalvm.compiler.nodes.NodeView) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) SimplifierTool(org.graalvm.compiler.nodes.spi.SimplifierTool) Stamp(org.graalvm.compiler.core.common.type.Stamp) Canonicalizable(org.graalvm.compiler.nodes.spi.Canonicalizable) LogicNode(org.graalvm.compiler.nodes.LogicNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) List(java.util.List) BinaryNode(org.graalvm.compiler.nodes.calc.BinaryNode) NodeClass(org.graalvm.compiler.graph.NodeClass) CYCLES_2(org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2) SIZE_2(org.graalvm.compiler.nodeinfo.NodeSize.SIZE_2) Stamp(org.graalvm.compiler.core.common.type.Stamp) BinaryNode(org.graalvm.compiler.nodes.calc.BinaryNode) IfNode(org.graalvm.compiler.nodes.IfNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode)

Example 5 with SimplifierTool

use of org.graalvm.compiler.nodes.spi.SimplifierTool in project graal by oracle.

the class IntegerSwitchNode method tryOptimizeEnumSwitch.

/**
 * For switch statements on enum values, the Java compiler has to generate complicated code:
 * because {@link Enum#ordinal()} can change when recompiling an enum, it cannot be used
 * directly as the value that is switched on. An intermediate int[] array, which is initialized
 * once at run time based on the actual {@link Enum#ordinal()} values, is used.
 * <p>
 * The {@link ConstantFieldProvider} of Graal already detects the int[] arrays and marks them as
 * {@link ConstantNode#isDefaultStable() stable}, i.e., the array elements are constant. The
 * code in this method detects array loads from such a stable array and re-wires the switch to
 * use the keys from the array elements, so that the array load is unnecessary.
 */
private boolean tryOptimizeEnumSwitch(SimplifierTool tool) {
    if (!(value() instanceof LoadIndexedNode)) {
        /* Not the switch pattern we are looking for. */
        return false;
    }
    LoadIndexedNode loadIndexed = (LoadIndexedNode) value();
    if (loadIndexed.hasMoreThanOneUsage()) {
        /*
             * The array load is necessary for other reasons too, so there is no benefit optimizing
             * the switch.
             */
        return false;
    }
    assert loadIndexed.usages().first() == this;
    ValueNode newValue = loadIndexed.index();
    JavaConstant arrayConstant = loadIndexed.array().asJavaConstant();
    if (arrayConstant == null || ((ConstantNode) loadIndexed.array()).getStableDimension() != 1 || !((ConstantNode) loadIndexed.array()).isDefaultStable()) {
        /*
             * The array is a constant that we can optimize. We require the array elements to be
             * constant too, since we put them as literal constants into the switch keys.
             */
        return false;
    }
    Integer optionalArrayLength = tool.getConstantReflection().readArrayLength(arrayConstant);
    if (optionalArrayLength == null) {
        /* Loading a constant value can be denied by the VM. */
        return false;
    }
    int arrayLength = optionalArrayLength;
    Map<Integer, List<Integer>> reverseArrayMapping = new HashMap<>();
    for (int i = 0; i < arrayLength; i++) {
        JavaConstant elementConstant = tool.getConstantReflection().readArrayElement(arrayConstant, i);
        if (elementConstant == null || elementConstant.getJavaKind() != JavaKind.Int) {
            /* Loading a constant value can be denied by the VM. */
            return false;
        }
        int element = elementConstant.asInt();
        /*
             * The value loaded from the array is the old switch key, the index into the array is
             * the new switch key. We build a mapping from the old switch key to new keys.
             */
        reverseArrayMapping.computeIfAbsent(element, e -> new ArrayList<>()).add(i);
    }
    /* Build high-level representation of new switch keys. */
    List<KeyData> newKeyDatas = new ArrayList<>(arrayLength);
    ArrayList<AbstractBeginNode> newSuccessors = new ArrayList<>(blockSuccessorCount());
    for (int i = 0; i < keys.length; i++) {
        List<Integer> newKeys = reverseArrayMapping.get(keys[i]);
        if (newKeys == null || newKeys.size() == 0) {
            /* The switch case is unreachable, we can ignore it. */
            continue;
        }
        /*
             * We do not have detailed profiling information about the individual new keys, so we
             * have to assume they split the probability of the old key.
             */
        double newKeyProbability = getKeyProbabilities()[i] / newKeys.size();
        int newKeySuccessor = addNewSuccessor(keySuccessor(i), newSuccessors);
        for (int newKey : newKeys) {
            newKeyDatas.add(new KeyData(newKey, newKeyProbability, newKeySuccessor));
        }
    }
    int newDefaultSuccessor = addNewSuccessor(defaultSuccessor(), newSuccessors);
    double newDefaultProbability = getKeyProbabilities()[getKeyProbabilities().length - 1];
    if (loadIndexed.getBoundsCheck() == null) {
        /*
             * We remove the array load, but we still need to preserve exception semantics by
             * keeping the bounds check. Fortunately the array length is a constant.
             */
        LogicNode boundsCheck = graph().unique(new IntegerBelowNode(newValue, ConstantNode.forInt(arrayLength, graph())));
        graph().addBeforeFixed(this, graph().add(new FixedGuardNode(boundsCheck, DeoptimizationReason.BoundsCheckException, DeoptimizationAction.InvalidateReprofile)));
    }
    /*
         * Build the low-level representation of the new switch keys and replace ourself with a new
         * node.
         */
    doReplace(newValue, newKeyDatas, newSuccessors, newDefaultSuccessor, newDefaultProbability);
    /* The array load is now unnecessary. */
    assert loadIndexed.hasNoUsages();
    GraphUtil.removeFixedWithUnusedInputs(loadIndexed);
    return true;
}
Also used : DeoptimizationReason(jdk.vm.ci.meta.DeoptimizationReason) Arrays(java.util.Arrays) ProfileSource(org.graalvm.compiler.nodes.ProfileData.ProfileSource) InputType(org.graalvm.compiler.nodeinfo.InputType) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) DeoptimizationAction(jdk.vm.ci.meta.DeoptimizationAction) HashMap(java.util.HashMap) SimplifierTool(org.graalvm.compiler.nodes.spi.SimplifierTool) SwitchFoldable(org.graalvm.compiler.nodes.spi.SwitchFoldable) EconomicSet(org.graalvm.collections.EconomicSet) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) ArrayList(java.util.ArrayList) NodeLIRBuilderTool(org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool) IntegerStamp(org.graalvm.compiler.core.common.type.IntegerStamp) StampFactory(org.graalvm.compiler.core.common.type.StampFactory) JavaKind(jdk.vm.ci.meta.JavaKind) EconomicMap(org.graalvm.collections.EconomicMap) NodeClass(org.graalvm.compiler.graph.NodeClass) Map(java.util.Map) BeginNode(org.graalvm.compiler.nodes.BeginNode) MergeNode(org.graalvm.compiler.nodes.MergeNode) LoadIndexedNode(org.graalvm.compiler.nodes.java.LoadIndexedNode) SwitchProbabilityData(org.graalvm.compiler.nodes.ProfileData.SwitchProbabilityData) FixedNode(org.graalvm.compiler.nodes.FixedNode) IntegerBelowNode(org.graalvm.compiler.nodes.calc.IntegerBelowNode) Iterator(java.util.Iterator) NodeInfo(org.graalvm.compiler.nodeinfo.NodeInfo) GraphUtil(org.graalvm.compiler.nodes.util.GraphUtil) MapCursor(org.graalvm.collections.MapCursor) Simplifiable(org.graalvm.compiler.nodes.spi.Simplifiable) NodeView(org.graalvm.compiler.nodes.NodeView) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) FixedGuardNode(org.graalvm.compiler.nodes.FixedGuardNode) PrimitiveStamp(org.graalvm.compiler.core.common.type.PrimitiveStamp) Stamp(org.graalvm.compiler.core.common.type.Stamp) LIRLowerable(org.graalvm.compiler.nodes.spi.LIRLowerable) JavaConstant(jdk.vm.ci.meta.JavaConstant) LogicNode(org.graalvm.compiler.nodes.LogicNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) List(java.util.List) ConstantFieldProvider(org.graalvm.compiler.core.common.spi.ConstantFieldProvider) Node(org.graalvm.compiler.graph.Node) EndNode(org.graalvm.compiler.nodes.EndNode) Comparator(java.util.Comparator) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) IntegerBelowNode(org.graalvm.compiler.nodes.calc.IntegerBelowNode) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) JavaConstant(jdk.vm.ci.meta.JavaConstant) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) FixedGuardNode(org.graalvm.compiler.nodes.FixedGuardNode) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) LoadIndexedNode(org.graalvm.compiler.nodes.java.LoadIndexedNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) ArrayList(java.util.ArrayList) List(java.util.List) LogicNode(org.graalvm.compiler.nodes.LogicNode)

Aggregations

ValueNode (org.graalvm.compiler.nodes.ValueNode)5 Simplifiable (org.graalvm.compiler.nodes.spi.Simplifiable)5 SimplifierTool (org.graalvm.compiler.nodes.spi.SimplifierTool)5 Node (org.graalvm.compiler.graph.Node)4 AbstractBeginNode (org.graalvm.compiler.nodes.AbstractBeginNode)4 LogicNode (org.graalvm.compiler.nodes.LogicNode)4 NodeClass (org.graalvm.compiler.graph.NodeClass)3 NodeInfo (org.graalvm.compiler.nodeinfo.NodeInfo)3 AbstractMergeNode (org.graalvm.compiler.nodes.AbstractMergeNode)3 EndNode (org.graalvm.compiler.nodes.EndNode)3 FixedGuardNode (org.graalvm.compiler.nodes.FixedGuardNode)3 FixedNode (org.graalvm.compiler.nodes.FixedNode)3 FixedWithNextNode (org.graalvm.compiler.nodes.FixedWithNextNode)3 IfNode (org.graalvm.compiler.nodes.IfNode)3 ArrayList (java.util.ArrayList)2 List (java.util.List)2 EconomicSet (org.graalvm.collections.EconomicSet)2 Stamp (org.graalvm.compiler.core.common.type.Stamp)2 StampFactory (org.graalvm.compiler.core.common.type.StampFactory)2 BeginNode (org.graalvm.compiler.nodes.BeginNode)2