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 
  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 
 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 
 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 
 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 }