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