• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 public class Main {
18 
19   // CHECK-START: int Main.div() licm (before)
20   // CHECK-DAG: Div ( loop_header:{{B\d+}} )
21 
22   // CHECK-START: int Main.div() licm (after)
23   // CHECK-NOT: Div ( loop_header:{{B\d+}} )
24 
25   // CHECK-START: int Main.div() licm (after)
26   // CHECK-DAG: Div ( loop_header:null )
27 
div()28   public static int div() {
29     int result = 0;
30     for (int i = 0; i < 10; ++i) {
31       result += staticField / 42;
32     }
33     return result;
34   }
35 
36   // CHECK-START: int Main.innerDiv() licm (before)
37   // CHECK-DAG: Div ( loop_header:{{B\d+}} )
38 
39   // CHECK-START: int Main.innerDiv() licm (after)
40   // CHECK-NOT: Div ( loop_header:{{B\d+}} )
41 
42   // CHECK-START: int Main.innerDiv() licm (after)
43   // CHECK-DAG: Div ( loop_header:null )
44 
innerDiv()45   public static int innerDiv() {
46     int result = 0;
47     for (int i = 0; i < 10; ++i) {
48       for (int j = 0; j < 10; ++j) {
49         result += staticField / 42;
50       }
51     }
52     return result;
53   }
54 
55   // CHECK-START: int Main.innerDiv2() licm (before)
56   // CHECK-DAG: Mul ( loop_header:{{B4}} )
57 
58   // CHECK-START: int Main.innerDiv2() licm (after)
59   // CHECK-DAG: Mul ( loop_header:{{B2}} )
60 
innerDiv2()61   public static int innerDiv2() {
62     int result = 0;
63     for (int i = 0; i < 10; ++i) {
64       for (int j = 0; j < 10; ++j) {
65         // The operation has been hoisted out of the inner loop.
66         // Note that we depend on the compiler's block numbering to
67         // check if it has been moved.
68         result += staticField * i;
69       }
70     }
71     return result;
72   }
73 
74   // CHECK-START: int Main.innerDiv3(int, int) licm (before)
75   // CHECK-DAG: Div ( loop_header:{{B\d+}} )
76 
77   // CHECK-START: int Main.innerDiv3(int, int) licm (after)
78   // CHECK-DAG: Div ( loop_header:{{B\d+}} )
79 
innerDiv3(int a, int b)80   public static int innerDiv3(int a, int b) {
81     int result = 0;
82     while (b < 5) {
83       // a might be null, so we can't hoist the operation.
84       result += staticField / a;
85       b++;
86     }
87     return result;
88   }
89 
90   // CHECK-START: int Main.arrayLength(int[]) licm (before)
91   // CHECK-DAG: [[NullCheck:l\d+]] NullCheck ( loop_header:{{B\d+}} )
92   // CHECK-DAG:                    ArrayLength [ [[NullCheck]] ] ( loop_header:{{B\d+}} )
93 
94   // CHECK-START: int Main.arrayLength(int[]) licm (after)
95   // CHECK-NOT:                    NullCheck ( loop_header:{{B\d+}} )
96   // CHECK-NOT:                    ArrayLength ( loop_header:{{B\d+}} )
97 
98   // CHECK-START: int Main.arrayLength(int[]) licm (after)
99   // CHECK-DAG: [[NullCheck:l\d+]] NullCheck ( loop_header:null )
100   // CHECK-DAG:                    ArrayLength [ [[NullCheck]] ] ( loop_header:null )
101 
arrayLength(int[] array)102   public static int arrayLength(int[] array) {
103     int result = 0;
104     for (int i = 0; i < array.length; ++i) {
105       result += array[i];
106     }
107     return result;
108   }
109 
110   public static int staticField = 42;
111 
assertEquals(int expected, int actual)112   public static void assertEquals(int expected, int actual) {
113     if (expected != actual) {
114       throw new Error("Expected " + expected + ", got " + actual);
115     }
116   }
117 
main(String[] args)118   public static void main(String[] args) {
119     assertEquals(10, div());
120     assertEquals(100, innerDiv());
121     assertEquals(12, arrayLength(new int[] { 4, 8 }));
122   }
123 }
124