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