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