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