HELLO·Android
系统源代码
IT资讯
技术文章
我的收藏
注册
登录
-
我收藏的文章
创建代码块
我的代码块
我的账号
Pie
|
9.0.0_r8
下载
查看原文件
收藏
根目录
art
test
669-checker-break
src
Main.java
/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Tests for optimizations of break-loops, i.e. loops that break * out of a while-true loop when the end condition is satisfied. * In particular, the tests focus on break-loops that can be * rewritten into regular countable loops (this may improve certain * loops generated by the Kotlin compiler for inclusive ranges). */ public class Main { /// CHECK-START: int Main.breakLoop(int[]) induction_var_analysis (before) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 0 loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NotEqual [{{i\d+}},<
>] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none // /// CHECK-START: int Main.breakLoop(int[]) induction_var_analysis (after) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 0 loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> LessThanOrEqual [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none // /// CHECK-START-ARM64: int Main.breakLoop(int[]) loop_optimization (after) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> IntConstant 4 loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:none /// CHECK-DAG: <
> VecReplicateScalar [<
>] loop:none /// CHECK-DAG: VecStore [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: Add [<
>,<
>] loop:<
> outer_loop:none static int breakLoop(int[] a) { int l = 0; int u = a.length - 1; int i = l; if (l <= u) { while (true) { a[i] = 1; if (i == u) break; i++; } } return i; } /// CHECK-START: int Main.breakLoopDown(int[]) induction_var_analysis (before) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 0 loop:none /// CHECK-DAG: <
> IntConstant -1 loop:none /// CHECK-DAG: <
> IntConstant 2 loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:none /// CHECK-DAG: <
> Phi [{{i\d+}},<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NotEqual [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none // /// CHECK-START: int Main.breakLoopDown(int[]) induction_var_analysis (after) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 0 loop:none /// CHECK-DAG: <
> IntConstant -1 loop:none /// CHECK-DAG: <
> IntConstant 2 loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:none /// CHECK-DAG: <
> Phi [{{i\d+}},<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> GreaterThanOrEqual [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none static int breakLoopDown(int[] a) { int l = 0; int u = a.length - 1; int i = u; if (u >= l) { while (true) { a[i] = 2; if (i == l) break; i--; } } return i; } /// CHECK-START: int Main.breakLoopSafeConst(int[]) induction_var_analysis (before) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> IntConstant 3 loop:none /// CHECK-DAG: <
> IntConstant 2147483631 loop:none /// CHECK-DAG: <
> IntConstant 2147483646 loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Sub [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NotEqual [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none // /// CHECK-START: int Main.breakLoopSafeConst(int[]) induction_var_analysis (after) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> IntConstant 3 loop:none /// CHECK-DAG: <
> IntConstant 2147483631 loop:none /// CHECK-DAG: <
> IntConstant 2147483646 loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> LessThanOrEqual [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Sub [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none // /// CHECK-START-ARM64: int Main.breakLoopSafeConst(int[]) loop_optimization (after) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> IntConstant 3 loop:none /// CHECK-DAG: <
> IntConstant 4 loop:none /// CHECK-DAG: <
> VecReplicateScalar [<
>] loop:none /// CHECK-DAG: VecStore [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: Add [<
>,<
>] loop:<
> outer_loop:none static int breakLoopSafeConst(int[] a) { int l = Integer.MAX_VALUE - 16; int u = Integer.MAX_VALUE - 1; int i = l; if (l <= u) { // will be removed by simplifier while (true) { a[i - l] = 3; if (i == u) break; i++; } } return i; } /// CHECK-START: int Main.breakLoopUnsafeConst(int[]) induction_var_analysis (before) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> IntConstant 4 loop:none /// CHECK-DAG: <
> IntConstant 2147483632 loop:none /// CHECK-DAG: <
> IntConstant 2147483647 loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Sub [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NotEqual [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Add [<
>,<
>] loop:<
> outer_loop:none // /// CHECK-START: int Main.breakLoopUnsafeConst(int[]) induction_var_analysis (after) /// CHECK-DAG: NotEqual /// CHECK-NOT: LessThanOrEqual static int breakLoopUnsafeConst(int[] a) { int l = Integer.MAX_VALUE - 15; int u = Integer.MAX_VALUE; int i = l; if (l <= u) { // will be removed by simplifier while (true) { a[i - l] = 4; if (i == u) break; // rewriting exit not safe! i++; } } return i; } /// CHECK-START: int Main.breakLoopNastyPhi(int[]) induction_var_analysis (before) /// CHECK-DAG: <
> ParameterValue loop:none /// CHECK-DAG: <
> IntConstant 0 loop:none /// CHECK-DAG: <
> IntConstant 1 loop:none /// CHECK-DAG: <
> IntConstant 5 loop:none /// CHECK-DAG: <
> IntConstant -123 loop:none /// CHECK-DAG: <
> NullCheck [<
>] loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> Phi [<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> BoundsCheck [<
>,{{i\d+}}] loop:<
> outer_loop:none /// CHECK-DAG: ArraySet [<
>,<
>,<
>] loop:<
> outer_loop:none /// CHECK-DAG: <
> NotEqual [{{i\d+}},<
>] loop:<
> outer_loop:none /// CHECK-DAG: If [<
>] loop:<
> outer_loop:none /// CHECK-DAG: <