src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/IfNode.java
author dlong
Tue, 24 Sep 2019 12:47:15 -0400
changeset 58299 6df94ce3ab2f
parent 57537 ecc6e394475f
child 58533 46b0b7fe255c
permissions -rw-r--r--
8229201: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
     2
 * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 50330
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 50330
diff changeset
    24
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
package org.graalvm.compiler.nodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47667
diff changeset
    27
import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_1;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    29
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    30
import java.util.ArrayList;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    31
import java.util.Arrays;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import java.util.Iterator;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import java.util.List;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    34
import java.util.Objects;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
49873
26ebfe8ce852 8199755: Update Graal
dlong
parents: 48861
diff changeset
    36
import jdk.internal.vm.compiler.collections.EconomicMap;
26ebfe8ce852 8199755: Update Graal
dlong
parents: 48861
diff changeset
    37
import jdk.internal.vm.compiler.collections.Equivalence;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    38
import org.graalvm.compiler.bytecode.BytecodeDisassembler;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    39
import org.graalvm.compiler.bytecode.Bytecodes;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    40
import org.graalvm.compiler.bytecode.Bytes;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    41
import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.core.common.calc.Condition;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    43
import org.graalvm.compiler.core.common.type.FloatStamp;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.core.common.type.IntegerStamp;
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
    45
import org.graalvm.compiler.core.common.type.PrimitiveStamp;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import org.graalvm.compiler.core.common.type.Stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import org.graalvm.compiler.core.common.type.StampFactory;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
    48
import org.graalvm.compiler.debug.CounterKey;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    49
import org.graalvm.compiler.debug.DebugCloseable;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
    50
import org.graalvm.compiler.debug.DebugContext;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import org.graalvm.compiler.debug.GraalError;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
    52
import org.graalvm.compiler.graph.IterableNodeType;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
import org.graalvm.compiler.graph.Node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
import org.graalvm.compiler.graph.NodeClass;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    55
import org.graalvm.compiler.graph.NodeSourcePosition;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
import org.graalvm.compiler.graph.iterators.NodeIterable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
import org.graalvm.compiler.graph.spi.Canonicalizable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
import org.graalvm.compiler.graph.spi.Simplifiable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
import org.graalvm.compiler.graph.spi.SimplifierTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
import org.graalvm.compiler.nodeinfo.InputType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
import org.graalvm.compiler.nodeinfo.NodeInfo;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    62
import org.graalvm.compiler.nodes.calc.AddNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
import org.graalvm.compiler.nodes.calc.CompareNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
import org.graalvm.compiler.nodes.calc.ConditionalNode;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
    65
import org.graalvm.compiler.nodes.calc.FloatNormalizeCompareNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
import org.graalvm.compiler.nodes.calc.IntegerBelowNode;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    67
import org.graalvm.compiler.nodes.calc.IntegerEqualsNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
import org.graalvm.compiler.nodes.calc.IntegerLessThanNode;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
    69
import org.graalvm.compiler.nodes.calc.IntegerNormalizeCompareNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
import org.graalvm.compiler.nodes.calc.IsNullNode;
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
    71
import org.graalvm.compiler.nodes.calc.ObjectEqualsNode;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
    72
import org.graalvm.compiler.nodes.extended.UnboxNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
import org.graalvm.compiler.nodes.java.InstanceOfNode;
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
    74
import org.graalvm.compiler.nodes.java.LoadFieldNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
import org.graalvm.compiler.nodes.spi.LIRLowerable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
    77
import org.graalvm.compiler.nodes.spi.SwitchFoldable;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
import org.graalvm.compiler.nodes.util.GraphUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
    80
import jdk.vm.ci.code.CodeUtil;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
import jdk.vm.ci.meta.Constant;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
import jdk.vm.ci.meta.JavaConstant;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
import jdk.vm.ci.meta.JavaKind;
48398
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
    84
import jdk.vm.ci.meta.MetaAccessProvider;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
import jdk.vm.ci.meta.PrimitiveConstant;
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
    86
import jdk.vm.ci.meta.ResolvedJavaMethod;
48398
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
    87
import jdk.vm.ci.meta.ResolvedJavaType;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    88
import jdk.vm.ci.meta.TriState;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
 * The {@code IfNode} represents a branch that can go one of two directions depending on the outcome
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
 * of a comparison.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
 */
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47667
diff changeset
    94
@NodeInfo(cycles = CYCLES_1, size = SIZE_2, sizeRationale = "2 jmps")
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
    95
public final class IfNode extends ControlSplitNode implements Simplifiable, LIRLowerable, IterableNodeType, SwitchFoldable {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
    public static final NodeClass<IfNode> TYPE = NodeClass.create(IfNode.class);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
    98
    private static final int MAX_USAGE_COLOR_SET_SIZE = 64;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
    99
    private static final int MAX_FRAMESTATE_SEARCH_DEPTH = 4;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
   100
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   101
    private static final CounterKey CORRECTED_PROBABILITIES = DebugContext.counter("CorrectedProbabilities");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
    @Successor AbstractBeginNode trueSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
    @Successor AbstractBeginNode falseSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
    @Input(InputType.Condition) LogicNode condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
    protected double trueSuccessorProbability;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
    public LogicNode condition() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
        return condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
    public void setCondition(LogicNode x) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
        updateUsages(condition, x);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
        condition = x;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   117
    public IfNode(LogicNode condition, FixedNode trueSuccessor, FixedNode falseSuccessor, double trueSuccessorProbability) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
        this(condition, BeginNode.begin(trueSuccessor), BeginNode.begin(falseSuccessor), trueSuccessorProbability);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
    public IfNode(LogicNode condition, AbstractBeginNode trueSuccessor, AbstractBeginNode falseSuccessor, double trueSuccessorProbability) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
        super(TYPE, StampFactory.forVoid());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
        this.condition = condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
        this.falseSuccessor = falseSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
        this.trueSuccessor = trueSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
        setTrueSuccessorProbability(trueSuccessorProbability);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
     * Gets the true successor.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
     * @return the true successor
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
    public AbstractBeginNode trueSuccessor() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   135
        return trueSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
     * Gets the false successor.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
     * @return the false successor
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
    public AbstractBeginNode falseSuccessor() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
        return falseSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   147
    public double getTrueSuccessorProbability() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   148
        return this.trueSuccessorProbability;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   149
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   150
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   151
    public void setTrueSuccessor(AbstractBeginNode node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   152
        updatePredecessor(trueSuccessor, node);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   153
        trueSuccessor = node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   155
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   156
    public void setFalseSuccessor(AbstractBeginNode node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
        updatePredecessor(falseSuccessor, node);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
        falseSuccessor = node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   162
     * Gets the node corresponding to the specified outcome of the branch.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   163
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   164
     * @param istrue {@code true} if the true successor is requested, {@code false} otherwise
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   165
     * @return the corresponding successor
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
    public AbstractBeginNode successor(boolean istrue) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
        return istrue ? trueSuccessor : falseSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
    public void setTrueSuccessorProbability(double prob) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
        assert prob >= -0.000000001 && prob <= 1.000000001 : "Probability out of bounds: " + prob;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
        trueSuccessorProbability = Math.min(1.0, Math.max(0.0, prob));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   177
    public double probability(AbstractBeginNode successor) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
        return successor == trueSuccessor ? trueSuccessorProbability : 1 - trueSuccessorProbability;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   181
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   182
    public void generate(NodeLIRBuilderTool gen) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   183
        gen.emitIf(this);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   184
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   185
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   186
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   187
    public boolean verify() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   188
        assertTrue(condition() != null, "missing condition");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   189
        assertTrue(trueSuccessor() != null, "missing trueSuccessor");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   190
        assertTrue(falseSuccessor() != null, "missing falseSuccessor");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   191
        return super.verify();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   192
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   194
    private boolean compareCallContext(NodeSourcePosition successorPosition) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   195
        NodeSourcePosition position = getNodeSourcePosition();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   196
        NodeSourcePosition successor = successorPosition;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   197
        while (position != null) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   198
            assertTrue(Objects.equals(position.getMethod(), successor.getMethod()), "method mismatch");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   199
            position = position.getCaller();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   200
            successor = successor.getCaller();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   201
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   202
        assertTrue(successor == null, "successor position has more methods");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   203
        return true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   204
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   205
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   206
    @Override
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   207
    public boolean verifySourcePosition() {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   208
        NodeSourcePosition sourcePosition = getNodeSourcePosition();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   209
        assertTrue(sourcePosition != null, "missing IfNode source position");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   210
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   211
        NodeSourcePosition trueSuccessorPosition = trueSuccessor.getNodeSourcePosition();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   212
        assertTrue(trueSuccessorPosition != null, "missing IfNode true successor source position");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   213
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   214
        NodeSourcePosition falseSuccessorPosition = falseSuccessor.getNodeSourcePosition();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   215
        assertTrue(falseSuccessorPosition != null, "missing IfNode false successor source position");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   216
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   217
        int bci = sourcePosition.getBCI();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   218
        ResolvedJavaMethod method = sourcePosition.getMethod();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   219
        int bytecode = BytecodeDisassembler.getBytecodeAt(method, bci);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   220
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   221
        if (!Bytecodes.isIfBytecode(bytecode)) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   222
            return true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   223
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   224
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   225
        byte[] code = (new ResolvedJavaMethodBytecode(method)).getCode();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   226
        int targetBCI = bci + Bytes.beS2(code, bci + 1);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   227
        int nextBCI = bci + Bytecodes.lengthOf(bytecode);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   228
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   229
        // At least one successor should have the correct BCI to indicate any possible negation that
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   230
        // occurred after bytecode parsing
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   231
        boolean matchingSuccessorFound = false;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   232
        if (trueSuccessorPosition.getBCI() == nextBCI || trueSuccessorPosition.getBCI() == targetBCI) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   233
            assertTrue(compareCallContext(trueSuccessorPosition), "call context different from IfNode in trueSuccessor");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   234
            matchingSuccessorFound = true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   235
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   236
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   237
        if (falseSuccessorPosition.getBCI() == nextBCI || falseSuccessorPosition.getBCI() == targetBCI) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   238
            assertTrue(compareCallContext(falseSuccessorPosition), "call context different from IfNode in falseSuccessor");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   239
            matchingSuccessorFound = true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   240
        }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   241
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   242
        assertTrue(matchingSuccessorFound, "no matching successor position found in IfNode");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   243
        assertTrue(trueSuccessorPosition.getBCI() != falseSuccessorPosition.getBCI(), "successor positions same in IfNode");
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   244
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   245
        return true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   246
    }
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   247
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   248
    public void eliminateNegation() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   249
        AbstractBeginNode oldTrueSuccessor = trueSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   250
        AbstractBeginNode oldFalseSuccessor = falseSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   251
        trueSuccessor = oldFalseSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   252
        falseSuccessor = oldTrueSuccessor;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   253
        trueSuccessorProbability = 1 - trueSuccessorProbability;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
        setCondition(((LogicNegationNode) condition).getValue());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   255
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   256
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   257
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   258
    public void simplify(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
        if (trueSuccessor().next() instanceof DeoptimizeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   260
            if (trueSuccessorProbability != 0) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   261
                CORRECTED_PROBABILITIES.increment(getDebug());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
                trueSuccessorProbability = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   264
        } else if (falseSuccessor().next() instanceof DeoptimizeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   265
            if (trueSuccessorProbability != 1) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   266
                CORRECTED_PROBABILITIES.increment(getDebug());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   267
                trueSuccessorProbability = 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   268
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   271
        if (condition() instanceof LogicNegationNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   272
            eliminateNegation();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   273
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   274
        if (condition() instanceof LogicConstantNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   275
            LogicConstantNode c = (LogicConstantNode) condition();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
            if (c.getValue()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   277
                tool.deleteBranch(falseSuccessor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   278
                tool.addToWorkList(trueSuccessor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   279
                graph().removeSplit(this, trueSuccessor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   280
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
                tool.deleteBranch(trueSuccessor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
                tool.addToWorkList(falseSuccessor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
                graph().removeSplit(this, falseSuccessor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
            return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
        if (tool.allUsagesAvailable() && trueSuccessor().hasNoUsages() && falseSuccessor().hasNoUsages()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
            pushNodesThroughIf(tool);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   291
            if (checkForUnsignedCompare(tool) || removeOrMaterializeIf(tool)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   292
                return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   293
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
        if (removeIntermediateMaterialization(tool)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   297
            return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   298
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   299
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   300
        if (splitIfAtPhi(tool)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   301
            return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   302
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   303
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   304
        if (conditionalNodeOptimization(tool)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   305
            return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   306
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   307
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   308
        if (switchTransformationOptimization(tool)) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   309
            return;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   310
        }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   311
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   312
        if (falseSuccessor().hasNoUsages() && (!(falseSuccessor() instanceof LoopExitNode)) && falseSuccessor().next() instanceof IfNode &&
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   313
                        !(((IfNode) falseSuccessor().next()).falseSuccessor() instanceof LoopExitNode)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   314
            AbstractBeginNode intermediateBegin = falseSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   315
            IfNode nextIf = (IfNode) intermediateBegin.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   316
            double probabilityB = (1.0 - this.trueSuccessorProbability) * nextIf.trueSuccessorProbability;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   317
            if (this.trueSuccessorProbability < probabilityB) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   318
                // Reordering of those two if statements is beneficial from the point of view of
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   319
                // their probabilities.
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   320
                if (prepareForSwap(tool, condition(), nextIf.condition())) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   321
                    // Reordering is allowed from (if1 => begin => if2) to (if2 => begin => if1).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   322
                    assert intermediateBegin.next() == nextIf;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   323
                    AbstractBeginNode bothFalseBegin = nextIf.falseSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   324
                    nextIf.setFalseSuccessor(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   325
                    intermediateBegin.setNext(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   326
                    this.setFalseSuccessor(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   327
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   328
                    this.replaceAtPredecessor(nextIf);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   329
                    nextIf.setFalseSuccessor(intermediateBegin);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   330
                    intermediateBegin.setNext(this);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
                    this.setFalseSuccessor(bothFalseBegin);
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   332
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   333
                    NodeSourcePosition intermediateBeginPosition = intermediateBegin.getNodeSourcePosition();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   334
                    intermediateBegin.setNodeSourcePosition(bothFalseBegin.getNodeSourcePosition());
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   335
                    bothFalseBegin.setNodeSourcePosition(intermediateBeginPosition);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   336
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   337
                    nextIf.setTrueSuccessorProbability(probabilityB);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   338
                    if (probabilityB == 1.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   339
                        this.setTrueSuccessorProbability(0.0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   340
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   341
                        double newProbability = this.trueSuccessorProbability / (1.0 - probabilityB);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   342
                        this.setTrueSuccessorProbability(Math.min(1.0, newProbability));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   343
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   344
                    return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   345
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   346
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   347
        }
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   348
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   349
        if (tryEliminateBoxedReferenceEquals(tool)) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   350
            return;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   351
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   352
    }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   353
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
   354
    private static boolean isUnboxedFrom(MetaAccessProvider meta, NodeView view, ValueNode x, ValueNode src) {
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   355
        if (x == src) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   356
            return true;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   357
        } else if (x instanceof UnboxNode) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   358
            return isUnboxedFrom(meta, view, ((UnboxNode) x).getValue(), src);
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   359
        } else if (x instanceof PiNode) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   360
            PiNode pi = (PiNode) x;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   361
            return isUnboxedFrom(meta, view, pi.getOriginalNode(), src);
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   362
        } else if (x instanceof LoadFieldNode) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   363
            LoadFieldNode load = (LoadFieldNode) x;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   364
            ResolvedJavaType integerType = meta.lookupJavaType(Integer.class);
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   365
            if (load.getValue().stamp(view).javaType(meta).equals(integerType)) {
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   366
                return isUnboxedFrom(meta, view, load.getValue(), src);
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   367
            } else {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   368
                return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   369
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   370
        } else {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   371
            return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   372
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   373
    }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   374
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   375
    /**
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   376
     * Attempts to replace the following pattern:
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   377
     *
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   378
     * <pre>
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   379
     * Integer x = ...;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   380
     * Integer y = ...;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   381
     * if ((x == y) || x.equals(y)) { ... }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   382
     * </pre>
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   383
     *
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   384
     * with:
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   385
     *
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   386
     * <pre>
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   387
     * Integer x = ...;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   388
     * Integer y = ...;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   389
     * if (x.equals(y)) { ... }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   390
     * </pre>
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   391
     *
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   392
     * whenever the probability that the reference check will pass is relatively small.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   393
     *
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   394
     * See GR-1315 for more information.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   395
     */
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   396
    private boolean tryEliminateBoxedReferenceEquals(SimplifierTool tool) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   397
        if (!(condition instanceof ObjectEqualsNode)) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   398
            return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   399
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   400
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   401
        MetaAccessProvider meta = tool.getMetaAccess();
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   402
        ObjectEqualsNode equalsCondition = (ObjectEqualsNode) condition;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   403
        ValueNode x = equalsCondition.getX();
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   404
        ValueNode y = equalsCondition.getY();
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   405
        ResolvedJavaType integerType = meta.lookupJavaType(Integer.class);
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   406
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   407
        // At least one argument for reference equal must be a boxed primitive.
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   408
        NodeView view = NodeView.from(tool);
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   409
        if (!x.stamp(view).javaType(meta).equals(integerType) && !y.stamp(view).javaType(meta).equals(integerType)) {
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   410
            return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   411
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   412
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   413
        // The reference equality check is usually more efficient compared to a boxing check.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   414
        // The success of the reference equals must therefore be relatively rare, otherwise it makes
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   415
        // no sense to eliminate it.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   416
        if (getTrueSuccessorProbability() > 0.4) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   417
            return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   418
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   419
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   420
        // True branch must be empty.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   421
        if (trueSuccessor instanceof BeginNode || trueSuccessor instanceof LoopExitNode) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   422
            if (trueSuccessor.next() instanceof EndNode) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   423
                // Empty true branch.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   424
            } else {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   425
                return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   426
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   427
        } else {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   428
            return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   429
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   430
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   431
        // False branch must only check the unboxed values.
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   432
        UnboxNode unbox = null;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   433
        FixedGuardNode unboxCheck = null;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   434
        for (FixedNode node : falseSuccessor.getBlockNodes()) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   435
            if (!(node instanceof BeginNode || node instanceof UnboxNode || node instanceof FixedGuardNode || node instanceof EndNode ||
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   436
                            node instanceof LoadFieldNode || node instanceof LoopExitNode)) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   437
                return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   438
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   439
            if (node instanceof UnboxNode) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   440
                if (unbox == null) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   441
                    unbox = (UnboxNode) node;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   442
                } else {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   443
                    return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   444
                }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   445
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   446
            if (!(node instanceof FixedGuardNode)) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   447
                continue;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   448
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   449
            FixedGuardNode fixed = (FixedGuardNode) node;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   450
            if (!(fixed.condition() instanceof IntegerEqualsNode)) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   451
                continue;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   452
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   453
            IntegerEqualsNode equals = (IntegerEqualsNode) fixed.condition();
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   454
            if ((isUnboxedFrom(meta, view, equals.getX(), x) && isUnboxedFrom(meta, view, equals.getY(), y)) ||
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   455
                            (isUnboxedFrom(meta, view, equals.getX(), y) && isUnboxedFrom(meta, view, equals.getY(), x))) {
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   456
                unboxCheck = fixed;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   457
            }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   458
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   459
        if (unbox == null || unboxCheck == null) {
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   460
            return false;
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   461
        }
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   462
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   463
        // Falsify the reference check.
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47667
diff changeset
   464
        setCondition(graph().addOrUniqueWithInputs(LogicConstantNode.contradiction()));
47667
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   465
390896759aa2 8187438: Update Graal
dlong
parents: 47216
diff changeset
   466
        return true;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   467
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   468
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   469
    // SwitchFoldable implementation.
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   470
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   471
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   472
    public Node getNextSwitchFoldableBranch() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   473
        return falseSuccessor();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   474
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   475
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   476
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   477
    public boolean isInSwitch(ValueNode switchValue) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   478
        return SwitchFoldable.maybeIsInSwitch(condition()) && SwitchFoldable.sameSwitchValue(condition(), switchValue);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   479
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   480
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   481
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   482
    public void cutOffCascadeNode() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   483
        setTrueSuccessor(null);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   484
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   485
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   486
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   487
    public void cutOffLowestCascadeNode() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   488
        setFalseSuccessor(null);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   489
        setTrueSuccessor(null);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   490
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   491
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   492
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   493
    public AbstractBeginNode getDefault() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   494
        return falseSuccessor();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   495
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   496
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   497
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   498
    public ValueNode switchValue() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   499
        if (SwitchFoldable.maybeIsInSwitch(condition())) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   500
            return ((IntegerEqualsNode) condition()).getX();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   501
        }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   502
        return null;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   503
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   504
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   505
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   506
    public boolean isNonInitializedProfile() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   507
        return getTrueSuccessorProbability() == 0.5d;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   508
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   509
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   510
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   511
    public int intKeyAt(int i) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   512
        assert i == 0;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   513
        return ((IntegerEqualsNode) condition()).getY().asJavaConstant().asInt();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   514
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   515
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   516
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   517
    public double keyProbability(int i) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   518
        assert i == 0;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   519
        return getTrueSuccessorProbability();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   520
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   521
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   522
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   523
    public AbstractBeginNode keySuccessor(int i) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   524
        assert i == 0;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   525
        return trueSuccessor();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   526
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   527
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   528
    @Override
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   529
    public double defaultProbability() {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   530
        return 1.0d - getTrueSuccessorProbability();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   531
    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   532
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   533
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   534
     * Try to optimize this as if it were a {@link ConditionalNode}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   535
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   536
    private boolean conditionalNodeOptimization(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   537
        if (trueSuccessor().next() instanceof AbstractEndNode && falseSuccessor().next() instanceof AbstractEndNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   538
            AbstractEndNode trueEnd = (AbstractEndNode) trueSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   539
            AbstractEndNode falseEnd = (AbstractEndNode) falseSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   540
            if (trueEnd.merge() != falseEnd.merge()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   541
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   542
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   543
            if (!(trueEnd.merge() instanceof MergeNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   544
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   545
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   546
            MergeNode merge = (MergeNode) trueEnd.merge();
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   547
            if (!merge.hasExactlyOneUsage() || merge.phis().count() != 1) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   548
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   549
            }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   550
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   551
            if (trueSuccessor().anchored().isNotEmpty() || falseSuccessor().anchored().isNotEmpty()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   552
                return false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   553
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   554
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   555
            PhiNode phi = merge.phis().first();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   556
            ValueNode falseValue = phi.valueAt(falseEnd);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   557
            ValueNode trueValue = phi.valueAt(trueEnd);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   558
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   559
            NodeView view = NodeView.from(tool);
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   560
            ValueNode result = ConditionalNode.canonicalizeConditional(condition, trueValue, falseValue, phi.stamp(view), view);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   561
            if (result != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   562
                /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   563
                 * canonicalizeConditional returns possibly new nodes so add them to the graph.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   564
                 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   565
                if (result.graph() == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   566
                    result = graph().addOrUniqueWithInputs(result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   567
                }
48398
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   568
                result = proxyReplacement(result);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   569
                /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   570
                 * This optimization can be performed even if multiple values merge at this phi
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   571
                 * since the two inputs get simplified into one.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   572
                 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   573
                phi.setValueAt(trueEnd, result);
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
   574
                removeThroughFalseBranch(tool, merge);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   575
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   576
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   577
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   578
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   579
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   580
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   581
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   582
    private void pushNodesThroughIf(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   583
        assert trueSuccessor().hasNoUsages() && falseSuccessor().hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   584
        // push similar nodes upwards through the if, thereby deduplicating them
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   585
        do {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   586
            AbstractBeginNode trueSucc = trueSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   587
            AbstractBeginNode falseSucc = falseSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   588
            if (trueSucc instanceof BeginNode && falseSucc instanceof BeginNode && trueSucc.next() instanceof FixedWithNextNode && falseSucc.next() instanceof FixedWithNextNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   589
                FixedWithNextNode trueNext = (FixedWithNextNode) trueSucc.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   590
                FixedWithNextNode falseNext = (FixedWithNextNode) falseSucc.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   591
                NodeClass<?> nodeClass = trueNext.getNodeClass();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   592
                if (trueNext.getClass() == falseNext.getClass()) {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   593
                    if (trueNext instanceof AbstractBeginNode) {
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   594
                        // Cannot do this optimization for begin nodes, because it could
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   595
                        // move guards above the if that need to stay below a branch.
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   596
                    } else if (nodeClass.equalInputs(trueNext, falseNext) && trueNext.valueEquals(falseNext)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   597
                        falseNext.replaceAtUsages(trueNext);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   598
                        graph().removeFixed(falseNext);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   599
                        GraphUtil.unlinkFixedNode(trueNext);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   600
                        graph().addBeforeFixed(this, trueNext);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   601
                        for (Node usage : trueNext.usages().snapshot()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   602
                            if (usage.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   603
                                NodeClass<?> usageNodeClass = usage.getNodeClass();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   604
                                if (usageNodeClass.valueNumberable() && !usageNodeClass.isLeafNode()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   605
                                    Node newNode = graph().findDuplicate(usage);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   606
                                    if (newNode != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   607
                                        usage.replaceAtUsagesAndDelete(newNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   608
                                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   609
                                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   610
                                if (usage.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   611
                                    tool.addToWorkList(usage);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   612
                                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   613
                            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   614
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   615
                        continue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   616
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   617
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   618
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   619
            break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   620
        } while (true);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   621
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   622
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   623
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   624
     * Recognize a couple patterns that can be merged into an unsigned compare.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   625
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   626
     * @param tool
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   627
     * @return true if a replacement was done.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   628
     */
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   629
    @SuppressWarnings("try")
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   630
    private boolean checkForUnsignedCompare(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   631
        assert trueSuccessor().hasNoUsages() && falseSuccessor().hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   632
        if (condition() instanceof IntegerLessThanNode) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   633
            NodeView view = NodeView.from(tool);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   634
            IntegerLessThanNode lessThan = (IntegerLessThanNode) condition();
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   635
            Constant y = lessThan.getY().stamp(view).asConstant();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   636
            if (y instanceof PrimitiveConstant && ((PrimitiveConstant) y).asLong() == 0 && falseSuccessor().next() instanceof IfNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   637
                IfNode ifNode2 = (IfNode) falseSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   638
                if (ifNode2.condition() instanceof IntegerLessThanNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   639
                    IntegerLessThanNode lessThan2 = (IntegerLessThanNode) ifNode2.condition();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   640
                    AbstractBeginNode falseSucc = ifNode2.falseSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   641
                    AbstractBeginNode trueSucc = ifNode2.trueSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   642
                    IntegerBelowNode below = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   643
                    /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   644
                     * Convert x >= 0 && x < positive which is represented as !(x < 0) && x <
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   645
                     * <positive> into an unsigned compare.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   646
                     */
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   647
                    if (lessThan2.getX() == lessThan.getX() && lessThan2.getY().stamp(view) instanceof IntegerStamp &&
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   648
                                    ((IntegerStamp) lessThan2.getY().stamp(view)).isPositive() &&
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   649
                                    sameDestination(trueSuccessor(), ifNode2.falseSuccessor)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   650
                        below = graph().unique(new IntegerBelowNode(lessThan2.getX(), lessThan2.getY()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   651
                        // swap direction
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   652
                        AbstractBeginNode tmp = falseSucc;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   653
                        falseSucc = trueSucc;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   654
                        trueSucc = tmp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   655
                    } else if (lessThan2.getY() == lessThan.getX() && sameDestination(trueSuccessor(), ifNode2.trueSuccessor)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   656
                        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   657
                         * Convert x >= 0 && x <= positive which is represented as !(x < 0) &&
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   658
                         * !(<positive> > x), into x <| positive + 1. This can only be done for
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   659
                         * constants since there isn't a IntegerBelowEqualThanNode but that doesn't
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   660
                         * appear to be interesting.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   661
                         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   662
                        JavaConstant positive = lessThan2.getX().asJavaConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   663
                        if (positive != null && positive.asLong() > 0 && positive.asLong() < positive.getJavaKind().getMaxValue()) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   664
                            ConstantNode newLimit = ConstantNode.forIntegerStamp(lessThan2.getX().stamp(view), positive.asLong() + 1, graph());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   665
                            below = graph().unique(new IntegerBelowNode(lessThan.getX(), newLimit));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   666
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   667
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   668
                    if (below != null) {
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   669
                        try (DebugCloseable position = ifNode2.withNodeSourcePosition()) {
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   670
                            ifNode2.setTrueSuccessor(null);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   671
                            ifNode2.setFalseSuccessor(null);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   672
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   673
                            IfNode newIfNode = graph().add(new IfNode(below, falseSucc, trueSucc, 1 - trueSuccessorProbability));
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   674
                            // Remove the < 0 test.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   675
                            tool.deleteBranch(trueSuccessor);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   676
                            graph().removeSplit(this, falseSuccessor);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   677
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   678
                            // Replace the second test with the new one.
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   679
                            ifNode2.predecessor().replaceFirstSuccessor(ifNode2, newIfNode);
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   680
                            ifNode2.safeDelete();
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   681
                            return true;
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
   682
                        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   683
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   684
                }
57537
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   685
            } else if (y instanceof PrimitiveConstant && ((PrimitiveConstant) y).asLong() < 0 && falseSuccessor().next() instanceof IfNode) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   686
                IfNode ifNode2 = (IfNode) falseSuccessor().next();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   687
                AbstractBeginNode falseSucc = ifNode2.falseSuccessor();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   688
                AbstractBeginNode trueSucc = ifNode2.trueSuccessor();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   689
                IntegerBelowNode below = null;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   690
                if (ifNode2.condition() instanceof IntegerLessThanNode) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   691
                    ValueNode x = lessThan.getX();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   692
                    IntegerLessThanNode lessThan2 = (IntegerLessThanNode) ifNode2.condition();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   693
                    /*
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   694
                     * Convert x >= -C1 && x < C2, represented as !(x < -C1) && x < C2, into an
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   695
                     * unsigned compare. This condition is equivalent to x + C1 |<| C1 + C2 if C1 +
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   696
                     * C2 does not overflow.
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   697
                     */
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   698
                    Constant c2 = lessThan2.getY().stamp(view).asConstant();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   699
                    if (lessThan2.getX() == x && c2 instanceof PrimitiveConstant && ((PrimitiveConstant) c2).asLong() > 0 &&
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   700
                                    x.stamp(view).isCompatible(lessThan.getY().stamp(view)) &&
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   701
                                    x.stamp(view).isCompatible(lessThan2.getY().stamp(view)) &&
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   702
                                    sameDestination(trueSuccessor(), ifNode2.falseSuccessor)) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   703
                        long newLimitValue = -((PrimitiveConstant) y).asLong() + ((PrimitiveConstant) c2).asLong();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   704
                        // Make sure the limit fits into the target type without overflow.
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   705
                        if (newLimitValue > 0 && newLimitValue <= CodeUtil.maxValue(PrimitiveStamp.getBits(x.stamp(view)))) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   706
                            ConstantNode newLimit = ConstantNode.forIntegerStamp(x.stamp(view), newLimitValue, graph());
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   707
                            ConstantNode c1 = ConstantNode.forIntegerStamp(x.stamp(view), -((PrimitiveConstant) y).asLong(), graph());
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   708
                            ValueNode addNode = graph().addOrUniqueWithInputs(AddNode.create(x, c1, view));
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   709
                            below = graph().unique(new IntegerBelowNode(addNode, newLimit));
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   710
                        }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   711
                    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   712
                }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   713
                if (below != null) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   714
                    try (DebugCloseable position = ifNode2.withNodeSourcePosition()) {
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   715
                        ifNode2.setTrueSuccessor(null);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   716
                        ifNode2.setFalseSuccessor(null);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   717
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   718
                        IfNode newIfNode = graph().add(new IfNode(below, trueSucc, falseSucc, trueSuccessorProbability));
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   719
                        // Remove the < -C1 test.
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   720
                        tool.deleteBranch(trueSuccessor);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   721
                        graph().removeSplit(this, falseSuccessor);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   722
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   723
                        // Replace the second test with the new one.
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   724
                        ifNode2.predecessor().replaceFirstSuccessor(ifNode2, newIfNode);
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   725
                        ifNode2.safeDelete();
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   726
                        return true;
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   727
                    }
ecc6e394475f 8226771: Update Graal
dlong
parents: 55509
diff changeset
   728
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   729
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   730
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   731
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   732
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   733
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   734
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   735
     * Check it these two blocks end up at the same place. Meeting at the same merge, or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   736
     * deoptimizing in the same way.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   737
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   738
    private static boolean sameDestination(AbstractBeginNode succ1, AbstractBeginNode succ2) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   739
        Node next1 = succ1.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   740
        Node next2 = succ2.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   741
        if (next1 instanceof EndNode && next2 instanceof EndNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   742
            EndNode end1 = (EndNode) next1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   743
            EndNode end2 = (EndNode) next2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   744
            if (end1.merge() == end2.merge()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   745
                for (PhiNode phi : end1.merge().phis()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   746
                    if (phi.valueAt(end1) != phi.valueAt(end2)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   747
                        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   748
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   749
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   750
                // They go to the same MergeNode and merge the same values
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   751
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   752
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   753
        } else if (next1 instanceof DeoptimizeNode && next2 instanceof DeoptimizeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   754
            DeoptimizeNode deopt1 = (DeoptimizeNode) next1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   755
            DeoptimizeNode deopt2 = (DeoptimizeNode) next2;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48398
diff changeset
   756
            if (deopt1.getReason() == deopt2.getReason() && deopt1.getAction() == deopt2.getAction()) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   757
                // Same deoptimization reason and action.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   758
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   759
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   760
        } else if (next1 instanceof LoopExitNode && next2 instanceof LoopExitNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   761
            LoopExitNode exit1 = (LoopExitNode) next1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   762
            LoopExitNode exit2 = (LoopExitNode) next2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   763
            if (exit1.loopBegin() == exit2.loopBegin() && exit1.stateAfter() == exit2.stateAfter() && exit1.stateAfter() == null && sameDestination(exit1, exit2)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   764
                // Exit the same loop and end up at the same place.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   765
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   766
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   767
        } else if (next1 instanceof ReturnNode && next2 instanceof ReturnNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   768
            ReturnNode exit1 = (ReturnNode) next1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   769
            ReturnNode exit2 = (ReturnNode) next2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   770
            if (exit1.result() == exit2.result()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   771
                // Exit the same loop and end up at the same place.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   772
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   773
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   774
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   775
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   776
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   777
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   778
    private static boolean prepareForSwap(SimplifierTool tool, LogicNode a, LogicNode b) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   779
        DebugContext debug = a.getDebug();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   780
        if (a instanceof InstanceOfNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   781
            InstanceOfNode instanceOfA = (InstanceOfNode) a;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   782
            if (b instanceof IsNullNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   783
                IsNullNode isNullNode = (IsNullNode) b;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   784
                if (isNullNode.getValue() == instanceOfA.getValue()) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   785
                    debug.log("Can swap instanceof and isnull if");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   786
                    return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   787
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   788
            } else if (b instanceof InstanceOfNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   789
                InstanceOfNode instanceOfB = (InstanceOfNode) b;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   790
                if (instanceOfA.getValue() == instanceOfB.getValue() && !instanceOfA.type().getType().isInterface() && !instanceOfB.type().getType().isInterface() &&
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   791
                                !instanceOfA.type().getType().isAssignableFrom(instanceOfB.type().getType()) && !instanceOfB.type().getType().isAssignableFrom(instanceOfA.type().getType())) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   792
                    // Two instanceof on the same value with mutually exclusive types.
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   793
                    debug.log("Can swap instanceof for types %s and %s", instanceOfA.type(), instanceOfB.type());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   794
                    return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   795
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   796
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   797
        } else if (a instanceof CompareNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   798
            CompareNode compareA = (CompareNode) a;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48398
diff changeset
   799
            Condition conditionA = compareA.condition().asCondition();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   800
            if (compareA.unorderedIsTrue()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   801
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   802
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   803
            if (b instanceof CompareNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   804
                CompareNode compareB = (CompareNode) b;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   805
                if (compareA == compareB) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   806
                    debug.log("Same conditions => do not swap and leave the work for global value numbering.");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   807
                    return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   808
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   809
                if (compareB.unorderedIsTrue()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   810
                    return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   811
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   812
                Condition comparableCondition = null;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48398
diff changeset
   813
                Condition conditionB = compareB.condition().asCondition();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   814
                if (compareB.getX() == compareA.getX() && compareB.getY() == compareA.getY()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   815
                    comparableCondition = conditionB;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   816
                } else if (compareB.getX() == compareA.getY() && compareB.getY() == compareA.getX()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   817
                    comparableCondition = conditionB.mirror();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   818
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   819
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   820
                if (comparableCondition != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   821
                    Condition combined = conditionA.join(comparableCondition);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   822
                    if (combined == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   823
                        // The two conditions are disjoint => can reorder.
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   824
                        debug.log("Can swap disjoint coditions on same values: %s and %s", conditionA, comparableCondition);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   825
                        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   826
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   827
                } else if (conditionA == Condition.EQ && conditionB == Condition.EQ) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   828
                    boolean canSwap = false;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   829
                    if ((compareA.getX() == compareB.getX() && valuesDistinct(tool, compareA.getY(), compareB.getY()))) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   830
                        canSwap = true;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   831
                    } else if ((compareA.getX() == compareB.getY() && valuesDistinct(tool, compareA.getY(), compareB.getX()))) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   832
                        canSwap = true;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   833
                    } else if ((compareA.getY() == compareB.getX() && valuesDistinct(tool, compareA.getX(), compareB.getY()))) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   834
                        canSwap = true;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   835
                    } else if ((compareA.getY() == compareB.getY() && valuesDistinct(tool, compareA.getX(), compareB.getX()))) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   836
                        canSwap = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   837
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   838
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   839
                    if (canSwap) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46459
diff changeset
   840
                        debug.log("Can swap equality condition with one shared and one disjoint value.");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   841
                        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   842
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   843
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   844
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   845
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   846
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   847
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   848
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   849
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   850
    private static boolean valuesDistinct(SimplifierTool tool, ValueNode a, ValueNode b) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   851
        if (a.isConstant() && b.isConstant()) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   852
            Boolean equal = tool.getConstantReflection().constantEquals(a.asConstant(), b.asConstant());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   853
            if (equal != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   854
                return !equal.booleanValue();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   855
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   856
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   857
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   858
        NodeView view = NodeView.from(tool);
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   859
        Stamp stampA = a.stamp(view);
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   860
        Stamp stampB = b.stamp(view);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   861
        return stampA.alwaysDistinct(stampB);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   862
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   863
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   864
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   865
     * Tries to remove an empty if construct or replace an if construct with a materialization.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   866
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   867
     * @return true if a transformation was made, false otherwise
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   868
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   869
    private boolean removeOrMaterializeIf(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   870
        assert trueSuccessor().hasNoUsages() && falseSuccessor().hasNoUsages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   871
        if (trueSuccessor().next() instanceof AbstractEndNode && falseSuccessor().next() instanceof AbstractEndNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   872
            AbstractEndNode trueEnd = (AbstractEndNode) trueSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   873
            AbstractEndNode falseEnd = (AbstractEndNode) falseSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   874
            AbstractMergeNode merge = trueEnd.merge();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   875
            if (merge == falseEnd.merge() && trueSuccessor().anchored().isEmpty() && falseSuccessor().anchored().isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   876
                PhiNode singlePhi = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   877
                int distinct = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   878
                for (PhiNode phi : merge.phis()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   879
                    ValueNode trueValue = phi.valueAt(trueEnd);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   880
                    ValueNode falseValue = phi.valueAt(falseEnd);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   881
                    if (trueValue != falseValue) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   882
                        distinct++;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   883
                        singlePhi = phi;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   884
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   885
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   886
                if (distinct == 0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   887
                    /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   888
                     * Multiple phis but merging same values for true and false, so simply delete
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   889
                     * the path
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   890
                     */
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
   891
                    removeThroughFalseBranch(tool, merge);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   892
                    return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   893
                } else if (distinct == 1) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   894
                    // Fortify: Suppress Null Dereference false positive
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   895
                    assert singlePhi != null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   896
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   897
                    ValueNode trueValue = singlePhi.valueAt(trueEnd);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   898
                    ValueNode falseValue = singlePhi.valueAt(falseEnd);
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   899
                    ValueNode conditional = canonicalizeConditionalCascade(tool, trueValue, falseValue);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   900
                    if (conditional != null) {
48398
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   901
                        conditional = proxyReplacement(conditional);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   902
                        singlePhi.setValueAt(trueEnd, conditional);
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
   903
                        removeThroughFalseBranch(tool, merge);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   904
                        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   905
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   906
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   907
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   908
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   909
        if (trueSuccessor().next() instanceof ReturnNode && falseSuccessor().next() instanceof ReturnNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   910
            ReturnNode trueEnd = (ReturnNode) trueSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   911
            ReturnNode falseEnd = (ReturnNode) falseSuccessor().next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   912
            ValueNode trueValue = trueEnd.result();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   913
            ValueNode falseValue = falseEnd.result();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   914
            ValueNode value = null;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   915
            boolean needsProxy = false;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   916
            if (trueValue != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   917
                if (trueValue == falseValue) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   918
                    value = trueValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   919
                } else {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
   920
                    value = canonicalizeConditionalCascade(tool, trueValue, falseValue);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   921
                    if (value == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   922
                        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   923
                    }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   924
                    needsProxy = true;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   925
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   926
            }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   927
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   928
            if (trueSuccessor() instanceof LoopExitNode) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   929
                LoopBeginNode loopBegin = ((LoopExitNode) trueSuccessor()).loopBegin();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   930
                assert loopBegin == ((LoopExitNode) falseSuccessor()).loopBegin();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   931
                LoopExitNode loopExitNode = graph().add(new LoopExitNode(loopBegin));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   932
                graph().addBeforeFixed(this, loopExitNode);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   933
                if (graph().hasValueProxies() && needsProxy) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   934
                    value = graph().addOrUnique(new ValueProxyNode(value, loopExitNode));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   935
                }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   936
            }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   937
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   938
            ReturnNode newReturn = graph().add(new ReturnNode(value));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   939
            replaceAtPredecessor(newReturn);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   940
            GraphUtil.killCFG(this);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   941
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   942
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   943
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   944
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   945
48398
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   946
    private ValueNode proxyReplacement(ValueNode replacement) {
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   947
        /*
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   948
         * Special case: Every empty diamond we collapse to a conditional node can potentially
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   949
         * contain loop exit nodes on both branches. See the graph below: The two loop exits
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   950
         * (instanceof begin node) exit the same loop. The resulting phi is defined outside the
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   951
         * loop, but the resulting conditional node will be inside the loop, so we need to proxy the
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   952
         * resulting conditional node. Callers of this method ensure that true and false successor
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   953
         * have no usages, therefore a and b in the graph below can never be proxies themselves.
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   954
         */
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   955
        // @formatter:off
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   956
        //              +--+
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   957
        //              |If|
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   958
        //              +--+      +-----+ +-----+
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   959
        //         +----+  +----+ |  a  | |  b  |
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   960
        //         |Lex |  |Lex | +----^+ +^----+
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   961
        //         +----+  +----+      |   |
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   962
        //           +-------+         +---+
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   963
        //           | Merge +---------+Phi|
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   964
        //           +-------+         +---+
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   965
        // @formatter:on
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   966
        if (this.graph().hasValueProxies()) {
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   967
            if (trueSuccessor instanceof LoopExitNode && falseSuccessor instanceof LoopExitNode) {
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   968
                assert ((LoopExitNode) trueSuccessor).loopBegin() == ((LoopExitNode) falseSuccessor).loopBegin();
51436
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   969
                /*
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   970
                 * we can collapse all proxy nodes on one loop exit, the surviving one, which will
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   971
                 * be the true successor
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   972
                 */
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   973
                if (falseSuccessor.anchored().isEmpty() && falseSuccessor.hasUsages()) {
51436
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   974
                    for (Node n : falseSuccessor.usages().snapshot()) {
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   975
                        assert n instanceof ProxyNode;
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   976
                        ((ProxyNode) n).setProxyPoint((LoopExitNode) trueSuccessor);
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   977
                    }
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   978
                }
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   979
                /*
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   980
                 * The true successor (surviving loop exit) can have usages, namely proxy nodes, the
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   981
                 * false successor however, must not have usages any more after the code above
091c0d22e735 8206992: Update Graal
iveresov
parents: 50858
diff changeset
   982
                 */
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   983
                assert trueSuccessor.anchored().isEmpty() && falseSuccessor.hasNoUsages();
48398
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   984
                return this.graph().addOrUnique(new ValueProxyNode(replacement, (LoopExitNode) trueSuccessor));
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   985
            }
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   986
        }
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   987
        return replacement;
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   988
    }
79afa4c434f6 8193439: Update Graal
iveresov
parents: 48190
diff changeset
   989
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
   990
    protected void removeThroughFalseBranch(SimplifierTool tool, AbstractMergeNode merge) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   991
        AbstractBeginNode trueBegin = trueSuccessor();
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47667
diff changeset
   992
        LogicNode conditionNode = condition();
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
   993
        graph().removeSplitPropagate(this, trueBegin);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   994
        tool.addToWorkList(trueBegin);
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47667
diff changeset
   995
        if (conditionNode != null) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47667
diff changeset
   996
            GraphUtil.tryKillUnused(conditionNode);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   997
        }
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
   998
        if (merge.isAlive() && merge.forwardEndCount() > 1) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
   999
            for (FixedNode end : merge.forwardEnds()) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1000
                Node cur = end;
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1001
                while (cur != null && cur.predecessor() instanceof BeginNode) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1002
                    cur = cur.predecessor();
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1003
                }
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1004
                if (cur != null && cur.predecessor() instanceof IfNode) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1005
                    tool.addToWorkList(cur.predecessor());
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1006
                }
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1007
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1008
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1009
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1010
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1011
    private ValueNode canonicalizeConditionalViaImplies(ValueNode trueValue, ValueNode falseValue) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1012
        ValueNode collapsedTrue = trueValue;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1013
        ValueNode collapsedFalse = falseValue;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1014
        boolean simplify = false;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1015
        if (trueValue instanceof ConditionalNode) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1016
            TriState result = condition().implies(false, ((ConditionalNode) trueValue).condition());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1017
            if (result.isKnown()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1018
                simplify = true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1019
                collapsedTrue = result.toBoolean() ? ((ConditionalNode) trueValue).trueValue() : ((ConditionalNode) trueValue).falseValue();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1020
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1021
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1022
        if (falseValue instanceof ConditionalNode) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1023
            TriState result = condition().implies(true, ((ConditionalNode) falseValue).condition());
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1024
            if (result.isKnown()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1025
                simplify = true;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1026
                collapsedFalse = result.toBoolean() ? ((ConditionalNode) falseValue).trueValue() : ((ConditionalNode) falseValue).falseValue();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1027
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1028
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1029
        if (simplify) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1030
            return graph().unique(new ConditionalNode(condition(), collapsedTrue, collapsedFalse));
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1031
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1032
        return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1033
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1034
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
  1035
    private ValueNode canonicalizeConditionalCascade(SimplifierTool tool, ValueNode trueValue, ValueNode falseValue) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1036
        if (trueValue.getStackKind() != falseValue.getStackKind()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1037
            return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1038
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1039
        if (trueValue.getStackKind() != JavaKind.Int && trueValue.getStackKind() != JavaKind.Long) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1040
            return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1041
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1042
        if (trueValue.isConstant() && falseValue.isConstant()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1043
            return graph().unique(new ConditionalNode(condition(), trueValue, falseValue));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1044
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1045
        ValueNode value = canonicalizeConditionalViaImplies(trueValue, falseValue);
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1046
        if (value != null) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1047
            return value;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1048
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1049
        if (!graph().isAfterExpandLogic()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1050
            /*
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1051
             * !isAfterExpandLogic() => Cannot spawn NormalizeCompareNodes after lowering in the
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1052
             * ExpandLogicPhase.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1053
             */
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1054
            ConditionalNode conditional = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1055
            ValueNode constant = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1056
            boolean negateCondition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1057
            if (trueValue instanceof ConditionalNode && falseValue.isConstant()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1058
                conditional = (ConditionalNode) trueValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1059
                constant = falseValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1060
                negateCondition = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1061
            } else if (falseValue instanceof ConditionalNode && trueValue.isConstant()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1062
                conditional = (ConditionalNode) falseValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1063
                constant = trueValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1064
                negateCondition = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1065
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1066
                return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1067
            }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1068
            boolean negateConditionalCondition = false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1069
            ValueNode otherValue = null;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1070
            if (constant == conditional.trueValue()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1071
                otherValue = conditional.falseValue();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1072
                negateConditionalCondition = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1073
            } else if (constant == conditional.falseValue()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1074
                otherValue = conditional.trueValue();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1075
                negateConditionalCondition = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1076
            }
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1077
            if (otherValue != null && otherValue.isConstant()) {
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1078
                double shortCutProbability = probability(trueSuccessor());
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1079
                LogicNode newCondition = LogicNode.or(condition(), negateCondition, conditional.condition(), negateConditionalCondition, shortCutProbability);
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1080
                return graph().unique(new ConditionalNode(newCondition, constant, otherValue));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1081
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1082
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1083
            if (constant.isJavaConstant() && conditional.trueValue().isJavaConstant() && conditional.falseValue().isJavaConstant() && condition() instanceof CompareNode &&
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1084
                            conditional.condition() instanceof CompareNode) {
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1085
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1086
                CompareNode condition1 = (CompareNode) condition();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1087
                Condition cond1 = condition1.condition().asCondition();
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1088
                if (negateCondition) {
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1089
                    cond1 = cond1.negate();
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1090
                }
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1091
                // cond1 is EQ, NE, LT, or GE
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1092
                CompareNode condition2 = (CompareNode) conditional.condition();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1093
                Condition cond2 = condition2.condition().asCondition();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1094
                ValueNode x = condition1.getX();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1095
                ValueNode y = condition1.getY();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1096
                ValueNode x2 = condition2.getX();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1097
                ValueNode y2 = condition2.getY();
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1098
                // `x cond1 y ? c1 : (x2 cond2 y2 ? c2 : c3)`
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1099
                boolean sameVars = x == x2 && y == y2;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1100
                if (!sameVars && x == y2 && y == x2) {
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1101
                    sameVars = true;
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1102
                    cond2 = cond2.mirror();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1103
                }
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1104
                if (sameVars) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1105
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1106
                    JavaKind stackKind = conditional.trueValue().stamp(NodeView.from(tool)).getStackKind();
7dd81e82d083 8210777: Update Graal
dlong
parents: 51436
diff changeset
  1107
                    assert !stackKind.isNumericFloat();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1108
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1109
                    long c1 = constant.asJavaConstant().asLong();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1110
                    long c2 = conditional.trueValue().asJavaConstant().asLong();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1111
                    long c3 = conditional.falseValue().asJavaConstant().asLong();
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1112
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1113
                    // canonicalize cond2
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1114
                    cond2 = cond2.join(cond1.negate());
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1115
                    if (cond2 == null) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1116
                        // mixing signed and unsigned cases, or useless combination of conditions
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1117
                        return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1118
                    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1119
                    // derive cond3 from cond1 and cond2
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1120
                    Condition cond3 = cond1.negate().join(cond2.negate());
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1121
                    if (cond3 == null) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1122
                        // mixing signed and unsigned cases, or useless combination of conditions
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1123
                        return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1124
                    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1125
                    boolean unsigned = cond1.isUnsigned() || cond2.isUnsigned();
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1126
                    boolean floatingPoint = x.stamp(NodeView.from(tool)) instanceof FloatStamp;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1127
                    assert !floatingPoint || y.stamp(NodeView.from(tool)) instanceof FloatStamp;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1128
                    assert !(floatingPoint && unsigned);
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1129
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1130
                    long expected1 = expectedConstantForNormalize(cond1);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1131
                    long expected2 = expectedConstantForNormalize(cond2);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1132
                    long expected3 = expectedConstantForNormalize(cond3);
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
  1133
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1134
                    if (c1 == expected1 && c2 == expected2 && c3 == expected3) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1135
                        // normal order
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1136
                    } else if (c1 == 0 - expected1 && c2 == 0 - expected2 && c3 == 0 - expected3) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1137
                        // reverse order
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1138
                        ValueNode tmp = x;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1139
                        x = y;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1140
                        y = tmp;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1141
                    } else {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1142
                        // cannot be expressed by NormalizeCompareNode
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1143
                        return null;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1144
                    }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1145
                    if (floatingPoint) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1146
                        boolean unorderedLess = false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1147
                        if (((FloatStamp) x.stamp).canBeNaN() || ((FloatStamp) y.stamp).canBeNaN()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1148
                            // we may encounter NaNs, check the unordered value
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1149
                            // (following the original condition's "unorderedIsTrue" path)
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1150
                            long unorderedValue = condition1.unorderedIsTrue() ? c1 : condition2.unorderedIsTrue() ? c2 : c3;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1151
                            if (unorderedValue == 0) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1152
                                // returning "0" for unordered is not possible
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1153
                                return null;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1154
                            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1155
                            unorderedLess = unorderedValue == -1;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1156
                        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1157
                        return graph().unique(new FloatNormalizeCompareNode(x, y, stackKind, unorderedLess));
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1158
                    } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1159
                        return graph().unique(new IntegerNormalizeCompareNode(x, y, stackKind, unsigned));
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1160
                    }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1161
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1162
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1163
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1164
        return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1165
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1166
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1167
    private static long expectedConstantForNormalize(Condition condition) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1168
        if (condition == Condition.EQ) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1169
            return 0;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1170
        } else if (condition == Condition.LT || condition == Condition.BT) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1171
            return -1;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1172
        } else {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1173
            assert condition == Condition.GT || condition == Condition.AT;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1174
            return 1;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1175
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1176
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1177
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1178
    public enum NodeColor {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1179
        NONE,
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1180
        CONDITION_USAGE,
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1181
        TRUE_BRANCH,
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1182
        FALSE_BRANCH,
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1183
        PHI_MIXED,
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1184
        MIXED
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1185
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1186
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1187
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1188
     * Take an if that is immediately dominated by a merge with a single phi and split off any paths
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1189
     * where the test would be statically decidable creating a new merge below the appropriate side
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1190
     * of the IfNode. Any undecidable tests will continue to use the original IfNode.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1191
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1192
     * @param tool
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1193
     */
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1194
    @SuppressWarnings("try")
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1195
    private boolean splitIfAtPhi(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1196
        if (!(predecessor() instanceof MergeNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1197
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1198
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1199
        MergeNode merge = (MergeNode) predecessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1200
        if (merge.forwardEndCount() == 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1201
            // Don't bother.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1202
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1203
        }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1204
        if (merge.getUsageCount() != 1 || merge.phis().count() != 1) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1205
            // Don't trigger with multiple phis. Would require more rewiring.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1206
            // Most of the time the additional phis are memory phis that are removed after
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1207
            // fixed read phase.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1208
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1209
        }
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1210
        if (graph().getGuardsStage().areFrameStatesAtSideEffects() && merge.stateAfter() == null) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1211
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1212
        }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1213
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1214
        PhiNode generalPhi = merge.phis().first();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1215
        if (!(generalPhi instanceof ValuePhiNode)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1216
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1217
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1218
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1219
        ValuePhiNode phi = (ValuePhiNode) generalPhi;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1220
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1221
        EconomicMap<Node, NodeColor> coloredNodes = EconomicMap.create(Equivalence.IDENTITY, 8);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1222
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1223
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1224
         * Check that the condition uses the phi and that there is only one user of the condition
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1225
         * expression.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1226
         */
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1227
        if (!conditionUses(condition(), phi, coloredNodes)) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1228
            return false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1229
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1230
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1231
        if (!mayRemoveSplit(merge)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1232
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1233
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1234
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1235
        LogicNode[] results = new LogicNode[merge.forwardEndCount()];
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1236
        boolean success = false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1237
        for (int i = 0; i < results.length; ++i) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1238
            ValueNode value = phi.valueAt(i);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1239
            LogicNode curResult = computeCondition(tool, condition, phi, value);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1240
            if (curResult != condition) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1241
                for (Node n : curResult.inputs()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1242
                    if (n instanceof ConstantNode || n instanceof ParameterNode || n instanceof FixedNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1243
                        // Constant inputs or parameters or fixed nodes are OK.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1244
                    } else if (n == value) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1245
                        // References to the value itself are also OK.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1246
                    } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1247
                        // Input may cause scheduling issues.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1248
                        curResult = condition;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1249
                        break;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1250
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1251
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1252
                success = true;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1253
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1254
            results[i] = curResult;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1255
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1256
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1257
        if (!success) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1258
            return false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1259
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1260
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1261
        for (Node usage : phi.usages()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1262
            if (usage == merge.stateAfter()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1263
                // This usage can be ignored, because it is directly in the state after.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1264
            } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1265
                NodeColor color = colorUsage(coloredNodes, usage, merge, this.trueSuccessor(), this.falseSuccessor());
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1266
                if (color == NodeColor.MIXED) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1267
                    return false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1268
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1269
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1270
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1271
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1272
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1273
         * We could additionally filter for the case that at least some of the Phi inputs or one of
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1274
         * the condition inputs are constants but there are cases where a non-constant is
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1275
         * simplifiable, usually where the stamp allows the question to be answered.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1276
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1277
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1278
        /* Each successor of the if gets a new merge if needed. */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1279
        MergeNode trueMerge = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1280
        MergeNode falseMerge = null;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1281
        int i = 0;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1282
        for (EndNode end : merge.forwardEnds().snapshot()) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1283
            ValueNode value = phi.valueAt(end);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1284
            LogicNode result = results[i++];
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1285
            if (result instanceof LogicConstantNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1286
                if (((LogicConstantNode) result).getValue()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1287
                    if (trueMerge == null) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1288
                        trueMerge = insertMerge(trueSuccessor(), phi, merge.stateAfter(), tool);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1289
                        replaceNodesInBranch(coloredNodes, NodeColor.TRUE_BRANCH, phi, trueMerge.phis().first());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1290
                    }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1291
                    trueMerge.phis().first().addInput(value);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1292
                    trueMerge.addForwardEnd(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1293
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1294
                    if (falseMerge == null) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1295
                        falseMerge = insertMerge(falseSuccessor(), phi, merge.stateAfter(), tool);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1296
                        replaceNodesInBranch(coloredNodes, NodeColor.FALSE_BRANCH, phi, falseMerge.phis().first());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1297
                    }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1298
                    falseMerge.phis().first().addInput(value);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1299
                    falseMerge.addForwardEnd(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1300
                }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1301
                merge.removeEnd(end);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1302
            } else if (result != condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1303
                // Build a new IfNode using the new condition
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1304
                BeginNode trueBegin = graph().add(new BeginNode());
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1305
                trueBegin.setNodeSourcePosition(trueSuccessor().getNodeSourcePosition());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1306
                BeginNode falseBegin = graph().add(new BeginNode());
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1307
                falseBegin.setNodeSourcePosition(falseSuccessor().getNodeSourcePosition());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1308
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1309
                if (result.graph() == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1310
                    result = graph().addOrUniqueWithInputs(result);
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1311
                    result.setNodeSourcePosition(condition.getNodeSourcePosition());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1312
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1313
                IfNode newIfNode = graph().add(new IfNode(result, trueBegin, falseBegin, trueSuccessorProbability));
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1314
                newIfNode.setNodeSourcePosition(getNodeSourcePosition());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1315
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1316
                if (trueMerge == null) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1317
                    trueMerge = insertMerge(trueSuccessor(), phi, merge.stateAfter(), tool);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1318
                    replaceNodesInBranch(coloredNodes, NodeColor.TRUE_BRANCH, phi, trueMerge.phis().first());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1319
                }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1320
                trueMerge.phis().first().addInput(value);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1321
                trueBegin.setNext(graph().add(new EndNode()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1322
                trueMerge.addForwardEnd((EndNode) trueBegin.next());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1323
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1324
                if (falseMerge == null) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1325
                    falseMerge = insertMerge(falseSuccessor(), phi, merge.stateAfter(), tool);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1326
                    replaceNodesInBranch(coloredNodes, NodeColor.FALSE_BRANCH, phi, falseMerge.phis().first());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1327
                }
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1328
                falseMerge.phis().first().addInput(value);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1329
                falseBegin.setNext(graph().add(new EndNode()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1330
                falseMerge.addForwardEnd((EndNode) falseBegin.next());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1331
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1332
                merge.removeEnd(end);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1333
                ((FixedWithNextNode) end.predecessor()).setNext(newIfNode);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1334
                end.safeDelete();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1335
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1336
        }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1337
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1338
        cleanupMerge(merge);
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1339
        cleanupMerge(trueMerge);
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1340
        cleanupMerge(falseMerge);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1341
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1342
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1343
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1344
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1345
    private static void replaceNodesInBranch(EconomicMap<Node, NodeColor> coloredNodes, NodeColor branch, ValuePhiNode phi, ValueNode newValue) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1346
        for (Node n : phi.usages().snapshot()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1347
            if (coloredNodes.get(n) == branch) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1348
                n.replaceAllInputs(phi, newValue);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1349
            } else if (coloredNodes.get(n) == NodeColor.PHI_MIXED) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1350
                assert n instanceof PhiNode;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1351
                PhiNode phiNode = (PhiNode) n;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1352
                AbstractMergeNode merge = phiNode.merge();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1353
                for (int i = 0; i < merge.forwardEndCount(); ++i) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1354
                    if (phiNode.valueAt(i) == phi && coloredNodes.get(merge.forwardEndAt(i)) == branch) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1355
                        phiNode.setValueAt(i, newValue);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1356
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1357
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1358
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1359
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1360
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1361
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1362
    private NodeColor colorUsage(EconomicMap<Node, NodeColor> coloredNodes, Node node, MergeNode merge, AbstractBeginNode trueSucc, AbstractBeginNode falseSucc) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1363
        NodeColor color = coloredNodes.get(node);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1364
        if (color == null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1365
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1366
            if (coloredNodes.size() >= MAX_USAGE_COLOR_SET_SIZE) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1367
                return NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1368
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1369
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1370
            coloredNodes.put(node, NodeColor.MIXED);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1371
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1372
            if (node == merge) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1373
                color = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1374
            } else if (node == trueSucc) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1375
                color = NodeColor.TRUE_BRANCH;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1376
            } else if (node == falseSucc) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1377
                color = NodeColor.FALSE_BRANCH;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1378
            } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1379
                if (node instanceof AbstractMergeNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1380
                    AbstractMergeNode mergeNode = (AbstractMergeNode) node;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1381
                    NodeColor combinedColor = null;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1382
                    for (int i = 0; i < mergeNode.forwardEndCount(); ++i) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1383
                        NodeColor curColor = colorUsage(coloredNodes, mergeNode.forwardEndAt(i), merge, trueSucc, falseSucc);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1384
                        if (combinedColor == null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1385
                            combinedColor = curColor;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1386
                        } else if (combinedColor != curColor) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1387
                            combinedColor = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1388
                            break;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1389
                        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1390
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1391
                    color = combinedColor;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1392
                } else if (node instanceof StartNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1393
                    color = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1394
                } else if (node instanceof FixedNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1395
                    FixedNode fixedNode = (FixedNode) node;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1396
                    Node predecessor = fixedNode.predecessor();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1397
                    assert predecessor != null : fixedNode;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1398
                    color = colorUsage(coloredNodes, predecessor, merge, trueSucc, falseSucc);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1399
                } else if (node instanceof PhiNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1400
                    PhiNode phiNode = (PhiNode) node;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1401
                    AbstractMergeNode phiMerge = phiNode.merge();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1402
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1403
                    if (phiMerge instanceof LoopBeginNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1404
                        color = colorUsage(coloredNodes, phiMerge, merge, trueSucc, falseSucc);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1405
                    } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1406
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1407
                        for (int i = 0; i < phiMerge.forwardEndCount(); ++i) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1408
                            NodeColor curColor = colorUsage(coloredNodes, phiMerge.forwardEndAt(i), merge, trueSucc, falseSucc);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1409
                            if (curColor != NodeColor.TRUE_BRANCH && curColor != NodeColor.FALSE_BRANCH) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1410
                                color = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1411
                                break;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1412
                            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1413
                        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1414
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1415
                        if (color == null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1416
                            // Each of the inputs to the phi are either coming unambigously from
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1417
                            // true or false branch.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1418
                            color = NodeColor.PHI_MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1419
                            assert node instanceof PhiNode;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1420
                        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1421
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1422
                } else {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1423
                    NodeColor combinedColor = null;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1424
                    for (Node n : node.usages()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1425
                        if (n != node) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1426
                            NodeColor curColor = colorUsage(coloredNodes, n, merge, trueSucc, falseSucc);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1427
                            if (combinedColor == null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1428
                                combinedColor = curColor;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1429
                            } else if (combinedColor != curColor) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1430
                                combinedColor = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1431
                                break;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1432
                            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1433
                        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1434
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1435
                    if (combinedColor == NodeColor.PHI_MIXED) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1436
                        combinedColor = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1437
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1438
                    if (combinedColor == null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1439
                        // Floating node without usages => association unclear.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1440
                        combinedColor = NodeColor.MIXED;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1441
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1442
                    color = combinedColor;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1443
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1444
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1445
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1446
            assert color != null : node;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1447
            coloredNodes.put(node, color);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1448
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1449
        return color;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1450
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1451
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1452
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1453
     * @param condition
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1454
     * @param phi
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1455
     * @param coloredNodes
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1456
     * @return true if the passed in {@code condition} uses {@code phi} and the condition is only
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1457
     *         used once. Since the phi will go dead the condition using it will also have to be
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1458
     *         dead after the optimization.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1459
     */
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1460
    private static boolean conditionUses(LogicNode condition, PhiNode phi, EconomicMap<Node, NodeColor> coloredNodes) {
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
  1461
        if (!condition.hasExactlyOneUsage()) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1462
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1463
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1464
        if (condition instanceof ShortCircuitOrNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1465
            if (condition.graph().getGuardsStage().areDeoptsFixed()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1466
                /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1467
                 * It can be unsafe to simplify a ShortCircuitOr before deopts are fixed because
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1468
                 * conversion to guards assumes that all the required conditions are being tested.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1469
                 * Simplfying the condition based on context before this happens may lose a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1470
                 * condition.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1471
                 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1472
                ShortCircuitOrNode orNode = (ShortCircuitOrNode) condition;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1473
                return (conditionUses(orNode.x, phi, coloredNodes) || conditionUses(orNode.y, phi, coloredNodes));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1474
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1475
        } else if (condition instanceof Canonicalizable.Unary<?>) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1476
            Canonicalizable.Unary<?> unary = (Canonicalizable.Unary<?>) condition;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1477
            if (unary.getValue() == phi) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1478
                coloredNodes.put(condition, NodeColor.CONDITION_USAGE);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1479
                return true;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1480
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1481
        } else if (condition instanceof Canonicalizable.Binary<?>) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1482
            Canonicalizable.Binary<?> binary = (Canonicalizable.Binary<?>) condition;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1483
            if (binary.getX() == phi || binary.getY() == phi) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1484
                coloredNodes.put(condition, NodeColor.CONDITION_USAGE);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1485
                return true;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1486
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1487
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1488
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1489
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1490
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1491
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1492
     * Canonicalize {@code} condition using {@code value} in place of {@code phi}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1493
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1494
     * @param tool
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1495
     * @param condition
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1496
     * @param phi
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1497
     * @param value
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1498
     * @return an improved LogicNode or the original condition
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1499
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1500
    @SuppressWarnings("unchecked")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1501
    private static LogicNode computeCondition(SimplifierTool tool, LogicNode condition, PhiNode phi, Node value) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1502
        if (condition instanceof ShortCircuitOrNode) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents: 46371
diff changeset
  1503
            if (condition.graph().getGuardsStage().areDeoptsFixed() && !condition.graph().isAfterExpandLogic()) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1504
                ShortCircuitOrNode orNode = (ShortCircuitOrNode) condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1505
                LogicNode resultX = computeCondition(tool, orNode.x, phi, value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1506
                LogicNode resultY = computeCondition(tool, orNode.y, phi, value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1507
                if (resultX != orNode.x || resultY != orNode.y) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1508
                    LogicNode result = orNode.canonical(tool, resultX, resultY);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1509
                    if (result != orNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1510
                        return result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1511
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1512
                    /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1513
                     * Create a new node to carry the optimized inputs.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1514
                     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1515
                    ShortCircuitOrNode newOr = new ShortCircuitOrNode(resultX, orNode.xNegated, resultY,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1516
                                    orNode.yNegated, orNode.getShortCircuitProbability());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1517
                    return newOr.canonical(tool);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1518
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1519
                return orNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1520
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1521
        } else if (condition instanceof Canonicalizable.Binary<?>) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1522
            Canonicalizable.Binary<Node> compare = (Canonicalizable.Binary<Node>) condition;
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1523
            if (compare.getX() == phi || compare.getY() == phi) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1524
                return (LogicNode) compare.canonical(tool, compare.getX() == phi ? value : compare.getX(), compare.getY() == phi ? value : compare.getY());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1525
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1526
        } else if (condition instanceof Canonicalizable.Unary<?>) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1527
            Canonicalizable.Unary<Node> compare = (Canonicalizable.Unary<Node>) condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1528
            if (compare.getValue() == phi) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1529
                return (LogicNode) compare.canonical(tool, value);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1530
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1531
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1532
        if (condition instanceof Canonicalizable) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1533
            return (LogicNode) ((Canonicalizable) condition).canonical(tool);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1534
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1535
        return condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1536
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1537
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1538
    private void cleanupMerge(MergeNode merge) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1539
        if (merge != null && merge.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1540
            if (merge.forwardEndCount() == 0) {
46371
0337d0617e7b 8178088: Update Graal
iveresov
parents: 46344
diff changeset
  1541
                GraphUtil.killCFG(merge);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1542
            } else if (merge.forwardEndCount() == 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1543
                graph().reduceTrivialMerge(merge);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1544
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1545
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1546
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1547
50330
2cbc42a5764b 8202670: Update Graal
dlong
parents: 49873
diff changeset
  1548
    @SuppressWarnings("try")
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1549
    private MergeNode insertMerge(AbstractBeginNode begin, ValuePhiNode oldPhi, FrameState stateAfter, SimplifierTool tool) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1550
        MergeNode merge = graph().add(new MergeNode());
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1551
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1552
        AbstractBeginNode newBegin;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1553
        try (DebugCloseable position = begin.withNodeSourcePosition()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1554
            newBegin = graph().add(new BeginNode());
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1555
            begin.replaceAtPredecessor(newBegin);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1556
            newBegin.setNext(begin);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1557
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1558
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1559
        FixedNode next = newBegin.next();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1560
        next.replaceAtPredecessor(merge);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1561
        newBegin.setNext(graph().add(new EndNode()));
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1562
        merge.addForwardEnd((EndNode) newBegin.next());
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1563
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1564
        ValuePhiNode phi = begin.graph().addOrUnique(new ValuePhiNode(oldPhi.stamp(NodeView.DEFAULT), merge));
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1565
        phi.addInput(oldPhi);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1566
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1567
        if (stateAfter != null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1568
            FrameState newState = stateAfter.duplicate();
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1569
            newState.replaceAllInputs(oldPhi, phi);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1570
            merge.setStateAfter(newState);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1571
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1572
        merge.setNext(next);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1573
        tool.addToWorkList(begin);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1574
        return merge;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1575
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1576
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1577
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1578
     * Tries to connect code that initializes a variable directly with the successors of an if
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1579
     * construct that switches on the variable. For example, the pseudo code below:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1580
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1581
     * <pre>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1582
     * contains(list, e, yes, no) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1583
     *     if (list == null || e == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1584
     *         condition = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1585
     *     } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1586
     *         condition = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1587
     *         for (i in list) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1588
     *             if (i.equals(e)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1589
     *                 condition = true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1590
     *                 break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1591
     *             }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1592
     *         }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1593
     *     }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1594
     *     if (condition) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1595
     *         return yes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1596
     *     } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1597
     *         return no;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1598
     *     }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1599
     * }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1600
     * </pre>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1601
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1602
     * will be transformed into:
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1603
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1604
     * <pre>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1605
     * contains(list, e, yes, no) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1606
     *     if (list == null || e == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1607
     *         return no;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1608
     *     } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1609
     *         condition = false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1610
     *         for (i in list) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1611
     *             if (i.equals(e)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1612
     *                 return yes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1613
     *             }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1614
     *         }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1615
     *         return no;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1616
     *     }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1617
     * }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1618
     * </pre>
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1619
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1620
     * @return true if a transformation was made, false otherwise
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1621
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1622
    private boolean removeIntermediateMaterialization(SimplifierTool tool) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1623
        if (!(predecessor() instanceof AbstractMergeNode) || predecessor() instanceof LoopBeginNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1624
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1625
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1626
        AbstractMergeNode merge = (AbstractMergeNode) predecessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1627
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1628
        if (!(condition() instanceof CompareNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1629
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1630
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1631
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1632
        CompareNode compare = (CompareNode) condition();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1633
        if (compare.getUsageCount() != 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1634
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1635
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1636
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1637
        // Only consider merges with a single usage that is both a phi and an operand of the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1638
        // comparison
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1639
        NodeIterable<Node> mergeUsages = merge.usages();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1640
        if (mergeUsages.count() != 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1641
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1642
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1643
        Node singleUsage = mergeUsages.first();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1644
        if (!(singleUsage instanceof ValuePhiNode) || (singleUsage != compare.getX() && singleUsage != compare.getY())) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1645
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1646
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1647
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1648
        // Ensure phi is used by at most the comparison and the merge's frame state (if any)
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1649
        ValuePhiNode phi = (ValuePhiNode) singleUsage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1650
        NodeIterable<Node> phiUsages = phi.usages();
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1651
        for (Node usage : phiUsages) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1652
            if (usage == compare) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1653
                continue;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1654
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1655
            if (usage == merge.stateAfter()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1656
                continue;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1657
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1658
            // Checkstyle: stop
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1659
            // @formatter:off
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1660
            //
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1661
            // We also want to allow the usage to be on the loop-proxy if one of the branches is a
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1662
            // loop exit.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1663
            //
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1664
            // This pattern:
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1665
            //
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1666
            //      if------->cond
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1667
            //     /  \
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1668
            // begin  begin
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1669
            //   |      |
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1670
            //  end    end        C1 V2
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1671
            //     \  /            \ /
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1672
            //     merge---------->phi<------    C1
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1673
            //       |              ^        \  /
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1674
            //       if-------------|-------->==
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1675
            //      /  \            |
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1676
            //     A    B<--------Proxy
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1677
            //
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1678
            // Must be simplified to:
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1679
            //
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1680
            //       if---------------------->cond
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1681
            //      /  \
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1682
            //     A    B<--------Proxy------>V2
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1683
            //
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1684
            // @formatter:on
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1685
            // Checkstyle: resume
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1686
            if (usage instanceof ValueProxyNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1687
                ValueProxyNode proxy = (ValueProxyNode) usage;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1688
                if (proxy.proxyPoint() == trueSuccessor || proxy.proxyPoint() == falseSuccessor) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1689
                    continue;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1690
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1691
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1692
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1693
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1694
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1695
        List<EndNode> mergePredecessors = merge.cfgPredecessors().snapshot();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1696
        assert phi.valueCount() == merge.forwardEndCount();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1697
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1698
        Constant[] xs = constantValues(compare.getX(), merge, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1699
        Constant[] ys = constantValues(compare.getY(), merge, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1700
        if (xs == null || ys == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1701
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1702
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1703
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1704
        if (!mayRemoveSplit(merge)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1705
            return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1706
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1707
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1708
        List<EndNode> falseEnds = new ArrayList<>(mergePredecessors.size());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1709
        List<EndNode> trueEnds = new ArrayList<>(mergePredecessors.size());
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1710
        EconomicMap<AbstractEndNode, ValueNode> phiValues = EconomicMap.create(Equivalence.IDENTITY, mergePredecessors.size());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1711
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1712
        AbstractBeginNode oldFalseSuccessor = falseSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1713
        AbstractBeginNode oldTrueSuccessor = trueSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1714
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1715
        setFalseSuccessor(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1716
        setTrueSuccessor(null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1717
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1718
        Iterator<EndNode> ends = mergePredecessors.iterator();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1719
        for (int i = 0; i < xs.length; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1720
            EndNode end = ends.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1721
            phiValues.put(end, phi.valueAt(end));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1722
            if (compare.condition().foldCondition(xs[i], ys[i], tool.getConstantReflection(), compare.unorderedIsTrue())) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1723
                trueEnds.add(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1724
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1725
                falseEnds.add(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1726
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1727
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1728
        assert !ends.hasNext();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1729
        assert falseEnds.size() + trueEnds.size() == xs.length;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1730
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1731
        connectEnds(falseEnds, phi, phiValues, oldFalseSuccessor, merge, tool);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1732
        connectEnds(trueEnds, phi, phiValues, oldTrueSuccessor, merge, tool);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1733
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1734
        if (this.trueSuccessorProbability == 0.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1735
            for (AbstractEndNode endNode : trueEnds) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1736
                propagateZeroProbability(endNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1737
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1738
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1739
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1740
        if (this.trueSuccessorProbability == 1.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1741
            for (AbstractEndNode endNode : falseEnds) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1742
                propagateZeroProbability(endNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1743
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1744
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1745
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1746
        /*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1747
         * Remove obsolete ends only after processing all ends, otherwise oldTrueSuccessor or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1748
         * oldFalseSuccessor might have been removed if it is a LoopExitNode.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1749
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1750
        if (falseEnds.isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1751
            GraphUtil.killCFG(oldFalseSuccessor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1752
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1753
        if (trueEnds.isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1754
            GraphUtil.killCFG(oldTrueSuccessor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1755
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1756
        GraphUtil.killCFG(merge);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1757
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1758
        assert !merge.isAlive() : merge;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1759
        assert !phi.isAlive() : phi;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1760
        assert !compare.isAlive() : compare;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1761
        assert !this.isAlive() : this;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1762
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1763
        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1764
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1765
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1766
    private boolean mayRemoveSplit(AbstractMergeNode merge) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1767
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1768
        if (merge.stateAfter() != null && (!checkFrameState(trueSuccessor, MAX_FRAMESTATE_SEARCH_DEPTH) || !checkFrameState(trueSuccessor, MAX_FRAMESTATE_SEARCH_DEPTH))) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1769
            return false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1770
        }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1771
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1772
        return true;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1773
    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1774
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1775
    private static void propagateZeroProbability(FixedNode startNode) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1776
        Node prev = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1777
        for (FixedNode node : GraphUtil.predecessorIterable(startNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1778
            if (node instanceof IfNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1779
                IfNode ifNode = (IfNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1780
                if (ifNode.trueSuccessor() == prev) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1781
                    if (ifNode.trueSuccessorProbability == 0.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1782
                        return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1783
                    } else if (ifNode.trueSuccessorProbability == 1.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1784
                        continue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1785
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1786
                        ifNode.setTrueSuccessorProbability(0.0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1787
                        return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1788
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1789
                } else if (ifNode.falseSuccessor() == prev) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1790
                    if (ifNode.trueSuccessorProbability == 1.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1791
                        return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1792
                    } else if (ifNode.trueSuccessorProbability == 0.0) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1793
                        continue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1794
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1795
                        ifNode.setTrueSuccessorProbability(1.0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1796
                        return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1797
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1798
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1799
                    throw new GraalError("Illegal state");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1800
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1801
            } else if (node instanceof AbstractMergeNode && !(node instanceof LoopBeginNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1802
                for (AbstractEndNode endNode : ((AbstractMergeNode) node).cfgPredecessors()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1803
                    propagateZeroProbability(endNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1804
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1805
                return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1806
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1807
            prev = node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1808
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1809
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1810
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1811
    /**
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1812
     * Snippet lowerings may produce patterns without a frame state on the merge. We need to take
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1813
     * extra care when optimizing these patterns.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1814
     */
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1815
    private static boolean checkFrameState(FixedNode start, int maxDepth) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1816
        if (maxDepth == 0) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1817
            return false;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1818
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1819
        FixedNode node = start;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1820
        while (true) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1821
            if (node instanceof AbstractMergeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1822
                AbstractMergeNode mergeNode = (AbstractMergeNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1823
                if (mergeNode.stateAfter() == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1824
                    return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1825
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1826
                    return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1827
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1828
            } else if (node instanceof StateSplit) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1829
                StateSplit stateSplitNode = (StateSplit) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1830
                if (stateSplitNode.stateAfter() != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1831
                    return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1832
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1833
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1834
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1835
            if (node instanceof ControlSplitNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1836
                ControlSplitNode controlSplitNode = (ControlSplitNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1837
                for (Node succ : controlSplitNode.cfgSuccessors()) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1838
                    if (checkFrameState((FixedNode) succ, maxDepth - 1)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1839
                        return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1840
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1841
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1842
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1843
            } else if (node instanceof FixedWithNextNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1844
                FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1845
                node = fixedWithNextNode.next();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1846
            } else if (node instanceof AbstractEndNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1847
                AbstractEndNode endNode = (AbstractEndNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1848
                node = endNode.merge();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1849
            } else if (node instanceof ControlSinkNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1850
                return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1851
            } else {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1852
                assert false : "unexpected node";
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1853
                return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1854
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1855
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1856
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1857
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1858
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1859
     * Connects a set of ends to a given successor, inserting a merge node if there is more than one
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1860
     * end. If {@code ends} is not empty, then {@code successor} is added to {@code tool}'s
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1861
     * {@linkplain SimplifierTool#addToWorkList(org.graalvm.compiler.graph.Node) work list}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1862
     *
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1863
     * @param phi the original single-usage phi of the preceding merge
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1864
     * @param phiValues the values of the phi at the merge, keyed by the merge ends
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1865
     * @param oldMerge the merge being removed
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1866
     */
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1867
    private void connectEnds(List<EndNode> ends, ValuePhiNode phi, EconomicMap<AbstractEndNode, ValueNode> phiValues, AbstractBeginNode successor, AbstractMergeNode oldMerge, SimplifierTool tool) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1868
        if (!ends.isEmpty()) {
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1869
            // If there was a value proxy usage, then the proxy needs a new value.
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1870
            ValueProxyNode valueProxy = null;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1871
            if (successor instanceof LoopExitNode) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1872
                for (Node usage : phi.usages()) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1873
                    if (usage instanceof ValueProxyNode && ((ValueProxyNode) usage).proxyPoint() == successor) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1874
                        valueProxy = (ValueProxyNode) usage;
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1875
                    }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1876
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1877
            }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1878
            final ValueProxyNode proxy = valueProxy;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1879
            if (ends.size() == 1) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1880
                AbstractEndNode end = ends.get(0);
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1881
                if (proxy != null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1882
                    phi.replaceAtUsages(phiValues.get(end), n -> n == proxy);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1883
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1884
                ((FixedWithNextNode) end.predecessor()).setNext(successor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1885
                oldMerge.removeEnd(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1886
                GraphUtil.killCFG(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1887
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1888
                // Need a new phi in case the frame state is used by more than the merge being
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
  1889
                // removed.
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
  1890
                NodeView view = NodeView.from(tool);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1891
                AbstractMergeNode newMerge = graph().add(new MergeNode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1892
                PhiNode oldPhi = (PhiNode) oldMerge.usages().first();
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47798
diff changeset
  1893
                PhiNode newPhi = graph().addWithoutUnique(new ValuePhiNode(oldPhi.stamp(view), newMerge));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1894
58299
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1895
                if (proxy != null) {
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1896
                    phi.replaceAtUsages(newPhi, n -> n == proxy);
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1897
                }
6df94ce3ab2f 8229201: Update Graal
dlong
parents: 57537
diff changeset
  1898
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1899
                for (EndNode end : ends) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1900
                    newPhi.addInput(phiValues.get(end));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1901
                    newMerge.addForwardEnd(end);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1902
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1903
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1904
                FrameState stateAfter = oldMerge.stateAfter();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1905
                if (stateAfter != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1906
                    stateAfter = stateAfter.duplicate();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1907
                    stateAfter.replaceFirstInput(oldPhi, newPhi);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1908
                    newMerge.setStateAfter(stateAfter);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1909
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1910
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1911
                newMerge.setNext(successor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1912
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1913
            tool.addToWorkList(successor);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1914
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1915
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1916
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1917
    /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1918
     * Gets an array of constants derived from a node that is either a {@link ConstantNode} or a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1919
     * {@link PhiNode} whose input values are all constants. The length of the returned array is
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1920
     * equal to the number of ends terminating in a given merge node.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1921
     *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1922
     * @return null if {@code node} is neither a {@link ConstantNode} nor a {@link PhiNode} whose
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1923
     *         input values are all constants
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1924
     */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1925
    public static Constant[] constantValues(ValueNode node, AbstractMergeNode merge, boolean allowNull) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1926
        if (node.isConstant()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1927
            Constant[] result = new Constant[merge.forwardEndCount()];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1928
            Arrays.fill(result, node.asConstant());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1929
            return result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1930
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1931
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1932
        if (node instanceof PhiNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1933
            PhiNode phi = (PhiNode) node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1934
            if (phi.merge() == merge && phi instanceof ValuePhiNode && phi.valueCount() == merge.forwardEndCount()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1935
                Constant[] result = new Constant[merge.forwardEndCount()];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1936
                int i = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1937
                for (ValueNode n : phi.values()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1938
                    if (!allowNull && !n.isConstant()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1939
                        return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1940
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1941
                    result[i++] = n.asConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1942
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1943
                return result;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1944
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1945
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1946
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1947
        return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1948
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1949
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1950
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1951
    public AbstractBeginNode getPrimarySuccessor() {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 48398
diff changeset
  1952
        return null;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1953
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1954
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1955
    public AbstractBeginNode getSuccessor(boolean result) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1956
        return result ? this.trueSuccessor() : this.falseSuccessor();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1957
    }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1958
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1959
    @Override
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1960
    public boolean setProbability(AbstractBeginNode successor, double value) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1961
        if (successor == this.trueSuccessor()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1962
            this.setTrueSuccessorProbability(value);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1963
            return true;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1964
        } else if (successor == this.falseSuccessor()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1965
            this.setTrueSuccessorProbability(1.0 - value);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1966
            return true;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1967
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1968
        return false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1969
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1970
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1971
    @Override
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1972
    public int getSuccessorCount() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1973
        return 2;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1974
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1975
}