/*
|
* Copyright (C) 2016 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.
|
*/
|
|
import java.util.Arrays;
|
|
// Modified from a fuzz test.
|
public class Main {
|
|
private interface X {
|
int x();
|
}
|
|
private class A {
|
public int a() {
|
return (+ (Math.multiplyExact(mI, mI)));
|
}
|
}
|
|
private class B extends A implements X {
|
public int a() {
|
return super.a() + ((int) (Math.max(364746077.0f, ((float) mD))));
|
}
|
public int x() {
|
return (mI >> (mI++));
|
}
|
}
|
|
private static class C implements X {
|
public static int s() {
|
return 671468641;
|
}
|
public int c() {
|
return -383762838;
|
}
|
public int x() {
|
return -138813312;
|
}
|
}
|
|
private A mA = new B();
|
private B mB = new B();
|
private X mBX = new B();
|
private C mC = new C();
|
private X mCX = new C();
|
|
private boolean mZ = false;
|
private int mI = 0;
|
private long mJ = 0;
|
private float mF = 0;
|
private double mD = 0;
|
|
private boolean[] mArray = new boolean[576];
|
|
private Main() {
|
boolean a = false;
|
for (int i0 = 0; i0 < 576; i0++) {
|
mArray[i0] = a;
|
a = !a;
|
}
|
}
|
|
/// CHECK-START: float Main.testMethod() load_store_elimination (before)
|
/// CHECK-DAG: Deoptimize
|
/// CHECK-DAG: Deoptimize
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: ConstructorFence
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: NewInstance
|
/// CHECK-DAG: NewInstance
|
/// CHECK-NOT: NewInstance
|
|
/// CHECK-START: float Main.testMethod() load_store_elimination (after)
|
/// CHECK-DAG: Deoptimize
|
/// CHECK-DAG: Deoptimize
|
/// CHECK-NOT: NewInstance
|
/// CHECK-NOT: ConstructorFence
|
|
private float testMethod() {
|
{
|
// Each of the "new" statements here will initialize an object with final fields,
|
// which after inlining will also retain a constructor fence.
|
//
|
// After LSE we remove the 'new-instance' and the associated constructor fence.
|
int lI0 = (-1456058746 << mI);
|
mD = ((double)(int)(double) mD);
|
for (int i0 = 56 - 1; i0 >= 0; i0--) {
|
mArray[i0] &= (Boolean.logicalOr(((true ? ((boolean) new Boolean((mZ))) : mZ) || mArray[i0]), (mZ)));
|
mF *= (mF * mF);
|
if ((mZ ^ true)) {
|
mF *= ((float)(int)(float) 267827331.0f);
|
mZ ^= ((false & ((boolean) new Boolean(false))) | mZ);
|
for (int i1 = 576 - 1; i1 >= 0; i1--) {
|
mZ &= ((mArray[279]) | ((boolean) new Boolean(true)));
|
mD -= (--mD);
|
for (int i2 = 56 - 1; i2 >= 0; i2--) {
|
mF /= (mF - mF);
|
mI = (Math.min(((int) new Integer(mI)), (766538816 * (++mI))));
|
mF += (mZ ? (mB.a()) : ((! mZ) ? -752042357.0f : (++mF)));
|
mJ |= ((long) new Long((-2084191070L + (mJ | mJ))));
|
lI0 |= ((int) new Integer(((int) new Integer(mI))));
|
if (((boolean) new Boolean(false))) {
|
mZ &= (mZ);
|
mF *= (mF--);
|
mD = (Double.POSITIVE_INFINITY);
|
mF += ((float)(int)(float) (-2026938813.0f * 638401585.0f));
|
mJ = (--mJ);
|
for (int i3 = 56 - 1; i3 >= 0; i3--) {
|
mI &= (- mI);
|
mD = (--mD);
|
mArray[426] = (mZ || false);
|
mF -= (((this instanceof Main) ? mF : mF) + 976981405.0f);
|
mZ &= ((mZ) & (this instanceof Main));
|
}
|
mZ ^= (Float.isFinite(-1975953895.0f));
|
} else {
|
mJ /= ((long) (Math.nextDown(-1519600008.0f)));
|
mJ <<= (Math.round(1237681786.0));
|
}
|
}
|
mArray[i0] &= (false || ((1256071300.0f != -353296391.0f) ? false : (mZ ^ mArray[i0])));
|
mF *= (+ ((float) mD));
|
for (int i2 = 0; i2 < 576; i2++) {
|
mD *= ((double) lI0);
|
lI0 = (lI0 & (Integer.MIN_VALUE));
|
mF -= (--mF);
|
}
|
if ((this instanceof Main)) {
|
mZ ^= ((boolean) new Boolean(true));
|
} else {
|
{
|
int lI1 = (mZ ? (--lI0) : 1099574344);
|
mJ >>= (Math.incrementExact(mJ));
|
mJ = (~ -2103354070L);
|
}
|
}
|
}
|
} else {
|
mJ *= (- ((long) new Long(479832084L)));
|
mJ %= (Long.MAX_VALUE);
|
mD /= (--mD);
|
if ((mI > ((mBX.x()) << mI))) {
|
{
|
long lJ0 = (mJ--);
|
mI >>>= (mBX.x());
|
}
|
mF = (+ 505094603.0f);
|
mD *= (((boolean) new Boolean((! false))) ? mD : 1808773781.0);
|
mI *= (Integer.MIN_VALUE);
|
for (int i1 = 576 - 1; i1 >= 0; i1--) {
|
if (((boolean) new Boolean(false))) {
|
mD += ((double)(float)(double) -1051436901.0);
|
} else {
|
mF -= ((float)(int)(float) (Float.min(mF, (mF--))));
|
}
|
for (int i2 = 0; i2 < 576; i2++) {
|
mJ -= ((long) new Long(-1968644857L));
|
mJ ^= (+ (mC.s()));
|
}
|
}
|
} else {
|
mF -= ((- mF) + -2145489966.0f);
|
}
|
mD -= (mD++);
|
mD = (949112777.0 * 1209996119.0);
|
}
|
mZ &= (Boolean.logicalAnd(true, ((mZ) & (((boolean) new Boolean(true)) && true))));
|
}
|
}
|
return ((float) 964977619L);
|
}
|
|
public static void main(String[] args) {
|
System.out.println("Start....");
|
Main t = new Main();
|
float r = 1883600237.0f;
|
try {
|
r = t.testMethod();
|
} catch (Exception e) {
|
// Arithmetic, null pointer, index out of bounds, etc.
|
System.out.println("An exception was caught.");
|
}
|
System.out.println("r = " + r);
|
System.out.println("mZ = " + t.mZ);
|
System.out.println("mI = " + t.mI);
|
System.out.println("mJ = " + t.mJ);
|
System.out.println("mF = " + t.mF);
|
System.out.println("mD = " + t.mD);
|
System.out.println("Done....");
|
}
|
}
|