12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
1643a364291dcdfe08e530e9568748359735dd7442buzbee
17a26babddfce488172648efcd18d8c9e672a71759Ian Rogersclass Main {
1843a364291dcdfe08e530e9568748359735dd7442buzbee
1943a364291dcdfe08e530e9568748359735dd7442buzbee    public int ifoo;
2043a364291dcdfe08e530e9568748359735dd7442buzbee
2143a364291dcdfe08e530e9568748359735dd7442buzbee    /* Test requires visual inspection of object code to verify */
22a26babddfce488172648efcd18d8c9e672a71759Ian Rogers    int noThrow(Main nonNullA,
23a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                Main nonNullB,
24a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                Main nonNullC) {
2543a364291dcdfe08e530e9568748359735dd7442buzbee
2643a364291dcdfe08e530e9568748359735dd7442buzbee        // "this" check should be eliminated on both IGET/IPUT
2743a364291dcdfe08e530e9568748359735dd7442buzbee        ifoo++;
2843a364291dcdfe08e530e9568748359735dd7442buzbee
2943a364291dcdfe08e530e9568748359735dd7442buzbee       // "this" check should be eliminated on both IGET/IPUT
3043a364291dcdfe08e530e9568748359735dd7442buzbee       if (ifoo != 321) {
3143a364291dcdfe08e530e9568748359735dd7442buzbee           // Check not eliminated
3243a364291dcdfe08e530e9568748359735dd7442buzbee           nonNullA.ifoo = 12;
3343a364291dcdfe08e530e9568748359735dd7442buzbee           // Check not eliminated
3443a364291dcdfe08e530e9568748359735dd7442buzbee           nonNullB.ifoo = 21;
3543a364291dcdfe08e530e9568748359735dd7442buzbee       } else {
3643a364291dcdfe08e530e9568748359735dd7442buzbee           // Check not eliminated
3743a364291dcdfe08e530e9568748359735dd7442buzbee           nonNullA.ifoo = 12;
3843a364291dcdfe08e530e9568748359735dd7442buzbee       }
3943a364291dcdfe08e530e9568748359735dd7442buzbee
4043a364291dcdfe08e530e9568748359735dd7442buzbee       // Check eliminated
4143a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullA.ifoo = 13;
4243a364291dcdfe08e530e9568748359735dd7442buzbee
4343a364291dcdfe08e530e9568748359735dd7442buzbee       // Check not eliminated
4443a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullB.ifoo = 21;
4543a364291dcdfe08e530e9568748359735dd7442buzbee
4643a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullC = nonNullB;
4743a364291dcdfe08e530e9568748359735dd7442buzbee
4843a364291dcdfe08e530e9568748359735dd7442buzbee       // Check eliminated
4943a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullC.ifoo = 32;
5043a364291dcdfe08e530e9568748359735dd7442buzbee
5143a364291dcdfe08e530e9568748359735dd7442buzbee      // All null checks eliminated
5243a364291dcdfe08e530e9568748359735dd7442buzbee      return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
5343a364291dcdfe08e530e9568748359735dd7442buzbee    }
5443a364291dcdfe08e530e9568748359735dd7442buzbee
5543a364291dcdfe08e530e9568748359735dd7442buzbee    /* Test to ensure we don't remove necessary null checks */
56a26babddfce488172648efcd18d8c9e672a71759Ian Rogers    int checkThrow(Main nonNullA,
57a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                   Main nonNullB,
58a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                   Main nonNullC,
59a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                   Main nullA,
60a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                   Main nullB,
61a26babddfce488172648efcd18d8c9e672a71759Ian Rogers                   Main nullC) {
6243a364291dcdfe08e530e9568748359735dd7442buzbee
6343a364291dcdfe08e530e9568748359735dd7442buzbee        // "this" check should be eliminated on both IGET/IPUT
6443a364291dcdfe08e530e9568748359735dd7442buzbee        ifoo++;
6543a364291dcdfe08e530e9568748359735dd7442buzbee
6643a364291dcdfe08e530e9568748359735dd7442buzbee       try {
6743a364291dcdfe08e530e9568748359735dd7442buzbee           nullA.ifoo = 12;
6843a364291dcdfe08e530e9568748359735dd7442buzbee           // Should not be reached
6943a364291dcdfe08e530e9568748359735dd7442buzbee           return -1;
7043a364291dcdfe08e530e9568748359735dd7442buzbee       } catch (NullPointerException npe) {
7143a364291dcdfe08e530e9568748359735dd7442buzbee           ifoo++;
7243a364291dcdfe08e530e9568748359735dd7442buzbee       }
7343a364291dcdfe08e530e9568748359735dd7442buzbee       try {
7443a364291dcdfe08e530e9568748359735dd7442buzbee           nullB.ifoo = 13;
7543a364291dcdfe08e530e9568748359735dd7442buzbee           // Should not be reached
7643a364291dcdfe08e530e9568748359735dd7442buzbee           return -2;
7743a364291dcdfe08e530e9568748359735dd7442buzbee       } catch (NullPointerException npe) {
7843a364291dcdfe08e530e9568748359735dd7442buzbee           ifoo++;
7943a364291dcdfe08e530e9568748359735dd7442buzbee       }
8043a364291dcdfe08e530e9568748359735dd7442buzbee       try {
8143a364291dcdfe08e530e9568748359735dd7442buzbee           nullC.ifoo = 14;
8243a364291dcdfe08e530e9568748359735dd7442buzbee           // Should not be reached
8343a364291dcdfe08e530e9568748359735dd7442buzbee           return -3;
8443a364291dcdfe08e530e9568748359735dd7442buzbee       } catch (NullPointerException npe) {
8543a364291dcdfe08e530e9568748359735dd7442buzbee           ifoo++;
8643a364291dcdfe08e530e9568748359735dd7442buzbee       }
8743a364291dcdfe08e530e9568748359735dd7442buzbee
8843a364291dcdfe08e530e9568748359735dd7442buzbee       // "this" check should be eliminated
8943a364291dcdfe08e530e9568748359735dd7442buzbee       if (ifoo != 321) {
9043a364291dcdfe08e530e9568748359735dd7442buzbee           // Check not eliminated
9143a364291dcdfe08e530e9568748359735dd7442buzbee           nonNullA.ifoo = 12;
9243a364291dcdfe08e530e9568748359735dd7442buzbee           // Check not eliminated
9343a364291dcdfe08e530e9568748359735dd7442buzbee           nonNullB.ifoo = 21;
9443a364291dcdfe08e530e9568748359735dd7442buzbee           // Should throw here
9543a364291dcdfe08e530e9568748359735dd7442buzbee           try {
9643a364291dcdfe08e530e9568748359735dd7442buzbee               nullA.ifoo = 11;
9743a364291dcdfe08e530e9568748359735dd7442buzbee               return -4;
9843a364291dcdfe08e530e9568748359735dd7442buzbee           } catch (NullPointerException npe) {
9943a364291dcdfe08e530e9568748359735dd7442buzbee           }
10043a364291dcdfe08e530e9568748359735dd7442buzbee       } else {
10143a364291dcdfe08e530e9568748359735dd7442buzbee           // Check not eliminated
10243a364291dcdfe08e530e9568748359735dd7442buzbee           nonNullA.ifoo = 12;
10343a364291dcdfe08e530e9568748359735dd7442buzbee           // Should throw here
10443a364291dcdfe08e530e9568748359735dd7442buzbee           try {
10543a364291dcdfe08e530e9568748359735dd7442buzbee               nullA.ifoo = 11;
10643a364291dcdfe08e530e9568748359735dd7442buzbee               return -5;
10743a364291dcdfe08e530e9568748359735dd7442buzbee           } catch (NullPointerException npe) {
10843a364291dcdfe08e530e9568748359735dd7442buzbee           }
10943a364291dcdfe08e530e9568748359735dd7442buzbee       }
11043a364291dcdfe08e530e9568748359735dd7442buzbee
11143a364291dcdfe08e530e9568748359735dd7442buzbee       // Check not eliminated
11243a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullA.ifoo = 13;
11343a364291dcdfe08e530e9568748359735dd7442buzbee
11443a364291dcdfe08e530e9568748359735dd7442buzbee       // Check not eliminated
11543a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullB.ifoo = 21;
11643a364291dcdfe08e530e9568748359735dd7442buzbee
11743a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullC = nonNullB;
11843a364291dcdfe08e530e9568748359735dd7442buzbee
11943a364291dcdfe08e530e9568748359735dd7442buzbee       // Check eliminated
12043a364291dcdfe08e530e9568748359735dd7442buzbee       nonNullC.ifoo = 32;
12143a364291dcdfe08e530e9568748359735dd7442buzbee
12243a364291dcdfe08e530e9568748359735dd7442buzbee       // Should throw here
12343a364291dcdfe08e530e9568748359735dd7442buzbee       try {
12443a364291dcdfe08e530e9568748359735dd7442buzbee           nullA.ifoo = 13;
12543a364291dcdfe08e530e9568748359735dd7442buzbee           return -6;
12643a364291dcdfe08e530e9568748359735dd7442buzbee       } catch (NullPointerException npe) {
12743a364291dcdfe08e530e9568748359735dd7442buzbee       }
12843a364291dcdfe08e530e9568748359735dd7442buzbee
12943a364291dcdfe08e530e9568748359735dd7442buzbee      return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
13043a364291dcdfe08e530e9568748359735dd7442buzbee    }
13143a364291dcdfe08e530e9568748359735dd7442buzbee
13243a364291dcdfe08e530e9568748359735dd7442buzbee
13343a364291dcdfe08e530e9568748359735dd7442buzbee    static int nullCheckTestNoThrow(int x) {
134a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main base = new Main();
135a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main a = new Main();
136a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main b = new Main();
137a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main c = new Main();
13843a364291dcdfe08e530e9568748359735dd7442buzbee        base.ifoo = x;
13943a364291dcdfe08e530e9568748359735dd7442buzbee        return base.noThrow(a,b,c);
14043a364291dcdfe08e530e9568748359735dd7442buzbee    }
14143a364291dcdfe08e530e9568748359735dd7442buzbee
14243a364291dcdfe08e530e9568748359735dd7442buzbee    static int nullCheckTestThrow(int x) {
143a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main base = new Main();
144a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main a = new Main();
145a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main b = new Main();
146a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main c = new Main();
147a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main d = null;
148a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main e = null;
149a26babddfce488172648efcd18d8c9e672a71759Ian Rogers        Main f = null;
15043a364291dcdfe08e530e9568748359735dd7442buzbee        base.ifoo = x;
15143a364291dcdfe08e530e9568748359735dd7442buzbee        return base.checkThrow(a,b,c,d,e,f);
15243a364291dcdfe08e530e9568748359735dd7442buzbee    }
15343a364291dcdfe08e530e9568748359735dd7442buzbee
15443a364291dcdfe08e530e9568748359735dd7442buzbee
1559651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    static void throwImplicitAIOBE(int[] array, int index) {
1569651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      array[index] = 0;
1579651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    }
1589651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers
1599651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    static int checkAIOBE() {
1609651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      int[] array = new int[10];
1619651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      int res;
1629651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      try {
1639651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        throwImplicitAIOBE(array, 11);
1649651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res = 123;
1659651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (NullPointerException npe) {
1669651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res = 768;
1679651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (ArrayIndexOutOfBoundsException e) {
1689651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res = 456;
1699651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      }
1709651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      try {
1719651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        throwImplicitAIOBE(array, -1);
1729651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res += 123;
1739651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (NullPointerException npe) {
1749651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res += 768;
1759651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (ArrayIndexOutOfBoundsException e) {
1769651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res += 456;
1779651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      }
1789651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      return res;
1799651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    }
1809651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers
1819651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    static int throwImplicitDivZero(int x, int y) {
1829651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      return x / y;
1839651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    }
1849651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers
1859651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    static int checkDivZero() {
1869651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      try {
1879651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        throwImplicitDivZero(100, 0);
1889651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        return 123;
1899651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (NullPointerException npe) {
1909651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        return 768;
1919651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (ArrayIndexOutOfBoundsException e) {
1929651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        return 987;
1939651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      } catch (ArithmeticException e) {
1949651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        return 456;
1959651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers      }
1969651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers    }
1979651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers
19843a364291dcdfe08e530e9568748359735dd7442buzbee    public static void main(String[] args) {
199bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom        boolean failure = false;
20043a364291dcdfe08e530e9568748359735dd7442buzbee        int res;
20143a364291dcdfe08e530e9568748359735dd7442buzbee
20243a364291dcdfe08e530e9568748359735dd7442buzbee        res = nullCheckTestNoThrow(1976);
20343a364291dcdfe08e530e9568748359735dd7442buzbee        if (res == 2054) {
20443a364291dcdfe08e530e9568748359735dd7442buzbee            System.out.println("nullCheckTestNoThrow PASSED");
20543a364291dcdfe08e530e9568748359735dd7442buzbee        } else {
20643a364291dcdfe08e530e9568748359735dd7442buzbee            System.out.println("nullCheckTestNoThrow FAILED: " + res);
207bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom            failure = true;
20843a364291dcdfe08e530e9568748359735dd7442buzbee        }
20943a364291dcdfe08e530e9568748359735dd7442buzbee
21043a364291dcdfe08e530e9568748359735dd7442buzbee        res = nullCheckTestThrow(1976);
21143a364291dcdfe08e530e9568748359735dd7442buzbee        if (res == 2057) {
212bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom            System.out.println("nullCheckTestThrow PASSED");
21343a364291dcdfe08e530e9568748359735dd7442buzbee        } else {
214bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom            System.out.println("nullCheckTestThrow FAILED: " + res);
215bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom            failure = true;
21643a364291dcdfe08e530e9568748359735dd7442buzbee        }
2179651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers
2189651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res = checkAIOBE();
2199651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        if (res == 912) {
2209651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers          System.out.println("checkAIOBE PASSED");
2219651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        } else {
2229651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers          System.out.println("checkAIOBE FAILED: " + res);
2239651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers          failure = true;
2249651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        }
2259651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers
2269651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        res = checkDivZero();
2279651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        if (res == 456) {
2289651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers          System.out.println("checkDivZero PASSED");
2299651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        } else {
2309651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers          System.out.println("checkDivZero FAILED: " + res);
2319651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers          failure = true;
2329651f425f7413772a7b5352da2b04eb7de7d416fIan Rogers        }
233bbf1e41e8d9b2446756e729f30c2501fb3e682c1Brian Carlstrom        System.exit(failure ? 1 : 0);
23443a364291dcdfe08e530e9568748359735dd7442buzbee    }
23543a364291dcdfe08e530e9568748359735dd7442buzbee}
236