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