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