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