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