Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
3a1c76b6
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看板
提交
3a1c76b6
编写于
9月 02, 2011
作者:
T
twisti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7071709: JSR 292: switchpoint invalidation should be pushed not pulled
Reviewed-by: never
上级
edafa3be
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
37 addition
and
7 deletion
+37
-7
src/share/vm/opto/memnode.cpp
src/share/vm/opto/memnode.cpp
+32
-4
src/share/vm/opto/parse3.cpp
src/share/vm/opto/parse3.cpp
+5
-3
未找到文件。
src/share/vm/opto/memnode.cpp
浏览文件 @
3a1c76b6
...
...
@@ -1493,6 +1493,7 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const {
if
(
tp
==
NULL
||
tp
->
empty
())
return
Type
::
TOP
;
int
off
=
tp
->
offset
();
assert
(
off
!=
Type
::
OffsetTop
,
"case covered by TypePtr::empty"
);
Compile
*
C
=
phase
->
C
;
// Try to guess loaded type from pointer type
if
(
tp
->
base
()
==
Type
::
AryPtr
)
{
...
...
@@ -1536,7 +1537,7 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const {
Node
*
base
=
adr
->
in
(
AddPNode
::
Base
);
if
(
base
!=
NULL
&&
!
phase
->
type
(
base
)
->
higher_equal
(
TypePtr
::
NULL_PTR
))
{
Compile
::
AliasType
*
atp
=
phase
->
C
->
alias_type
(
base
->
adr_type
());
Compile
::
AliasType
*
atp
=
C
->
alias_type
(
base
->
adr_type
());
if
(
is_autobox_cache
(
atp
))
{
return
jt
->
join
(
TypePtr
::
NOTNULL
)
->
is_ptr
();
}
...
...
@@ -1546,22 +1547,23 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const {
}
}
}
else
if
(
tp
->
base
()
==
Type
::
InstPtr
)
{
ciEnv
*
env
=
C
->
env
();
const
TypeInstPtr
*
tinst
=
tp
->
is_instptr
();
ciKlass
*
klass
=
tinst
->
klass
();
assert
(
off
!=
Type
::
OffsetBot
||
// arrays can be cast to Objects
tp
->
is_oopptr
()
->
klass
()
->
is_java_lang_Object
()
||
// unsafe field access may not have a constant offset
phase
->
C
->
has_unsafe_access
(),
C
->
has_unsafe_access
(),
"Field accesses must be precise"
);
// For oop loads, we expect the _type to be precise
if
(
klass
==
phase
->
C
->
env
()
->
String_klass
()
&&
if
(
klass
==
env
->
String_klass
()
&&
adr
->
is_AddP
()
&&
off
!=
Type
::
OffsetBot
)
{
// For constant Strings treat the final fields as compile time constants.
Node
*
base
=
adr
->
in
(
AddPNode
::
Base
);
const
TypeOopPtr
*
t
=
phase
->
type
(
base
)
->
isa_oopptr
();
if
(
t
!=
NULL
&&
t
->
singleton
())
{
ciField
*
field
=
phase
->
C
->
env
()
->
String_klass
()
->
get_field_by_offset
(
off
,
false
);
ciField
*
field
=
env
->
String_klass
()
->
get_field_by_offset
(
off
,
false
);
if
(
field
!=
NULL
&&
field
->
is_final
())
{
ciObject
*
string
=
t
->
const_oop
();
ciConstant
constant
=
string
->
as_instance
()
->
field_value
(
field
);
...
...
@@ -1577,6 +1579,32 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const {
}
}
}
// Optimizations for constant objects
ciObject
*
const_oop
=
tinst
->
const_oop
();
if
(
const_oop
!=
NULL
)
{
// For constant CallSites treat the target field as a compile time constant.
if
(
const_oop
->
is_call_site
())
{
ciCallSite
*
call_site
=
const_oop
->
as_call_site
();
ciField
*
field
=
call_site
->
klass
()
->
as_instance_klass
()
->
get_field_by_offset
(
off
,
/*is_static=*/
false
);
if
(
field
!=
NULL
&&
field
->
is_call_site_target
())
{
ciMethodHandle
*
target
=
call_site
->
get_target
();
if
(
target
!=
NULL
)
{
// just in case
ciConstant
constant
(
T_OBJECT
,
target
);
const
Type
*
t
;
if
(
adr
->
bottom_type
()
->
is_ptr_to_narrowoop
())
{
t
=
TypeNarrowOop
::
make_from_constant
(
constant
.
as_object
(),
true
);
}
else
{
t
=
TypeOopPtr
::
make_from_constant
(
constant
.
as_object
(),
true
);
}
// Add a dependence for invalidation of the optimization.
if
(
!
call_site
->
is_constant_call_site
())
{
C
->
dependencies
()
->
assert_call_site_target_value
(
call_site
,
target
);
}
return
t
;
}
}
}
}
}
else
if
(
tp
->
base
()
==
Type
::
KlassPtr
)
{
assert
(
off
!=
Type
::
OffsetBot
||
// arrays can be cast to Objects
...
...
src/share/vm/opto/parse3.cpp
浏览文件 @
3a1c76b6
...
...
@@ -147,19 +147,21 @@ void Parse::do_field_access(bool is_get, bool is_field) {
void
Parse
::
do_get_xxx
(
Node
*
obj
,
ciField
*
field
,
bool
is_field
)
{
// Does this field have a constant value? If so, just push the value.
if
(
field
->
is_constant
())
{
// final field
if
(
field
->
is_static
())
{
// final static field
if
(
push_constant
(
field
->
constant_value
()))
return
;
}
else
{
// final non-static field of a trusted class (classes in
// java.lang.invoke and sun.invoke packages and subpackages).
// final non-static field
// Treat final non-static fields of trusted classes (classes in
// java.lang.invoke and sun.invoke packages and subpackages) as
// compile time constants.
if
(
obj
->
is_Con
())
{
const
TypeOopPtr
*
oop_ptr
=
obj
->
bottom_type
()
->
isa_oopptr
();
ciObject
*
constant_oop
=
oop_ptr
->
const_oop
();
ciConstant
constant
=
field
->
constant_value_of
(
constant_oop
);
if
(
push_constant
(
constant
,
true
))
return
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录