| /* |
| * Copyright (C) 2015 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. |
| */ |
| |
| // |
| // Test on (in)variant static and instance field and array references in loops. |
| // |
| public class Main { |
| |
| private static Object anObject = new Object(); |
| private static Object anotherObject = new Object(); |
| |
| // |
| // Static fields. |
| // |
| |
| private static boolean sZ; |
| private static byte sB; |
| private static char sC; |
| private static short sS; |
| private static int sI; |
| private static long sJ; |
| private static float sF; |
| private static double sD; |
| private static Object sL; |
| |
| // |
| // Static arrays. |
| // |
| |
| private static boolean[] sArrZ; |
| private static byte[] sArrB; |
| private static char[] sArrC; |
| private static short[] sArrS; |
| private static int[] sArrI; |
| private static long[] sArrJ; |
| private static float[] sArrF; |
| private static double[] sArrD; |
| private static Object[] sArrL; |
| |
| // |
| // Instance fields. |
| // |
| |
| private boolean mZ; |
| private byte mB; |
| private char mC; |
| private short mS; |
| private int mI; |
| private long mJ; |
| private float mF; |
| private double mD; |
| private Object mL; |
| |
| // |
| // Instance arrays. |
| // |
| |
| private boolean[] mArrZ; |
| private byte[] mArrB; |
| private char[] mArrC; |
| private short[] mArrS; |
| private int[] mArrI; |
| private long[] mArrJ; |
| private float[] mArrF; |
| private double[] mArrD; |
| private Object[] mArrL; |
| |
| // |
| // Loops on static arrays with invariant static field references. |
| // The checker is used to ensure hoisting occurred. |
| // |
| |
| /// CHECK-START: void Main.SInvLoopZ() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopZ() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopZ() { |
| for (int i = 0; i < sArrZ.length; i++) { |
| sArrZ[i] = sZ; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopB() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopB() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopB() { |
| for (int i = 0; i < sArrB.length; i++) { |
| sArrB[i] = sB; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopC() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopC() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopC() { |
| for (int i = 0; i < sArrC.length; i++) { |
| sArrC[i] = sC; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopS() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopS() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopS() { |
| for (int i = 0; i < sArrS.length; i++) { |
| sArrS[i] = sS; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopI() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopI() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopI() { |
| for (int i = 0; i < sArrI.length; i++) { |
| sArrI[i] = sI; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopJ() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopJ() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopJ() { |
| for (int i = 0; i < sArrJ.length; i++) { |
| sArrJ[i] = sJ; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopF() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopF() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopF() { |
| for (int i = 0; i < sArrF.length; i++) { |
| sArrF[i] = sF; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopD() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopD() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopD() { |
| for (int i = 0; i < sArrD.length; i++) { |
| sArrD[i] = sD; |
| } |
| } |
| |
| /// CHECK-START: void Main.SInvLoopL() licm (before) |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: StaticFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SInvLoopL() licm (after) |
| /// CHECK-DAG: StaticFieldGet loop:none |
| /// CHECK-DAG: StaticFieldGet loop:none |
| |
| private static void SInvLoopL() { |
| for (int i = 0; i < sArrL.length; i++) { |
| sArrL[i] = sL; |
| } |
| } |
| |
| // |
| // Loops on static arrays with variant static field references. |
| // Incorrect hoisting is detected by incorrect outcome. |
| // |
| |
| private static void SVarLoopZ() { |
| for (int i = 0; i < sArrZ.length; i++) { |
| sArrZ[i] = sZ; |
| if (i == 10) |
| sZ = !sZ; |
| } |
| } |
| |
| private static void SVarLoopB() { |
| for (int i = 0; i < sArrB.length; i++) { |
| sArrB[i] = sB; |
| if (i == 10) |
| sB++; |
| } |
| } |
| |
| private static void SVarLoopC() { |
| for (int i = 0; i < sArrC.length; i++) { |
| sArrC[i] = sC; |
| if (i == 10) |
| sC++; |
| } |
| } |
| |
| private static void SVarLoopS() { |
| for (int i = 0; i < sArrS.length; i++) { |
| sArrS[i] = sS; |
| if (i == 10) |
| sS++; |
| } |
| } |
| |
| private static void SVarLoopI() { |
| for (int i = 0; i < sArrI.length; i++) { |
| sArrI[i] = sI; |
| if (i == 10) |
| sI++; |
| } |
| } |
| |
| private static void SVarLoopJ() { |
| for (int i = 0; i < sArrJ.length; i++) { |
| sArrJ[i] = sJ; |
| if (i == 10) |
| sJ++; |
| } |
| } |
| |
| private static void SVarLoopF() { |
| for (int i = 0; i < sArrF.length; i++) { |
| sArrF[i] = sF; |
| if (i == 10) |
| sF++; |
| } |
| } |
| |
| private static void SVarLoopD() { |
| for (int i = 0; i < sArrD.length; i++) { |
| sArrD[i] = sD; |
| if (i == 10) |
| sD++; |
| } |
| } |
| |
| private static void SVarLoopL() { |
| for (int i = 0; i < sArrL.length; i++) { |
| sArrL[i] = sL; |
| if (i == 10) |
| sL = anotherObject; |
| } |
| } |
| |
| // |
| // Loops on static arrays with a cross-over reference. |
| // Incorrect hoisting is detected by incorrect outcome. |
| // In addition, the checker is used to detect no hoisting. |
| // |
| |
| /// CHECK-START: void Main.SCrossOverLoopZ() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopZ() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopZ() { |
| for (int i = 0; i < sArrZ.length; i++) { |
| sArrZ[i] = !sArrZ[20]; |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopB() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopB() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopB() { |
| for (int i = 0; i < sArrB.length; i++) { |
| sArrB[i] = (byte)(sArrB[20] + 2); |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopC() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopC() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopC() { |
| for (int i = 0; i < sArrC.length; i++) { |
| sArrC[i] = (char)(sArrC[20] + 2); |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopS() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopS() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopS() { |
| for (int i = 0; i < sArrS.length; i++) { |
| sArrS[i] = (short)(sArrS[20] + 2); |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopI() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopI() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopI() { |
| for (int i = 0; i < sArrI.length; i++) { |
| sArrI[i] = sArrI[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopJ() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopJ() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopJ() { |
| for (int i = 0; i < sArrJ.length; i++) { |
| sArrJ[i] = sArrJ[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopF() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopF() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopF() { |
| for (int i = 0; i < sArrF.length; i++) { |
| sArrF[i] = sArrF[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopD() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopD() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopD() { |
| for (int i = 0; i < sArrD.length; i++) { |
| sArrD[i] = sArrD[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.SCrossOverLoopL() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.SCrossOverLoopL() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private static void SCrossOverLoopL() { |
| for (int i = 0; i < sArrL.length; i++) { |
| sArrL[i] = (sArrL[20] == anObject) ? anotherObject : anObject; |
| } |
| } |
| |
| // |
| // Loops on instance arrays with invariant instance field references. |
| // The checker is used to ensure hoisting occurred. |
| // |
| |
| /// CHECK-START: void Main.InvLoopZ() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopZ() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopZ() { |
| for (int i = 0; i < mArrZ.length; i++) { |
| mArrZ[i] = mZ; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopB() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopB() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopB() { |
| for (int i = 0; i < mArrB.length; i++) { |
| mArrB[i] = mB; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopC() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopC() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopC() { |
| for (int i = 0; i < mArrC.length; i++) { |
| mArrC[i] = mC; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopS() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopS() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopS() { |
| for (int i = 0; i < mArrS.length; i++) { |
| mArrS[i] = mS; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopI() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopI() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopI() { |
| for (int i = 0; i < mArrI.length; i++) { |
| mArrI[i] = mI; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopJ() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopJ() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopJ() { |
| for (int i = 0; i < mArrJ.length; i++) { |
| mArrJ[i] = mJ; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopF() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopF() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopF() { |
| for (int i = 0; i < mArrF.length; i++) { |
| mArrF[i] = mF; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopD() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopD() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopD() { |
| for (int i = 0; i < mArrD.length; i++) { |
| mArrD[i] = mD; |
| } |
| } |
| |
| /// CHECK-START: void Main.InvLoopL() licm (before) |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| /// CHECK-DAG: InstanceFieldGet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.InvLoopL() licm (after) |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| /// CHECK-DAG: InstanceFieldGet loop:none |
| |
| private void InvLoopL() { |
| for (int i = 0; i < mArrL.length; i++) { |
| mArrL[i] = mL; |
| } |
| } |
| |
| // |
| // Loops on instance arrays with variant instance field references. |
| // Incorrect hoisting is detected by incorrect outcome. |
| // |
| |
| private void VarLoopZ() { |
| for (int i = 0; i < mArrZ.length; i++) { |
| mArrZ[i] = mZ; |
| if (i == 10) |
| mZ = !mZ; |
| } |
| } |
| |
| private void VarLoopB() { |
| for (int i = 0; i < mArrB.length; i++) { |
| mArrB[i] = mB; |
| if (i == 10) |
| mB++; |
| } |
| } |
| |
| private void VarLoopC() { |
| for (int i = 0; i < mArrC.length; i++) { |
| mArrC[i] = mC; |
| if (i == 10) |
| mC++; |
| } |
| } |
| |
| private void VarLoopS() { |
| for (int i = 0; i < mArrS.length; i++) { |
| mArrS[i] = mS; |
| if (i == 10) |
| mS++; |
| } |
| } |
| |
| private void VarLoopI() { |
| for (int i = 0; i < mArrI.length; i++) { |
| mArrI[i] = mI; |
| if (i == 10) |
| mI++; |
| } |
| } |
| |
| private void VarLoopJ() { |
| for (int i = 0; i < mArrJ.length; i++) { |
| mArrJ[i] = mJ; |
| if (i == 10) |
| mJ++; |
| } |
| } |
| |
| private void VarLoopF() { |
| for (int i = 0; i < mArrF.length; i++) { |
| mArrF[i] = mF; |
| if (i == 10) |
| mF++; |
| } |
| } |
| |
| private void VarLoopD() { |
| for (int i = 0; i < mArrD.length; i++) { |
| mArrD[i] = mD; |
| if (i == 10) |
| mD++; |
| } |
| } |
| |
| private void VarLoopL() { |
| for (int i = 0; i < mArrL.length; i++) { |
| mArrL[i] = mL; |
| if (i == 10) |
| mL = anotherObject; |
| } |
| } |
| |
| // |
| // Loops on instance arrays with a cross-over reference. |
| // Incorrect hoisting is detected by incorrect outcome. |
| // In addition, the checker is used to detect no hoisting. |
| // |
| |
| /// CHECK-START: void Main.CrossOverLoopZ() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopZ() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopZ() { |
| for (int i = 0; i < mArrZ.length; i++) { |
| mArrZ[i] = !mArrZ[20]; |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopB() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopB() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopB() { |
| for (int i = 0; i < mArrB.length; i++) { |
| mArrB[i] = (byte)(mArrB[20] + 2); |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopC() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopC() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopC() { |
| for (int i = 0; i < mArrC.length; i++) { |
| mArrC[i] = (char)(mArrC[20] + 2); |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopS() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopS() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopS() { |
| for (int i = 0; i < mArrS.length; i++) { |
| mArrS[i] = (short)(mArrS[20] + 2); |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopI() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopI() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopI() { |
| for (int i = 0; i < mArrI.length; i++) { |
| mArrI[i] = mArrI[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopJ() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopJ() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopJ() { |
| for (int i = 0; i < mArrJ.length; i++) { |
| mArrJ[i] = mArrJ[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopF() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopF() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopF() { |
| for (int i = 0; i < mArrF.length; i++) { |
| mArrF[i] = mArrF[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopD() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopD() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopD() { |
| for (int i = 0; i < mArrD.length; i++) { |
| mArrD[i] = mArrD[20] + 2; |
| } |
| } |
| |
| /// CHECK-START: void Main.CrossOverLoopL() licm (before) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| /// CHECK-START: void Main.CrossOverLoopL() licm (after) |
| /// CHECK-DAG: ArrayGet loop:{{B\d+}} |
| /// CHECK-DAG: ArraySet loop:{{B\d+}} |
| |
| private void CrossOverLoopL() { |
| for (int i = 0; i < mArrL.length; i++) { |
| mArrL[i] = (mArrL[20] == anObject) ? anotherObject : anObject; |
| } |
| } |
| |
| // |
| // Driver and testers. |
| // |
| |
| public static void main(String[] args) { |
| DoStaticTests(); |
| new Main().DoInstanceTests(); |
| } |
| |
| private static void DoStaticTests() { |
| // Type Z. |
| sZ = true; |
| sArrZ = new boolean[100]; |
| SInvLoopZ(); |
| for (int i = 0; i < sArrZ.length; i++) { |
| expectEquals(true, sArrZ[i]); |
| } |
| SVarLoopZ(); |
| for (int i = 0; i < sArrZ.length; i++) { |
| expectEquals(i <= 10, sArrZ[i]); |
| } |
| SCrossOverLoopZ(); |
| for (int i = 0; i < sArrZ.length; i++) { |
| expectEquals(i <= 20, sArrZ[i]); |
| } |
| // Type B. |
| sB = 1; |
| sArrB = new byte[100]; |
| SInvLoopB(); |
| for (int i = 0; i < sArrB.length; i++) { |
| expectEquals(1, sArrB[i]); |
| } |
| SVarLoopB(); |
| for (int i = 0; i < sArrB.length; i++) { |
| expectEquals(i <= 10 ? 1 : 2, sArrB[i]); |
| } |
| SCrossOverLoopB(); |
| for (int i = 0; i < sArrB.length; i++) { |
| expectEquals(i <= 20 ? 4 : 6, sArrB[i]); |
| } |
| // Type C. |
| sC = 2; |
| sArrC = new char[100]; |
| SInvLoopC(); |
| for (int i = 0; i < sArrC.length; i++) { |
| expectEquals(2, sArrC[i]); |
| } |
| SVarLoopC(); |
| for (int i = 0; i < sArrC.length; i++) { |
| expectEquals(i <= 10 ? 2 : 3, sArrC[i]); |
| } |
| SCrossOverLoopC(); |
| for (int i = 0; i < sArrC.length; i++) { |
| expectEquals(i <= 20 ? 5 : 7, sArrC[i]); |
| } |
| // Type S. |
| sS = 3; |
| sArrS = new short[100]; |
| SInvLoopS(); |
| for (int i = 0; i < sArrS.length; i++) { |
| expectEquals(3, sArrS[i]); |
| } |
| SVarLoopS(); |
| for (int i = 0; i < sArrS.length; i++) { |
| expectEquals(i <= 10 ? 3 : 4, sArrS[i]); |
| } |
| SCrossOverLoopS(); |
| for (int i = 0; i < sArrS.length; i++) { |
| expectEquals(i <= 20 ? 6 : 8, sArrS[i]); |
| } |
| // Type I. |
| sI = 4; |
| sArrI = new int[100]; |
| SInvLoopI(); |
| for (int i = 0; i < sArrI.length; i++) { |
| expectEquals(4, sArrI[i]); |
| } |
| SVarLoopI(); |
| for (int i = 0; i < sArrI.length; i++) { |
| expectEquals(i <= 10 ? 4 : 5, sArrI[i]); |
| } |
| SCrossOverLoopI(); |
| for (int i = 0; i < sArrI.length; i++) { |
| expectEquals(i <= 20 ? 7 : 9, sArrI[i]); |
| } |
| // Type J. |
| sJ = 5; |
| sArrJ = new long[100]; |
| SInvLoopJ(); |
| for (int i = 0; i < sArrJ.length; i++) { |
| expectEquals(5, sArrJ[i]); |
| } |
| SVarLoopJ(); |
| for (int i = 0; i < sArrJ.length; i++) { |
| expectEquals(i <= 10 ? 5 : 6, sArrJ[i]); |
| } |
| SCrossOverLoopJ(); |
| for (int i = 0; i < sArrJ.length; i++) { |
| expectEquals(i <= 20 ? 8 : 10, sArrJ[i]); |
| } |
| // Type F. |
| sF = 6.0f; |
| sArrF = new float[100]; |
| SInvLoopF(); |
| for (int i = 0; i < sArrF.length; i++) { |
| expectEquals(6, sArrF[i]); |
| } |
| SVarLoopF(); |
| for (int i = 0; i < sArrF.length; i++) { |
| expectEquals(i <= 10 ? 6 : 7, sArrF[i]); |
| } |
| SCrossOverLoopF(); |
| for (int i = 0; i < sArrF.length; i++) { |
| expectEquals(i <= 20 ? 9 : 11, sArrF[i]); |
| } |
| // Type D. |
| sD = 7.0; |
| sArrD = new double[100]; |
| SInvLoopD(); |
| for (int i = 0; i < sArrD.length; i++) { |
| expectEquals(7.0, sArrD[i]); |
| } |
| SVarLoopD(); |
| for (int i = 0; i < sArrD.length; i++) { |
| expectEquals(i <= 10 ? 7 : 8, sArrD[i]); |
| } |
| SCrossOverLoopD(); |
| for (int i = 0; i < sArrD.length; i++) { |
| expectEquals(i <= 20 ? 10 : 12, sArrD[i]); |
| } |
| // Type L. |
| sL = anObject; |
| sArrL = new Object[100]; |
| SInvLoopL(); |
| for (int i = 0; i < sArrL.length; i++) { |
| expectEquals(anObject, sArrL[i]); |
| } |
| SVarLoopL(); |
| for (int i = 0; i < sArrL.length; i++) { |
| expectEquals(i <= 10 ? anObject : anotherObject, sArrL[i]); |
| } |
| SCrossOverLoopL(); |
| for (int i = 0; i < sArrL.length; i++) { |
| expectEquals(i <= 20 ? anObject : anotherObject, sArrL[i]); |
| } |
| } |
| |
| private void DoInstanceTests() { |
| // Type Z. |
| mZ = true; |
| mArrZ = new boolean[100]; |
| InvLoopZ(); |
| for (int i = 0; i < mArrZ.length; i++) { |
| expectEquals(true, mArrZ[i]); |
| } |
| VarLoopZ(); |
| for (int i = 0; i < mArrZ.length; i++) { |
| expectEquals(i <= 10, mArrZ[i]); |
| } |
| CrossOverLoopZ(); |
| for (int i = 0; i < mArrZ.length; i++) { |
| expectEquals(i <= 20, mArrZ[i]); |
| } |
| // Type B. |
| mB = 1; |
| mArrB = new byte[100]; |
| InvLoopB(); |
| for (int i = 0; i < mArrB.length; i++) { |
| expectEquals(1, mArrB[i]); |
| } |
| VarLoopB(); |
| for (int i = 0; i < mArrB.length; i++) { |
| expectEquals(i <= 10 ? 1 : 2, mArrB[i]); |
| } |
| CrossOverLoopB(); |
| for (int i = 0; i < mArrB.length; i++) { |
| expectEquals(i <= 20 ? 4 : 6, mArrB[i]); |
| } |
| // Type C. |
| mC = 2; |
| mArrC = new char[100]; |
| InvLoopC(); |
| for (int i = 0; i < mArrC.length; i++) { |
| expectEquals(2, mArrC[i]); |
| } |
| VarLoopC(); |
| for (int i = 0; i < mArrC.length; i++) { |
| expectEquals(i <= 10 ? 2 : 3, mArrC[i]); |
| } |
| CrossOverLoopC(); |
| for (int i = 0; i < mArrC.length; i++) { |
| expectEquals(i <= 20 ? 5 : 7, mArrC[i]); |
| } |
| // Type S. |
| mS = 3; |
| mArrS = new short[100]; |
| InvLoopS(); |
| for (int i = 0; i < mArrS.length; i++) { |
| expectEquals(3, mArrS[i]); |
| } |
| VarLoopS(); |
| for (int i = 0; i < mArrS.length; i++) { |
| expectEquals(i <= 10 ? 3 : 4, mArrS[i]); |
| } |
| CrossOverLoopS(); |
| for (int i = 0; i < mArrS.length; i++) { |
| expectEquals(i <= 20 ? 6 : 8, mArrS[i]); |
| } |
| // Type I. |
| mI = 4; |
| mArrI = new int[100]; |
| InvLoopI(); |
| for (int i = 0; i < mArrI.length; i++) { |
| expectEquals(4, mArrI[i]); |
| } |
| VarLoopI(); |
| for (int i = 0; i < mArrI.length; i++) { |
| expectEquals(i <= 10 ? 4 : 5, mArrI[i]); |
| } |
| CrossOverLoopI(); |
| for (int i = 0; i < mArrI.length; i++) { |
| expectEquals(i <= 20 ? 7 : 9, mArrI[i]); |
| } |
| // Type J. |
| mJ = 5; |
| mArrJ = new long[100]; |
| InvLoopJ(); |
| for (int i = 0; i < mArrJ.length; i++) { |
| expectEquals(5, mArrJ[i]); |
| } |
| VarLoopJ(); |
| for (int i = 0; i < mArrJ.length; i++) { |
| expectEquals(i <= 10 ? 5 : 6, mArrJ[i]); |
| } |
| CrossOverLoopJ(); |
| for (int i = 0; i < mArrJ.length; i++) { |
| expectEquals(i <= 20 ? 8 : 10, mArrJ[i]); |
| } |
| // Type F. |
| mF = 6.0f; |
| mArrF = new float[100]; |
| InvLoopF(); |
| for (int i = 0; i < mArrF.length; i++) { |
| expectEquals(6, mArrF[i]); |
| } |
| VarLoopF(); |
| for (int i = 0; i < mArrF.length; i++) { |
| expectEquals(i <= 10 ? 6 : 7, mArrF[i]); |
| } |
| CrossOverLoopF(); |
| for (int i = 0; i < mArrF.length; i++) { |
| expectEquals(i <= 20 ? 9 : 11, mArrF[i]); |
| } |
| // Type D. |
| mD = 7.0; |
| mArrD = new double[100]; |
| InvLoopD(); |
| for (int i = 0; i < mArrD.length; i++) { |
| expectEquals(7.0, mArrD[i]); |
| } |
| VarLoopD(); |
| for (int i = 0; i < mArrD.length; i++) { |
| expectEquals(i <= 10 ? 7 : 8, mArrD[i]); |
| } |
| CrossOverLoopD(); |
| for (int i = 0; i < mArrD.length; i++) { |
| expectEquals(i <= 20 ? 10 : 12, mArrD[i]); |
| } |
| // Type L. |
| mL = anObject; |
| mArrL = new Object[100]; |
| InvLoopL(); |
| for (int i = 0; i < mArrL.length; i++) { |
| expectEquals(anObject, mArrL[i]); |
| } |
| VarLoopL(); |
| for (int i = 0; i < mArrL.length; i++) { |
| expectEquals(i <= 10 ? anObject : anotherObject, mArrL[i]); |
| } |
| CrossOverLoopL(); |
| for (int i = 0; i < mArrL.length; i++) { |
| expectEquals(i <= 20 ? anObject : anotherObject, mArrL[i]); |
| } |
| } |
| |
| private static void expectEquals(boolean expected, boolean result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(byte expected, byte result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(char expected, char result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(short expected, short result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(int expected, int result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(long expected, long result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(float expected, float result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(double expected, double result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| |
| private static void expectEquals(Object expected, Object result) { |
| if (expected != result) { |
| throw new Error("Expected: " + expected + ", found: " + result); |
| } |
| } |
| } |