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