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  * @test
26  * @bug 8146792
27  * @summary Predicate moved after partial peel may lead to broken graph
28  * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation
29  *      -XX:-UseOnStackReplacement
30  *      -XX:CompileCommand=compileonly,compiler.loopopts.BadPredicateAfterPartialPeel::m
31  *      -XX:CompileCommand=dontinline,compiler.loopopts.BadPredicateAfterPartialPeel::not_inlined*
32  *      -XX:CompileCommand=quiet
33  *      compiler.loopopts.BadPredicateAfterPartialPeel
34  */
35 
36 package compiler.loopopts;
37 
38 public class BadPredicateAfterPartialPeel {
39 
not_inlined1()40     static void not_inlined1() {}
not_inlined4()41     static void not_inlined4() {}
42 
m_helper(int i, int i3, int i4)43     static int m_helper(int i, int i3, int i4) {
44         return i3 == 4 ? i4 : i;
45     }
46 
47     static float[] array = new float[1000];
48     static int[] array2 = new int[1000];
49 
50     boolean flag;
51     int j;
52 
m(BadPredicateAfterPartialPeel o1, BadPredicateAfterPartialPeel o2, BadPredicateAfterPartialPeel o, int i4)53     static void m(BadPredicateAfterPartialPeel o1, BadPredicateAfterPartialPeel o2, BadPredicateAfterPartialPeel o, int i4) {
54         int i1 = 1;
55 
56         // To delay partial peeling to the loop opts pass right before CCP
57         int i2 = 0;
58         for (; i2 < 10; i2 += i1);
59         i2 = i2 / 10;
60 
61         // Simplified during CCP:
62         int i3 = 2;
63         for (; i3 < 4; i3 *= 2);
64 
65         // Loop is partial peeled right before CCP
66         int i = 0;
67         boolean b = true;
68 
69         not_inlined1();
70 
71         array[0] = -1;
72         do {
73             // peeled section starts here
74             o.flag = false;
75             o.j = 0;
76 
77             if (b) {
78                 // The following store will be pinned between
79                 // predicates and the loop after partial peeling. All
80                 // control flow will be optimized out and so nothing
81                 // will prevent predicates from being moved out the
82                 // loop.
83                 array[i] = 0;
84             }
85             if (array[0] != 0) {
86             }
87             if (i >= 10) {
88                 // peeled section ends here
89                 return;
90             }
91             i += i2;
92             b = false;
93             int i5 = m_helper(i, i3, i4); // This will be simpliflied during CCP
94             if (array[i5] != 0) { // and this will become a predicate
95             }
96             if (o2.flag) {
97             }
98             // A bunch of stuff to grow loop body size and prevent peeling:
99             array2[0] = 0;
100             array2[1] = 0;
101             array2[2] = 0;
102             array2[3] = 0;
103             array2[4] = 0;
104             array2[5] = 0;
105             array2[6] = 0;
106             array2[7] = 0;
107             array2[8] = 0;
108             array2[9] = 0;
109             array2[10] = 0;
110             array2[11] = 0;
111             array2[12] = 0;
112             array2[13] = 0;
113             array2[14] = 0;
114             array2[15] = 0;
115             array2[16] = 0;
116             array2[17] = 0;
117             array2[18] = 0;
118             array2[19] = 0;
119             array2[20] = 0;
120             array2[21] = 0;
121             array2[22] = 0;
122             array2[23] = 0;
123             array2[24] = 0;
124             array2[25] = 0;
125             array2[26] = 0;
126             array2[27] = 0;
127             array2[28] = 0;
128             array2[29] = 0;
129             array2[30] = 0;
130             array2[31] = 0;
131             array2[32] = 0;
132             array2[33] = 0;
133             array2[34] = 0;
134             array2[35] = 0;
135             array2[36] = 0;
136             array2[37] = 0;
137             array2[38] = 0;
138             array2[39] = 0;
139             array2[40] = 0;
140             array2[41] = 0;
141             array2[42] = 0;
142             array2[43] = 0;
143             array2[44] = 0;
144             array2[45] = 0;
145             array2[46] = 0;
146             array2[47] = 0;
147             array2[48] = 0;
148             array2[49] = 0;
149             array2[50] = 0;
150             array2[51] = 0;
151             array2[52] = 0;
152             array2[53] = 0;
153             array2[54] = 0;
154             array2[55] = 0;
155             array2[56] = 0;
156             array2[57] = 0;
157             array2[58] = 0;
158             array2[59] = 0;
159             array2[60] = 0;
160             array2[61] = 0;
161             array2[62] = 0;
162             array2[63] = 0;
163             array2[64] = 0;
164             array2[65] = 0;
165             array2[66] = 0;
166             array2[67] = 0;
167             array2[68] = 0;
168             array2[69] = 0;
169             array2[70] = 0;
170             array2[71] = 0;
171             array2[72] = 0;
172             array2[73] = 0;
173             array2[74] = 0;
174             array2[75] = 0;
175             array2[76] = 0;
176             array2[77] = 0;
177             array2[78] = 0;
178             array2[79] = 0;
179             array2[80] = 0;
180             array2[81] = 0;
181             array2[82] = 0;
182             array2[83] = 0;
183             array2[84] = 0;
184             array2[85] = 0;
185             array2[86] = 0;
186             array2[87] = 0;
187             array2[88] = 0;
188             array2[89] = 0;
189             array2[90] = 0;
190             array2[91] = 0;
191             array2[92] = 0;
192             array2[93] = 0;
193             array2[94] = 0;
194             array2[95] = 0;
195             array2[96] = 0;
196             array2[97] = 0;
197             array2[98] = 0;
198             array2[99] = 0;
199 
200             array2[100] = 0;
201             array2[101] = 0;
202             array2[102] = 0;
203             array2[103] = 0;
204             array2[104] = 0;
205             array2[105] = 0;
206             array2[106] = 0;
207             array2[107] = 0;
208             array2[108] = 0;
209             array2[109] = 0;
210             array2[110] = 0;
211             array2[111] = 0;
212             array2[112] = 0;
213             array2[113] = 0;
214             array2[114] = 0;
215             array2[115] = 0;
216             array2[116] = 0;
217             array2[117] = 0;
218             array2[118] = 0;
219             array2[119] = 0;
220             array2[120] = 0;
221             array2[121] = 0;
222             array2[122] = 0;
223             array2[123] = 0;
224             array2[124] = 0;
225             array2[125] = 0;
226             array2[126] = 0;
227             array2[127] = 0;
228             array2[128] = 0;
229             array2[129] = 0;
230             array2[130] = 0;
231             array2[131] = 0;
232             array2[132] = 0;
233             array2[133] = 0;
234             array2[134] = 0;
235             array2[135] = 0;
236             array2[136] = 0;
237             array2[137] = 0;
238             array2[138] = 0;
239             array2[139] = 0;
240             array2[140] = 0;
241             array2[141] = 0;
242             array2[142] = 0;
243             array2[143] = 0;
244             array2[144] = 0;
245             array2[145] = 0;
246             array2[146] = 0;
247             array2[147] = 0;
248             array2[148] = 0;
249             array2[149] = 0;
250             array2[150] = 0;
251             array2[151] = 0;
252             array2[152] = 0;
253             array2[153] = 0;
254             array2[154] = 0;
255             array2[155] = 0;
256             array2[156] = 0;
257             array2[157] = 0;
258             array2[158] = 0;
259             array2[159] = 0;
260             array2[160] = 0;
261             array2[161] = 0;
262             array2[162] = 0;
263             array2[163] = 0;
264             array2[164] = 0;
265             array2[165] = 0;
266             array2[166] = 0;
267             array2[167] = 0;
268             array2[168] = 0;
269             array2[169] = 0;
270             array2[170] = 0;
271             array2[171] = 0;
272             array2[172] = 0;
273             array2[173] = 0;
274             array2[174] = 0;
275             array2[175] = 0;
276             array2[176] = 0;
277             array2[177] = 0;
278             array2[178] = 0;
279             array2[179] = 0;
280             array2[180] = 0;
281             array2[181] = 0;
282             array2[182] = 0;
283             array2[183] = 0;
284             array2[184] = 0;
285             array2[185] = 0;
286             array2[186] = 0;
287             array2[187] = 0;
288             array2[188] = 0;
289             array2[189] = 0;
290             array2[190] = 0;
291             array2[191] = 0;
292             array2[192] = 0;
293             array2[193] = 0;
294             array2[194] = 0;
295             array2[195] = 0;
296             array2[196] = 0;
297             array2[197] = 0;
298             array2[198] = 0;
299             array2[199] = 0;
300             if (o1.j >= 20) {
301                 break;
302             }
303             o1.j++;
304         } while(true);
305         not_inlined4();
306     }
307 
main(String[] args)308     static public void main(String[] args) {
309         BadPredicateAfterPartialPeel o1 = new BadPredicateAfterPartialPeel();
310         BadPredicateAfterPartialPeel o2 = new BadPredicateAfterPartialPeel();
311         for (int i = 0; i < 20000; i++) {
312             o1.j = 0;
313             m(o1, o2, o2, 0);
314             m_helper(i, 2, i); // pollute profile
315         }
316     }
317 }
318