Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
a73317d6
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看板
提交
a73317d6
编写于
8月 27, 2011
作者:
I
iveresov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6591247: C2 cleans up the merge point too early during SplitIf
Summary: Remove region self reference last Reviewed-by: kvn, never
上级
db6f7d55
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
18 addition
and
21 deletion
+18
-21
src/share/vm/opto/split_if.cpp
src/share/vm/opto/split_if.cpp
+18
-21
未找到文件。
src/share/vm/opto/split_if.cpp
浏览文件 @
a73317d6
...
...
@@ -500,19 +500,14 @@ void PhaseIdealLoop::do_split_if( Node *iff ) {
region_cache
.
lru_insert
(
new_false
,
new_false
);
region_cache
.
lru_insert
(
new_true
,
new_true
);
// Now handle all uses of the splitting block
for
(
DUIterator
_Last
kmin
,
k
=
region
->
last_outs
(
kmin
);
k
>=
kmin
;
--
k
)
{
Node
*
phi
=
region
->
last_
out
(
k
);
if
(
!
phi
->
in
(
0
)
)
{
// Dead phi? Remove it
for
(
DUIterator
k
=
region
->
outs
();
region
->
has_out
(
k
);
k
++
)
{
Node
*
phi
=
region
->
out
(
k
);
if
(
!
phi
->
in
(
0
)
)
{
// Dead phi? Remove it
_igvn
.
remove_dead_node
(
phi
);
continue
;
}
assert
(
phi
->
in
(
0
)
==
region
,
""
);
if
(
phi
==
region
)
{
// Found the self-reference
phi
->
set_req
(
0
,
NULL
);
continue
;
// Break the self-cycle
}
// Expected common case: Phi hanging off of Region
if
(
phi
->
is_Phi
()
)
{
}
else
if
(
phi
==
region
)
{
// Found the self-reference
continue
;
// No roll-back of DUIterator
}
else
if
(
phi
->
is_Phi
())
{
// Expected common case: Phi hanging off of Region
assert
(
phi
->
in
(
0
)
==
region
,
"Inconsistent graph"
);
// Need a per-def cache. Phi represents a def, so make a cache
small_cache
phi_cache
;
...
...
@@ -524,23 +519,25 @@ void PhaseIdealLoop::do_split_if( Node *iff ) {
// collection of PHI's merging values from different paths. The Phis
// inserted depend only on the location of the USE. We use a
// 2-element cache to handle multiple uses from the same block.
handle_use
(
use
,
phi
,
&
phi_cache
,
region_dom
,
new_false
,
new_true
,
old_false
,
old_true
);
handle_use
(
use
,
phi
,
&
phi_cache
,
region_dom
,
new_false
,
new_true
,
old_false
,
old_true
);
}
// End of while phi has uses
// Because handle_use might relocate region->_out,
// we must refresh the iterator.
k
=
region
->
last_outs
(
kmin
);
// Remove the dead Phi
_igvn
.
remove_dead_node
(
phi
);
}
else
{
assert
(
phi
->
in
(
0
)
==
region
,
"Inconsistent graph"
);
// Random memory op guarded by Region. Compute new DEF for USE.
handle_use
(
phi
,
region
,
&
region_cache
,
region_dom
,
new_false
,
new_true
,
old_false
,
old_true
);
handle_use
(
phi
,
region
,
&
region_cache
,
region_dom
,
new_false
,
new_true
,
old_false
,
old_true
);
}
// Every path above deletes a use of the region, except for the region
// self-cycle (which is needed by handle_use calling find_use_block
// calling get_ctrl calling get_ctrl_no_update looking for dead
// regions). So roll back the DUIterator innards.
--
k
;
}
// End of while merge point has phis
assert
(
region
->
outcnt
()
==
1
,
"Only self reference should remain"
);
// Just Self on the Region
region
->
set_req
(
0
,
NULL
);
// Break the self-cycle
// Any leftover bits in the splitting block must not have depended on local
// Phi inputs (these have already been split-up). Hence it's safe to hoist
// these guys to the dominating point.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录