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
35package compiler.uncommontrap;
36
37public 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}
301