/*
 * 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;
    }
  }

  //
  // Misc. tests on false cross-over loops with data types (I/F and J/D) that used
  // to be aliased in an older version of the compiler. This alias has been removed,
  // however, which enables hoisting the invariant array reference.
  //

  /// CHECK-START: void Main.FalseCrossOverLoop1() licm (before)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  /// CHECK-START: void Main.FalseCrossOverLoop1() licm (after)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:none
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  private static void FalseCrossOverLoop1() {
    sArrF[20] = -1;
    for (int i = 0; i < sArrI.length; i++) {
      sArrI[i] = (int) sArrF[20] - 2;
    }
  }

  /// CHECK-START: void Main.FalseCrossOverLoop2() licm (before)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  /// CHECK-START: void Main.FalseCrossOverLoop2() licm (after)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:none
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  private static void FalseCrossOverLoop2() {
    sArrI[20] = -2;
    for (int i = 0; i < sArrF.length; i++) {
      sArrF[i] = sArrI[20] - 2;
    }
  }

  /// CHECK-START: void Main.FalseCrossOverLoop3() licm (before)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  /// CHECK-START: void Main.FalseCrossOverLoop3() licm (after)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:none
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  private static void FalseCrossOverLoop3() {
    sArrD[20] = -3;
    for (int i = 0; i < sArrJ.length; i++) {
      sArrJ[i] = (long) sArrD[20] - 2;
    }
  }

  /// CHECK-START: void Main.FalseCrossOverLoop4() licm (before)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:{{B\d+}}
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  /// CHECK-START: void Main.FalseCrossOverLoop4() licm (after)
  /// CHECK-DAG: ArraySet loop:none
  /// CHECK-DAG: ArrayGet loop:none
  /// CHECK-DAG: ArraySet loop:{{B\d+}}

  private static void FalseCrossOverLoop4() {
    sArrJ[20] = -4;
    for (int i = 0; i < sArrD.length; i++) {
      sArrD[i] = sArrJ[20] - 2;
    }
  }

  //
  // Driver and testers.
  //

  public static void main(String[] args) {
    DoStaticTests();
    new Main().DoInstanceTests();
    System.out.println("passed");
  }

  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]);
    }
    // Misc. tests.
    FalseCrossOverLoop1();
    for (int i = 0; i < sArrI.length; i++) {
      expectEquals(-3, sArrI[i]);
    }
    FalseCrossOverLoop2();
    for (int i = 0; i < sArrF.length; i++) {
      expectEquals(-4, sArrF[i]);
    }
    FalseCrossOverLoop3();
    for (int i = 0; i < sArrJ.length; i++) {
      expectEquals(-5, sArrJ[i]);
    }
    FalseCrossOverLoop4();
    for (int i = 0; i < sArrD.length; i++) {
      expectEquals(-6, sArrD[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);
    }
  }
}
