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