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