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