Main.java revision a06d66a4ee60926127b9498b7ff0b3e37a24fccf
182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray/*
282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* Copyright (C) 2015 The Android Open Source Project
382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray*
482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* Licensed under the Apache License, Version 2.0 (the "License");
582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* you may not use this file except in compliance with the License.
682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* You may obtain a copy of the License at
782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray*
882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray*      http://www.apache.org/licenses/LICENSE-2.0
982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray*
1082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* Unless required by applicable law or agreed to in writing, software
1182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* distributed under the License is distributed on an "AS IS" BASIS,
1282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* See the License for the specific language governing permissions and
1482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray* limitations under the License.
1582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray*/
1682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
1782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffraypublic class Main {
1882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
19a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.div() licm (before)
20a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Div loop:{{B\d+}}
2182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
22a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.div() licm (after)
23a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Div loop:{{B\d+}}
2482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
25a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.div() licm (after)
26a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Div loop:none
2782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
2882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static int div() {
2982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    int result = 0;
3082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    for (int i = 0; i < 10; ++i) {
3182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      result += staticField / 42;
3282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    }
3382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    return result;
3482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
3582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
36a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv() licm (before)
37a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Div loop:{{B\d+}}
3882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
39a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv() licm (after)
40a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Div loop:{{B\d+}}
4182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
42a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv() licm (after)
43a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Div loop:none
4482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
4582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static int innerDiv() {
4682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    int result = 0;
4782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    for (int i = 0; i < 10; ++i) {
4882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      for (int j = 0; j < 10; ++j) {
4982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray        result += staticField / 42;
5082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      }
5182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    }
5282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    return result;
5382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
5482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
55a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv2() licm (before)
56a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Mul loop:B4
5782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
58a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv2() licm (after)
59a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Mul loop:B2
6082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
6182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static int innerDiv2() {
6282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    int result = 0;
6382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    for (int i = 0; i < 10; ++i) {
6482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      for (int j = 0; j < 10; ++j) {
6582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray        // The operation has been hoisted out of the inner loop.
6682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray        // Note that we depend on the compiler's block numbering to
6782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray        // check if it has been moved.
6882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray        result += staticField * i;
6982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      }
7082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    }
7182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    return result;
7282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
7382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
74a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv3(int, int) licm (before)
75a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Div loop:{{B\d+}}
7682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
77a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.innerDiv3(int, int) licm (after)
78a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: Div loop:{{B\d+}}
7982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
8082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static int innerDiv3(int a, int b) {
8182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    int result = 0;
8282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    while (b < 5) {
8382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      // a might be null, so we can't hoist the operation.
8482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      result += staticField / a;
8582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      b++;
8682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    }
8782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    return result;
8882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
8982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
90a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.arrayLength(int[]) licm (before)
91a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: <<NullCheck:l\d+>> NullCheck loop:{{B\d+}}
92a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG:                    ArrayLength [<<NullCheck>>] loop:{{B\d+}}
9382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
94a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.arrayLength(int[]) licm (after)
95a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:                    NullCheck loop:{{B\d+}}
96a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT:                    ArrayLength loop:{{B\d+}}
9782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
98a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.arrayLength(int[]) licm (after)
99a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG: <<NullCheck:l\d+>> NullCheck loop:none
100a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-DAG:                    ArrayLength [<<NullCheck>>] loop:none
10182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
10282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static int arrayLength(int[] array) {
10382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    int result = 0;
10482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    for (int i = 0; i < array.length; ++i) {
10582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      result += array[i];
10682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    }
10782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    return result;
10882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
10982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
11082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static int staticField = 42;
11182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
11282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static void assertEquals(int expected, int actual) {
11382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    if (expected != actual) {
11482091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray      throw new Error("Expected " + expected + ", got " + actual);
11582091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    }
11682091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
11782091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray
11882091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  public static void main(String[] args) {
11982091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    assertEquals(10, div());
12082091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    assertEquals(100, innerDiv());
12182091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray    assertEquals(12, arrayLength(new int[] { 4, 8 }));
12282091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray  }
12382091dad38f3e5bfaf3b6984c9ab73069fb68310Nicolas Geoffray}
124