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