1/* 2 * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23package org.graalvm.compiler.core.test; 24 25import org.graalvm.compiler.api.directives.GraalDirectives; 26import org.junit.Ignore; 27import org.junit.Test; 28 29/** 30 * Collection of tests for {@link org.graalvm.compiler.phases.common.ConditionalEliminationPhase} 31 * including those that triggered bugs in this phase. 32 */ 33public class ConditionalEliminationTest5 extends ConditionalEliminationTestBase { 34 35 interface A { 36 } 37 38 interface B extends A { 39 } 40 41 interface C extends B { 42 43 } 44 45 static final class DistinctA { 46 } 47 48 static final class DistinctB { 49 } 50 51 public static void reference1Snippet(Object a) { 52 if (a instanceof B) { 53 sink1 = 1; 54 } 55 sink2 = 2; 56 } 57 58 public static void test1Snippet(Object a) { 59 if (a instanceof B) { 60 if (a instanceof A) { 61 sink1 = 1; 62 } 63 } 64 sink2 = 2; 65 } 66 67 @Test 68 public void test1() { 69 testConditionalElimination("test1Snippet", "reference1Snippet"); 70 } 71 72 public static void reference2Snippet(A a) { 73 if (a instanceof B) { 74 sink1 = 1; 75 } 76 sink2 = 2; 77 } 78 79 public static void test2Snippet(A a) { 80 if (a instanceof B) { 81 B newVal = (B) a; 82 if (newVal != null) { 83 sink1 = 1; 84 } 85 } 86 sink2 = 2; 87 } 88 89 @Test 90 public void test2() { 91 testConditionalElimination("test2Snippet", "reference2Snippet"); 92 } 93 94 @SuppressWarnings("unused") 95 public static void reference3Snippet(Object a, Object b) { 96 if (a instanceof DistinctA) { 97 DistinctA proxyA = (DistinctA) a; 98 if (b instanceof DistinctB) { 99 sink1 = 1; 100 } 101 } 102 sink2 = 2; 103 } 104 105 @SuppressWarnings("all") 106 public static void test3Snippet(Object a, Object b) { 107 if (a instanceof DistinctA) { 108 DistinctA proxyA = (DistinctA) a; 109 if (b instanceof DistinctB) { 110 if (proxyA == b) { 111 sink0 = 42; 112 } 113 sink1 = 1; 114 } 115 } 116 sink2 = 2; 117 } 118 119 @Test 120 public void test3() { 121 testConditionalElimination("test3Snippet", "reference3Snippet", true, false); 122 } 123 124 public static void reference4Snippet(Object a) { 125 if (!(a instanceof B)) { 126 GraalDirectives.deoptimizeAndInvalidate(); 127 } 128 sink1 = 1; 129 } 130 131 public static void test4Snippet1(Object a) { 132 if (!(a instanceof B)) { 133 GraalDirectives.deoptimizeAndInvalidate(); 134 } 135 if (!(a instanceof A)) { 136 GraalDirectives.deoptimizeAndInvalidate(); 137 } 138 sink1 = 1; 139 } 140 141 public static void test4Snippet2(Object a) { 142 if (!(a instanceof A)) { 143 GraalDirectives.deoptimizeAndInvalidate(); 144 } 145 if (!(a instanceof B)) { 146 GraalDirectives.deoptimizeAndInvalidate(); 147 } 148 sink1 = 1; 149 } 150 151 @SuppressWarnings({"cast", "unused"}) 152 public static void test4Snippet3(Object a) { 153 Object pi = (A) a; 154 if (!(a instanceof B)) { 155 GraalDirectives.deoptimizeAndInvalidate(); 156 } 157 sink1 = 1; 158 } 159 160 public static void test4Snippet4(Object a) { 161 if (!(a instanceof A)) { 162 GraalDirectives.deoptimizeAndInvalidate(); 163 } 164 if (!(((A) a) instanceof B)) { 165 GraalDirectives.deoptimizeAndInvalidate(); 166 } 167 sink1 = 1; 168 } 169 170 @SuppressWarnings({"cast"}) 171 public static void test4Snippet5(Object a) { 172 Object pi = (A) a; 173 if (pi == null) { 174 GraalDirectives.deoptimizeAndInvalidate(); 175 } 176 if (!(a instanceof B)) { 177 GraalDirectives.deoptimizeAndInvalidate(); 178 } 179 sink1 = 1; 180 } 181 182 @Test 183 public void test4() { 184 testConditionalElimination("test4Snippet1", "reference4Snippet"); 185 testConditionalElimination("test4Snippet2", "reference4Snippet"); 186 testConditionalElimination("test4Snippet3", "reference4Snippet"); 187 testConditionalElimination("test4Snippet5", "reference4Snippet"); 188 } 189 190 @Ignore 191 @Test 192 public void test5() { 193 testConditionalElimination("test4Snippet4", "reference4Snippet", false, true); 194 } 195} 196