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