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