src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.test/src/org/graalvm/compiler/core/test/ea/PartialEscapeAnalysisIterationTest.java
author dlong
Thu, 31 Oct 2019 16:54:16 -0700
changeset 58877 aec7bf35d6f5
parent 51436 091c0d22e735
permissions -rw-r--r--
8233273: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51436
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     1
/*
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 51436
diff changeset
     2
 * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
51436
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     4
 *
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     8
 *
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    13
 * accompanied this code).
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    14
 *
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    18
 *
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    21
 * questions.
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    22
 */
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    23
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    24
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    25
package org.graalvm.compiler.core.test.ea;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    26
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    27
import java.lang.ref.WeakReference;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    28
import java.util.List;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    29
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    30
import org.graalvm.compiler.nodes.extended.BoxNode;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    31
import org.graalvm.compiler.nodes.extended.UnboxNode;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    32
import org.graalvm.compiler.nodes.java.StoreFieldNode;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    33
import org.graalvm.compiler.nodes.virtual.CommitAllocationNode;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    34
import org.graalvm.compiler.virtual.phases.ea.PartialEscapePhase;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    35
import org.junit.Assert;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    36
import org.junit.Test;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    37
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    38
public class PartialEscapeAnalysisIterationTest extends EATestBase {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    39
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    40
    // remember boxing nodes from before PEA
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    41
    private List<BoxNode> boxNodes;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    42
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    43
    @Override
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    44
    protected void canonicalizeGraph() {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    45
        super.canonicalizeGraph();
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    46
        boxNodes = graph.getNodes().filter(BoxNode.class).snapshot();
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    47
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    48
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    49
    private static final class AllocatedObject {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    50
        private int value;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    51
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    52
        AllocatedObject(int value) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    53
            this.value = value;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    54
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    55
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    56
        AllocatedObject() {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    57
            // empty
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    58
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    59
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    60
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    61
    public static volatile Object obj1;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    62
    public static volatile Double object1 = (double) 123;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    63
    public static volatile AllocatedObject object2 = new AllocatedObject(123);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    64
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    65
    public static String moveIntoBranchBox(int id) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    66
        Double box = object1 + 1;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    67
        if (id == 0) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    68
            obj1 = new WeakReference<>(box);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    69
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    70
        return "value";
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    71
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    72
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    73
    public static String moveIntoBranch(int id) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    74
        AllocatedObject box = new AllocatedObject(object2.value + 1);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    75
        if (id == 0) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    76
            obj1 = new WeakReference<>(box);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    77
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    78
        return "value";
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    79
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    80
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    81
    @Test
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    82
    public void testJMHBlackholePattern() {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    83
        /*
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    84
         * The overall number of allocations in this methods does not change during PEA, but the
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    85
         * effects still need to be applied since they move the allocation between blocks.
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    86
         */
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    87
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    88
        // test with a boxing object
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    89
        prepareGraph("moveIntoBranchBox", false);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    90
        Assert.assertEquals(1, graph.getNodes().filter(UnboxNode.class).count());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    91
        Assert.assertEquals(1, graph.getNodes().filter(BoxNode.class).count());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    92
        // the boxing needs to be moved into the branch
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    93
        Assert.assertTrue(graph.getNodes().filter(BoxNode.class).first().next() instanceof StoreFieldNode);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    94
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    95
        // test with a normal object
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    96
        prepareGraph("moveIntoBranch", false);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    97
        Assert.assertEquals(1, graph.getNodes().filter(CommitAllocationNode.class).count());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    98
        // the allocation needs to be moved into the branch
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
    99
        Assert.assertTrue(graph.getNodes().filter(CommitAllocationNode.class).first().next() instanceof StoreFieldNode);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   100
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   101
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   102
    public static String noLoopIterationBox(int id) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   103
        Double box = object1 + 1;
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   104
        for (int i = 0; i < 100; i++) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   105
            if (id == i) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   106
                obj1 = new WeakReference<>(box);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   107
            }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   108
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   109
        return "value";
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   110
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   111
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   112
    public static String noLoopIteration(int id) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   113
        AllocatedObject box = new AllocatedObject(object2.value + 1);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   114
        for (int i = 0; i < 100; i++) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   115
            if (id == i) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   116
                obj1 = new WeakReference<>(box);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   117
            }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   118
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   119
        return "value";
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   120
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   121
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   122
    public static String noLoopIterationEmpty(int id) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   123
        AllocatedObject box = new AllocatedObject();
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   124
        for (int i = 0; i < 100; i++) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   125
            if (id == i) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   126
                obj1 = new WeakReference<>(box);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   127
            }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   128
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   129
        return "value";
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   130
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   131
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   132
    @Test
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   133
    public void testNoLoopIteration() {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   134
        /*
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   135
         * PEA should not apply any effects on this method, since it cannot move the allocation into
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   136
         * the branch anyway (it needs to stay outside the loop).
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   137
         */
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   138
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   139
        // test with a boxing object
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   140
        prepareGraph("noLoopIterationBox", true);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   141
        Assert.assertEquals(1, boxNodes.size());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   142
        Assert.assertTrue(boxNodes.get(0).isAlive());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   143
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   144
        // test with a normal object (needs one iteration to replace NewInstance with
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   145
        // CommitAllocation)
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   146
        for (String name : new String[]{"noLoopIterationEmpty", "noLoopIteration"}) {
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   147
            prepareGraph(name, false);
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   148
            List<CommitAllocationNode> allocations = graph.getNodes().filter(CommitAllocationNode.class).snapshot();
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 51436
diff changeset
   149
            new PartialEscapePhase(true, false, createCanonicalizerPhase(), null, graph.getOptions()).apply(graph, context);
51436
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   150
            Assert.assertEquals(1, allocations.size());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   151
            Assert.assertTrue(allocations.get(0).isAlive());
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   152
        }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   153
    }
091c0d22e735 8206992: Update Graal
iveresov
parents:
diff changeset
   154
}