Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
fcdfd13d
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看板
提交
fcdfd13d
编写于
9月 22, 2010
作者:
N
never
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6982537: Crash in Node*step_through_mergemem
Reviewed-by: kvn
上级
a225727a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
19 addition
and
17 deletion
+19
-17
src/share/vm/opto/escape.cpp
src/share/vm/opto/escape.cpp
+13
-12
src/share/vm/opto/memnode.cpp
src/share/vm/opto/memnode.cpp
+6
-5
未找到文件。
src/share/vm/opto/escape.cpp
浏览文件 @
fcdfd13d
...
...
@@ -706,14 +706,15 @@ PhiNode *ConnectionGraph::split_memory_phi(PhiNode *orig_phi, int alias_idx, Gro
//
// The next methods are derived from methods in MemNode.
//
static
Node
*
step_through_mergemem
(
MergeMemNode
*
mmem
,
int
alias_idx
,
const
TypeOopPtr
*
t
inst
)
{
static
Node
*
step_through_mergemem
(
MergeMemNode
*
mmem
,
int
alias_idx
,
const
TypeOopPtr
*
t
oop
)
{
Node
*
mem
=
mmem
;
// Type
Inst
Ptr::NOTNULL+any is an OOP with unknown offset - generally
// Type
Oop
Ptr::NOTNULL+any is an OOP with unknown offset - generally
// means an array I have not precisely typed yet. Do not do any
// alias stuff with it any time soon.
if
(
tinst
->
base
()
!=
Type
::
AnyPtr
&&
!
(
tinst
->
klass
()
->
is_java_lang_Object
()
&&
tinst
->
offset
()
==
Type
::
OffsetBot
)
)
{
if
(
toop
->
base
()
!=
Type
::
AnyPtr
&&
!
(
toop
->
klass
()
!=
NULL
&&
toop
->
klass
()
->
is_java_lang_Object
()
&&
toop
->
offset
()
==
Type
::
OffsetBot
)
)
{
mem
=
mmem
->
memory_at
(
alias_idx
);
// Update input if it is progress over what we have now
}
...
...
@@ -803,8 +804,8 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra
if
(
orig_mem
==
NULL
)
return
orig_mem
;
Compile
*
C
=
phase
->
C
;
const
TypeOopPtr
*
t
inst
=
C
->
get_adr_type
(
alias_idx
)
->
isa_oopptr
();
bool
is_instance
=
(
t
inst
!=
NULL
)
&&
tinst
->
is_known_instance
();
const
TypeOopPtr
*
t
oop
=
C
->
get_adr_type
(
alias_idx
)
->
isa_oopptr
();
bool
is_instance
=
(
t
oop
!=
NULL
)
&&
toop
->
is_known_instance
();
Node
*
start_mem
=
C
->
start
()
->
proj_out
(
TypeFunc
::
Memory
);
Node
*
prev
=
NULL
;
Node
*
result
=
orig_mem
;
...
...
@@ -827,18 +828,18 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra
// skip over a call which does not affect this memory slice
if
(
result
->
is_Proj
()
&&
result
->
as_Proj
()
->
_con
==
TypeFunc
::
Memory
)
{
Node
*
proj_in
=
result
->
in
(
0
);
if
(
proj_in
->
is_Allocate
()
&&
proj_in
->
_idx
==
(
uint
)
t
inst
->
instance_id
())
{
if
(
proj_in
->
is_Allocate
()
&&
proj_in
->
_idx
==
(
uint
)
t
oop
->
instance_id
())
{
break
;
// hit one of our sentinels
}
else
if
(
proj_in
->
is_Call
())
{
CallNode
*
call
=
proj_in
->
as_Call
();
if
(
!
call
->
may_modify
(
t
inst
,
phase
))
{
if
(
!
call
->
may_modify
(
t
oop
,
phase
))
{
result
=
call
->
in
(
TypeFunc
::
Memory
);
}
}
else
if
(
proj_in
->
is_Initialize
())
{
AllocateNode
*
alloc
=
proj_in
->
as_Initialize
()
->
allocation
();
// Stop if this is the initialization for the object instance which
// which contains this memory slice, otherwise skip over it.
if
(
alloc
==
NULL
||
alloc
->
_idx
!=
(
uint
)
t
inst
->
instance_id
())
{
if
(
alloc
==
NULL
||
alloc
->
_idx
!=
(
uint
)
t
oop
->
instance_id
())
{
result
=
proj_in
->
in
(
TypeFunc
::
Memory
);
}
}
else
if
(
proj_in
->
is_MemBar
())
{
...
...
@@ -846,7 +847,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra
}
}
else
if
(
result
->
is_MergeMem
())
{
MergeMemNode
*
mmem
=
result
->
as_MergeMem
();
result
=
step_through_mergemem
(
mmem
,
alias_idx
,
t
inst
);
result
=
step_through_mergemem
(
mmem
,
alias_idx
,
t
oop
);
if
(
result
==
mmem
->
base_memory
())
{
// Didn't find instance memory, search through general slice recursively.
result
=
mmem
->
memory_at
(
C
->
get_general_index
(
alias_idx
));
...
...
@@ -866,7 +867,7 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra
break
;
}
}
else
if
(
result
->
is_ClearArray
())
{
if
(
!
ClearArrayNode
::
step_through
(
&
result
,
(
uint
)
t
inst
->
instance_id
(),
phase
))
{
if
(
!
ClearArrayNode
::
step_through
(
&
result
,
(
uint
)
t
oop
->
instance_id
(),
phase
))
{
// Can not bypass initialization of the instance
// we are looking for.
break
;
...
...
src/share/vm/opto/memnode.cpp
浏览文件 @
fcdfd13d
...
...
@@ -193,14 +193,15 @@ static Node *step_through_mergemem(PhaseGVN *phase, MergeMemNode *mmem, const T
}
}
#endif
// Type
Inst
Ptr::NOTNULL+any is an OOP with unknown offset - generally
// Type
Oop
Ptr::NOTNULL+any is an OOP with unknown offset - generally
// means an array I have not precisely typed yet. Do not do any
// alias stuff with it any time soon.
const
TypeOopPtr
*
t
inst
=
tp
->
isa_oopptr
();
const
TypeOopPtr
*
t
oop
=
tp
->
isa_oopptr
();
if
(
tp
->
base
()
!=
Type
::
AnyPtr
&&
!
(
tinst
&&
tinst
->
klass
()
->
is_java_lang_Object
()
&&
tinst
->
offset
()
==
Type
::
OffsetBot
)
)
{
!
(
toop
&&
toop
->
klass
()
!=
NULL
&&
toop
->
klass
()
->
is_java_lang_Object
()
&&
toop
->
offset
()
==
Type
::
OffsetBot
)
)
{
// compress paths and change unreachable cycles to TOP
// If not, we can update the input infinitely along a MergeMem cycle
// Equivalent code in PhiNode::Ideal
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录