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