blob: aad61e254dd83113dcba90713d242696338b1735 [file] [log] [blame]
/*
* 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.
*/
/**
* Regression test on ARM-scheduling/array-aliasing bug (b/64018485).
*/
public class Main {
//
// Mimic original bug.
//
static void setFields(int[] fields) {
if (fields == null || fields.length < 6)
fields = new int[6]; // creates phi
fields[5] = 127;
}
static void processFieldValues(int field0, int field1, int field2,
int field3, int field4, int field5) {
if (field5 != 127) {
throw new Error("field = " + field5);
} else if (field0 != 0) {
processFieldValues(0, 0, 0, 0, 0, 0); // disable inlining
}
}
static int doit(int pass) {
int[] fields = new int[6];
for (; ; pass++) {
setFields(fields);
processFieldValues(fields[0], fields[1], fields[2],
fields[3], fields[4], fields[5]);
if (pass == 0)
break;
}
return fields[5];
}
//
// Similar situation.
//
private static int aliasing(boolean f) {
int[] array = new int[6];
int[] array2 = null;
int s = 0;
for (int i = 0; i < 1; i++) {
if (f) {
array2 = array;
}
array2[1] = 4;
s = array[1];
}
return s;
}
//
// Main driver.
//
static public void main(String[] args) {
int r = doit(0);
int s = aliasing(true);
System.out.println("passed " + r + " " + s);
}
}