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 }