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_FULL_OPTIMIZATION = 4;
  40     private static Method m3 = null;
  41 
  42     static Object m1(boolean deopt) {
  43         // When running interpreted, on sparc, the caller's stack is
  44         // extended for the locals and the caller's frame is restored
  45         // on return.
  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         if (deopt) {
 149             // Force deoptimization of m3
 150             WHITE_BOX.deoptimizeMethod(m3);
 151             if(WHITE_BOX.isMethodCompiled(m3)) {
 152                 throw new RuntimeException(m3 + " not deoptimized");
 153             }
 154         }
 155         return null;
 156     }
 157 
 158     static int count = 0;
 159 
 160     static void m2() {
 161         // Will be called recursively until a stack overflow
 162         // exception. Makes sure it has a lot of locals so that it's
 163         // not called a sufficient number of times to trigger
 164         // compilation.
 165 
 166         long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12,
 167         l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24,
 168         l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36,
 169         l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48,
 170         l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60,
 171         l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72,
 172         l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84,
 173         l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96,
 174         l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107,
 175         l108, l109, l110, l111, l112, l113, l114, l115, l116, l117,
 176         l118, l119, l120, l121, l122, l123, l124, l125, l126, l127,
 177         l128, l129, l130, l131, l132, l133, l134, l135, l136, l137,
 178         l138, l139, l140, l141, l142, l143, l144, l145, l146, l147,
 179         l148, l149, l150, l151, l152, l153, l154, l155, l156, l157,
 180         l158, l159, l160, l161, l162, l163, l164, l165, l166, l167,
 181         l168, l169, l170, l171, l172, l173, l174, l175, l176, l177,
 182         l178, l179, l180, l181, l182, l183, l184, l185, l186, l187,
 183         l188, l189, l190, l191, l192, l193, l194, l195, l196, l197,
 184         l198, l199, l200, l201, l202, l203, l204, l205, l206, l207,
 185         l208, l209, l210, l211, l212, l213, l214, l215, l216, l217,
 186         l218, l219, l220, l221, l222, l223, l224, l225, l226, l227,
 187         l228, l229, l230, l231, l232, l233, l234, l235, l236, l237,
 188         l238, l239, l240, l241, l242, l243, l244, l245, l246, l247,
 189         l248, l249, l250, l251, l252, l253, l254, l255, l256, l257,
 190         l258, l259, l260, l261, l262, l263, l264, l265, l266, l267,
 191         l268, l269, l270, l271, l272, l273, l274, l275, l276, l277,
 192         l278, l279, l280, l281, l282, l283, l284, l285, l286, l287,
 193         l288, l289, l290, l291, l292, l293, l294, l295, l296, l297,
 194         l298, l299, l300, l301, l302, l303, l304, l305, l306, l307,
 195         l308, l309, l310, l311, l312, l313, l314, l315, l316, l317,
 196         l318, l319, l320, l321, l322, l323, l324, l325, l326, l327,
 197         l328, l329, l330, l331, l332, l333, l334, l335, l336, l337,
 198         l338, l339, l340, l341, l342, l343, l344, l345, l346, l347,
 199         l348, l349, l350, l351, l352, l353, l354, l355, l356, l357,
 200         l358, l359, l360, l361, l362, l363, l364, l365, l366, l367,
 201         l368, l369, l370, l371, l372, l373, l374, l375, l376, l377,
 202         l378, l379, l380, l381, l382, l383, l384, l385, l386, l387,
 203         l388, l389, l390, l391, l392, l393, l394, l395, l396, l397,
 204         l398, l399, l400, l401, l402, l403, l404, l405, l406, l407,
 205         l408, l409, l410, l411, l412, l413, l414, l415, l416, l417,
 206         l418, l419, l420, l421, l422, l423, l424, l425, l426, l427,
 207         l428, l429, l430, l431, l432, l433, l434, l435, l436, l437,
 208         l438, l439, l440, l441, l442, l443, l444, l445, l446, l447,
 209         l448, l449, l450, l451, l452, l453, l454, l455, l456, l457,
 210         l458, l459, l460, l461, l462, l463, l464, l465, l466, l467,
 211         l468, l469, l470, l471, l472, l473, l474, l475, l476, l477,
 212         l478, l479, l480, l481, l482, l483, l484, l485, l486, l487,
 213         l488, l489, l490, l491, l492, l493, l494, l495, l496, l497,
 214         l498, l499, l500, l501, l502, l503, l504, l505, l506, l507,
 215         l508, l509, l510, l511;
 216 
 217         count++;
 218         m2();
 219     }
 220 
 221     static Object m3(boolean overflow_stack, boolean deopt) {
 222         if (overflow_stack) {
 223             m2();
 224             return null;
 225         }
 226         Object o = m1(deopt);
 227         if (deopt) {
 228             m2();
 229         }
 230         return o;
 231     }
 232 
 233     static public void main(String[] args) {
 234         try {
 235             // Get Method object for m3
 236             m3 = Test8009761.class.getDeclaredMethod("m3", boolean.class, boolean.class);
 237         } catch (NoSuchMethodException | SecurityException ex) {
 238             throw new RuntimeException("Failed to retrieve method m3");
 239         }
 240         
 241         int c1;
 242         // Call m2 from m3 recursively until stack overflow. Count the number of recursive calls.
 243         try {
 244             m3(true, false);
 245         } catch(StackOverflowError soe) {
 246         }
 247         c1 = count;
 248         
 249         // Force the compilation of m3() that will inline m1()
 250         WHITE_BOX.enqueueMethodForCompilation(m3, COMP_LEVEL_FULL_OPTIMIZATION);
 251         if(!WHITE_BOX.isMethodCompiled(m3)) {
 252             throw new RuntimeException(m3 + " not compiled");
 253         }
 254         
 255         count = 0;
 256         // Force deoptimization of m3() in m1(), then return from m1()
 257         // to m3(), call recursively m2(). If deoptimization correctly
 258         // built the interpreter stack for m3()/m1() then we should be
 259         // able to call m2() recursively as many times as before.
 260         try {
 261             m3(false, true);
 262         } catch(StackOverflowError soe) {
 263         }
 264         if (c1 != count) {
 265             System.out.println("Failed: init recursive calls: " + c1 + ". After deopt " + count);
 266             System.exit(97);
 267         } else {
 268             System.out.println("PASSED " + c1);
 269         }
 270     }
 271 }