blob: 350d9ad03123b872bc7f187ce807d8131bbdd04c [file] [log] [blame]
David Brazdilb3e773e2016-01-26 11:28:37 +00001/*
2 * Copyright (C) 2016 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
17public class Main {
18
Mark P Mendell2f10a5f2016-01-25 14:47:50 +000019 /// CHECK-START-X86: int Main.p(float) liveness (after)
20 /// CHECK: <<Arg:f\d+>> ParameterValue uses:[<<UseInput:\d+>>]
21 /// CHECK-DAG: <<Five:f\d+>> FloatConstant 5 uses:[<<UseInput>>]
22 /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0
23 /// CHECK-DAG: <<MinusOne:i\d+>> IntConstant -1 uses:[<<UseInput>>]
24 /// CHECK: <<Base:i\d+>> X86ComputeBaseMethodAddress uses:[<<UseInput>>]
25 /// CHECK-NEXT: <<Load:f\d+>> X86LoadFromConstantTable [<<Base>>,<<Five>>]
26 /// CHECK-NEXT: <<Cond:z\d+>> LessThanOrEqual [<<Arg>>,<<Load>>]
27 /// CHECK-NEXT: Select [<<Zero>>,<<MinusOne>>,<<Cond>>] liveness:<<LivSel:\d+>>
28 /// CHECK-EVAL: <<UseInput>> == <<LivSel>> + 1
29
30 public static int p(float arg) {
David Brazdil40e4ba22016-03-02 13:25:57 +000031 return (arg > 5.0f) ? 0 : -1;
Mark P Mendell2f10a5f2016-01-25 14:47:50 +000032 }
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010033
34 /// CHECK-START-{ARM,ARM64}: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
35 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[23,25]
Santiago Aboy Solanesf976aa82022-06-24 11:16:35 +010036 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,23,25,33]
37 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,23,25,33]
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010038 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[23,25]
39 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
40 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
41 /// CHECK-DAG: ArrayLength liveness:22
42 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
43 /// CHECK-DAG: TryBoundary
44
45 /// CHECK-START-{ARM,ARM64}-DEBUGGABLE: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
Santiago Aboy Solanesf976aa82022-06-24 11:16:35 +010046 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,23,25,33]
47 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,23,25,33]
48 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,23,25,33]
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010049 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[23,25]
50 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
51 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
52 /// CHECK-DAG: ArrayLength liveness:22
53 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
54 /// CHECK-DAG: TryBoundary
Mark P Mendell2f10a5f2016-01-25 14:47:50 +000055
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010056 // X86 and X86_64 generate at use site the ArrayLength, meaning only the BoundsCheck will have environment uses.
57 /// CHECK-START-{X86,X86_64}: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
Vladimir Markoee1f1262019-06-26 14:37:17 +010058 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[25,25]
Santiago Aboy Solanesf976aa82022-06-24 11:16:35 +010059 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,25,25,33]
60 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,25,25,33]
Vladimir Markoee1f1262019-06-26 14:37:17 +010061 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[25,25]
Artem Serovd6750532018-05-30 20:07:43 +010062 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
63 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010064 /// CHECK-DAG: ArrayLength liveness:22
Artem Serovd6750532018-05-30 20:07:43 +010065 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
66 /// CHECK-DAG: TryBoundary
67
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010068 /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testThrowIntoCatchBlock(int, java.lang.Object, int[]) liveness (after)
Santiago Aboy Solanesf976aa82022-06-24 11:16:35 +010069 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,25,25,33]
70 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,25,25,33]
71 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,25,25,33]
Vladimir Markoee1f1262019-06-26 14:37:17 +010072 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[25,25]
Artem Serovd6750532018-05-30 20:07:43 +010073 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
74 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010075 /// CHECK-DAG: ArrayLength liveness:22
Artem Serovd6750532018-05-30 20:07:43 +010076 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
77 /// CHECK-DAG: TryBoundary
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010078
Artem Serovd6750532018-05-30 20:07:43 +010079 //
80 // A value live at a throwing instruction in a try block may be copied by
81 // the exception handler to its location at the top of the catch block.
82 public static void testThrowIntoCatchBlock(int x, Object y, int[] a) {
83 try {
84 a[1] = x;
85 } catch (ArrayIndexOutOfBoundsException exception) {
86 }
87 }
88
Nicolas Geoffray90fdc482018-08-25 00:12:36 +010089 /// CHECK-START-{ARM,ARM64}: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
90 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[]
91 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,19,21]
92 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,19,21]
93 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[]
94 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
95 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:16
96 /// CHECK-DAG: ArrayLength liveness:18
97 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
98
99 /// CHECK-START-{ARM,ARM64}-DEBUGGABLE: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
100 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,19,21]
101 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,19,21]
102 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,19,21]
103 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[19,21]
104 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
105 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:16
106 /// CHECK-DAG: ArrayLength liveness:18
107 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
108
109 /// CHECK-START-{X86,X86_64}: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
Artem Serovd6750532018-05-30 20:07:43 +0100110 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[]
Vladimir Markoee1f1262019-06-26 14:37:17 +0100111 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,21,21]
112 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,21,21]
Artem Serovd6750532018-05-30 20:07:43 +0100113 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[]
114 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
115 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:16
Nicolas Geoffray90fdc482018-08-25 00:12:36 +0100116 /// CHECK-DAG: ArrayLength liveness:18
Artem Serovd6750532018-05-30 20:07:43 +0100117 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
118
Nicolas Geoffray90fdc482018-08-25 00:12:36 +0100119 /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testBoundsCheck(int, java.lang.Object, int[]) liveness (after)
Vladimir Markoee1f1262019-06-26 14:37:17 +0100120 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[11,21,21]
121 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[11,21,21]
122 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[11,21,21]
123 /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 env_uses:[21,21]
Artem Serovd6750532018-05-30 20:07:43 +0100124 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:10
125 /// CHECK-DAG: NullCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:16
Nicolas Geoffray90fdc482018-08-25 00:12:36 +0100126 /// CHECK-DAG: ArrayLength liveness:18
Artem Serovd6750532018-05-30 20:07:43 +0100127 /// CHECK-DAG: BoundsCheck env:[[<<Const1>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:20
128 public static void testBoundsCheck(int x, Object y, int[] a) {
129 a[1] = x;
130 }
131
132 /// CHECK-START: void Main.testDeoptimize(int, java.lang.Object, int[]) liveness (after)
133 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[25]
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +0100134 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[13,21,25]
135 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[13,21,25]
Artem Serovd6750532018-05-30 20:07:43 +0100136 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 env_uses:[25]
137 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:12
138 /// CHECK-DAG: NullCheck env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:18
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +0100139 /// CHECK-DAG: ArrayLength liveness:20
Artem Serovd6750532018-05-30 20:07:43 +0100140 /// CHECK-DAG: Deoptimize env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
Nicolas Geoffray90fdc482018-08-25 00:12:36 +0100141
142 /// CHECK-START-{ARM,ARM64}-DEBUGGABLE: void Main.testDeoptimize(int, java.lang.Object, int[]) liveness (after)
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +0100143 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[13,21,25]
144 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[13,21,25]
145 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[13,21,25]
Nicolas Geoffray90fdc482018-08-25 00:12:36 +0100146 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 env_uses:[21,25]
147 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:12
148 /// CHECK-DAG: NullCheck env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:18
149 /// CHECK-DAG: ArrayLength liveness:20
150 /// CHECK-DAG: Deoptimize env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
151
152 /// CHECK-START-{X86,X86_64}-DEBUGGABLE: void Main.testDeoptimize(int, java.lang.Object, int[]) liveness (after)
153 /// CHECK-DAG: <<IntArg:i\d+>> ParameterValue env_uses:[13,21,25]
154 /// CHECK-DAG: <<RefArg:l\d+>> ParameterValue env_uses:[13,21,25]
155 /// CHECK-DAG: <<Array:l\d+>> ParameterValue env_uses:[13,21,25]
156 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 env_uses:[21,25]
Artem Serovd6750532018-05-30 20:07:43 +0100157 /// CHECK-DAG: SuspendCheck env:[[_,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:12
158 /// CHECK-DAG: NullCheck env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:18
Nicolas Geoffray61ba8d22018-08-07 09:55:57 +0100159 /// CHECK-DAG: ArrayLength liveness:20
Artem Serovd6750532018-05-30 20:07:43 +0100160 /// CHECK-DAG: Deoptimize env:[[<<Const0>>,<<IntArg>>,<<RefArg>>,<<Array>>]] liveness:24
161 //
162 // A value that's not live in compiled code may still be needed in interpreter,
163 // due to code motion, etc.
164 public static void testDeoptimize(int x, Object y, int[] a) {
165 a[0] = x;
166 a[1] = x;
167 }
168
169
David Brazdilb3e773e2016-01-26 11:28:37 +0000170 /// CHECK-START: void Main.main(java.lang.String[]) liveness (after)
171 /// CHECK: <<X:i\d+>> ArrayLength uses:[<<UseInput:\d+>>]
172 /// CHECK: <<Y:i\d+>> StaticFieldGet uses:[<<UseInput>>]
173 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [<<X>>,<<Y>>]
174 /// CHECK-NEXT: If [<<Cond>>] liveness:<<LivIf:\d+>>
175 /// CHECK-EVAL: <<UseInput>> == <<LivIf>> + 1
176
177 public static void main(String[] args) {
178 int x = args.length;
179 int y = field;
180 if (x > y) {
181 System.nanoTime();
182 }
Artem Serovd6750532018-05-30 20:07:43 +0100183
184 int val = 14;
185 int[] array = new int[2];
186 Integer intObj = Integer.valueOf(0);
187 testThrowIntoCatchBlock(val, intObj, array);
188 testBoundsCheck(val, intObj, array);
189 testDeoptimize(val, intObj, array);
David Brazdilb3e773e2016-01-26 11:28:37 +0000190 }
191
Artem Serovd6750532018-05-30 20:07:43 +0100192
David Brazdilb3e773e2016-01-26 11:28:37 +0000193 public static int field = 42;
194}