ConditionalEliminationTest1.java revision 12651:6ef01bd40ce2
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.junit.Test;
26
27import org.graalvm.compiler.api.directives.GraalDirectives;
28
29/**
30 * Collection of tests for
31 * {@link org.graalvm.compiler.phases.common.DominatorConditionalEliminationPhase} including those
32 * that triggered bugs in this phase.
33 */
34public class ConditionalEliminationTest1 extends ConditionalEliminationTestBase {
35
36    private static final String REFERENCE_SNIPPET = "referenceSnippet";
37
38    @SuppressWarnings("all")
39    public static int referenceSnippet(int a) {
40        if (a == 0) {
41            return 1;
42        }
43        return 0;
44    }
45
46    @Test
47    public void test1() {
48        testConditionalElimination("test1Snippet", REFERENCE_SNIPPET);
49    }
50
51    @SuppressWarnings("all")
52    public static int test1Snippet(int a) {
53        if (a == 0) {
54            if (a == 5) {
55                return 100;
56            }
57            if (a > 100) {
58                if (a == 0) {
59                    return 200;
60                }
61            }
62            if (a != 2) {
63                return 1;
64            }
65        }
66        return 0;
67    }
68
69    @Test
70    public void test2() {
71        testConditionalElimination("test2Snippet", REFERENCE_SNIPPET);
72    }
73
74    @SuppressWarnings("all")
75    public static int test2Snippet(int a) {
76        if (a == 0) {
77            if (a > 100) {
78                if (a == 0) {
79                    return 200;
80                }
81            }
82            if (a != 2) {
83                return 1;
84            }
85        }
86        return 0;
87    }
88
89    @Test
90    public void test3() {
91        testConditionalElimination("test3Snippet", REFERENCE_SNIPPET);
92    }
93
94    @SuppressWarnings("all")
95    public static int test3Snippet(int a) {
96        if (a == 0) {
97            if (a < 1) {
98                if (a < 2) {
99                    if (a < 3) {
100                        if (a > -1) {
101                            if (a > -2) {
102                                if (a > -3) {
103                                    if (a == 1) {
104                                        return 42;
105                                    } else {
106                                        return 1;
107                                    }
108                                }
109                            }
110                        }
111                    }
112                }
113            }
114        }
115        return 0;
116    }
117
118    @SuppressWarnings("all")
119    public static int test4Snippet(int a, int b) {
120        if (b < 1) {
121            GraalDirectives.controlFlowAnchor();
122            if (b < 0) {
123                return 1;
124            }
125        }
126        return 0;
127    }
128
129    @Test
130    public void test4() {
131        testConditionalElimination("test4Snippet", "test4Snippet");
132    }
133
134    @SuppressWarnings("all")
135    public static int test5Snippet(int a, int b) {
136        if ((b & 3) == 0) {
137            GraalDirectives.controlFlowAnchor();
138            if ((b & 7) == 0) {
139                GraalDirectives.controlFlowAnchor();
140                return 1;
141            }
142        } else {
143            GraalDirectives.controlFlowAnchor();
144            if ((b & 1) == 0) {
145                GraalDirectives.controlFlowAnchor();
146                return 2;
147            }
148        }
149        return 0;
150    }
151
152    @Test
153    public void test5() {
154        testConditionalElimination("test5Snippet", "test5Snippet");
155    }
156}
157