1 /*
2  * Copyright (c) 2015, 2018, 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  */
23 
24 
25 package org.graalvm.compiler.core.test;
26 
27 import org.graalvm.compiler.api.directives.GraalDirectives;
28 import org.junit.Ignore;
29 import org.junit.Test;
30 
31 /**
32  * Collection of tests for {@link org.graalvm.compiler.phases.common.ConditionalEliminationPhase}
33  * including those that triggered bugs in this phase.
34  */
35 public class ConditionalEliminationTest5 extends ConditionalEliminationTestBase {
36 
37     interface A {
38     }
39 
40     interface B extends A {
41     }
42 
43     interface C extends B {
44 
45     }
46 
47     static final class DistinctA {
48     }
49 
50     static final class DistinctB {
51     }
52 
reference1Snippet(Object a)53     public static void reference1Snippet(Object a) {
54         if (a instanceof B) {
55             sink1 = 1;
56         }
57         sink2 = 2;
58     }
59 
test1Snippet(Object a)60     public static void test1Snippet(Object a) {
61         if (a instanceof B) {
62             if (a instanceof A) {
63                 sink1 = 1;
64             }
65         }
66         sink2 = 2;
67     }
68 
69     @Test
test1()70     public void test1() {
71         testConditionalElimination("test1Snippet", "reference1Snippet");
72     }
73 
reference2Snippet(A a)74     public static void reference2Snippet(A a) {
75         if (a instanceof B) {
76             sink1 = 1;
77         }
78         sink2 = 2;
79     }
80 
test2Snippet(A a)81     public static void test2Snippet(A a) {
82         if (a instanceof B) {
83             B newVal = (B) a;
84             if (newVal != null) {
85                 sink1 = 1;
86             }
87         }
88         sink2 = 2;
89     }
90 
91     @Test
test2()92     public void test2() {
93         testConditionalElimination("test2Snippet", "reference2Snippet");
94     }
95 
96     @SuppressWarnings("unused")
reference3Snippet(Object a, Object b)97     public static void reference3Snippet(Object a, Object b) {
98         if (a instanceof DistinctA) {
99             DistinctA proxyA = (DistinctA) a;
100             if (b instanceof DistinctB) {
101                 sink1 = 1;
102             }
103         }
104         sink2 = 2;
105     }
106 
107     @SuppressWarnings("all")
test3Snippet(Object a, Object b)108     public static void test3Snippet(Object a, Object b) {
109         if (a instanceof DistinctA) {
110             DistinctA proxyA = (DistinctA) a;
111             if (b instanceof DistinctB) {
112                 if (proxyA == b) {
113                     sink0 = 42;
114                 }
115                 sink1 = 1;
116             }
117         }
118         sink2 = 2;
119     }
120 
121     @Test
test3()122     public void test3() {
123         testConditionalElimination("test3Snippet", "reference3Snippet", true, false);
124     }
125 
reference4Snippet(Object a)126     public static void reference4Snippet(Object a) {
127         if (!(a instanceof B)) {
128             GraalDirectives.deoptimizeAndInvalidate();
129         }
130         sink1 = 1;
131     }
132 
test4Snippet1(Object a)133     public static void test4Snippet1(Object a) {
134         if (!(a instanceof B)) {
135             GraalDirectives.deoptimizeAndInvalidate();
136         }
137         if (!(a instanceof A)) {
138             GraalDirectives.deoptimizeAndInvalidate();
139         }
140         sink1 = 1;
141     }
142 
test4Snippet2(Object a)143     public static void test4Snippet2(Object a) {
144         if (!(a instanceof A)) {
145             GraalDirectives.deoptimizeAndInvalidate();
146         }
147         if (!(a instanceof B)) {
148             GraalDirectives.deoptimizeAndInvalidate();
149         }
150         sink1 = 1;
151     }
152 
153     @SuppressWarnings({"cast", "unused"})
test4Snippet3(Object a)154     public static void test4Snippet3(Object a) {
155         Object pi = (A) a;
156         if (!(a instanceof B)) {
157             GraalDirectives.deoptimizeAndInvalidate();
158         }
159         sink1 = 1;
160     }
161 
test4Snippet4(Object a)162     public static void test4Snippet4(Object a) {
163         if (!(a instanceof A)) {
164             GraalDirectives.deoptimizeAndInvalidate();
165         }
166         if (!(((A) a) instanceof B)) {
167             GraalDirectives.deoptimizeAndInvalidate();
168         }
169         sink1 = 1;
170     }
171 
172     @SuppressWarnings({"cast"})
test4Snippet5(Object a)173     public static void test4Snippet5(Object a) {
174         Object pi = (A) a;
175         if (pi == null) {
176             GraalDirectives.deoptimizeAndInvalidate();
177         }
178         if (!(a instanceof B)) {
179             GraalDirectives.deoptimizeAndInvalidate();
180         }
181         sink1 = 1;
182     }
183 
184     @Test
test4()185     public void test4() {
186         testConditionalElimination("test4Snippet1", "reference4Snippet");
187         testConditionalElimination("test4Snippet2", "reference4Snippet");
188         testConditionalElimination("test4Snippet3", "reference4Snippet");
189         testConditionalElimination("test4Snippet5", "reference4Snippet");
190     }
191 
192     @Ignore
193     @Test
test5()194     public void test5() {
195         testConditionalElimination("test4Snippet4", "reference4Snippet", false, true);
196     }
197 }
198