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