1 /* 2 * Copyright (c) 2013, 2018, 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 8009761 27 * @summary Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates 28 * @library /test/lib / 29 * @modules java.base/jdk.internal.misc 30 * 31 * @build sun.hotspot.WhiteBox 32 * @run driver ClassFileInstaller sun.hotspot.WhiteBox 33 * sun.hotspot.WhiteBox$WhiteBoxPermission 34 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI 35 * -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -Xss512K 36 * -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+EagerJVMCI 37 * -XX:CompileCommand=exclude,compiler.uncommontrap.Test8009761::m2 38 * compiler.uncommontrap.Test8009761 39 */ 40 41 package compiler.uncommontrap; 42 43 import sun.hotspot.WhiteBox; 44 import java.lang.reflect.Method; 45 import compiler.whitebox.CompilerWhiteBoxTest; 46 47 public class Test8009761 { 48 49 private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); 50 private static Method m3 = null; 51 m1(boolean deopt)52 static Object m1(boolean deopt) { 53 // When running interpreted, on sparc, the caller's stack is 54 // extended for the locals and the caller's frame is restored 55 // on return. 56 long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, 57 l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, 58 l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, 59 l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, 60 l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, 61 l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, 62 l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, 63 l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, 64 l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, 65 l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, 66 l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, 67 l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, 68 l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, 69 l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, 70 l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, 71 l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, 72 l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, 73 l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, 74 l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, 75 l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, 76 l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, 77 l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, 78 l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, 79 l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, 80 l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, 81 l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, 82 l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, 83 l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, 84 l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, 85 l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, 86 l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, 87 l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, 88 l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, 89 l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, 90 l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, 91 l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, 92 l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, 93 l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, 94 l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, 95 l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, 96 l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, 97 l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, 98 l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, 99 l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, 100 l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, 101 l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, 102 l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, 103 l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, 104 l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, 105 l508, l509, l510, l511; 106 107 long ll0, ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, ll9, ll10, ll11, ll12, 108 ll13, ll14, ll15, ll16, ll17, ll18, ll19, ll20, ll21, ll22, ll23, ll24, 109 ll25, ll26, ll27, ll28, ll29, ll30, ll31, ll32, ll33, ll34, ll35, ll36, 110 ll37, ll38, ll39, ll40, ll41, ll42, ll43, ll44, ll45, ll46, ll47, ll48, 111 ll49, ll50, ll51, ll52, ll53, ll54, ll55, ll56, ll57, ll58, ll59, ll60, 112 ll61, ll62, ll63, ll64, ll65, ll66, ll67, ll68, ll69, ll70, ll71, ll72, 113 ll73, ll74, ll75, ll76, ll77, ll78, ll79, ll80, ll81, ll82, ll83, ll84, 114 ll85, ll86, ll87, ll88, ll89, ll90, ll91, ll92, ll93, ll94, ll95, ll96, 115 ll97, ll98, ll99, ll100, ll101, ll102, ll103, ll104, ll105, ll106, ll107, 116 ll108, ll109, ll110, ll111, ll112, ll113, ll114, ll115, ll116, ll117, 117 ll118, ll119, ll120, ll121, ll122, ll123, ll124, ll125, ll126, ll127, 118 ll128, ll129, ll130, ll131, ll132, ll133, ll134, ll135, ll136, ll137, 119 ll138, ll139, ll140, ll141, ll142, ll143, ll144, ll145, ll146, ll147, 120 ll148, ll149, ll150, ll151, ll152, ll153, ll154, ll155, ll156, ll157, 121 ll158, ll159, ll160, ll161, ll162, ll163, ll164, ll165, ll166, ll167, 122 ll168, ll169, ll170, ll171, ll172, ll173, ll174, ll175, ll176, ll177, 123 ll178, ll179, ll180, ll181, ll182, ll183, ll184, ll185, ll186, ll187, 124 ll188, ll189, ll190, ll191, ll192, ll193, ll194, ll195, ll196, ll197, 125 ll198, ll199, ll200, ll201, ll202, ll203, ll204, ll205, ll206, ll207, 126 ll208, ll209, ll210, ll211, ll212, ll213, ll214, ll215, ll216, ll217, 127 ll218, ll219, ll220, ll221, ll222, ll223, ll224, ll225, ll226, ll227, 128 ll228, ll229, ll230, ll231, ll232, ll233, ll234, ll235, ll236, ll237, 129 ll238, ll239, ll240, ll241, ll242, ll243, ll244, ll245, ll246, ll247, 130 ll248, ll249, ll250, ll251, ll252, ll253, ll254, ll255, ll256, ll257, 131 ll258, ll259, ll260, ll261, ll262, ll263, ll264, ll265, ll266, ll267, 132 ll268, ll269, ll270, ll271, ll272, ll273, ll274, ll275, ll276, ll277, 133 ll278, ll279, ll280, ll281, ll282, ll283, ll284, ll285, ll286, ll287, 134 ll288, ll289, ll290, ll291, ll292, ll293, ll294, ll295, ll296, ll297, 135 ll298, ll299, ll300, ll301, ll302, ll303, ll304, ll305, ll306, ll307, 136 ll308, ll309, ll310, ll311, ll312, ll313, ll314, ll315, ll316, ll317, 137 ll318, ll319, ll320, ll321, ll322, ll323, ll324, ll325, ll326, ll327, 138 ll328, ll329, ll330, ll331, ll332, ll333, ll334, ll335, ll336, ll337, 139 ll338, ll339, ll340, ll341, ll342, ll343, ll344, ll345, ll346, ll347, 140 ll348, ll349, ll350, ll351, ll352, ll353, ll354, ll355, ll356, ll357, 141 ll358, ll359, ll360, ll361, ll362, ll363, ll364, ll365, ll366, ll367, 142 ll368, ll369, ll370, ll371, ll372, ll373, ll374, ll375, ll376, ll377, 143 ll378, ll379, ll380, ll381, ll382, ll383, ll384, ll385, ll386, ll387, 144 ll388, ll389, ll390, ll391, ll392, ll393, ll394, ll395, ll396, ll397, 145 ll398, ll399, ll400, ll401, ll402, ll403, ll404, ll405, ll406, ll407, 146 ll408, ll409, ll410, ll411, ll412, ll413, ll414, ll415, ll416, ll417, 147 ll418, ll419, ll420, ll421, ll422, ll423, ll424, ll425, ll426, ll427, 148 ll428, ll429, ll430, ll431, ll432, ll433, ll434, ll435, ll436, ll437, 149 ll438, ll439, ll440, ll441, ll442, ll443, ll444, ll445, ll446, ll447, 150 ll448, ll449, ll450, ll451, ll452, ll453, ll454, ll455, ll456, ll457, 151 ll458, ll459, ll460, ll461, ll462, ll463, ll464, ll465, ll466, ll467, 152 ll468, ll469, ll470, ll471, ll472, ll473, ll474, ll475, ll476, ll477, 153 ll478, ll479, ll480, ll481, ll482, ll483, ll484, ll485, ll486, ll487, 154 ll488, ll489, ll490, ll491, ll492, ll493, ll494, ll495, ll496, ll497, 155 ll498, ll499, ll500, ll501, ll502, ll503, ll504, ll505, ll506, ll507, 156 ll508, ll509, ll510, ll511; 157 158 if (deopt) { 159 // Force deoptimization of m3 160 WHITE_BOX.deoptimizeMethod(m3); 161 if(WHITE_BOX.isMethodCompiled(m3)) { 162 throw new RuntimeException(m3 + " not deoptimized"); 163 } 164 } 165 return null; 166 } 167 168 static int count = 0; 169 m2()170 static void m2() { 171 // Will be called recursively until a stack overflow 172 // exception. Makes sure it has a lot of locals so that it's 173 // not called a sufficient number of times to trigger 174 // compilation. 175 176 long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, 177 l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, 178 l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, 179 l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, 180 l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, 181 l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, 182 l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, 183 l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, 184 l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, 185 l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, 186 l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, 187 l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, 188 l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, 189 l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, 190 l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, 191 l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, 192 l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, 193 l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, 194 l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, 195 l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, 196 l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, 197 l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, 198 l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, 199 l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, 200 l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, 201 l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, 202 l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, 203 l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, 204 l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, 205 l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, 206 l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, 207 l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, 208 l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, 209 l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, 210 l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, 211 l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, 212 l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, 213 l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, 214 l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, 215 l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, 216 l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, 217 l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, 218 l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, 219 l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, 220 l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, 221 l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, 222 l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, 223 l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, 224 l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, 225 l508, l509, l510, l511; 226 227 count++; 228 m2(); 229 } 230 m3(boolean overflow_stack, boolean deopt)231 static Object m3(boolean overflow_stack, boolean deopt) { 232 if (overflow_stack) { 233 m2(); 234 return null; 235 } 236 Object o = m1(deopt); 237 if (deopt) { 238 m2(); 239 } 240 return o; 241 } 242 main(String[] args)243 static public void main(String[] args) { 244 // Make sure background compilation is disabled 245 if (WHITE_BOX.getBooleanVMFlag("BackgroundCompilation")) { 246 throw new RuntimeException("Background compilation enabled"); 247 } 248 249 try { 250 // Get Method object for m3 251 m3 = Test8009761.class.getDeclaredMethod("m3", boolean.class, boolean.class); 252 } catch (NoSuchMethodException | SecurityException ex) { 253 throw new RuntimeException("Failed to retrieve method m3"); 254 } 255 256 int c1; 257 // Call m2 from m3 recursively until stack overflow. Count the number of recursive calls. 258 try { 259 m3(true, false); 260 } catch(StackOverflowError soe) { 261 } 262 c1 = count; 263 264 // Force the compilation of m3() that will inline m1() 265 if(!WHITE_BOX.enqueueMethodForCompilation(m3, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION)) { 266 // C2 compiler not available, compile with C1 267 WHITE_BOX.enqueueMethodForCompilation(m3, CompilerWhiteBoxTest.COMP_LEVEL_SIMPLE); 268 } 269 270 // Because background compilation is disabled, method should now be compiled 271 if(!WHITE_BOX.isMethodCompiled(m3)) { 272 throw new RuntimeException(m3 + " not compiled"); 273 } 274 275 count = 0; 276 // Force deoptimization of m3() in m1(), then return from m1() 277 // to m3(), call recursively m2(). If deoptimization correctly 278 // built the interpreter stack for m3()/m1() then we should be 279 // able to call m2() recursively as many times as before. 280 try { 281 m3(false, true); 282 } catch(StackOverflowError soe) { 283 } 284 // Allow number of recursive calls to vary by 1 285 if ((c1 < (count - 1)) || (c1 > (count + 1))) { 286 throw new RuntimeException("Failed: init recursive calls: " + c1 + ". After deopt " + count); 287 } else { 288 System.out.println("PASSED " + c1); 289 } 290 } 291 } 292