10304e182adee81be32c744fd3c0d28add29974ffMingyao Yang/*
26a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * Copyright (C) 2015 The Android Open Source Project
36a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *
46a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * Licensed under the Apache License, Version 2.0 (the "License");
56a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * you may not use this file except in compliance with the License.
66a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * You may obtain a copy of the License at
76a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *
86a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *      http://www.apache.org/licenses/LICENSE-2.0
96a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain *
106a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * Unless required by applicable law or agreed to in writing, software
116a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * distributed under the License is distributed on an "AS IS" BASIS,
126a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * See the License for the specific language governing permissions and
146a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain * limitations under the License.
156a92a033c33e383541d77607fbe8cd982875d13dRoland Levillain */
160304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
170304e182adee81be32c744fd3c0d28add29974ffMingyao Yangpublic class Main {
180304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
19a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.sieve(int) BCE (before)
20a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
21a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
22a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
23a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
24a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
25a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
26a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
27a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int Main.sieve(int) BCE (after)
28a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
29a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
30a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
31a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
32a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
33a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
340304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
350304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  static int sieve(int size) {
360304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    int primeCount = 0;
370304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    boolean[] flags = new boolean[size + 1];
380304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    for (int i = 1; i < size; i++) flags[i] = true; // Can eliminate.
390304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    for (int i = 2; i < size; i++) {
400304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      if (flags[i]) { // Can eliminate.
410304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        primeCount++;
420304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        for (int k = i + 1; k <= size; k += i)
430304e182adee81be32c744fd3c0d28add29974ffMingyao Yang          flags[k - 1] = false; // Can't eliminate yet due to (k+i) may overflow.
440304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      }
450304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    }
460304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    return primeCount;
470304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  }
480304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
498c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
50a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.narrow(int[], int) BCE (before)
51a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
52a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
53a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
54a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
55a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
56a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
57a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
58a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.narrow(int[], int) BCE (after)
59a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
60a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
61a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
62a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
63a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
64a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
65a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
66a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
67a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
68a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
690304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
708c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void narrow(int[] array, int offset) {
710304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    if (offset < 0) {
720304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      return;
730304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    }
740304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    if (offset < array.length) {
750304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      // offset is in range [0, array.length-1].
760304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      // Bounds check can be eliminated.
770304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      array[offset] = 1;
780304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
790304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      int biased_offset1 = offset + 1;
800304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      // biased_offset1 is in range [1, array.length].
810304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      if (biased_offset1 < array.length) {
820304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        // biased_offset1 is in range [1, array.length-1].
830304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        // Bounds check can be eliminated.
840304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        array[biased_offset1] = 1;
850304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      }
860304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
870304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      int biased_offset2 = offset + 0x70000000;
880304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      // biased_offset2 is in range [0x70000000, array.length-1+0x70000000].
890304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      // It may overflow and be negative.
900304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      if (biased_offset2 < array.length) {
910304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        // Even with this test, biased_offset2 can be negative so we can't
920304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        // eliminate this bounds check.
930304e182adee81be32c744fd3c0d28add29974ffMingyao Yang        array[biased_offset2] = 1;
940304e182adee81be32c744fd3c0d28add29974ffMingyao Yang      }
958c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
968c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // offset_sub1 won't underflow since offset is no less than 0.
978c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      int offset_sub1 = offset - Integer.MAX_VALUE;
988c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (offset_sub1 >= 0) {
998c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        array[offset_sub1] = 1;  // Bounds check can be eliminated.
1008c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
1018c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
1028c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // offset_sub2 can underflow.
1038c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      int offset_sub2 = offset_sub1 - Integer.MAX_VALUE;
1048c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (offset_sub2 >= 0) {
1058c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        array[offset_sub2] = 1;  // Bounds check can't be eliminated.
1068c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
1078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
1088c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
1098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
1108c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
111a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing1(int[]) BCE (before)
112a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
113a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
114a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
115a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
116d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
117a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing1(int[]) BCE (after)
118a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Deoptimize
119a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
120a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
121a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
122a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1238c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
124d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static void constantIndexing1(int[] array) {
1251d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    // Decreasing order: bc for 5 but not for 4.
1261d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[5] = 11;
1271d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[4] = 11;
128d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
129d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
130d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
1315949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  /// CHECK-START: void Main.$opt$noinline$constantIndexing2(int[]) BCE (before)
132a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
133a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
134a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
135a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
136a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
137a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
138a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
139a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
140a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
1415949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  /// CHECK-START: void Main.$opt$noinline$constantIndexing2(int[]) BCE (after)
142e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: Deoptimize
143e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-NOT: BoundsCheck
144a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
145e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-NOT: BoundsCheck
146a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
147e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-NOT: BoundsCheck
148a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
149e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-NOT: BoundsCheck
150a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1518c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
1525949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  static void $opt$noinline$constantIndexing2(int[] array) {
153d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[1] = 1;
154d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[2] = 1;
155d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[3] = 1;
1568c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[4] = 1;
157e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    if (array[1] != 1) {
1585949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray      throw new Error("");
1595949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray    }
160d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
161d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
1621d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing2b(int[]) BCE (before)
1631d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
1641d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
1651d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
1661d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
1671d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
1681d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
1691d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
1701d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
171e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
172e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
1731d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
1741d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing2b(int[]) BCE (after)
175e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-NOT: Deoptimize
176e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
177e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
178e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
179e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
180e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
181e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
182e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
183e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
184e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
185e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
186e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik
187e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  static void constantIndexing2b(int[] array) {
188e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    array[0] = 6;
189e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    array[1] = 6;
190e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    array[2] = 6;
191e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    array[3] = 6;
192e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    array[-1] = 1;  // prevents the whole opt on [-1:4]
193e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  }
194e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik
195e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-START: void Main.constantIndexing2c(int[]) BCE (before)
196e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
197e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
198e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
199e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
200e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
201e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
202e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: BoundsCheck
203e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK: ArraySet
204e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik
205e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  /// CHECK-START: void Main.constantIndexing2c(int[]) BCE (after)
2061d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
2071d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
2081d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
2091d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
2101d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
2111d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
2121d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
2131d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
2141d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
2151d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
216e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik  static void constantIndexing2c(int[] array) {
2171d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[0] = 7;
2181d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[1] = 7;
2191d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[2] = 7;
2201d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[3] = 7;
2211d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  }
222d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
223a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (before)
224a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
225a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
226a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
227a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
228a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
229a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
230a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
231a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
232a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
233a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
234a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
235a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
236a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
237a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
238a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
239a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
240a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
241a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (after)
242a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Deoptimize
243a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
244a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
245a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Deoptimize
246a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
247a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
248a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
249a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
250a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
251a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
252a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
253a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
254a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
255a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
256a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
257a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
258a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
259a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
260d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
261d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static int[] constantIndexing3(int[] array1, int[] array2, boolean copy) {
262d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    if (!copy) {
263d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang      return array1;
264d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    }
265d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[0] = array1[0];
266d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[1] = array1[1];
267d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[2] = array1[2];
268d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[3] = array1[3];
269d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    return array2;
270d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
271d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
272d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
273a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing4(int[]) BCE (before)
274a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
275a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
276d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
277a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing4(int[]) BCE (after)
2781d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: Deoptimize
279a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
280a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
281d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
282d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  // There is only one array access. It's not beneficial
283d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  // to create a compare with deoptimization instruction.
284d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static void constantIndexing4(int[] array) {
2851d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[0] = -1;
2868c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
2878c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
2888c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
289a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing5(int[]) BCE (before)
290a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
291a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
292a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
293a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
294d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
295a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing5(int[]) BCE (after)
296a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Deoptimize
297a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
298a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
299a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
300a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
301d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
302d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static void constantIndexing5(int[] array) {
303d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    // We don't apply the deoptimization for very large constant index
304d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    // since it's likely to be an anomaly and will throw AIOOBE.
305d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[Integer.MAX_VALUE - 1000] = 1;
306d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[Integer.MAX_VALUE - 999] = 1;
307d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[Integer.MAX_VALUE - 998] = 1;
308d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
309d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
310639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK-START: void Main.constantIndexing6(int[]) BCE (before)
311639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: BoundsCheck
312639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: ArraySet
313639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: BoundsCheck
314639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: ArraySet
315639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
316639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK-START: void Main.constantIndexing6(int[]) BCE (after)
317639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: Deoptimize
3181d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3191d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3201d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3211d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
322639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
323639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  static void constantIndexing6(int[] array) {
3241d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[3] = 111;
3251d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[4] = 111;
3261d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  }
3271d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3281d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing7(int[], int) BCE (before)
3291d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3301d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3311d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3321d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3331d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3341d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3351d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3361d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3371d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3381d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing7(int[], int) BCE (after)
3391d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
3401d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
3411d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3421d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3431d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3441d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3451d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3461d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3471d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3481d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3491d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3501d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  static void constantIndexing7(int[] array, int base) {
3511d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    // With constant offsets to symbolic base.
3521d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base]     = 10;
3531d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base + 1] = 20;
3541d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base + 2] = 30;
3551d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base + 3] = 40;
3561d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  }
3571d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3581d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing8(int[], int) BCE (before)
3591d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3601d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3611d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3621d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3631d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3641d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3651d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3661d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3671d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3681d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing8(int[], int) BCE (after)
3691d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
3701d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
3711d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3721d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3731d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3741d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3751d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3761d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3771d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
3781d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3791d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3801d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  static void constantIndexing8(int[] array, int base) {
3811d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    // With constant offsets "both ways" to symbolic base.
3821d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base - 1] = 100;
3831d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base]     = 200;
3841d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base + 1] = 300;
3851d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base + 2] = 400;
3861d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  }
3871d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3881d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing9(int[], int) BCE (before)
3891d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3901d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3911d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3921d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3931d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3941d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3951d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: BoundsCheck
3961d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
3971d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
3981d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-START: void Main.constantIndexing9(int[], int) BCE (after)
3991d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
4001d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: Deoptimize
4011d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
4021d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
4031d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
4041d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
4051d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
4061d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
4071d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
4081d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK: ArraySet
4091d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  /// CHECK-NOT: BoundsCheck
4101d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
4111d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  static void constantIndexing9(int[] array, int base) {
4121d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    // Final range is base..base+3 so conditional
4131d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    // references may be included in the end.
4141d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base] = 0;
4151d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (base != 12345)
4161d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      array[base + 2] = 2;
4171d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    array[base + 3] = 3;
4181d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (base != 67890)
4191d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      array[base + 1] = 1;
4201d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  }
4211d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
422bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK-START: void Main.constantIndexing10(int[], int) BCE (before)
423bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: BoundsCheck
424bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
425bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: BoundsCheck
426bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
427bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: BoundsCheck
428bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
429bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: BoundsCheck
430bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
431bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik
432bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK-START: void Main.constantIndexing10(int[], int) BCE (after)
433bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: Deoptimize
434bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: Deoptimize
435bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK-NOT: BoundsCheck
436bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
437bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK-NOT: BoundsCheck
438bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
439bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK-NOT: BoundsCheck
440bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
441bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK-NOT: BoundsCheck
442bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  /// CHECK: ArraySet
443bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik
444bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  static void constantIndexing10(int[] array, int base) {
445bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    // Offset hidden in incremented base.
446bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    array[base] = 1;
447bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    array[++base] = 2;
448bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    array[++base] = 3;
449bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    array[++base] = 4;
450bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik  }
451bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik
4521d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik  static void runAllConstantIndices() {
4531d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    int[] a1 = { 0 };
4541d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    int[] a6 = { 0, 0, 0, 0, 0, 0 };
4551d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
4561d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    boolean caught = false;
4571d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    try {
4581d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      constantIndexing1(a1);
4591d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    } catch (ArrayIndexOutOfBoundsException e) {
4601d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      caught = true;
4611d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
4621d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (!caught) {
4631d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 1 failed!");
4641d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
4651d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
4661d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing1(a6);
4671d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a6[4] != 11 || a6[5] != 11) {
4681d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 1 failed!");
4691d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
4701d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
471e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    $opt$noinline$constantIndexing2(a6);
472e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    if (a6[0] != 0 || a6[1] != 1 || a6[2] != 1 ||
473e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik        a6[3] != 1 || a6[4] != 1 || a6[5] != 11) {
474e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik      System.out.println("constant indices 2 failed!");
475e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    }
476e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik
4771d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    caught = false;
4781d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    try {
479e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik      constantIndexing2b(a6);
4801d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    } catch (ArrayIndexOutOfBoundsException e) {
4811d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      caught = true;
4821d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
483e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    if (!caught || a6[0] != 6 || a6[1] != 6 || a6[2] != 6 ||
484e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik                   a6[3] != 6 || a6[4] != 1 || a6[5] != 11) {
485e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik      System.out.println("constant indices 2b failed!");
4861d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
4871d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
4881d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    caught = false;
4891d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    try {
490e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik      constantIndexing2c(a1);
4911d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    } catch (ArrayIndexOutOfBoundsException e) {
4921d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      caught = true;
4931d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
4941d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (!caught || a1[0] != 7) {
495e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik      System.out.println("constant indices 2c failed!");
4961d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
4971d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
498e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik    constantIndexing2c(a6);
4991d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a6[0] != 7 || a6[1] != 7 || a6[2] != 7 ||
5001d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik        a6[3] != 7 || a6[4] != 1 || a6[5] != 11) {
501e530539656fd7c95c914885b4f67c404daea2ea2Aart Bik      System.out.println("constant indices 2c failed!");
5021d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5031d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5041d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    int[] b4 = new int[4];
5051d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing3(a6, b4, true);
5061d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (b4[0] != 7 || b4[1] != 7 || b4[2] != 7 || b4[3] != 7) {
5071d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 3 failed!");
5081d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5091d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5101d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing4(a1);
5111d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a1[0] != -1) {
5121d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 4 failed!");
5131d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5141d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5151d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    caught = false;
5161d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    try {
5171d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      constantIndexing5(a6);
5181d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    } catch (ArrayIndexOutOfBoundsException e) {
5191d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      caught = true;
5201d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5211d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (!caught) {
5221d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 5 failed!");
5231d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5241d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5251d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing6(a6);
5261d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a6[0] != 7   || a6[1] != 7   || a6[2] != 7 ||
5271d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik        a6[3] != 111 || a6[4] != 111 || a6[5] != 11) {
5281d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 6 failed!");
5291d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5301d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5311d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing7(a6, 1);
5321d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a6[0] != 7  || a6[1] != 10 || a6[2] != 20 ||
5331d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik        a6[3] != 30 || a6[4] != 40 || a6[5] != 11) {
5341d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 7 failed!");
5351d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5361d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5371d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    caught = false;
5381d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    try {
5391d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      constantIndexing7(a6, 5);
5401d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    } catch (ArrayIndexOutOfBoundsException e) {
5411d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      caught = true;
5421d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5431d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (!caught || a6[0] != 7  || a6[1] != 10 || a6[2] != 20 ||
5441d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik                   a6[3] != 30 || a6[4] != 40 || a6[5] != 10) {
5451d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 7 failed!");
5461d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5471d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5481d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing8(a6, 1);
5491d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a6[0] != 100 || a6[1] != 200 || a6[2] != 300 ||
5501d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik        a6[3] != 400 || a6[4] != 40  || a6[5] != 10) {
5511d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 8 failed!");
5521d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5531d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5541d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    caught = false;
5551d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    try {
5561d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      constantIndexing8(a6, 0);
5571d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    } catch (ArrayIndexOutOfBoundsException e) {
5581d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      caught = true;
5591d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5601d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (!caught || a6[0] != 100) {
5611d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 8 failed!");
5621d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
5631d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
5641d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    constantIndexing9(a6, 0);
5651d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    if (a6[0] != 0 || a6[1] != 1  || a6[2] != 2  ||
5661d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik        a6[3] != 3 || a6[4] != 40 || a6[5] != 10) {
5671d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik      System.out.println("constant indices 9 failed!");
5681d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    }
569bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik
570bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    constantIndexing10(a6, 0);
571bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    if (a6[0] != 1 || a6[1] != 2  || a6[2] != 3  ||
572bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik        a6[3] != 4 || a6[4] != 40 || a6[5] != 10) {
573bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik      System.out.println("constant indices 10 failed!");
574bf3f1cf15a021ea1ff8ae860c55e8281da4619b3Aart Bik    }
575639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  }
576639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
577639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  // A helper into which the actual throwing function should be inlined.
578639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  static void constantIndexingForward6(int[] array) {
5790dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    assertIsManaged();
580639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    constantIndexing6(array);
581639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  }
582639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
583a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern1(int[]) BCE (before)
584a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
585a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
586a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
587a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
588a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
589a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
590a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
591a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
592a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
593a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
594a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
595a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
596a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
597a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
598a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
599a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern1(int[]) BCE (after)
600a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
601a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
602a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
603a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
604a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
605a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
606a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
607a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
608a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
609a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
610a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
611a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
612a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
613a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
6148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void loopPattern1(int[] array) {
6168c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < array.length; i++) {
6178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
6188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 1; i < array.length; i++) {
6218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
6228c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6238c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6248c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 1; i < array.length - 1; i++) {
6258c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
6268c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6278c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6288c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = -1; i < array.length; i++) {
6298c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
6308c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6318c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6328c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i <= array.length; i++) {
6338c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
6348c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6358c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6368c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < array.length; i += 2) {
6378c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // We don't have any assumption on max array length yet.
6388c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // Bounds check can't be eliminated due to overflow concern.
6398c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;
6408c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6418c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6428c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 1; i < array.length; i += 2) {
6438c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // Bounds check can be eliminated since i is odd so the last
6448c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // i that's less than array.length is at most (Integer.MAX_VALUE - 2).
6458c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;
6468c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6478c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
6488c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6498c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
650a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern2(int[]) BCE (before)
651a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
652a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
653a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
654a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
655a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
656a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
657a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
658a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
659a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
660a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
661a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
662a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
663a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
664a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern2(int[]) BCE (after)
665a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
666a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
667a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
668a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
669a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
670a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
671a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
672a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
673a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
674a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
675a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
676a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
6778c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6788c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void loopPattern2(int[] array) {
6798c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length - 1; i >= 0; i--) {
6808c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
6818c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6828c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6838c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i > 0; i--) {
6848c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i - 1] = 1;  // Bounds check can be eliminated.
6858c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6868c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6878c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length - 1; i > 0; i--) {
6888c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
6898c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6908c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6918c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i >= 0; i--) {
6928c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
6938c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6948c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6958c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i >= 0; i--) {
6968c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i - 1] = 1;  // Bounds check can't be eliminated.
6978c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6988c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6998c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i > 0; i -= 20) {
7008c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // For i >= 0, (i - 20 - 1) is guaranteed not to underflow.
7018c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i - 1] = 1;  // Bounds check can be eliminated.
7028c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
7038c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
7048c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
7058c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
706a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern3(int[]) BCE (before)
707a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
708a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
7098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
710a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern3(int[]) BCE (after)
711a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
712a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
7138c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
7148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void loopPattern3(int[] array) {
7158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    java.util.Random random = new java.util.Random();
7168c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; ; i++) {
7178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (random.nextInt() % 1000 == 0 && i < array.length) {
7188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        // Can't eliminate the bound check since not every i++ is
7198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        // matched with a array length check, so there is some chance that i
7208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        // overflows and is negative.
7218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        array[i] = 1;
7228c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
7230304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    }
7240304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  }
7250304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
7268c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
727a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantNewArray() BCE (before)
728a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
729a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
730a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
731a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
732a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
733a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
734a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
735a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
736a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
737a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
738a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
739a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantNewArray() BCE (after)
740a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
741a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
742a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
743a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
744a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
745a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
746a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
747a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
748a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
749a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
7508c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
7518c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void constantNewArray() {
7528c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int[] array = new int[10];
7538c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < 10; i++) {
7548c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
7558c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
7568c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
7578c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i <= 10; i++) {
7588c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
7598c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
7608c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
7618c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[0] = 1;  // Bounds check can be eliminated.
7628c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[9] = 1;  // Bounds check can be eliminated.
7638c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[10] = 1; // Bounds check can't be eliminated.
7648c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
7658c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
7664559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
7674559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  static byte readData() {
7684559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    return 1;
7694559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  }
7704559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
771a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.circularBufferProducer() BCE (before)
772a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
773a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
7744559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
775a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.circularBufferProducer() BCE (after)
776a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
777a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
7784559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
7794559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  static void circularBufferProducer() {
7804559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    byte[] array = new byte[4096];
7814559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    int i = 0;
7824559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    while (true) {
7834559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang      array[i & (array.length - 1)] = readData();
7844559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang      i++;
7854559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    }
7864559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  }
7874559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
7884559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
789a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid1(int[]) BCE (before)
790a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
791a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
792a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
793a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
7948c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
795a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid1(int[]) BCE (after)
796a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
797a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
798a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
799a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
8008c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8018c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  // Set array to something like {0, 1, 2, 3, 2, 1, 0}.
8028c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void pyramid1(int[] array) {
8038c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < (array.length + 1) / 2; i++) {
8048c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = i;
8058c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[array.length - 1 - i] = i;
8068c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
8078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
8088c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
810a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid2(int[]) BCE (before)
811a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
812a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
813a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
814a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
8158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
816a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid2(int[]) BCE (after)
817a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
818a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
819a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
820a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
8218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8228c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  // Set array to something like {0, 1, 2, 3, 2, 1, 0}.
8238c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void pyramid2(int[] array) {
8248c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < (array.length + 1) >> 1; i++) {
8258c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = i;
8268c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[array.length - 1 - i] = i;
8278c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
8288c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
8298c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8308c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
831a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid3(int[]) BCE (before)
832a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
833a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
834a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
835a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
8368c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
837a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid3(int[]) BCE (after)
838a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
839a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
840a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
841a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
8428c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8438c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  // Set array to something like {0, 1, 2, 3, 2, 1, 0}.
8448c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void pyramid3(int[] array) {
8458c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < (array.length + 1) >>> 1; i++) {
8468c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = i;
8478c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[array.length - 1 - i] = i;
8488c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
8498c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
8508c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8518c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
852a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: boolean Main.isPyramid(int[]) BCE (before)
853a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
854a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
855a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
856a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
85757e04754d5b7fb3cc99d6b9f70da73cf4c65b416Mingyao Yang
858a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: boolean Main.isPyramid(int[]) BCE (after)
859a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
860a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
861a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
862a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
86357e04754d5b7fb3cc99d6b9f70da73cf4c65b416Mingyao Yang
8648c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static boolean isPyramid(int[] array) {
8658c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int i = 0;
8668c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int j = array.length - 1;
8678c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    while (i <= j) {
8688c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (array[i] != i) {
8698c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        return false;
8708c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
8718c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (array[j] != i) {
8728c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        return false;
8738c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
8748c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      i++; j--;
8758c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
8768c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    return true;
8778c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
8788c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
8798c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
880a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.bubbleSort(int[]) GVN (before)
881a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
882a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
883a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
884a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
885a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
886a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
887a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
888a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
889a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
890a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
891a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
892a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
893a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
894a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.bubbleSort(int[]) GVN (after)
895a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
896a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
897a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
898a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
899a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
900a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
901a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
902a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
903a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
904a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
905a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
906a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.bubbleSort(int[]) BCE (after)
907a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
908a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
909a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
910a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
911a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
912a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
913a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
914a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
915a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
916a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
9178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
9188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void bubbleSort(int[] array) {
9198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < array.length - 1; i++) {
9208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      for (int j = 0; j < array.length - i - 1; j++) {
9218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        if (array[j] > array[j + 1]) {
9228c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang          int temp = array[j + 1];
9238c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang          array[j + 1] = array[j];
9248c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang          array[j] = temp;
9258c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        }
9268c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
9278c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
9288c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
9298c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
9305d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  static int[][] mA;
9315d75afe333f57546786686d9bee16b52f1bbe971Aart Bik
9325d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (before)
93309e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Array references mA[i] and ..[j] both in inner loop.
93409e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get1:l\d+>>  ArrayGet [<<Array1:l\d+>>,<<Bounds1:i\d+>>] loop:<<InnerLoop:B\d+>>
93509e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array1>>     NullCheck [<<Field1:l\d+>>]                 loop:<<InnerLoop>>
93609e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Len1:i\d+>>  ArrayLength [<<Array1>>]                    loop:<<InnerLoop>>
93709e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Bounds1>>    BoundsCheck [<<Index1:i\d+>>,<<Len1>>]      loop:<<InnerLoop>>
93809e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get2:i\d+>>  ArrayGet [<<Array2:l\d+>>,<<Bounds2:i\d+>>] loop:<<InnerLoop>>
93909e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array2>>     NullCheck [<<Get1>>]                        loop:<<InnerLoop>>
94009e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Len2:i\d+>>  ArrayLength [<<Array2>>]                    loop:<<InnerLoop>>
94109e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Bounds2>>    BoundsCheck [<<Index2:i\d+>>,<<Len2>>]      loop:<<InnerLoop>>
94217fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  // Note: The ArtMethod* (typed as int or long) is optional after sharpening.
94317fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  /// CHECK-DAG:                 InvokeStaticOrDirect [<<Get2>>{{(,[ij]\d+)?}}] loop:<<InnerLoop>>
94409e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index2>>     Phi                                         loop:<<InnerLoop>>
94509e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index1>>     Phi                                         loop:<<OuterLoop:B\d+>>
94609e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Field1>>     StaticFieldGet                              loop:none
94709e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>"
94809e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //
94909e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after)
95009e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Array reference mA[i] hoisted to same level as deopt.
95109e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:                 Deoptimize                                  loop:<<OuterLoop:B\d+>>
95209e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:                 ArrayLength                                 loop:<<OuterLoop>>
95309e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get1:l\d+>>  ArrayGet [<<Array1:l\d+>>,<<Index1:i\d+>>]  loop:<<OuterLoop>>
95409e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Array reference ..[j] still in inner loop, with a direct index.
95509e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get2:i\d+>>  ArrayGet [<<Array2:l\d+>>,<<Index2:i\d+>>]  loop:<<InnerLoop:B\d+>>
95617fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  // Note: The ArtMethod* (typed as int or long) is optional after sharpening.
95717fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  /// CHECK-DAG:                 InvokeStaticOrDirect [<<Get2>>{{(,[ij]\d+)?}}] loop:<<InnerLoop>>
95809e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index2>>     Phi                                         loop:<<InnerLoop>>
95909e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index1>>     Phi                                         loop:<<OuterLoop>>
96009e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Synthetic phi.
96109e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array2>>     Phi                                         loop:<<OuterLoop>>
96209e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array1>>     StaticFieldGet                              loop:none
96309e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>"
96409e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //
9655d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after)
9665d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-NOT: NullCheck
9675d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-NOT: BoundsCheck
9685d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  static void dynamicBCEAndIntrinsic(int n) {
9695d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    for (int i = 0; i < n; i++) {
9705d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      for (int j = 0; j < n; j++) {
9715d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        // Since intrinsic call cannot modify fields or arrays,
9725d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        // dynamic BCE and hoisting can be applied to the inner loop.
9735d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        mA[i][j] = Math.abs(mA[i][j]);
9745d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      }
9755d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    }
9765d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  }
9778c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
978d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static int foo() {
979d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    try {
9800dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      assertIsManaged();
981d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang      // This will cause AIOOBE.
9825949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray      $opt$noinline$constantIndexing2(new int[3]);
983d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
9840dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      assertIsManaged();  // This is to ensure that single-frame deoptimization works.
9855949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray                          // Will need to be updated if $opt$noinline$constantIndexing2 is inlined.
986639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe      try {
987639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe        // This will cause AIOOBE.
988639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe        constantIndexingForward6(new int[3]);
989639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe      } catch (ArrayIndexOutOfBoundsException e2) {
990951779839f0d35ed5336f399c8f521fd9a6b7c27David Brazdil        // Having deopted, we expect to be running interpreted at this point.
991951779839f0d35ed5336f399c8f521fd9a6b7c27David Brazdil        // Does not apply to debuggable, however, since we do not inline.
992639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe        return 99;
993639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe      }
994d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    }
995d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    return 0;
996d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
997d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
998d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
999206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  int sum;
1000206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
10010dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo1(int[], int, int, boolean) BCE (before)
1002a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1003a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1004a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1005a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1006a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
10070dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo1(int[], int, int, boolean) BCE (after)
1008a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1009a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1010a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1011a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1012a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
10134a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
10144a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
10153584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
10163584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10173584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10183584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10193584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
10203584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
10214a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10223584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
1023206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
10240dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo1(int[] array, int start, int end, boolean expectInterpreter) {
10254a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
1026206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null
1027206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // check and array.length out of loop).
1028206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = start ; i < end; i++) {
10290dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
10300dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
10310dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
10320dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
10330dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
1034206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
1035206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
1036206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1037206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1038206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1039206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
10400dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo2(int[], int, int, boolean) BCE (before)
1041a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1042a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1043a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1044a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
10450dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo2(int[], int, int, boolean) BCE (after)
1046a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1047a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1048a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1049a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1050a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
10514a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
10524a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
10533584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
10543584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10553584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10563584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10573584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
10583584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
10594a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10603584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
1061206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
10620dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo2(int[] array, int start, int end, boolean expectInterpreter) {
10634a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
1064206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null
1065206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // check and array.length out of loop).
1066206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = start ; i <= end; i++) {
10670dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
10680dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
10690dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
10700dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
10710dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
1072206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
1073206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
1074206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1075206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1076206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1077206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
10780dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo3(int[], int, boolean) BCE (before)
1079a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1080a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1081a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1082a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
10830dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo3(int[], int, boolean) BCE (after)
1084a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1085a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1086a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1087a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1088a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
10894a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
10904a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
10913584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
10924a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
10933584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10943584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10953584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
10963584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
10974a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10983584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
1099206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
11000dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo3(int[] array, int end, boolean expectInterpreter) {
11014a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
1102206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null check
1103206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and array.length out of loop).
1104206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = 3 ; i <= end; i++) {
11050dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
11060dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
11070dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
11080dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
11090dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
1110206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
1111206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
1112206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1113206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1114206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
11153584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
11160dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo4(int[], int, boolean) BCE (before)
1117a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1118a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1119a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1120a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1121a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
11220dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo4(int[], int, boolean) BCE (after)
1123a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1124a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1125a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1126a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1127a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
11284a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
11294a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
11303584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
11314a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
11323584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
11333584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
11343584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
11353584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
11364a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
11373584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
1138206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
11390dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo4(int[] array, int end, boolean expectInterpreter) {
11404a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
1141206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null check
1142206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and array.length out of loop).
1143206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = end ; i > 0; i--) {
11440dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
11450dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
11460dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
11470dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
11480dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
1149206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i - 1] = 1;
1150206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i - 1];
1151206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1152206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1153206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1154206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
11550dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo5(int[], int, boolean) BCE (before)
1156a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1157a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1158a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1159a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1160a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1161a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1162a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1163a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1164a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
11650dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo5(int[], int, boolean) BCE (after)
1166a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1167a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1168a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1169a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1170a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1171a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1172a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1173a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1174a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
11754a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
11764a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
11773584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
11784a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
11794a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
11804a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
11814a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
11824a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
11833584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
11843584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
11853584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
11864a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
11873584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
1188206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
11890dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo5(int[] array, int end, boolean expectInterpreter) {
1190206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // Bounds check in this loop can be eliminated without deoptimization.
1191206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = array.length - 1 ; i >= 0; i--) {
1192206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
1193206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
11944a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Several HDeoptimize will be added. Two for each index.
11954a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // The null check is not necessary.
1196206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = end - 2 ; i > 0; i--) {
11970dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
11980dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
11990dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
12000dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
12010dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
1202206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i - 1];
1203206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
1204206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i + 1];
1205206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1206206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1207206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1208206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
12090dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo6(int[], int, int, boolean) BCE (before)
1210a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1211a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1212a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1213a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1214a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1215a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1216a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1217a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1218a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1219a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1220a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1221a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
12220dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo6(int[], int, int, boolean) BCE (after)
1223a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1224a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1225a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1226a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1227a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1228a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1229a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1230a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1231a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1232a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1233a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1234a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1235a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
12364a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
12374a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
12383584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
12394a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12404a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12414a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12424a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12434a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12444a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12454a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12464a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
12473584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
12483584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
12493584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
12503584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
12513584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
12523584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
12534a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
1254206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
12550dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo6(int[] array, int start, int end, boolean expectInterpreter) {
12564a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Several HDeoptimize will be added.
1257206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = end; i >= start; i--) {
12580dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
12590dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
12600dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
12610dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
12620dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
1263591ad29eb1aa7c5ac7faadb426f5eb2b4a4ccd02Aart Bik      array[i] = (array[i-2] + array[i-1] + array[i] + array[i+1] + array[i+2]) / 5;
1264206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1265206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1266206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1267206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1268a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.foo7(int[], int, int, boolean) BCE (before)
1269a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1270a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1271a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1272a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1273206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1274a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.foo7(int[], int, int, boolean) BCE (after)
1275a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
1276a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1277a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
1278a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
1279a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
12804a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
12814a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
12823584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
12833584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
12843584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
12853584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
12863584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
12873584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
12884a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
12893584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
1290206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1291206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  void foo7(int[] array, int start, int end, boolean lowEnd) {
12924a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. One for the index
1293206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null
1294206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // check and array.length out of loop).
1295206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = start ; i < end; i++) {
1296206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      if (lowEnd) {
1297206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        // This array access isn't certain. So we don't
1298206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        // use +1000 offset in decision making for deoptimization
1299206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        // conditions.
1300206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        sum += array[i + 1000];
1301206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      }
1302206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
1303206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1304206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1305206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1306206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
13073584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-START: void Main.foo8(int[][], int, int) BCE (before)
13083584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: BoundsCheck
13093584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
13103584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: BoundsCheck
13113584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArraySet
13123584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13133584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-START: void Main.foo8(int[][], int, int) BCE (after)
13143584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Phi
13153584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: BoundsCheck
13163584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
13173584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Phi
13183584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: BoundsCheck
13193584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArraySet
13204a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
13214a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
13223584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
13233584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13243584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13253584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13264a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
13274a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
13284a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
13294a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: If
13303584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13313584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13323584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13333584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
13343584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
13354a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
13363584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
13373584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13383584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  void foo8(int[][] matrix, int start, int end) {
13394a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added for the outer loop,
13404a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // two for the index, and null check on matrix. Same
13414a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // for the inner loop.
13423584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    for (int i = start; i < end; i++) {
13433584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      int[] row = matrix[i];
13443584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      for (int j = start; j < end; j++) {
13453584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang        row[j] = 1;
13463584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      }
13473584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    }
13483584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  }
13493584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13503584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13510dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo9(int[], boolean) BCE (before)
13523584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: NullCheck
13533584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: BoundsCheck
13543584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
13553584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13560dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo9(int[], boolean) BCE (after)
13573584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  //  The loop is guaranteed to be entered. No need to transform the
13583584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  //  loop for loop body entry test.
13593584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13603584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
13614a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
13623584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
13633584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Phi
13643584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: NullCheck
13653584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: BoundsCheck
13663584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
13673584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13684a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK-START: void Main.foo9(int[], boolean) instruction_simplifier_after_bce (after)
13694a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Simplification removes the redundant check
13704a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
13714a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
13724a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK-NOT: Deoptimize
13734a34277c55279ba57ab361f7580db846a201d9b1Aart Bik
13740dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo9(int[] array, boolean expectInterpreter) {
13754a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Two HDeoptimize will be added. Two for the index
13764a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // and one for null check on array.
13773584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    for (int i = 0 ; i < 10; i++) {
13780dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
13790dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
13800dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
13810dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
13820dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
13833584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      sum += array[i];
13843584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    }
13853584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  }
13863584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
13873584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
1388a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.partialLooping(int[], int, int) BCE (before)
1389a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1390a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
13919d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
1392a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.partialLooping(int[], int, int) BCE (after)
1393a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Deoptimize
1394a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1395a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
13969d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
13979d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang  void partialLooping(int[] array, int start, int end) {
13989d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // This loop doesn't cover the full range of [start, end) so
13999d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // adding deoptimization is too aggressive, since end can be
14009d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // greater than array.length but the loop is never going to work on
14019d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // more than 2 elements.
14029d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    for (int i = start; i < end; i++) {
14039d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      if (i == 2) {
14049d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang        return;
14059d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      }
14069d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      array[i] = 1;
14079d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    }
14089d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang  }
14099d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
14109d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
1411206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  static void testUnknownBounds() {
1412206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    boolean caught = false;
14131d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
14141d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik    runAllConstantIndices();
14151d23982327265e8139f67e37d9a86ba2758f7b4aAart Bik
1416206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    Main main = new Main();
14170dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo1(new int[10], 0, 10, false);
1418206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 10) {
1419206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo1 failed!");
1420206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1421206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1422206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1423206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1424206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
14250dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo1(new int[10], 0, 11, true);
1426206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1427206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1428206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1429206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 10) {
1430206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo1 exception failed!");
1431206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1432206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1433206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
14340dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo2(new int[10], 0, 9, false);
1435206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 10) {
1436206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo2 failed!");
1437206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1438206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1439206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1440206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1441206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
14420dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo2(new int[10], 0, 10, true);
1443206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1444206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1445206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1446206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 10) {
1447206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo2 exception failed!");
1448206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1449206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1450206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
14510dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo3(new int[10], 9, false);
1452206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 7) {
1453206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo3 failed!");
1454206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1455206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1456206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1457206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1458206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
14590dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo3(new int[10], 10, true);
1460206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1461206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1462206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1463206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 7) {
1464206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo3 exception failed!");
1465206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1466206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1467206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
14680dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo4(new int[10], 10, false);
1469206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 10) {
1470206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo4 failed!");
1471206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1472206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1473206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1474206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1475206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
14760dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo4(new int[10], 11, true);
1477206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1478206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1479206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1480206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 0) {
1481206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo4 exception failed!");
1482206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1483206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1484206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
14850dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo5(new int[10], 10, false);
1486206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 24) {
1487206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo5 failed!");
1488206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1489206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1490206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1491206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1492206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
14930dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo5(new int[10], 11, true);
1494206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1495206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1496206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1497206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 2) {
1498206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo5 exception failed!");
1499206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1500206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1501206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
15020dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo6(new int[10], 2, 7, false);
1503206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
15049d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    main = new Main();
15053584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    int[] array9 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
15060dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo9(array9, false);
15073584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    if (main.sum != 45) {
15083584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      System.out.println("foo9 failed!");
15093584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    }
15103584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
15113584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    main = new Main();
15129d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    int[] array = new int[4];
15139d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    main.partialLooping(new int[3], 0, 4);
15149d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    if ((array[0] != 1) && (array[1] != 1) &&
15159d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang        (array[2] != 0) && (array[3] != 0)) {
15169d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      System.out.println("partialLooping failed!");
15179d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    }
15189d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
1519206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1520206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1521206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
15220dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo6(new int[10], 2, 8, true);
1523206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1524206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1525206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1526206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught) {
1527206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo6 exception failed!");
1528206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1529206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1530206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1531206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1532206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
15330dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo6(new int[10], 1, 7, true);
1534206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1535206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1536206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1537206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught) {
1538206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo6 exception failed!");
1539206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1540206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1541206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1542206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1543718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  public void testExceptionMessage() {
1544718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    short[] B1 = new short[5];
1545718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    int[] B2 = new int[5];
1546718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    Exception err = null;
1547718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    try {
1548718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang      testExceptionMessage1(B1, B2, null, -1, 6);
1549718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    } catch (Exception e) {
1550718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang      err = e;
1551718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    }
1552718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    System.out.println(err);
1553718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  }
1554718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang
1555718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  void testExceptionMessage1(short[] a1, int[] a2, long a3[], int start, int finish) {
1556718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    int j = finish + 77;
1557718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    // Bug: 22665511
1558718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    // A deoptimization will be triggered here right before the loop. Need to make
1559718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    // sure the value of j is preserved for the interpreter.
1560718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    for (int i = start; i <= finish; i++) {
1561718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang      a2[j - 1] = a1[i + 1];
1562718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    }
1563718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  }
1564718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang
1565d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  // Make sure this method is compiled with optimizing.
1566a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.main(java.lang.String[]) register (after)
1567a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ParallelMove
1568d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
15690304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  public static void main(String[] args) {
15700dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    System.loadLibrary(args[0]);
15710dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe
15720dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    if (!compiledWithOptimizing() ||
15730dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        !hasOatFile() ||
15740dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        runtimeIsSoftFail() ||
15750dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        isInterpreted()) {
15760dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      disableStackFrameAsserts();
15770dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    }
15780dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe
15790304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    sieve(20);
15808c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
15818c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int[] array = {5, 2, 3, 7, 0, 1, 6, 4};
15828c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    bubbleSort(array);
15838c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < 8; i++) {
15848c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (array[i] != i) {
15858c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        System.out.println("bubble sort failed!");
15868c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
15878c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
15888c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
15895d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    mA = new int[4][4];
15905d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    for (int i = 0; i < 4; i++) {
15915d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      for (int j = 0; j < 4; j++) {
15925d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        mA[i][j] = -1;
15935d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      }
15945d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    }
15955d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    dynamicBCEAndIntrinsic(4);
15965d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    for (int i = 0; i < 4; i++) {
15975d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      for (int j = 0; j < 4; j++) {
15985d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        if (mA[i][i] != 1) {
15995d75afe333f57546786686d9bee16b52f1bbe971Aart Bik          System.out.println("dynamic bce failed!");
16005d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        }
16015d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      }
16025d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    }
16035d75afe333f57546786686d9bee16b52f1bbe971Aart Bik
16048c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array = new int[7];
16058c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    pyramid1(array);
16068c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    if (!isPyramid(array)) {
16078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      System.out.println("pyramid1 failed!");
16088c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
16098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
16108c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array = new int[8];
16118c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    pyramid2(array);
16128c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    if (!isPyramid(array)) {
16138c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      System.out.println("pyramid2 failed!");
16148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
16158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
16168c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    java.util.Arrays.fill(array, -1);
16178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    pyramid3(array);
16188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    if (!isPyramid(array)) {
16198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      System.out.println("pyramid3 failed!");
16208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
1621d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
1622d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    // Make sure this value is kept after deoptimization.
1623d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    int i = 1;
1624206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (foo() + i != 100) {
1625206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo failed!");
1626206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    };
1627206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1628206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    testUnknownBounds();
1629718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    new Main().testExceptionMessage();
16300304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  }
1631d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
16320dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean compiledWithOptimizing();
16330dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native void disableStackFrameAsserts();
16340dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native void assertIsManaged();
16350dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native void assertIsInterpreted();
16360dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean hasOatFile();
16370dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean runtimeIsSoftFail();
16380dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean isInterpreted();
16390304e182adee81be32c744fd3c0d28add29974ffMingyao Yang}
1640