Main.java revision 17fb893c41f2fb2528abbd63e463008d2ddd5d8f
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) {
125d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[5] = 1;
126d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[4] = 1;
127d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
128d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
129d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
1305949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  /// CHECK-START: void Main.$opt$noinline$constantIndexing2(int[]) BCE (before)
131a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
132a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
133a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
134a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
135a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
136a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
137a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
138a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
139a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
1405949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  /// CHECK-START: void Main.$opt$noinline$constantIndexing2(int[]) BCE (after)
141a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: LessThanOrEqual
142a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Deoptimize
143a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
144a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
145a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
146a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
147a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
148a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
149a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
150a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
151a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
152a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
1538c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
1545949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray  static void $opt$noinline$constantIndexing2(int[] array) {
155d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[1] = 1;
156d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[2] = 1;
157d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[3] = 1;
1588c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[4] = 1;
159d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[-1] = 1;
1605949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray    if (array[1] == 1) {
1615949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray      throw new Error("");
1625949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray    }
163d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
164d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
165d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
166a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (before)
167a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
168a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
169a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
170a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
171a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
172a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
173a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
174a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
175a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
176a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
177a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
178a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
179a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
180a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
181a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
182a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
183a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
184a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: int[] Main.constantIndexing3(int[], int[], boolean) BCE (after)
185a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: LessThanOrEqual
186a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Deoptimize
187a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
188a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
189a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: LessThanOrEqual
190a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Deoptimize
191a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
192a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
193a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
194a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
195a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
196a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
197a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
198a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
199a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
200a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
201a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
202a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
203a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
204a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
205d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
206d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static int[] constantIndexing3(int[] array1, int[] array2, boolean copy) {
207d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    if (!copy) {
208d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang      return array1;
209d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    }
210d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[0] = array1[0];
211d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[1] = array1[1];
212d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[2] = array1[2];
213d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array2[3] = array1[3];
214d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    return array2;
215d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
216d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
217d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
218a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing4(int[]) BCE (before)
219a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
220a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
221d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
222a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing4(int[]) BCE (after)
223a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: LessThanOrEqual
224a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
225a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
226d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
227d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  // There is only one array access. It's not beneficial
228d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  // to create a compare with deoptimization instruction.
229d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static void constantIndexing4(int[] array) {
230d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[0] = 1;
2318c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
2328c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
2338c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
234a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing5(int[]) BCE (before)
235a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
236a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
237a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
238a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
239d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
240a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantIndexing5(int[]) BCE (after)
241a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Deoptimize
242a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
243a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
244a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
245a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
246d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
247d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static void constantIndexing5(int[] array) {
248d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    // We don't apply the deoptimization for very large constant index
249d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    // since it's likely to be an anomaly and will throw AIOOBE.
250d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[Integer.MAX_VALUE - 1000] = 1;
251d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[Integer.MAX_VALUE - 999] = 1;
252d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    array[Integer.MAX_VALUE - 998] = 1;
253d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
254d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
255639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK-START: void Main.constantIndexing6(int[]) BCE (before)
256639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: BoundsCheck
257639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: ArraySet
258639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: BoundsCheck
259639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: ArraySet
260639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
261639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK-START: void Main.constantIndexing6(int[]) BCE (after)
262639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  /// CHECK: Deoptimize
263639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
264639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  static void constantIndexing6(int[] array) {
265639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    array[3] = 1;
266639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    array[4] = 1;
267639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  }
268639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
269639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  // A helper into which the actual throwing function should be inlined.
270639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  static void constantIndexingForward6(int[] array) {
2710dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    assertIsManaged();
272639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe    constantIndexing6(array);
273639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe  }
274639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe
275a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern1(int[]) BCE (before)
276a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
277a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
278a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
279a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
280a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
281a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
282a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
283a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
284a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
285a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
286a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
287a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
288a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
289a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
290a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
291a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern1(int[]) BCE (after)
292a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
293a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
294a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
295a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
296a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
297a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
298a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
299a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
300a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
301a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
302a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
303a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
304a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
305a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
3068c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void loopPattern1(int[] array) {
3088c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < array.length; i++) {
3098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
3108c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3118c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3128c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 1; i < array.length; i++) {
3138c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
3148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3168c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 1; i < array.length - 1; i++) {
3178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
3188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = -1; i < array.length; i++) {
3218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
3228c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3238c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3248c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i <= array.length; i++) {
3258c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
3268c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3278c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3288c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < array.length; i += 2) {
3298c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // We don't have any assumption on max array length yet.
3308c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // Bounds check can't be eliminated due to overflow concern.
3318c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;
3328c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3338c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3348c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 1; i < array.length; i += 2) {
3358c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // Bounds check can be eliminated since i is odd so the last
3368c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // i that's less than array.length is at most (Integer.MAX_VALUE - 2).
3378c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;
3388c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3398c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
3408c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3418c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
342a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern2(int[]) BCE (before)
343a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
344a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
345a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
346a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
347a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
348a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
349a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
350a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
351a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
352a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
353a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
354a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
355a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
356a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern2(int[]) BCE (after)
357a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
358a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
359a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
360a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
361a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
362a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
363a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
364a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
365a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
366a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
367a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
368a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
3698c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3708c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void loopPattern2(int[] array) {
3718c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length - 1; i >= 0; i--) {
3728c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
3738c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3748c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3758c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i > 0; i--) {
3768c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i - 1] = 1;  // Bounds check can be eliminated.
3778c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3788c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3798c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length - 1; i > 0; i--) {
3808c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
3818c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3828c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3838c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i >= 0; i--) {
3848c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
3858c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3868c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3878c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i >= 0; i--) {
3888c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i - 1] = 1;  // Bounds check can't be eliminated.
3898c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3908c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3918c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = array.length; i > 0; i -= 20) {
3928c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      // For i >= 0, (i - 20 - 1) is guaranteed not to underflow.
3938c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i - 1] = 1;  // Bounds check can be eliminated.
3948c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
3958c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
3968c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
3978c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
398a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern3(int[]) BCE (before)
399a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
400a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4018c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
402a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.loopPattern3(int[]) BCE (after)
403a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
404a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4058c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
4068c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void loopPattern3(int[] array) {
4078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    java.util.Random random = new java.util.Random();
4088c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; ; i++) {
4098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (random.nextInt() % 1000 == 0 && i < array.length) {
4108c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        // Can't eliminate the bound check since not every i++ is
4118c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        // matched with a array length check, so there is some chance that i
4128c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        // overflows and is negative.
4138c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        array[i] = 1;
4148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
4150304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    }
4160304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  }
4170304e182adee81be32c744fd3c0d28add29974ffMingyao Yang
4188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
419a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantNewArray() BCE (before)
420a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
421a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
422a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
423a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
424a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
425a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
426a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
427a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
428a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
429a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
430a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
431a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.constantNewArray() BCE (after)
432a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
433a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
434a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
435a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
436a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
437a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
438a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
439a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
440a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
441a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4428c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
4438c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void constantNewArray() {
4448c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int[] array = new int[10];
4458c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < 10; i++) {
4468c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can be eliminated.
4478c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
4488c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
4498c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i <= 10; i++) {
4508c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = 1;  // Bounds check can't be eliminated.
4518c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
4528c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
4538c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[0] = 1;  // Bounds check can be eliminated.
4548c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[9] = 1;  // Bounds check can be eliminated.
4558c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array[10] = 1; // Bounds check can't be eliminated.
4568c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
4578c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
4584559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
4594559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  static byte readData() {
4604559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    return 1;
4614559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  }
4624559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
463a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.circularBufferProducer() BCE (before)
464a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
465a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4664559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
467a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.circularBufferProducer() BCE (after)
468a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
469a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4704559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
4714559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  static void circularBufferProducer() {
4724559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    byte[] array = new byte[4096];
4734559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    int i = 0;
4744559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    while (true) {
4754559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang      array[i & (array.length - 1)] = readData();
4764559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang      i++;
4774559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang    }
4784559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang  }
4794559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
4804559f000b323b64e4bd179b72cfb788b30b25b23Mingyao Yang
481a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid1(int[]) BCE (before)
482a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
483a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
484a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
485a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4868c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
487a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid1(int[]) BCE (after)
488a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
489a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
490a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
491a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
4928c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
4938c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  // Set array to something like {0, 1, 2, 3, 2, 1, 0}.
4948c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void pyramid1(int[] array) {
4958c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < (array.length + 1) / 2; i++) {
4968c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = i;
4978c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[array.length - 1 - i] = i;
4988c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
4998c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
5008c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
5018c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
502a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid2(int[]) BCE (before)
503a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
504a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
505a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
506a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
5078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
508a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid2(int[]) BCE (after)
509a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
510a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
511a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
512a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
5138c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
5148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  // Set array to something like {0, 1, 2, 3, 2, 1, 0}.
5158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void pyramid2(int[] array) {
5168c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < (array.length + 1) >> 1; i++) {
5178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = i;
5188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[array.length - 1 - i] = i;
5198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
5208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
5218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
5228c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
523a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid3(int[]) BCE (before)
524a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
525a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
526a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
527a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
5288c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
529a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.pyramid3(int[]) BCE (after)
530a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
531a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
532a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
533a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
5348c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
5358c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  // Set array to something like {0, 1, 2, 3, 2, 1, 0}.
5368c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void pyramid3(int[] array) {
5378c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < (array.length + 1) >>> 1; i++) {
5388c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[i] = i;
5398c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      array[array.length - 1 - i] = i;
5408c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
5418c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
5428c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
5438c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
544a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: boolean Main.isPyramid(int[]) BCE (before)
545a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
546a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
547a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
548a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
54957e04754d5b7fb3cc99d6b9f70da73cf4c65b416Mingyao Yang
550a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: boolean Main.isPyramid(int[]) BCE (after)
551a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
552a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
553a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
554a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
55557e04754d5b7fb3cc99d6b9f70da73cf4c65b416Mingyao Yang
5568c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static boolean isPyramid(int[] array) {
5578c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int i = 0;
5588c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int j = array.length - 1;
5598c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    while (i <= j) {
5608c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (array[i] != i) {
5618c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        return false;
5628c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
5638c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (array[j] != i) {
5648c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        return false;
5658c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
5668c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      i++; j--;
5678c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
5688c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    return true;
5698c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
5708c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
5718c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
572a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.bubbleSort(int[]) GVN (before)
573a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
574a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
575a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
576a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
577a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
578a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
579a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
580a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
581a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
582a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
583a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
584a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
585a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
586a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.bubbleSort(int[]) GVN (after)
587a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
588a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
589a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
590a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
591a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
592a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
593a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
594a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
595a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
596a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
597a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
598a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.bubbleSort(int[]) BCE (after)
599a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
600a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
601a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
602a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
603a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
604a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: ArrayGet
605a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
606a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
607a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
608a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
6098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6108c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  static void bubbleSort(int[] array) {
6118c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < array.length - 1; i++) {
6128c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      for (int j = 0; j < array.length - i - 1; j++) {
6138c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        if (array[j] > array[j + 1]) {
6148c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang          int temp = array[j + 1];
6158c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang          array[j + 1] = array[j];
6168c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang          array[j] = temp;
6178c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        }
6188c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
6198c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
6208c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang  }
6218c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
6225d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  static int[][] mA;
6235d75afe333f57546786686d9bee16b52f1bbe971Aart Bik
6245d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (before)
62509e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Array references mA[i] and ..[j] both in inner loop.
62609e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get1:l\d+>>  ArrayGet [<<Array1:l\d+>>,<<Bounds1:i\d+>>] loop:<<InnerLoop:B\d+>>
62709e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array1>>     NullCheck [<<Field1:l\d+>>]                 loop:<<InnerLoop>>
62809e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Len1:i\d+>>  ArrayLength [<<Array1>>]                    loop:<<InnerLoop>>
62909e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Bounds1>>    BoundsCheck [<<Index1:i\d+>>,<<Len1>>]      loop:<<InnerLoop>>
63009e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get2:i\d+>>  ArrayGet [<<Array2:l\d+>>,<<Bounds2:i\d+>>] loop:<<InnerLoop>>
63109e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array2>>     NullCheck [<<Get1>>]                        loop:<<InnerLoop>>
63209e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Len2:i\d+>>  ArrayLength [<<Array2>>]                    loop:<<InnerLoop>>
63309e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Bounds2>>    BoundsCheck [<<Index2:i\d+>>,<<Len2>>]      loop:<<InnerLoop>>
63417fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  // Note: The ArtMethod* (typed as int or long) is optional after sharpening.
63517fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  /// CHECK-DAG:                 InvokeStaticOrDirect [<<Get2>>{{(,[ij]\d+)?}}] loop:<<InnerLoop>>
63609e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index2>>     Phi                                         loop:<<InnerLoop>>
63709e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index1>>     Phi                                         loop:<<OuterLoop:B\d+>>
63809e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Field1>>     StaticFieldGet                              loop:none
63909e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>"
64009e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //
64109e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after)
64209e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Array reference mA[i] hoisted to same level as deopt.
64309e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:                 Deoptimize                                  loop:<<OuterLoop:B\d+>>
64409e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:                 ArrayLength                                 loop:<<OuterLoop>>
64509e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get1:l\d+>>  ArrayGet [<<Array1:l\d+>>,<<Index1:i\d+>>]  loop:<<OuterLoop>>
64609e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Array reference ..[j] still in inner loop, with a direct index.
64709e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Get2:i\d+>>  ArrayGet [<<Array2:l\d+>>,<<Index2:i\d+>>]  loop:<<InnerLoop:B\d+>>
64817fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  // Note: The ArtMethod* (typed as int or long) is optional after sharpening.
64917fb893c41f2fb2528abbd63e463008d2ddd5d8fVladimir Marko  /// CHECK-DAG:                 InvokeStaticOrDirect [<<Get2>>{{(,[ij]\d+)?}}] loop:<<InnerLoop>>
65009e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index2>>     Phi                                         loop:<<InnerLoop>>
65109e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Index1>>     Phi                                         loop:<<OuterLoop>>
65209e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //  Synthetic phi.
65309e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array2>>     Phi                                         loop:<<OuterLoop>>
65409e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-DAG:  <<Array1>>     StaticFieldGet                              loop:none
65509e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  /// CHECK-EVAL: "<<InnerLoop>>" != "<<OuterLoop>>"
65609e8d5ffe52c738c6a74984b1cbc7ad4bc8f5e2cAart Bik  //
6575d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-START: void Main.dynamicBCEAndIntrinsic(int) BCE (after)
6585d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-NOT: NullCheck
6595d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  /// CHECK-NOT: BoundsCheck
6605d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  static void dynamicBCEAndIntrinsic(int n) {
6615d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    for (int i = 0; i < n; i++) {
6625d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      for (int j = 0; j < n; j++) {
6635d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        // Since intrinsic call cannot modify fields or arrays,
6645d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        // dynamic BCE and hoisting can be applied to the inner loop.
6655d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        mA[i][j] = Math.abs(mA[i][j]);
6665d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      }
6675d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    }
6685d75afe333f57546786686d9bee16b52f1bbe971Aart Bik  }
6698c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
670d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  static int foo() {
671d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    try {
6720dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      assertIsManaged();
673d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang      // This will cause AIOOBE.
6745949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray      $opt$noinline$constantIndexing2(new int[3]);
675d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
6760dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      assertIsManaged();  // This is to ensure that single-frame deoptimization works.
6775949fa0cb9a8d26ac20b9b02065a63b4b20443beNicolas Geoffray                          // Will need to be updated if $opt$noinline$constantIndexing2 is inlined.
678639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe      try {
679639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe        // This will cause AIOOBE.
680639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe        constantIndexingForward6(new int[3]);
681639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe      } catch (ArrayIndexOutOfBoundsException e2) {
682951779839f0d35ed5336f399c8f521fd9a6b7c27David Brazdil        // Having deopted, we expect to be running interpreted at this point.
683951779839f0d35ed5336f399c8f521fd9a6b7c27David Brazdil        // Does not apply to debuggable, however, since we do not inline.
684639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe        return 99;
685639bdd13993644a267f177f8f5936496bda65e2bAndreas Gampe      }
686d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    }
687d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    return 0;
688d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  }
689d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
690d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
691206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  int sum;
692206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
6930dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo1(int[], int, int, boolean) BCE (before)
694a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
695a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
696a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
697a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
698a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
6990dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo1(int[], int, int, boolean) BCE (after)
700a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
701a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
702a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
703a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
704a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
7054a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
7064a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
7073584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
7083584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7093584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7103584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7113584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
7123584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
7134a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
7143584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
715206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
7160dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo1(int[] array, int start, int end, boolean expectInterpreter) {
7174a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
718206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null
719206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // check and array.length out of loop).
720206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = start ; i < end; i++) {
7210dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
7220dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
7230dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
7240dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
7250dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
726206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
727206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
728206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
729206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
730206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
731206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
7320dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo2(int[], int, int, boolean) BCE (before)
733a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
734a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
735a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
736a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
7370dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo2(int[], int, int, boolean) BCE (after)
738a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
739a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
740a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
741a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
742a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
7434a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
7444a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
7453584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
7463584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7473584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7483584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7493584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
7503584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
7514a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
7523584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
753206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
7540dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo2(int[] array, int start, int end, boolean expectInterpreter) {
7554a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
756206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null
757206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // check and array.length out of loop).
758206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = start ; i <= end; i++) {
7590dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
7600dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
7610dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
7620dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
7630dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
764206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
765206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
766206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
767206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
768206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
769206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
7700dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo3(int[], int, boolean) BCE (before)
771a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
772a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
773a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
774a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
7750dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo3(int[], int, boolean) BCE (after)
776a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
777a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
778a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
779a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
780a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
7814a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
7824a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
7833584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
7844a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
7853584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7863584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
7873584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
7883584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
7894a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
7903584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
791206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
7920dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo3(int[] array, int end, boolean expectInterpreter) {
7934a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
794206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null check
795206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and array.length out of loop).
796206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = 3 ; i <= end; i++) {
7970dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
7980dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
7990dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
8000dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
8010dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
802206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
803206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
804206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
805206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
806206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
8073584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
8080dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo4(int[], int, boolean) BCE (before)
809a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
810a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
811a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
812a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
813a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
8140dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo4(int[], int, boolean) BCE (after)
815a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
816a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
817a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
818a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
819a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
8204a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
8214a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
8223584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
8234a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
8243584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
8253584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
8263584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
8273584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
8284a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
8293584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
830206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
8310dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo4(int[] array, int end, boolean expectInterpreter) {
8324a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. Two for the index
833206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null check
834206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and array.length out of loop).
835206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = end ; i > 0; i--) {
8360dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
8370dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
8380dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
8390dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
8400dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
841206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i - 1] = 1;
842206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i - 1];
843206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
844206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
845206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
846206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
8470dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo5(int[], int, boolean) BCE (before)
848a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
849a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
850a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
851a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
852a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
853a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
854a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
855a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
856a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil
8570dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo5(int[], int, boolean) BCE (after)
858a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
859a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
860a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
861a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
862a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
863a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
864a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
865a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
866a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
8674a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
8684a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
8693584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
8704a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
8714a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
8724a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
8734a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
8744a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
8753584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
8763584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
8773584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
8784a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
8793584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
880206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
8810dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo5(int[] array, int end, boolean expectInterpreter) {
882206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // Bounds check in this loop can be eliminated without deoptimization.
883206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = array.length - 1 ; i >= 0; i--) {
884206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = 1;
885206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
8864a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Several HDeoptimize will be added. Two for each index.
8874a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // The null check is not necessary.
888206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = end - 2 ; i > 0; i--) {
8890dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
8900dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
8910dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
8920dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
8930dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
894206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i - 1];
895206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
896206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i + 1];
897206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
898206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
899206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
900206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
9010dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo6(int[], int, int, boolean) BCE (before)
902a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
903a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
904a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
905a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
906a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
907a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
908a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
909a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
910a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
911a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
912a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
913a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
9140dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo6(int[], int, int, boolean) BCE (after)
915a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
916a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
917a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
918a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
919a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
920a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
921a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
922a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
923a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
924a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
925a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
926a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
927a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
9284a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
9294a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
9303584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
9314a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9324a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9334a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9344a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9354a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9364a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9374a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9384a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
9393584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
9403584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
9413584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
9423584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
9433584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
9443584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
9454a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
946206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
9470dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo6(int[] array, int start, int end, boolean expectInterpreter) {
9484a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Several HDeoptimize will be added.
949206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = end; i >= start; i--) {
9500dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
9510dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
9520dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
9530dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
9540dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
955206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      array[i] = (array[i-2] + array[i-1] + array[i] + array[i+1] + array[i+2]) / 5;
956206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
957206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
958206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
959206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
960a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.foo7(int[], int, int, boolean) BCE (before)
961a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
962a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
963a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
964a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
965206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
966a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.foo7(int[], int, int, boolean) BCE (after)
967a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: Phi
968a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
969a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
970a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: BoundsCheck
971a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArrayGet
9724a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
9734a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
9743584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
9753584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
9763584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
9773584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
9783584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
9793584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
9804a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
9813584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
982206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
983206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  void foo7(int[] array, int start, int end, boolean lowEnd) {
9844a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added. One for the index
985206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // and one for null check on array (to hoist null
986206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    // check and array.length out of loop).
987206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    for (int i = start ; i < end; i++) {
988206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      if (lowEnd) {
989206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        // This array access isn't certain. So we don't
990206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        // use +1000 offset in decision making for deoptimization
991206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        // conditions.
992206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang        sum += array[i + 1000];
993206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      }
994206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      sum += array[i];
995206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
996206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
997206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
998206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
9993584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-START: void Main.foo8(int[][], int, int) BCE (before)
10003584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: BoundsCheck
10013584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
10023584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: BoundsCheck
10033584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArraySet
10043584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10053584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-START: void Main.foo8(int[][], int, int) BCE (after)
10063584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Phi
10073584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: BoundsCheck
10083584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
10093584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Phi
10103584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: BoundsCheck
10113584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArraySet
10124a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Added blocks at end for deoptimization.
10134a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Exit
10143584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: If
10153584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10163584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10173584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10184a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10194a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10204a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10214a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: If
10223584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10233584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10243584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10253584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
10263584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
10274a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Goto
10283584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Goto
10293584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10303584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  void foo8(int[][] matrix, int start, int end) {
10314a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Three HDeoptimize will be added for the outer loop,
10324a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // two for the index, and null check on matrix. Same
10334a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // for the inner loop.
10343584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    for (int i = start; i < end; i++) {
10353584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      int[] row = matrix[i];
10363584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      for (int j = start; j < end; j++) {
10373584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang        row[j] = 1;
10383584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      }
10393584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    }
10403584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  }
10413584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10423584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10430dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo9(int[], boolean) BCE (before)
10443584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: NullCheck
10453584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: BoundsCheck
10463584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
10473584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10480dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  /// CHECK-START: void Main.foo9(int[], boolean) BCE (after)
10493584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  //  The loop is guaranteed to be entered. No need to transform the
10503584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  //  loop for loop body entry test.
10513584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10523584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Deoptimize
10534a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
10543584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: Deoptimize
10553584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: Phi
10563584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: NullCheck
10573584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK-NOT: BoundsCheck
10583584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  /// CHECK: ArrayGet
10593584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10604a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK-START: void Main.foo9(int[], boolean) instruction_simplifier_after_bce (after)
10614a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  //  Simplification removes the redundant check
10624a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
10634a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK: Deoptimize
10644a34277c55279ba57ab361f7580db846a201d9b1Aart Bik  /// CHECK-NOT: Deoptimize
10654a34277c55279ba57ab361f7580db846a201d9b1Aart Bik
10660dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  void foo9(int[] array, boolean expectInterpreter) {
10674a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // Two HDeoptimize will be added. Two for the index
10684a34277c55279ba57ab361f7580db846a201d9b1Aart Bik    // and one for null check on array.
10693584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    for (int i = 0 ; i < 10; i++) {
10700dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      if (expectInterpreter) {
10710dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsInterpreted();
10720dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      } else {
10730dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        assertIsManaged();
10740dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      }
10753584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      sum += array[i];
10763584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    }
10773584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang  }
10783584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
10793584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
1080a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.partialLooping(int[], int, int) BCE (before)
1081a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1082a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
10839d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
1084a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.partialLooping(int[], int, int) BCE (after)
1085a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-NOT: Deoptimize
1086a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: BoundsCheck
1087a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ArraySet
10889d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
10899d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang  void partialLooping(int[] array, int start, int end) {
10909d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // This loop doesn't cover the full range of [start, end) so
10919d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // adding deoptimization is too aggressive, since end can be
10929d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // greater than array.length but the loop is never going to work on
10939d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    // more than 2 elements.
10949d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    for (int i = start; i < end; i++) {
10959d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      if (i == 2) {
10969d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang        return;
10979d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      }
10989d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      array[i] = 1;
10999d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    }
11009d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang  }
11019d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
11029d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
1103206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  static void testUnknownBounds() {
1104206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    boolean caught = false;
1105206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    Main main = new Main();
11060dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo1(new int[10], 0, 10, false);
1107206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 10) {
1108206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo1 failed!");
1109206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1110206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1111206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1112206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1113206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
11140dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo1(new int[10], 0, 11, true);
1115206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1116206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1117206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1118206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 10) {
1119206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo1 exception failed!");
1120206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1121206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1122206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
11230dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo2(new int[10], 0, 9, false);
1124206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 10) {
1125206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo2 failed!");
1126206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1127206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1128206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1129206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1130206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
11310dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo2(new int[10], 0, 10, true);
1132206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1133206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1134206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1135206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 10) {
1136206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo2 exception failed!");
1137206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1138206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1139206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
11400dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo3(new int[10], 9, false);
1141206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 7) {
1142206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo3 failed!");
1143206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1144206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1145206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1146206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1147206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
11480dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo3(new int[10], 10, true);
1149206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1150206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1151206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1152206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 7) {
1153206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo3 exception failed!");
1154206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1155206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1156206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
11570dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo4(new int[10], 10, false);
1158206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 10) {
1159206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo4 failed!");
1160206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1161206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1162206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1163206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1164206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
11650dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo4(new int[10], 11, true);
1166206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1167206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1168206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1169206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 0) {
1170206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo4 exception failed!");
1171206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1172206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1173206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
11740dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo5(new int[10], 10, false);
1175206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (main.sum != 24) {
1176206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo5 failed!");
1177206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1178206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1179206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1180206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1181206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
11820dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo5(new int[10], 11, true);
1183206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1184206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1185206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1186206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught || main.sum != 2) {
1187206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo5 exception failed!");
1188206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1189206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1190206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
11910dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo6(new int[10], 2, 7, false);
1192206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
11939d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    main = new Main();
11943584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    int[] array9 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
11950dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    main.foo9(array9, false);
11963584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    if (main.sum != 45) {
11973584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang      System.out.println("foo9 failed!");
11983584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    }
11993584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang
12003584bce5b1f45e5741d3a6ca24884a36320ecb6bMingyao Yang    main = new Main();
12019d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    int[] array = new int[4];
12029d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    main.partialLooping(new int[3], 0, 4);
12039d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    if ((array[0] != 1) && (array[1] != 1) &&
12049d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang        (array[2] != 0) && (array[3] != 0)) {
12059d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang      System.out.println("partialLooping failed!");
12069d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang    }
12079d750efd66ae7f4b790af3c1ff8de972bbe826d9Mingyao Yang
1208206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1209206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1210206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
12110dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo6(new int[10], 2, 8, true);
1212206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1213206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1214206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1215206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught) {
1216206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo6 exception failed!");
1217206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1218206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1219206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    caught = false;
1220206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    main = new Main();
1221206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    try {
12220dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      main.foo6(new int[10], 1, 7, true);
1223206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    } catch (ArrayIndexOutOfBoundsException e) {
1224206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      caught = true;
1225206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1226206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (!caught) {
1227206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo6 exception failed!");
1228206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    }
1229206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1230206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang  }
1231206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1232718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  public void testExceptionMessage() {
1233718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    short[] B1 = new short[5];
1234718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    int[] B2 = new int[5];
1235718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    Exception err = null;
1236718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    try {
1237718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang      testExceptionMessage1(B1, B2, null, -1, 6);
1238718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    } catch (Exception e) {
1239718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang      err = e;
1240718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    }
1241718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    System.out.println(err);
1242718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  }
1243718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang
1244718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  void testExceptionMessage1(short[] a1, int[] a2, long a3[], int start, int finish) {
1245718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    int j = finish + 77;
1246718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    // Bug: 22665511
1247718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    // A deoptimization will be triggered here right before the loop. Need to make
1248718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    // sure the value of j is preserved for the interpreter.
1249718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    for (int i = start; i <= finish; i++) {
1250718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang      a2[j - 1] = a1[i + 1];
1251718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    }
1252718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang  }
1253718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang
1254d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang  // Make sure this method is compiled with optimizing.
1255a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK-START: void Main.main(java.lang.String[]) register (after)
1256a06d66a4ee60926127b9498b7ff0b3e37a24fccfDavid Brazdil  /// CHECK: ParallelMove
1257d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
12580304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  public static void main(String[] args) {
12590dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    System.loadLibrary(args[0]);
12600dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe
12610dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    if (!compiledWithOptimizing() ||
12620dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        !hasOatFile() ||
12630dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        runtimeIsSoftFail() ||
12640dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe        isInterpreted()) {
12650dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe      disableStackFrameAsserts();
12660dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe    }
12670dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe
12680304e182adee81be32c744fd3c0d28add29974ffMingyao Yang    sieve(20);
12698c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
12708c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    int[] array = {5, 2, 3, 7, 0, 1, 6, 4};
12718c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    bubbleSort(array);
12728c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    for (int i = 0; i < 8; i++) {
12738c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      if (array[i] != i) {
12748c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang        System.out.println("bubble sort failed!");
12758c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      }
12768c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
12778c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
12785d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    mA = new int[4][4];
12795d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    for (int i = 0; i < 4; i++) {
12805d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      for (int j = 0; j < 4; j++) {
12815d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        mA[i][j] = -1;
12825d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      }
12835d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    }
12845d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    dynamicBCEAndIntrinsic(4);
12855d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    for (int i = 0; i < 4; i++) {
12865d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      for (int j = 0; j < 4; j++) {
12875d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        if (mA[i][i] != 1) {
12885d75afe333f57546786686d9bee16b52f1bbe971Aart Bik          System.out.println("dynamic bce failed!");
12895d75afe333f57546786686d9bee16b52f1bbe971Aart Bik        }
12905d75afe333f57546786686d9bee16b52f1bbe971Aart Bik      }
12915d75afe333f57546786686d9bee16b52f1bbe971Aart Bik    }
12925d75afe333f57546786686d9bee16b52f1bbe971Aart Bik
12938c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array = new int[7];
12948c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    pyramid1(array);
12958c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    if (!isPyramid(array)) {
12968c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      System.out.println("pyramid1 failed!");
12978c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
12988c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
12998c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    array = new int[8];
13008c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    pyramid2(array);
13018c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    if (!isPyramid(array)) {
13028c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      System.out.println("pyramid2 failed!");
13038c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
13048c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang
13058c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    java.util.Arrays.fill(array, -1);
13068c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    pyramid3(array);
13078c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    if (!isPyramid(array)) {
13088c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang      System.out.println("pyramid3 failed!");
13098c8bad89ff367712a6f5bbf3a5836cd398391067Mingyao Yang    }
1310d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
1311d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    // Make sure this value is kept after deoptimization.
1312d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang    int i = 1;
1313206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    if (foo() + i != 100) {
1314206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang      System.out.println("foo failed!");
1315206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    };
1316206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang
1317206d6fd6cae5ba8c4d5f0e230111fe77b9d5c0a5Mingyao Yang    testUnknownBounds();
1318718493c6c3c8e380663cb8a94e57ce160a6c473fMingyao Yang    new Main().testExceptionMessage();
13190304e182adee81be32c744fd3c0d28add29974ffMingyao Yang  }
1320d43b3ac88cd46b8815890188c9c2b9a3f1564648Mingyao Yang
13210dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean compiledWithOptimizing();
13220dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native void disableStackFrameAsserts();
13230dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native void assertIsManaged();
13240dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native void assertIsInterpreted();
13250dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean hasOatFile();
13260dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean runtimeIsSoftFail();
13270dfc9bc0cca3ae15dc75bbea3ca9b6d7508ce893Andreas Gampe  public static native boolean isInterpreted();
13280304e182adee81be32c744fd3c0d28add29974ffMingyao Yang}
1329