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