Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell11
提交
6b539b11
D
dragonwell11
项目概览
openanolis
/
dragonwell11
通知
7
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell11
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6b539b11
编写于
3月 14, 2013
作者:
M
morris
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
aa2e3796
fef499cd
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
323 addition
and
43 deletion
+323
-43
hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp
hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp
+2
-1
hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
+11
-1
hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp
hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp
+2
-1
hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
+2
-1
hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
+2
-1
hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
+2
-1
hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
+1
-1
hotspot/src/share/vm/compiler/compileBroker.cpp
hotspot/src/share/vm/compiler/compileBroker.cpp
+1
-1
hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
+6
-3
hotspot/src/share/vm/opto/chaitin.hpp
hotspot/src/share/vm/opto/chaitin.hpp
+0
-25
hotspot/src/share/vm/opto/compile.cpp
hotspot/src/share/vm/opto/compile.cpp
+1
-1
hotspot/src/share/vm/opto/live.hpp
hotspot/src/share/vm/opto/live.hpp
+25
-1
hotspot/src/share/vm/runtime/deoptimization.cpp
hotspot/src/share/vm/runtime/deoptimization.cpp
+1
-0
hotspot/src/share/vm/runtime/vframeArray.cpp
hotspot/src/share/vm/runtime/vframeArray.cpp
+10
-5
hotspot/src/share/vm/runtime/vframeArray.hpp
hotspot/src/share/vm/runtime/vframeArray.hpp
+2
-0
hotspot/test/compiler/8009761/Test8009761.java
hotspot/test/compiler/8009761/Test8009761.java
+255
-0
未找到文件。
hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp
浏览文件 @
6b539b11
...
...
@@ -2194,7 +2194,8 @@ int AbstractInterpreter::layout_activation(Method* method,
int
callee_locals_size
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
assert
(
popframe_extra_args
==
0
,
"NEED TO FIX"
);
// NOTE this code must exactly mimic what InterpreterGenerator::generate_compute_interpreter_state()
...
...
hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
浏览文件 @
6b539b11
...
...
@@ -1581,7 +1581,8 @@ int AbstractInterpreter::layout_activation(Method* method,
int
callee_local_count
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
// Note: This calculation must exactly parallel the frame setup
// in InterpreterGenerator::generate_fixed_frame.
// If f!=NULL, set up the following variables:
...
...
@@ -1664,6 +1665,15 @@ int AbstractInterpreter::layout_activation(Method* method,
int
delta
=
local_words
-
parm_words
;
int
computed_sp_adjustment
=
(
delta
>
0
)
?
round_to
(
delta
,
WordsPerLong
)
:
0
;
*
interpreter_frame
->
register_addr
(
I5_savedSP
)
=
(
intptr_t
)
(
fp
+
computed_sp_adjustment
)
-
STACK_BIAS
;
if
(
!
is_bottom_frame
)
{
// Llast_SP is set below for the current frame to SP (with the
// extra space for the callee's locals). Here we adjust
// Llast_SP for the caller's frame, removing the extra space
// for the current method's locals.
*
caller
->
register_addr
(
Llast_SP
)
=
*
interpreter_frame
->
register_addr
(
I5_savedSP
);
}
else
{
assert
(
*
caller
->
register_addr
(
Llast_SP
)
>=
*
interpreter_frame
->
register_addr
(
I5_savedSP
),
"strange Llast_SP"
);
}
}
else
{
assert
(
caller
->
is_compiled_frame
()
||
caller
->
is_entry_frame
(),
"only possible cases"
);
// Don't have Lesp available; lay out locals block in the caller
...
...
hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp
浏览文件 @
6b539b11
...
...
@@ -2361,7 +2361,8 @@ int AbstractInterpreter::layout_activation(Method* method,
int
callee_locals
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
assert
(
popframe_extra_args
==
0
,
"FIX ME"
);
// NOTE this code must exactly mimic what InterpreterGenerator::generate_compute_interpreter_state()
...
...
hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp
浏览文件 @
6b539b11
...
...
@@ -1585,7 +1585,8 @@ int AbstractInterpreter::layout_activation(Method* method,
int
callee_locals
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
// Note: This calculation must exactly parallel the frame setup
// in AbstractInterpreterGenerator::generate_method_entry.
// If interpreter_frame!=NULL, set up the method, locals, and monitors.
...
...
hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
浏览文件 @
6b539b11
...
...
@@ -1599,7 +1599,8 @@ int AbstractInterpreter::layout_activation(Method* method,
int
callee_locals
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
// Note: This calculation must exactly parallel the frame setup
// in AbstractInterpreterGenerator::generate_method_entry.
// If interpreter_frame!=NULL, set up the method, locals, and monitors.
...
...
hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp
浏览文件 @
6b539b11
...
...
@@ -919,7 +919,8 @@ int AbstractInterpreter::layout_activation(Method* method,
int
callee_locals
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
assert
(
popframe_extra_args
==
0
,
"what to do?"
);
assert
(
!
is_top_frame
||
(
!
callee_locals
&&
!
callee_param_count
),
"top frame should have no caller"
);
...
...
hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp
浏览文件 @
6b539b11
...
...
@@ -516,7 +516,7 @@ JVM_handle_bsd_signal(int sig,
// here if the underlying file has been truncated.
// Do not crash the VM in such a case.
CodeBlob
*
cb
=
CodeCache
::
find_blob_unsafe
(
pc
);
nmethod
*
nm
=
cb
->
is_nmethod
(
)
?
(
nmethod
*
)
cb
:
NULL
;
nmethod
*
nm
=
(
cb
!=
NULL
&&
cb
->
is_nmethod
()
)
?
(
nmethod
*
)
cb
:
NULL
;
if
(
nm
!=
NULL
&&
nm
->
has_unsafe_access
())
{
stub
=
StubRoutines
::
handler_for_unsafe_access
();
}
...
...
hotspot/src/share/vm/compiler/compileBroker.cpp
浏览文件 @
6b539b11
...
...
@@ -505,7 +505,7 @@ void CompileTask::log_task(xmlStream* log) {
ResourceMark
rm
(
thread
);
// <task id='9' method='M' osr_bci='X' level='1' blocking='1' stamp='1.234'>
if
(
_compile_id
!=
0
)
log
->
print
(
" compile_id='%d'"
,
_compile_id
);
log
->
print
(
" compile_id='%d'"
,
_compile_id
);
if
(
_osr_bci
!=
CompileBroker
::
standard_entry_bci
)
{
log
->
print
(
" compile_kind='osr'"
);
// same as nmethod::compile_kind
}
// else compile_kind='c2c'
...
...
hotspot/src/share/vm/interpreter/abstractInterpreter.hpp
浏览文件 @
6b539b11
...
...
@@ -186,7 +186,8 @@ class AbstractInterpreter: AllStatic {
int
caller_actual_parameters
,
int
callee_params
,
int
callee_locals
,
bool
is_top_frame
)
{
bool
is_top_frame
,
bool
is_bottom_frame
)
{
return
layout_activation
(
method
,
temps
,
popframe_args
,
...
...
@@ -196,7 +197,8 @@ class AbstractInterpreter: AllStatic {
callee_locals
,
(
frame
*
)
NULL
,
(
frame
*
)
NULL
,
is_top_frame
);
is_top_frame
,
is_bottom_frame
);
}
static
int
layout_activation
(
Method
*
method
,
...
...
@@ -208,7 +210,8 @@ class AbstractInterpreter: AllStatic {
int
callee_locals
,
frame
*
caller
,
frame
*
interpreter_frame
,
bool
is_top_frame
);
bool
is_top_frame
,
bool
is_bottom_frame
);
// Runtime support
static
bool
is_not_reached
(
methodHandle
method
,
int
bci
);
...
...
hotspot/src/share/vm/opto/chaitin.hpp
浏览文件 @
6b539b11
...
...
@@ -187,31 +187,6 @@ public:
#endif
};
//------------------------------LRG_List---------------------------------------
// Map Node indices to Live RanGe indices.
// Array lookup in the optimized case.
class
LRG_List
:
public
ResourceObj
{
friend
class
VMStructs
;
uint
_cnt
,
_max
;
uint
*
_lidxs
;
ReallocMark
_nesting
;
// assertion check for reallocations
public:
LRG_List
(
uint
max
);
uint
lookup
(
uint
nidx
)
const
{
return
_lidxs
[
nidx
];
}
uint
operator
[]
(
uint
nidx
)
const
{
return
lookup
(
nidx
);
}
void
map
(
uint
nidx
,
uint
lidx
)
{
assert
(
nidx
<
_cnt
,
"oob"
);
_lidxs
[
nidx
]
=
lidx
;
}
void
extend
(
uint
nidx
,
uint
lidx
);
uint
Size
()
const
{
return
_cnt
;
}
};
//------------------------------IFG--------------------------------------------
// InterFerence Graph
// An undirected graph implementation. Created with a fixed number of
...
...
hotspot/src/share/vm/opto/compile.cpp
浏览文件 @
6b539b11
...
...
@@ -892,7 +892,7 @@ Compile::Compile( ciEnv* ci_env,
:
Phase
(
Compiler
),
_env
(
ci_env
),
_log
(
ci_env
->
log
()),
_compile_id
(
-
1
),
_compile_id
(
0
),
_save_argument_registers
(
save_arg_registers
),
_method
(
NULL
),
_stub_name
(
stub_name
),
...
...
hotspot/src/share/vm/opto/live.hpp
浏览文件 @
6b539b11
...
...
@@ -33,11 +33,35 @@
#include "opto/regmask.hpp"
class
Block
;
class
LRG_List
;
class
PhaseCFG
;
class
VectorSet
;
class
IndexSet
;
//------------------------------LRG_List---------------------------------------
// Map Node indices to Live RanGe indices.
// Array lookup in the optimized case.
class
LRG_List
:
public
ResourceObj
{
friend
class
VMStructs
;
uint
_cnt
,
_max
;
uint
*
_lidxs
;
ReallocMark
_nesting
;
// assertion check for reallocations
public:
LRG_List
(
uint
max
);
uint
lookup
(
uint
nidx
)
const
{
return
_lidxs
[
nidx
];
}
uint
operator
[]
(
uint
nidx
)
const
{
return
lookup
(
nidx
);
}
void
map
(
uint
nidx
,
uint
lidx
)
{
assert
(
nidx
<
_cnt
,
"oob"
);
_lidxs
[
nidx
]
=
lidx
;
}
void
extend
(
uint
nidx
,
uint
lidx
);
uint
Size
()
const
{
return
_cnt
;
}
};
//------------------------------PhaseLive--------------------------------------
// Compute live-in/live-out
class
PhaseLive
:
public
Phase
{
...
...
hotspot/src/share/vm/runtime/deoptimization.cpp
浏览文件 @
6b539b11
...
...
@@ -425,6 +425,7 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread
callee_parameters
,
callee_locals
,
index
==
0
,
index
==
array
->
frames
()
-
1
,
popframe_extra_args
);
// This pc doesn't have to be perfect just good enough to identify the frame
// as interpreted so the skeleton frame will be walkable
...
...
hotspot/src/share/vm/runtime/vframeArray.cpp
浏览文件 @
6b539b11
...
...
@@ -160,6 +160,7 @@ void vframeArrayElement::unpack_on_stack(int caller_actual_parameters,
int
callee_locals
,
frame
*
caller
,
bool
is_top_frame
,
bool
is_bottom_frame
,
int
exec_mode
)
{
JavaThread
*
thread
=
(
JavaThread
*
)
Thread
::
current
();
...
...
@@ -275,7 +276,8 @@ void vframeArrayElement::unpack_on_stack(int caller_actual_parameters,
callee_locals
,
caller
,
iframe
(),
is_top_frame
);
is_top_frame
,
is_bottom_frame
);
// Update the pc in the frame object and overwrite the temporary pc
// we placed in the skeletal frame now that we finally know the
...
...
@@ -420,6 +422,7 @@ int vframeArrayElement::on_stack_size(int caller_actual_parameters,
int
callee_parameters
,
int
callee_locals
,
bool
is_top_frame
,
bool
is_bottom_frame
,
int
popframe_extra_stack_expression_els
)
const
{
assert
(
method
()
->
max_locals
()
==
locals
()
->
size
(),
"just checking"
);
int
locks
=
monitors
()
==
NULL
?
0
:
monitors
()
->
number_of_monitors
();
...
...
@@ -431,7 +434,8 @@ int vframeArrayElement::on_stack_size(int caller_actual_parameters,
caller_actual_parameters
,
callee_parameters
,
callee_locals
,
is_top_frame
);
is_top_frame
,
is_bottom_frame
);
}
...
...
@@ -522,7 +526,7 @@ void vframeArray::unpack_to_stack(frame &unpack_frame, int exec_mode, int caller
// Do the unpacking of interpreter frames; the frame at index 0 represents the top activation, so it has no callee
// Unpack the frames from the oldest (frames() -1) to the youngest (0)
frame
caller_frame
=
me
;
frame
*
caller_frame
=
&
me
;
for
(
index
=
frames
()
-
1
;
index
>=
0
;
index
--
)
{
vframeArrayElement
*
elem
=
element
(
index
);
// caller
int
callee_parameters
,
callee_locals
;
...
...
@@ -542,13 +546,14 @@ void vframeArray::unpack_to_stack(frame &unpack_frame, int exec_mode, int caller
elem
->
unpack_on_stack
(
caller_actual_parameters
,
callee_parameters
,
callee_locals
,
&
caller_frame
,
caller_frame
,
index
==
0
,
index
==
frames
()
-
1
,
exec_mode
);
if
(
index
==
frames
()
-
1
)
{
Deoptimization
::
unwind_callee_save_values
(
elem
->
iframe
(),
this
);
}
caller_frame
=
*
elem
->
iframe
();
caller_frame
=
elem
->
iframe
();
caller_actual_parameters
=
callee_parameters
;
}
deallocate_monitor_chunks
();
...
...
hotspot/src/share/vm/runtime/vframeArray.hpp
浏览文件 @
6b539b11
...
...
@@ -88,6 +88,7 @@ class vframeArrayElement : public _ValueObj {
int
on_stack_size
(
int
caller_actual_parameters
,
int
callee_parameters
,
int
callee_locals
,
bool
is_bottom_frame
,
bool
is_top_frame
,
int
popframe_extra_stack_expression_els
)
const
;
...
...
@@ -97,6 +98,7 @@ class vframeArrayElement : public _ValueObj {
int
callee_locals
,
frame
*
caller
,
bool
is_top_frame
,
bool
is_bottom_frame
,
int
exec_mode
);
#ifndef PRODUCT
...
...
hotspot/test/compiler/8009761/Test8009761.java
0 → 100644
浏览文件 @
6b539b11
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8009761
* @summary Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
* @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation Test8009761
*
*/
public
class
Test8009761
{
static
class
UnloadedClass
{
volatile
int
i
;
}
static
Object
m1
(
boolean
deopt
)
{
// When running interpreted, on sparc, the caller's stack is
// extended for the locals and the caller's frame is restored
// on return.
long
l0
,
l1
,
l2
,
l3
,
l4
,
l5
,
l6
,
l7
,
l8
,
l9
,
l10
,
l11
,
l12
,
l13
,
l14
,
l15
,
l16
,
l17
,
l18
,
l19
,
l20
,
l21
,
l22
,
l23
,
l24
,
l25
,
l26
,
l27
,
l28
,
l29
,
l30
,
l31
,
l32
,
l33
,
l34
,
l35
,
l36
,
l37
,
l38
,
l39
,
l40
,
l41
,
l42
,
l43
,
l44
,
l45
,
l46
,
l47
,
l48
,
l49
,
l50
,
l51
,
l52
,
l53
,
l54
,
l55
,
l56
,
l57
,
l58
,
l59
,
l60
,
l61
,
l62
,
l63
,
l64
,
l65
,
l66
,
l67
,
l68
,
l69
,
l70
,
l71
,
l72
,
l73
,
l74
,
l75
,
l76
,
l77
,
l78
,
l79
,
l80
,
l81
,
l82
,
l83
,
l84
,
l85
,
l86
,
l87
,
l88
,
l89
,
l90
,
l91
,
l92
,
l93
,
l94
,
l95
,
l96
,
l97
,
l98
,
l99
,
l100
,
l101
,
l102
,
l103
,
l104
,
l105
,
l106
,
l107
,
l108
,
l109
,
l110
,
l111
,
l112
,
l113
,
l114
,
l115
,
l116
,
l117
,
l118
,
l119
,
l120
,
l121
,
l122
,
l123
,
l124
,
l125
,
l126
,
l127
,
l128
,
l129
,
l130
,
l131
,
l132
,
l133
,
l134
,
l135
,
l136
,
l137
,
l138
,
l139
,
l140
,
l141
,
l142
,
l143
,
l144
,
l145
,
l146
,
l147
,
l148
,
l149
,
l150
,
l151
,
l152
,
l153
,
l154
,
l155
,
l156
,
l157
,
l158
,
l159
,
l160
,
l161
,
l162
,
l163
,
l164
,
l165
,
l166
,
l167
,
l168
,
l169
,
l170
,
l171
,
l172
,
l173
,
l174
,
l175
,
l176
,
l177
,
l178
,
l179
,
l180
,
l181
,
l182
,
l183
,
l184
,
l185
,
l186
,
l187
,
l188
,
l189
,
l190
,
l191
,
l192
,
l193
,
l194
,
l195
,
l196
,
l197
,
l198
,
l199
,
l200
,
l201
,
l202
,
l203
,
l204
,
l205
,
l206
,
l207
,
l208
,
l209
,
l210
,
l211
,
l212
,
l213
,
l214
,
l215
,
l216
,
l217
,
l218
,
l219
,
l220
,
l221
,
l222
,
l223
,
l224
,
l225
,
l226
,
l227
,
l228
,
l229
,
l230
,
l231
,
l232
,
l233
,
l234
,
l235
,
l236
,
l237
,
l238
,
l239
,
l240
,
l241
,
l242
,
l243
,
l244
,
l245
,
l246
,
l247
,
l248
,
l249
,
l250
,
l251
,
l252
,
l253
,
l254
,
l255
,
l256
,
l257
,
l258
,
l259
,
l260
,
l261
,
l262
,
l263
,
l264
,
l265
,
l266
,
l267
,
l268
,
l269
,
l270
,
l271
,
l272
,
l273
,
l274
,
l275
,
l276
,
l277
,
l278
,
l279
,
l280
,
l281
,
l282
,
l283
,
l284
,
l285
,
l286
,
l287
,
l288
,
l289
,
l290
,
l291
,
l292
,
l293
,
l294
,
l295
,
l296
,
l297
,
l298
,
l299
,
l300
,
l301
,
l302
,
l303
,
l304
,
l305
,
l306
,
l307
,
l308
,
l309
,
l310
,
l311
,
l312
,
l313
,
l314
,
l315
,
l316
,
l317
,
l318
,
l319
,
l320
,
l321
,
l322
,
l323
,
l324
,
l325
,
l326
,
l327
,
l328
,
l329
,
l330
,
l331
,
l332
,
l333
,
l334
,
l335
,
l336
,
l337
,
l338
,
l339
,
l340
,
l341
,
l342
,
l343
,
l344
,
l345
,
l346
,
l347
,
l348
,
l349
,
l350
,
l351
,
l352
,
l353
,
l354
,
l355
,
l356
,
l357
,
l358
,
l359
,
l360
,
l361
,
l362
,
l363
,
l364
,
l365
,
l366
,
l367
,
l368
,
l369
,
l370
,
l371
,
l372
,
l373
,
l374
,
l375
,
l376
,
l377
,
l378
,
l379
,
l380
,
l381
,
l382
,
l383
,
l384
,
l385
,
l386
,
l387
,
l388
,
l389
,
l390
,
l391
,
l392
,
l393
,
l394
,
l395
,
l396
,
l397
,
l398
,
l399
,
l400
,
l401
,
l402
,
l403
,
l404
,
l405
,
l406
,
l407
,
l408
,
l409
,
l410
,
l411
,
l412
,
l413
,
l414
,
l415
,
l416
,
l417
,
l418
,
l419
,
l420
,
l421
,
l422
,
l423
,
l424
,
l425
,
l426
,
l427
,
l428
,
l429
,
l430
,
l431
,
l432
,
l433
,
l434
,
l435
,
l436
,
l437
,
l438
,
l439
,
l440
,
l441
,
l442
,
l443
,
l444
,
l445
,
l446
,
l447
,
l448
,
l449
,
l450
,
l451
,
l452
,
l453
,
l454
,
l455
,
l456
,
l457
,
l458
,
l459
,
l460
,
l461
,
l462
,
l463
,
l464
,
l465
,
l466
,
l467
,
l468
,
l469
,
l470
,
l471
,
l472
,
l473
,
l474
,
l475
,
l476
,
l477
,
l478
,
l479
,
l480
,
l481
,
l482
,
l483
,
l484
,
l485
,
l486
,
l487
,
l488
,
l489
,
l490
,
l491
,
l492
,
l493
,
l494
,
l495
,
l496
,
l497
,
l498
,
l499
,
l500
,
l501
,
l502
,
l503
,
l504
,
l505
,
l506
,
l507
,
l508
,
l509
,
l510
,
l511
;
long
ll0
,
ll1
,
ll2
,
ll3
,
ll4
,
ll5
,
ll6
,
ll7
,
ll8
,
ll9
,
ll10
,
ll11
,
ll12
,
ll13
,
ll14
,
ll15
,
ll16
,
ll17
,
ll18
,
ll19
,
ll20
,
ll21
,
ll22
,
ll23
,
ll24
,
ll25
,
ll26
,
ll27
,
ll28
,
ll29
,
ll30
,
ll31
,
ll32
,
ll33
,
ll34
,
ll35
,
ll36
,
ll37
,
ll38
,
ll39
,
ll40
,
ll41
,
ll42
,
ll43
,
ll44
,
ll45
,
ll46
,
ll47
,
ll48
,
ll49
,
ll50
,
ll51
,
ll52
,
ll53
,
ll54
,
ll55
,
ll56
,
ll57
,
ll58
,
ll59
,
ll60
,
ll61
,
ll62
,
ll63
,
ll64
,
ll65
,
ll66
,
ll67
,
ll68
,
ll69
,
ll70
,
ll71
,
ll72
,
ll73
,
ll74
,
ll75
,
ll76
,
ll77
,
ll78
,
ll79
,
ll80
,
ll81
,
ll82
,
ll83
,
ll84
,
ll85
,
ll86
,
ll87
,
ll88
,
ll89
,
ll90
,
ll91
,
ll92
,
ll93
,
ll94
,
ll95
,
ll96
,
ll97
,
ll98
,
ll99
,
ll100
,
ll101
,
ll102
,
ll103
,
ll104
,
ll105
,
ll106
,
ll107
,
ll108
,
ll109
,
ll110
,
ll111
,
ll112
,
ll113
,
ll114
,
ll115
,
ll116
,
ll117
,
ll118
,
ll119
,
ll120
,
ll121
,
ll122
,
ll123
,
ll124
,
ll125
,
ll126
,
ll127
,
ll128
,
ll129
,
ll130
,
ll131
,
ll132
,
ll133
,
ll134
,
ll135
,
ll136
,
ll137
,
ll138
,
ll139
,
ll140
,
ll141
,
ll142
,
ll143
,
ll144
,
ll145
,
ll146
,
ll147
,
ll148
,
ll149
,
ll150
,
ll151
,
ll152
,
ll153
,
ll154
,
ll155
,
ll156
,
ll157
,
ll158
,
ll159
,
ll160
,
ll161
,
ll162
,
ll163
,
ll164
,
ll165
,
ll166
,
ll167
,
ll168
,
ll169
,
ll170
,
ll171
,
ll172
,
ll173
,
ll174
,
ll175
,
ll176
,
ll177
,
ll178
,
ll179
,
ll180
,
ll181
,
ll182
,
ll183
,
ll184
,
ll185
,
ll186
,
ll187
,
ll188
,
ll189
,
ll190
,
ll191
,
ll192
,
ll193
,
ll194
,
ll195
,
ll196
,
ll197
,
ll198
,
ll199
,
ll200
,
ll201
,
ll202
,
ll203
,
ll204
,
ll205
,
ll206
,
ll207
,
ll208
,
ll209
,
ll210
,
ll211
,
ll212
,
ll213
,
ll214
,
ll215
,
ll216
,
ll217
,
ll218
,
ll219
,
ll220
,
ll221
,
ll222
,
ll223
,
ll224
,
ll225
,
ll226
,
ll227
,
ll228
,
ll229
,
ll230
,
ll231
,
ll232
,
ll233
,
ll234
,
ll235
,
ll236
,
ll237
,
ll238
,
ll239
,
ll240
,
ll241
,
ll242
,
ll243
,
ll244
,
ll245
,
ll246
,
ll247
,
ll248
,
ll249
,
ll250
,
ll251
,
ll252
,
ll253
,
ll254
,
ll255
,
ll256
,
ll257
,
ll258
,
ll259
,
ll260
,
ll261
,
ll262
,
ll263
,
ll264
,
ll265
,
ll266
,
ll267
,
ll268
,
ll269
,
ll270
,
ll271
,
ll272
,
ll273
,
ll274
,
ll275
,
ll276
,
ll277
,
ll278
,
ll279
,
ll280
,
ll281
,
ll282
,
ll283
,
ll284
,
ll285
,
ll286
,
ll287
,
ll288
,
ll289
,
ll290
,
ll291
,
ll292
,
ll293
,
ll294
,
ll295
,
ll296
,
ll297
,
ll298
,
ll299
,
ll300
,
ll301
,
ll302
,
ll303
,
ll304
,
ll305
,
ll306
,
ll307
,
ll308
,
ll309
,
ll310
,
ll311
,
ll312
,
ll313
,
ll314
,
ll315
,
ll316
,
ll317
,
ll318
,
ll319
,
ll320
,
ll321
,
ll322
,
ll323
,
ll324
,
ll325
,
ll326
,
ll327
,
ll328
,
ll329
,
ll330
,
ll331
,
ll332
,
ll333
,
ll334
,
ll335
,
ll336
,
ll337
,
ll338
,
ll339
,
ll340
,
ll341
,
ll342
,
ll343
,
ll344
,
ll345
,
ll346
,
ll347
,
ll348
,
ll349
,
ll350
,
ll351
,
ll352
,
ll353
,
ll354
,
ll355
,
ll356
,
ll357
,
ll358
,
ll359
,
ll360
,
ll361
,
ll362
,
ll363
,
ll364
,
ll365
,
ll366
,
ll367
,
ll368
,
ll369
,
ll370
,
ll371
,
ll372
,
ll373
,
ll374
,
ll375
,
ll376
,
ll377
,
ll378
,
ll379
,
ll380
,
ll381
,
ll382
,
ll383
,
ll384
,
ll385
,
ll386
,
ll387
,
ll388
,
ll389
,
ll390
,
ll391
,
ll392
,
ll393
,
ll394
,
ll395
,
ll396
,
ll397
,
ll398
,
ll399
,
ll400
,
ll401
,
ll402
,
ll403
,
ll404
,
ll405
,
ll406
,
ll407
,
ll408
,
ll409
,
ll410
,
ll411
,
ll412
,
ll413
,
ll414
,
ll415
,
ll416
,
ll417
,
ll418
,
ll419
,
ll420
,
ll421
,
ll422
,
ll423
,
ll424
,
ll425
,
ll426
,
ll427
,
ll428
,
ll429
,
ll430
,
ll431
,
ll432
,
ll433
,
ll434
,
ll435
,
ll436
,
ll437
,
ll438
,
ll439
,
ll440
,
ll441
,
ll442
,
ll443
,
ll444
,
ll445
,
ll446
,
ll447
,
ll448
,
ll449
,
ll450
,
ll451
,
ll452
,
ll453
,
ll454
,
ll455
,
ll456
,
ll457
,
ll458
,
ll459
,
ll460
,
ll461
,
ll462
,
ll463
,
ll464
,
ll465
,
ll466
,
ll467
,
ll468
,
ll469
,
ll470
,
ll471
,
ll472
,
ll473
,
ll474
,
ll475
,
ll476
,
ll477
,
ll478
,
ll479
,
ll480
,
ll481
,
ll482
,
ll483
,
ll484
,
ll485
,
ll486
,
ll487
,
ll488
,
ll489
,
ll490
,
ll491
,
ll492
,
ll493
,
ll494
,
ll495
,
ll496
,
ll497
,
ll498
,
ll499
,
ll500
,
ll501
,
ll502
,
ll503
,
ll504
,
ll505
,
ll506
,
ll507
,
ll508
,
ll509
,
ll510
,
ll511
;
if
(
deopt
)
{
UnloadedClass
res
=
new
UnloadedClass
();
// sufficient to force deopt with c2 but not c1
res
.
i
=
0
;
// forces deopt with c1
return
res
;
}
return
null
;
}
static
int
count
=
0
;
static
void
m2
()
{
// Will be called recursively until a stack overflow
// exception. Makes sure it has a lot of locals so that it's
// not called a sufficient number of times to trigger
// compilation.
long
l0
,
l1
,
l2
,
l3
,
l4
,
l5
,
l6
,
l7
,
l8
,
l9
,
l10
,
l11
,
l12
,
l13
,
l14
,
l15
,
l16
,
l17
,
l18
,
l19
,
l20
,
l21
,
l22
,
l23
,
l24
,
l25
,
l26
,
l27
,
l28
,
l29
,
l30
,
l31
,
l32
,
l33
,
l34
,
l35
,
l36
,
l37
,
l38
,
l39
,
l40
,
l41
,
l42
,
l43
,
l44
,
l45
,
l46
,
l47
,
l48
,
l49
,
l50
,
l51
,
l52
,
l53
,
l54
,
l55
,
l56
,
l57
,
l58
,
l59
,
l60
,
l61
,
l62
,
l63
,
l64
,
l65
,
l66
,
l67
,
l68
,
l69
,
l70
,
l71
,
l72
,
l73
,
l74
,
l75
,
l76
,
l77
,
l78
,
l79
,
l80
,
l81
,
l82
,
l83
,
l84
,
l85
,
l86
,
l87
,
l88
,
l89
,
l90
,
l91
,
l92
,
l93
,
l94
,
l95
,
l96
,
l97
,
l98
,
l99
,
l100
,
l101
,
l102
,
l103
,
l104
,
l105
,
l106
,
l107
,
l108
,
l109
,
l110
,
l111
,
l112
,
l113
,
l114
,
l115
,
l116
,
l117
,
l118
,
l119
,
l120
,
l121
,
l122
,
l123
,
l124
,
l125
,
l126
,
l127
,
l128
,
l129
,
l130
,
l131
,
l132
,
l133
,
l134
,
l135
,
l136
,
l137
,
l138
,
l139
,
l140
,
l141
,
l142
,
l143
,
l144
,
l145
,
l146
,
l147
,
l148
,
l149
,
l150
,
l151
,
l152
,
l153
,
l154
,
l155
,
l156
,
l157
,
l158
,
l159
,
l160
,
l161
,
l162
,
l163
,
l164
,
l165
,
l166
,
l167
,
l168
,
l169
,
l170
,
l171
,
l172
,
l173
,
l174
,
l175
,
l176
,
l177
,
l178
,
l179
,
l180
,
l181
,
l182
,
l183
,
l184
,
l185
,
l186
,
l187
,
l188
,
l189
,
l190
,
l191
,
l192
,
l193
,
l194
,
l195
,
l196
,
l197
,
l198
,
l199
,
l200
,
l201
,
l202
,
l203
,
l204
,
l205
,
l206
,
l207
,
l208
,
l209
,
l210
,
l211
,
l212
,
l213
,
l214
,
l215
,
l216
,
l217
,
l218
,
l219
,
l220
,
l221
,
l222
,
l223
,
l224
,
l225
,
l226
,
l227
,
l228
,
l229
,
l230
,
l231
,
l232
,
l233
,
l234
,
l235
,
l236
,
l237
,
l238
,
l239
,
l240
,
l241
,
l242
,
l243
,
l244
,
l245
,
l246
,
l247
,
l248
,
l249
,
l250
,
l251
,
l252
,
l253
,
l254
,
l255
,
l256
,
l257
,
l258
,
l259
,
l260
,
l261
,
l262
,
l263
,
l264
,
l265
,
l266
,
l267
,
l268
,
l269
,
l270
,
l271
,
l272
,
l273
,
l274
,
l275
,
l276
,
l277
,
l278
,
l279
,
l280
,
l281
,
l282
,
l283
,
l284
,
l285
,
l286
,
l287
,
l288
,
l289
,
l290
,
l291
,
l292
,
l293
,
l294
,
l295
,
l296
,
l297
,
l298
,
l299
,
l300
,
l301
,
l302
,
l303
,
l304
,
l305
,
l306
,
l307
,
l308
,
l309
,
l310
,
l311
,
l312
,
l313
,
l314
,
l315
,
l316
,
l317
,
l318
,
l319
,
l320
,
l321
,
l322
,
l323
,
l324
,
l325
,
l326
,
l327
,
l328
,
l329
,
l330
,
l331
,
l332
,
l333
,
l334
,
l335
,
l336
,
l337
,
l338
,
l339
,
l340
,
l341
,
l342
,
l343
,
l344
,
l345
,
l346
,
l347
,
l348
,
l349
,
l350
,
l351
,
l352
,
l353
,
l354
,
l355
,
l356
,
l357
,
l358
,
l359
,
l360
,
l361
,
l362
,
l363
,
l364
,
l365
,
l366
,
l367
,
l368
,
l369
,
l370
,
l371
,
l372
,
l373
,
l374
,
l375
,
l376
,
l377
,
l378
,
l379
,
l380
,
l381
,
l382
,
l383
,
l384
,
l385
,
l386
,
l387
,
l388
,
l389
,
l390
,
l391
,
l392
,
l393
,
l394
,
l395
,
l396
,
l397
,
l398
,
l399
,
l400
,
l401
,
l402
,
l403
,
l404
,
l405
,
l406
,
l407
,
l408
,
l409
,
l410
,
l411
,
l412
,
l413
,
l414
,
l415
,
l416
,
l417
,
l418
,
l419
,
l420
,
l421
,
l422
,
l423
,
l424
,
l425
,
l426
,
l427
,
l428
,
l429
,
l430
,
l431
,
l432
,
l433
,
l434
,
l435
,
l436
,
l437
,
l438
,
l439
,
l440
,
l441
,
l442
,
l443
,
l444
,
l445
,
l446
,
l447
,
l448
,
l449
,
l450
,
l451
,
l452
,
l453
,
l454
,
l455
,
l456
,
l457
,
l458
,
l459
,
l460
,
l461
,
l462
,
l463
,
l464
,
l465
,
l466
,
l467
,
l468
,
l469
,
l470
,
l471
,
l472
,
l473
,
l474
,
l475
,
l476
,
l477
,
l478
,
l479
,
l480
,
l481
,
l482
,
l483
,
l484
,
l485
,
l486
,
l487
,
l488
,
l489
,
l490
,
l491
,
l492
,
l493
,
l494
,
l495
,
l496
,
l497
,
l498
,
l499
,
l500
,
l501
,
l502
,
l503
,
l504
,
l505
,
l506
,
l507
,
l508
,
l509
,
l510
,
l511
;
count
++;
m2
();
}
static
Object
m3
(
boolean
overflow_stack
,
boolean
deopt
)
{
if
(
overflow_stack
)
{
m2
();
return
null
;
}
Object
o
=
m1
(
deopt
);
if
(
deopt
)
{
m2
();
}
return
o
;
}
static
public
void
main
(
String
[]
args
)
{
int
c1
;
// Call m2 from m3 recursively until stack overflow. Count the number of recursive calls.
try
{
m3
(
true
,
false
);
}
catch
(
StackOverflowError
soe
)
{
}
c1
=
count
;
// Force the compilation of m3() that will inline m1()
for
(
int
i
=
0
;
i
<
20000
;
i
++)
{
m3
(
false
,
false
);
}
count
=
0
;
// Force deoptimization of m3() in m1(), then return from m1()
// to m3(), call recursively m2(). If deoptimization correctly
// built the interpreter stack for m3()/m1() then we should be
// able to call m2() recursively as many times as before.
try
{
m3
(
false
,
true
);
}
catch
(
StackOverflowError
soe
)
{
}
if
(
c1
!=
count
)
{
System
.
out
.
println
(
"Failed: init recursive calls: "
+
c1
+
". After deopt "
+
count
);
System
.
exit
(
97
);
}
else
{
System
.
out
.
println
(
"PASSED"
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录