1 /* 2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 /** 26 * @test 27 * @bug 8146792 28 * @summary Predicate moved after partial peel may lead to broken graph 29 * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:CompileOnly=BadPredicateAfterPartialPeel::m -XX:CompileCommand=dontinline,BadPredicateAfterPartialPeel::not_inlined* -XX:CompileCommand=quiet BadPredicateAfterPartialPeel 30 * 31 */ 32 33 public class BadPredicateAfterPartialPeel { 34 35 static void not_inlined1() {} 36 static void not_inlined4() {} 37 38 static int m_helper(int i, int i3, int i4) { 39 return i3 == 4 ? i4 : i; 40 } 41 42 static float[] array = new float[1000]; 43 static int[] array2 = new int[1000]; 44 45 boolean flag; 46 int j; 47 48 static void m(BadPredicateAfterPartialPeel o1, BadPredicateAfterPartialPeel o2, BadPredicateAfterPartialPeel o, int i4) { 49 int i1 = 1; 50 51 // To delay partial peeling to the loop opts pass right before CCP 52 int i2 = 0; 53 for (; i2 < 10; i2 += i1); 54 i2 = i2 / 10; 55 56 // Simplified during CCP: 57 int i3 = 2; 58 for (; i3 < 4; i3 *= 2); 59 60 // Loop is partial peeled right before CCP 61 int i = 0; 62 boolean b = true; 63 64 not_inlined1(); 65 66 array[0] = -1; 67 do { 68 // peeled section starts here 69 o.flag = false; 70 o.j = 0; 71 72 if (b) { 73 // The following store will be pinned between 74 // predicates and the loop after partial peeling. All 75 // control flow will be optimized out and so nothing 76 // will prevent predicates from being moved out the 77 // loop. 78 array[i] = 0; 79 } 80 if (array[0] != 0) { 81 } 82 if (i >= 10) { 83 // peeled section ends here 84 return; 85 } 86 i += i2; 87 b = false; 88 int i5 = m_helper(i, i3, i4); // This will be simpliflied during CCP 89 if (array[i5] != 0) { // and this will become a predicate 90 } 91 if (o2.flag) { 92 } 93 // A bunch of stuff to grow loop body size and prevent peeling: 94 array2[0] = 0; 95 array2[1] = 0; 96 array2[2] = 0; 97 array2[3] = 0; 98 array2[4] = 0; 99 array2[5] = 0; 100 array2[6] = 0; 101 array2[7] = 0; 102 array2[8] = 0; 103 array2[9] = 0; 104 array2[10] = 0; 105 array2[11] = 0; 106 array2[12] = 0; 107 array2[13] = 0; 108 array2[14] = 0; 109 array2[15] = 0; 110 array2[16] = 0; 111 array2[17] = 0; 112 array2[18] = 0; 113 array2[19] = 0; 114 array2[20] = 0; 115 array2[21] = 0; 116 array2[22] = 0; 117 array2[23] = 0; 118 array2[24] = 0; 119 array2[25] = 0; 120 array2[26] = 0; 121 array2[27] = 0; 122 array2[28] = 0; 123 array2[29] = 0; 124 array2[30] = 0; 125 array2[31] = 0; 126 array2[32] = 0; 127 array2[33] = 0; 128 array2[34] = 0; 129 array2[35] = 0; 130 array2[36] = 0; 131 array2[37] = 0; 132 array2[38] = 0; 133 array2[39] = 0; 134 array2[40] = 0; 135 array2[41] = 0; 136 array2[42] = 0; 137 array2[43] = 0; 138 array2[44] = 0; 139 array2[45] = 0; 140 array2[46] = 0; 141 array2[47] = 0; 142 array2[48] = 0; 143 array2[49] = 0; 144 array2[50] = 0; 145 array2[51] = 0; 146 array2[52] = 0; 147 array2[53] = 0; 148 array2[54] = 0; 149 array2[55] = 0; 150 array2[56] = 0; 151 array2[57] = 0; 152 array2[58] = 0; 153 array2[59] = 0; 154 array2[60] = 0; 155 array2[61] = 0; 156 array2[62] = 0; 157 array2[63] = 0; 158 array2[64] = 0; 159 array2[65] = 0; 160 array2[66] = 0; 161 array2[67] = 0; 162 array2[68] = 0; 163 array2[69] = 0; 164 array2[70] = 0; 165 array2[71] = 0; 166 array2[72] = 0; 167 array2[73] = 0; 168 array2[74] = 0; 169 array2[75] = 0; 170 array2[76] = 0; 171 array2[77] = 0; 172 array2[78] = 0; 173 array2[79] = 0; 174 array2[80] = 0; 175 array2[81] = 0; 176 array2[82] = 0; 177 array2[83] = 0; 178 array2[84] = 0; 179 array2[85] = 0; 180 array2[86] = 0; 181 array2[87] = 0; 182 array2[88] = 0; 183 array2[89] = 0; 184 array2[90] = 0; 185 array2[91] = 0; 186 array2[92] = 0; 187 array2[93] = 0; 188 array2[94] = 0; 189 array2[95] = 0; 190 array2[96] = 0; 191 array2[97] = 0; 192 array2[98] = 0; 193 array2[99] = 0; 194 195 array2[100] = 0; 196 array2[101] = 0; 197 array2[102] = 0; 198 array2[103] = 0; 199 array2[104] = 0; 200 array2[105] = 0; 201 array2[106] = 0; 202 array2[107] = 0; 203 array2[108] = 0; 204 array2[109] = 0; 205 array2[110] = 0; 206 array2[111] = 0; 207 array2[112] = 0; 208 array2[113] = 0; 209 array2[114] = 0; 210 array2[115] = 0; 211 array2[116] = 0; 212 array2[117] = 0; 213 array2[118] = 0; 214 array2[119] = 0; 215 array2[120] = 0; 216 array2[121] = 0; 217 array2[122] = 0; 218 array2[123] = 0; 219 array2[124] = 0; 220 array2[125] = 0; 221 array2[126] = 0; 222 array2[127] = 0; 223 array2[128] = 0; 224 array2[129] = 0; 225 array2[130] = 0; 226 array2[131] = 0; 227 array2[132] = 0; 228 array2[133] = 0; 229 array2[134] = 0; 230 array2[135] = 0; 231 array2[136] = 0; 232 array2[137] = 0; 233 array2[138] = 0; 234 array2[139] = 0; 235 array2[140] = 0; 236 array2[141] = 0; 237 array2[142] = 0; 238 array2[143] = 0; 239 array2[144] = 0; 240 array2[145] = 0; 241 array2[146] = 0; 242 array2[147] = 0; 243 array2[148] = 0; 244 array2[149] = 0; 245 array2[150] = 0; 246 array2[151] = 0; 247 array2[152] = 0; 248 array2[153] = 0; 249 array2[154] = 0; 250 array2[155] = 0; 251 array2[156] = 0; 252 array2[157] = 0; 253 array2[158] = 0; 254 array2[159] = 0; 255 array2[160] = 0; 256 array2[161] = 0; 257 array2[162] = 0; 258 array2[163] = 0; 259 array2[164] = 0; 260 array2[165] = 0; 261 array2[166] = 0; 262 array2[167] = 0; 263 array2[168] = 0; 264 array2[169] = 0; 265 array2[170] = 0; 266 array2[171] = 0; 267 array2[172] = 0; 268 array2[173] = 0; 269 array2[174] = 0; 270 array2[175] = 0; 271 array2[176] = 0; 272 array2[177] = 0; 273 array2[178] = 0; 274 array2[179] = 0; 275 array2[180] = 0; 276 array2[181] = 0; 277 array2[182] = 0; 278 array2[183] = 0; 279 array2[184] = 0; 280 array2[185] = 0; 281 array2[186] = 0; 282 array2[187] = 0; 283 array2[188] = 0; 284 array2[189] = 0; 285 array2[190] = 0; 286 array2[191] = 0; 287 array2[192] = 0; 288 array2[193] = 0; 289 array2[194] = 0; 290 array2[195] = 0; 291 array2[196] = 0; 292 array2[197] = 0; 293 array2[198] = 0; 294 array2[199] = 0; 295 if (o1.j >= 20) { 296 break; 297 } 298 o1.j++; 299 } while(true); 300 not_inlined4(); 301 } 302 303 static public void main(String[] args) { 304 BadPredicateAfterPartialPeel o1 = new BadPredicateAfterPartialPeel(); 305 BadPredicateAfterPartialPeel o2 = new BadPredicateAfterPartialPeel(); 306 for (int i = 0; i < 20000; i++) { 307 o1.j = 0; 308 m(o1, o2, o2, 0); 309 m_helper(i, 2, i); // pollute profile 310 } 311 } 312 }