Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
dcc49960
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
dcc49960
编写于
6月 11, 2015
作者:
V
vlivanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8074551: GWT can be marked non-compilable due to deopt count pollution
Reviewed-by: kvn
上级
75c7f306
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
147 addition
and
36 deletion
+147
-36
src/share/vm/ci/ciMethod.cpp
src/share/vm/ci/ciMethod.cpp
+2
-4
src/share/vm/ci/ciMethod.hpp
src/share/vm/ci/ciMethod.hpp
+3
-7
src/share/vm/classfile/classFileParser.cpp
src/share/vm/classfile/classFileParser.cpp
+6
-0
src/share/vm/classfile/classFileParser.hpp
src/share/vm/classfile/classFileParser.hpp
+1
-0
src/share/vm/classfile/vmSymbols.hpp
src/share/vm/classfile/vmSymbols.hpp
+1
-0
src/share/vm/oops/method.cpp
src/share/vm/oops/method.cpp
+1
-0
src/share/vm/oops/method.hpp
src/share/vm/oops/method.hpp
+20
-16
src/share/vm/opto/compile.cpp
src/share/vm/opto/compile.cpp
+0
-6
src/share/vm/opto/library_call.cpp
src/share/vm/opto/library_call.cpp
+0
-2
src/share/vm/runtime/deoptimization.cpp
src/share/vm/runtime/deoptimization.cpp
+4
-1
test/compiler/jsr292/PollutedTrapCounts.java
test/compiler/jsr292/PollutedTrapCounts.java
+109
-0
未找到文件。
src/share/vm/ci/ciMethod.cpp
浏览文件 @
dcc49960
...
...
@@ -70,8 +70,7 @@
// Loaded method.
ciMethod
::
ciMethod
(
methodHandle
h_m
,
ciInstanceKlass
*
holder
)
:
ciMetadata
(
h_m
()),
_holder
(
holder
),
_has_injected_profile
(
false
)
_holder
(
holder
)
{
assert
(
h_m
()
!=
NULL
,
"no null method"
);
...
...
@@ -168,8 +167,7 @@ ciMethod::ciMethod(ciInstanceKlass* holder,
_liveness
(
NULL
),
_can_be_statically_bound
(
false
),
_method_blocks
(
NULL
),
_method_data
(
NULL
),
_has_injected_profile
(
false
)
_method_data
(
NULL
)
#if defined(COMPILER2) || defined(SHARK)
,
_flow
(
NULL
),
...
...
src/share/vm/ci/ciMethod.hpp
浏览文件 @
dcc49960
...
...
@@ -78,7 +78,6 @@ class ciMethod : public ciMetadata {
bool
_is_c1_compilable
;
bool
_is_c2_compilable
;
bool
_can_be_statically_bound
;
bool
_has_injected_profile
;
// Lazy fields, filled in on demand
address
_code
;
...
...
@@ -173,9 +172,9 @@ class ciMethod : public ciMetadata {
// Code size for inlining decisions.
int
code_size_for_inlining
();
bool
caller_sensitive
()
{
return
get_Method
()
->
caller_sensitive
();
}
bool
force_inline
()
{
return
get_Method
()
->
force_inline
();
}
bool
dont_inline
()
{
return
get_Method
()
->
dont_inline
();
}
bool
caller_sensitive
()
const
{
return
get_Method
()
->
caller_sensitive
();
}
bool
force_inline
()
const
{
return
get_Method
()
->
force_inline
();
}
bool
dont_inline
()
const
{
return
get_Method
()
->
dont_inline
();
}
int
comp_level
();
int
highest_osr_comp_level
();
...
...
@@ -283,9 +282,6 @@ class ciMethod : public ciMetadata {
int
instructions_size
();
int
scale_count
(
int
count
,
float
prof_factor
=
1.
);
// make MDO count commensurate with IIC
bool
has_injected_profile
()
const
{
return
_has_injected_profile
;
}
void
set_injected_profile
(
bool
x
)
{
_has_injected_profile
=
x
;
}
// Stack walking support
bool
is_ignored_by_security_stack_walk
()
const
;
...
...
src/share/vm/classfile/classFileParser.cpp
浏览文件 @
dcc49960
...
...
@@ -1783,6 +1783,10 @@ ClassFileParser::AnnotationCollector::annotation_index(ClassLoaderData* loader_d
if
(
_location
!=
_in_method
)
break
;
// only allow for methods
if
(
!
privileged
)
break
;
// only allow in privileged code
return
_method_DontInline
;
case
vmSymbols
::
VM_SYMBOL_ENUM_NAME
(
java_lang_invoke_InjectedProfile_signature
):
if
(
_location
!=
_in_method
)
break
;
// only allow for methods
if
(
!
privileged
)
break
;
// only allow in privileged code
return
_method_InjectedProfile
;
case
vmSymbols
::
VM_SYMBOL_ENUM_NAME
(
java_lang_invoke_LambdaForm_Compiled_signature
):
if
(
_location
!=
_in_method
)
break
;
// only allow for methods
if
(
!
privileged
)
break
;
// only allow in privileged code
...
...
@@ -1824,6 +1828,8 @@ void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) {
m
->
set_force_inline
(
true
);
if
(
has_annotation
(
_method_DontInline
))
m
->
set_dont_inline
(
true
);
if
(
has_annotation
(
_method_InjectedProfile
))
m
->
set_has_injected_profile
(
true
);
if
(
has_annotation
(
_method_LambdaForm_Compiled
)
&&
m
->
intrinsic_id
()
==
vmIntrinsics
::
_none
)
m
->
set_intrinsic_id
(
vmIntrinsics
::
_compiledLambdaForm
);
if
(
has_annotation
(
_method_LambdaForm_Hidden
))
...
...
src/share/vm/classfile/classFileParser.hpp
浏览文件 @
dcc49960
...
...
@@ -126,6 +126,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
_method_CallerSensitive
,
_method_ForceInline
,
_method_DontInline
,
_method_InjectedProfile
,
_method_LambdaForm_Compiled
,
_method_LambdaForm_Hidden
,
_sun_misc_Contended
,
...
...
src/share/vm/classfile/vmSymbols.hpp
浏览文件 @
dcc49960
...
...
@@ -278,6 +278,7 @@
template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \
template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \
template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \
template(java_lang_invoke_InjectedProfile_signature, "Ljava/lang/invoke/InjectedProfile;") \
template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
...
...
src/share/vm/oops/method.cpp
浏览文件 @
dcc49960
...
...
@@ -92,6 +92,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) {
set_force_inline
(
false
);
set_hidden
(
false
);
set_dont_inline
(
false
);
set_has_injected_profile
(
false
);
set_method_data
(
NULL
);
clear_method_counters
();
set_vtable_index
(
Method
::
garbage_vtable_index
);
...
...
src/share/vm/oops/method.hpp
浏览文件 @
dcc49960
...
...
@@ -110,12 +110,13 @@ class Method : public Metadata {
#endif
u2
_method_size
;
// size of this object
u1
_intrinsic_id
;
// vmSymbols::intrinsic_id (0 == _none)
u1
_jfr_towrite
:
1
,
// Flags
_caller_sensitive
:
1
,
_force_inline
:
1
,
_hidden
:
1
,
_dont_inline
:
1
,
:
3
;
u1
_jfr_towrite
:
1
,
// Flags
_caller_sensitive
:
1
,
_force_inline
:
1
,
_hidden
:
1
,
_dont_inline
:
1
,
_has_injected_profile
:
1
,
:
2
;
#ifndef PRODUCT
int
_compiled_invocation_count
;
// Number of nmethod invocations so far (for perf. debugging)
...
...
@@ -781,16 +782,19 @@ class Method : public Metadata {
void
init_intrinsic_id
();
// updates from _none if a match
static
vmSymbols
::
SID
klass_id_for_intrinsics
(
Klass
*
holder
);
bool
jfr_towrite
()
{
return
_jfr_towrite
;
}
void
set_jfr_towrite
(
bool
x
)
{
_jfr_towrite
=
x
;
}
bool
caller_sensitive
()
{
return
_caller_sensitive
;
}
void
set_caller_sensitive
(
bool
x
)
{
_caller_sensitive
=
x
;
}
bool
force_inline
()
{
return
_force_inline
;
}
void
set_force_inline
(
bool
x
)
{
_force_inline
=
x
;
}
bool
dont_inline
()
{
return
_dont_inline
;
}
void
set_dont_inline
(
bool
x
)
{
_dont_inline
=
x
;
}
bool
is_hidden
()
{
return
_hidden
;
}
void
set_hidden
(
bool
x
)
{
_hidden
=
x
;
}
bool
jfr_towrite
()
{
return
_jfr_towrite
;
}
void
set_jfr_towrite
(
bool
x
)
{
_jfr_towrite
=
x
;
}
bool
caller_sensitive
()
{
return
_caller_sensitive
;
}
void
set_caller_sensitive
(
bool
x
)
{
_caller_sensitive
=
x
;
}
bool
force_inline
()
{
return
_force_inline
;
}
void
set_force_inline
(
bool
x
)
{
_force_inline
=
x
;
}
bool
dont_inline
()
{
return
_dont_inline
;
}
void
set_dont_inline
(
bool
x
)
{
_dont_inline
=
x
;
}
bool
is_hidden
()
{
return
_hidden
;
}
void
set_hidden
(
bool
x
)
{
_hidden
=
x
;
}
bool
has_injected_profile
()
{
return
_has_injected_profile
;
}
void
set_has_injected_profile
(
bool
x
)
{
_has_injected_profile
=
x
;
}
ConstMethod
::
MethodType
method_type
()
const
{
return
_constMethod
->
method_type
();
}
...
...
src/share/vm/opto/compile.cpp
浏览文件 @
dcc49960
...
...
@@ -3292,9 +3292,6 @@ bool Compile::final_graph_reshaping() {
bool
Compile
::
too_many_traps
(
ciMethod
*
method
,
int
bci
,
Deoptimization
::
DeoptReason
reason
)
{
if
(
method
->
has_injected_profile
())
{
return
false
;
}
ciMethodData
*
md
=
method
->
method_data
();
if
(
md
->
is_empty
())
{
// Assume the trap has not occurred, or that it occurred only
...
...
@@ -3344,9 +3341,6 @@ bool Compile::too_many_traps(Deoptimization::DeoptReason reason,
bool
Compile
::
too_many_recompiles
(
ciMethod
*
method
,
int
bci
,
Deoptimization
::
DeoptReason
reason
)
{
if
(
method
->
has_injected_profile
())
{
return
false
;
}
ciMethodData
*
md
=
method
->
method_data
();
if
(
md
->
is_empty
())
{
// Assume the trap has not occurred, or that it occurred only
...
...
src/share/vm/opto/library_call.cpp
浏览文件 @
dcc49960
...
...
@@ -6565,8 +6565,6 @@ bool LibraryCallKit::inline_profileBoolean() {
jint
false_cnt
=
aobj
->
element_value
(
0
).
as_int
();
jint
true_cnt
=
aobj
->
element_value
(
1
).
as_int
();
method
()
->
set_injected_profile
(
true
);
if
(
C
->
log
()
!=
NULL
)
{
C
->
log
()
->
elem
(
"observe source='profileBoolean' false='%d' true='%d'"
,
false_cnt
,
true_cnt
);
...
...
src/share/vm/runtime/deoptimization.cpp
浏览文件 @
dcc49960
...
...
@@ -1469,7 +1469,10 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra
//
// The other actions cause immediate removal of the present code.
bool
update_trap_state
=
true
;
// Traps caused by injected profile shouldn't pollute trap counts.
bool
injected_profile_trap
=
trap_method
->
has_injected_profile
()
&&
(
reason
==
Reason_intrinsic
||
reason
==
Reason_unreached
);
bool
update_trap_state
=
!
injected_profile_trap
;
bool
make_not_entrant
=
false
;
bool
make_not_compilable
=
false
;
bool
reprofile
=
false
;
...
...
test/compiler/jsr292/PollutedTrapCounts.java
0 → 100644
浏览文件 @
dcc49960
/*
* Copyright (c) 2015, 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 8074551
* @library /testlibrary
* @run main PollutedTrapCounts
*/
import
java.lang.invoke.*
;
import
com.oracle.java.testlibrary.*
;
public
class
PollutedTrapCounts
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
ProcessBuilder
pb
=
ProcessTools
.
createJavaProcessBuilder
(
"-XX:+IgnoreUnrecognizedVMOptions"
,
"-XX:-TieredCompilation"
,
"-Xbatch"
,
"-XX:PerBytecodeRecompilationCutoff=10"
,
"-XX:PerMethodRecompilationCutoff=10"
,
"-XX:+PrintCompilation"
,
"-XX:+UnlockDiagnosticVMOptions"
,
"-XX:+PrintInlining"
,
"PollutedTrapCounts$Test"
);
OutputAnalyzer
analyzer
=
new
OutputAnalyzer
(
pb
.
start
());
analyzer
.
shouldHaveExitValue
(
0
);
analyzer
.
shouldNotContain
(
"not compilable (disabled)"
);
}
static
class
Test
{
public
static
final
MethodHandle
test1
;
public
static
final
MethodHandle
test2
;
public
static
final
MethodHandle
empty
;
static
{
try
{
Class
<?>
THIS_CLASS
=
Test
.
class
;
MethodHandles
.
Lookup
LOOKUP
=
MethodHandles
.
lookup
();
test1
=
LOOKUP
.
findStatic
(
THIS_CLASS
,
"test1"
,
MethodType
.
methodType
(
boolean
.
class
,
boolean
.
class
));
test2
=
LOOKUP
.
findStatic
(
THIS_CLASS
,
"test2"
,
MethodType
.
methodType
(
boolean
.
class
,
boolean
.
class
));
empty
=
LOOKUP
.
findStatic
(
THIS_CLASS
,
"empty"
,
MethodType
.
methodType
(
void
.
class
,
boolean
.
class
));
}
catch
(
Throwable
e
)
{
throw
new
Error
(
e
);
}
}
static
boolean
test1
(
boolean
b
)
{
return
b
;
}
static
boolean
test2
(
boolean
b
)
{
return
true
;
}
static
void
empty
(
boolean
b
)
{}
static
void
test
(
boolean
freqValue
,
boolean
removeInlineBlocker
)
throws
Throwable
{
MethodHandle
innerGWT
=
MethodHandles
.
guardWithTest
(
test1
,
empty
,
empty
);
MethodHandle
outerGWT
=
MethodHandles
.
guardWithTest
(
test2
,
innerGWT
,
innerGWT
);
// Trigger compilation
for
(
int
i
=
0
;
i
<
20_000
;
i
++)
{
outerGWT
.
invokeExact
(
freqValue
);
}
// Trigger deopt & nmethod invalidation
outerGWT
.
invokeExact
(!
freqValue
);
// Force inline blocker removal on rare-taken path
if
(
removeInlineBlocker
)
{
for
(
int
i
=
0
;
i
<
100
;
i
++)
{
outerGWT
.
invokeExact
(!
freqValue
);
}
}
// Trigger recompilation
for
(
int
i
=
0
;
i
<
20_000
;
i
++)
{
outerGWT
.
invokeExact
(
freqValue
);
}
}
public
static
void
main
(
String
[]
args
)
throws
Throwable
{
boolean
freqValue
=
true
;
boolean
removeInlineBlocker
=
false
;
for
(
int
i
=
0
;
i
<
20
;
i
++)
{
test
(
freqValue
,
removeInlineBlocker
);
freqValue
=
!
freqValue
;
removeInlineBlocker
=
!
removeInlineBlocker
;
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录