270 lines
8.5 KiB
Java
270 lines
8.5 KiB
Java
/*
|
|
* Copyright (C) 2014 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.
|
|
*/
|
|
|
|
public class Main {
|
|
|
|
/// CHECK-START: void Main.InlineVoid() inliner (before)
|
|
/// CHECK-DAG: <<Const42:i\d+>> IntConstant 42
|
|
/// CHECK-DAG: InvokeStaticOrDirect
|
|
/// CHECK-DAG: InvokeStaticOrDirect [<<Const42>>{{(,[ij]\d+)?}}]
|
|
|
|
/// CHECK-START: void Main.InlineVoid() inliner (after)
|
|
/// CHECK-NOT: InvokeStaticOrDirect
|
|
|
|
public static void InlineVoid() {
|
|
returnVoid();
|
|
returnVoidWithOneParameter(42);
|
|
}
|
|
|
|
/// CHECK-START: int Main.InlineParameter(int) inliner (before)
|
|
/// CHECK-DAG: <<Param:i\d+>> ParameterValue
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect [<<Param>>{{(,[ij]\d+)?}}]
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: int Main.InlineParameter(int) inliner (after)
|
|
/// CHECK-DAG: <<Param:i\d+>> ParameterValue
|
|
/// CHECK-DAG: Return [<<Param>>]
|
|
|
|
public static int InlineParameter(int a) {
|
|
return returnParameter(a);
|
|
}
|
|
|
|
/// CHECK-START: long Main.InlineWideParameter(long) inliner (before)
|
|
/// CHECK-DAG: <<Param:j\d+>> ParameterValue
|
|
/// CHECK-DAG: <<Result:j\d+>> InvokeStaticOrDirect [<<Param>>{{(,[ij]\d+)?}}]
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: long Main.InlineWideParameter(long) inliner (after)
|
|
/// CHECK-DAG: <<Param:j\d+>> ParameterValue
|
|
/// CHECK-DAG: Return [<<Param>>]
|
|
|
|
public static long InlineWideParameter(long a) {
|
|
return returnWideParameter(a);
|
|
}
|
|
|
|
/// CHECK-START: java.lang.Object Main.InlineReferenceParameter(java.lang.Object) inliner (before)
|
|
/// CHECK-DAG: <<Param:l\d+>> ParameterValue
|
|
/// CHECK-DAG: <<Result:l\d+>> InvokeStaticOrDirect [<<Param>>{{(,[ij]\d+)?}}]
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: java.lang.Object Main.InlineReferenceParameter(java.lang.Object) inliner (after)
|
|
/// CHECK-DAG: <<Param:l\d+>> ParameterValue
|
|
/// CHECK-DAG: Return [<<Param>>]
|
|
|
|
public static Object InlineReferenceParameter(Object o) {
|
|
return returnReferenceParameter(o);
|
|
}
|
|
|
|
/// CHECK-START: int Main.InlineInt() inliner (before)
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: int Main.InlineInt() inliner (after)
|
|
/// CHECK-DAG: <<Const4:i\d+>> IntConstant 4
|
|
/// CHECK-DAG: Return [<<Const4>>]
|
|
|
|
public static int InlineInt() {
|
|
return returnInt();
|
|
}
|
|
|
|
/// CHECK-START: long Main.InlineWide() inliner (before)
|
|
/// CHECK-DAG: <<Result:j\d+>> InvokeStaticOrDirect
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: long Main.InlineWide() inliner (after)
|
|
/// CHECK-DAG: <<Const8:j\d+>> LongConstant 8
|
|
/// CHECK-DAG: Return [<<Const8>>]
|
|
|
|
public static long InlineWide() {
|
|
return returnWide();
|
|
}
|
|
|
|
/// CHECK-START: int Main.InlineAdd() inliner (before)
|
|
/// CHECK-DAG: <<Const3:i\d+>> IntConstant 3
|
|
/// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: int Main.InlineAdd() inliner (after)
|
|
/// CHECK-DAG: <<Const8:i\d+>> IntConstant 8
|
|
/// CHECK-DAG: Return [<<Const8>>]
|
|
|
|
public static int InlineAdd() {
|
|
return returnAdd(3, 5);
|
|
}
|
|
|
|
/// CHECK-START: int Main.InlineFieldAccess() inliner (before)
|
|
/// CHECK-DAG: <<After:i\d+>> InvokeStaticOrDirect
|
|
/// CHECK-DAG: Return [<<After>>]
|
|
|
|
/// CHECK-START: int Main.InlineFieldAccess() inliner (after)
|
|
/// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
|
|
/// CHECK-DAG: <<Before:i\d+>> StaticFieldGet
|
|
/// CHECK-DAG: <<After:i\d+>> Add [<<Before>>,<<Const1>>]
|
|
/// CHECK-DAG: StaticFieldSet [{{l\d+}},<<After>>]
|
|
/// CHECK-DAG: Return [<<After>>]
|
|
|
|
/// CHECK-START: int Main.InlineFieldAccess() inliner (after)
|
|
/// CHECK-NOT: InvokeStaticOrDirect
|
|
|
|
public static int InlineFieldAccess() {
|
|
return incCounter();
|
|
}
|
|
|
|
/// CHECK-START: int Main.InlineWithControlFlow(boolean) inliner (before)
|
|
/// CHECK-DAG: <<Const1:i\d+>> IntConstant 1
|
|
/// CHECK-DAG: <<Const3:i\d+>> IntConstant 3
|
|
/// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
|
|
/// CHECK-DAG: <<Add:i\d+>> InvokeStaticOrDirect [<<Const1>>,<<Const3>>{{(,[ij]\d+)?}}]
|
|
/// CHECK-DAG: <<Sub:i\d+>> InvokeStaticOrDirect [<<Const5>>,<<Const3>>{{(,[ij]\d+)?}}]
|
|
/// CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>]
|
|
/// CHECK-DAG: Return [<<Phi>>]
|
|
|
|
/// CHECK-START: int Main.InlineWithControlFlow(boolean) inliner (after)
|
|
/// CHECK-DAG: <<Const4:i\d+>> IntConstant 4
|
|
/// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
|
|
/// CHECK-DAG: <<Phi:i\d+>> Phi [<<Const4>>,<<Const2>>]
|
|
/// CHECK-DAG: Return [<<Phi>>]
|
|
|
|
public static int InlineWithControlFlow(boolean cond) {
|
|
int x, const1, const3, const5;
|
|
const1 = 1;
|
|
const3 = 3;
|
|
const5 = 5;
|
|
if (cond) {
|
|
x = returnAdd(const1, const3);
|
|
} else {
|
|
x = returnSub(const5, const3);
|
|
}
|
|
return x;
|
|
}
|
|
|
|
/// CHECK-START: int Main.returnAbs(int) intrinsics_recognition (before)
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: int Main.returnAbs(int) intrinsics_recognition (after)
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect intrinsic:MathAbsInt
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
private static int returnAbs(int i) {
|
|
return Math.abs(i);
|
|
}
|
|
|
|
/// CHECK-START: int Main.InlinedIntrinsicsAreStillIntrinsic() inliner (before)
|
|
/// CHECK-DAG: <<ConstMinus1:i\d+>> IntConstant -1
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
/// CHECK-START: int Main.InlinedIntrinsicsAreStillIntrinsic() inliner (after)
|
|
/// CHECK-DAG: <<ConstMinus1:i\d+>> IntConstant -1
|
|
/// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect intrinsic:MathAbsInt
|
|
/// CHECK-DAG: Return [<<Result>>]
|
|
|
|
public static int InlinedIntrinsicsAreStillIntrinsic() {
|
|
return returnAbs(-1);
|
|
}
|
|
|
|
private static void returnVoid() {
|
|
return;
|
|
}
|
|
|
|
private static void returnVoidWithOneParameter(int a) {
|
|
return;
|
|
}
|
|
|
|
private static int returnParameter(int a) {
|
|
return a;
|
|
}
|
|
|
|
private static long returnWideParameter(long a) {
|
|
return a;
|
|
}
|
|
|
|
private static Object returnReferenceParameter(Object o) {
|
|
return o;
|
|
}
|
|
|
|
private static int returnInt() {
|
|
return 4;
|
|
}
|
|
|
|
private static long returnWide() {
|
|
return 8L;
|
|
}
|
|
|
|
private static int returnAdd(int a, int b) {
|
|
return a + b;
|
|
}
|
|
|
|
private static int returnSub(int a, int b) {
|
|
return a - b;
|
|
}
|
|
|
|
private static int counter = 42;
|
|
|
|
private static int incCounter() {
|
|
return ++counter;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
InlineVoid();
|
|
|
|
if (InlineInt() != 4) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineWide() != 8L) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineParameter(42) != 42) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineWideParameter(0x100000001L) != 0x100000001L) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineReferenceParameter(Main.class) != Main.class) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineAdd() != 8) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineFieldAccess() != 43 || InlineFieldAccess() != 44) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineWithControlFlow(true) != 4) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlineWithControlFlow(false) != 2) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (InlinedIntrinsicsAreStillIntrinsic() != 1) {
|
|
throw new Error();
|
|
}
|
|
|
|
if (returnAbs(-1) != 1) {
|
|
throw new Error();
|
|
}
|
|
}
|
|
}
|