Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
20cf7369
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看板
提交
20cf7369
编写于
7月 26, 2012
作者:
J
jiangli
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
5465a8a0
ee5e88f9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
70 addition
and
39 deletion
+70
-39
src/share/vm/opto/phaseX.cpp
src/share/vm/opto/phaseX.cpp
+66
-37
src/share/vm/opto/phaseX.hpp
src/share/vm/opto/phaseX.hpp
+4
-2
未找到文件。
src/share/vm/opto/phaseX.cpp
浏览文件 @
20cf7369
...
...
@@ -757,6 +757,7 @@ void PhaseGVN::dead_loop_check( Node *n ) {
//------------------------------PhaseIterGVN-----------------------------------
// Initialize hash table to fresh and clean for +VerifyOpto
PhaseIterGVN
::
PhaseIterGVN
(
PhaseIterGVN
*
igvn
,
const
char
*
dummy
)
:
PhaseGVN
(
igvn
,
dummy
),
_worklist
(
),
_stack
(
C
->
unique
()
>>
1
),
_delay_transform
(
false
)
{
}
...
...
@@ -764,6 +765,7 @@ PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn, const char *dummy ) : PhaseGVN(i
// Initialize with previous PhaseIterGVN info; used by PhaseCCP
PhaseIterGVN
::
PhaseIterGVN
(
PhaseIterGVN
*
igvn
)
:
PhaseGVN
(
igvn
),
_worklist
(
igvn
->
_worklist
),
_stack
(
igvn
->
_stack
),
_delay_transform
(
igvn
->
_delay_transform
)
{
}
...
...
@@ -772,6 +774,7 @@ PhaseIterGVN::PhaseIterGVN( PhaseIterGVN *igvn ) : PhaseGVN(igvn),
// Initialize with previous PhaseGVN info from Parser
PhaseIterGVN
::
PhaseIterGVN
(
PhaseGVN
*
gvn
)
:
PhaseGVN
(
gvn
),
_worklist
(
*
C
->
for_igvn
()),
_stack
(
C
->
unique
()
>>
1
),
_delay_transform
(
false
)
{
uint
max
;
...
...
@@ -1138,51 +1141,77 @@ const Type* PhaseIterGVN::saturate(const Type* new_type, const Type* old_type,
// Kill a globally dead Node. All uses are also globally dead and are
// aggressively trimmed.
void
PhaseIterGVN
::
remove_globally_dead_node
(
Node
*
dead
)
{
assert
(
dead
!=
C
->
root
(),
"killing root, eh?"
);
if
(
dead
->
is_top
())
return
;
NOT_PRODUCT
(
set_progress
();
)
// Remove from iterative worklist
_worklist
.
remove
(
dead
);
if
(
!
dead
->
is_Con
())
{
// Don't kill cons but uses
// Remove from hash table
_table
.
hash_delete
(
dead
);
// Smash all inputs to 'dead', isolating him completely
for
(
uint
i
=
0
;
i
<
dead
->
req
();
i
++
)
{
Node
*
in
=
dead
->
in
(
i
);
if
(
in
)
{
// Points to something?
dead
->
set_req
(
i
,
NULL
);
// Kill the edge
if
(
in
->
outcnt
()
==
0
&&
in
!=
C
->
top
())
{
// Made input go dead?
remove_dead_node
(
in
);
// Recursively remove
}
else
if
(
in
->
outcnt
()
==
1
&&
in
->
has_special_unique_user
())
{
_worklist
.
push
(
in
->
unique_out
());
}
else
if
(
in
->
outcnt
()
<=
2
&&
dead
->
is_Phi
())
{
if
(
in
->
Opcode
()
==
Op_Region
)
_worklist
.
push
(
in
);
else
if
(
in
->
is_Store
()
)
{
DUIterator_Fast
imax
,
i
=
in
->
fast_outs
(
imax
);
_worklist
.
push
(
in
->
fast_out
(
i
));
i
++
;
if
(
in
->
outcnt
()
==
2
)
{
_worklist
.
push
(
in
->
fast_out
(
i
));
i
++
;
enum
DeleteProgress
{
PROCESS_INPUTS
,
PROCESS_OUTPUTS
};
assert
(
_stack
.
is_empty
(),
"not empty"
);
_stack
.
push
(
dead
,
PROCESS_INPUTS
);
while
(
_stack
.
is_nonempty
())
{
dead
=
_stack
.
node
();
uint
progress_state
=
_stack
.
index
();
assert
(
dead
!=
C
->
root
(),
"killing root, eh?"
);
assert
(
!
dead
->
is_top
(),
"add check for top when pushing"
);
NOT_PRODUCT
(
set_progress
();
)
if
(
progress_state
==
PROCESS_INPUTS
)
{
// After following inputs, continue to outputs
_stack
.
set_index
(
PROCESS_OUTPUTS
);
// Remove from iterative worklist
_worklist
.
remove
(
dead
);
if
(
!
dead
->
is_Con
())
{
// Don't kill cons but uses
bool
recurse
=
false
;
// Remove from hash table
_table
.
hash_delete
(
dead
);
// Smash all inputs to 'dead', isolating him completely
for
(
uint
i
=
0
;
i
<
dead
->
req
();
i
++
)
{
Node
*
in
=
dead
->
in
(
i
);
if
(
in
)
{
// Points to something?
dead
->
set_req
(
i
,
NULL
);
// Kill the edge
if
(
in
->
outcnt
()
==
0
&&
in
!=
C
->
top
())
{
// Made input go dead?
_stack
.
push
(
in
,
PROCESS_INPUTS
);
// Recursively remove
recurse
=
true
;
}
else
if
(
in
->
outcnt
()
==
1
&&
in
->
has_special_unique_user
())
{
_worklist
.
push
(
in
->
unique_out
());
}
else
if
(
in
->
outcnt
()
<=
2
&&
dead
->
is_Phi
())
{
if
(
in
->
Opcode
()
==
Op_Region
)
_worklist
.
push
(
in
);
else
if
(
in
->
is_Store
()
)
{
DUIterator_Fast
imax
,
i
=
in
->
fast_outs
(
imax
);
_worklist
.
push
(
in
->
fast_out
(
i
));
i
++
;
if
(
in
->
outcnt
()
==
2
)
{
_worklist
.
push
(
in
->
fast_out
(
i
));
i
++
;
}
assert
(
!
(
i
<
imax
),
"sanity"
);
}
}
assert
(
!
(
i
<
imax
),
"sanity"
);
}
}
if
(
dead
->
is_macro
())
{
C
->
remove_macro_node
(
dead
);
}
if
(
recurse
)
{
continue
;
}
}
}
if
(
dead
->
is_macro
())
{
C
->
remove_macro_node
(
dead
);
// Aggressively kill globally dead uses
// (Rather than pushing all the outs at once, we push one at a time,
// plus the parent to resume later, because of the indefinite number
// of edge deletions per loop trip.)
if
(
dead
->
outcnt
()
>
0
)
{
// Recursively remove
_stack
.
push
(
dead
->
raw_out
(
0
),
PROCESS_INPUTS
);
}
else
{
_stack
.
pop
();
}
}
// Aggressively kill globally dead uses
// (Cannot use DUIterator_Last because of the indefinite number
// of edge deletions per loop trip.)
while
(
dead
->
outcnt
()
>
0
)
{
remove_globally_dead_node
(
dead
->
raw_out
(
0
));
}
}
//------------------------------subsume_node-----------------------------------
...
...
src/share/vm/opto/phaseX.hpp
浏览文件 @
20cf7369
...
...
@@ -403,6 +403,8 @@ class PhaseIterGVN : public PhaseGVN {
// Subsume users of node 'old' into node 'nn'
void
subsume_node
(
Node
*
old
,
Node
*
nn
);
Node_Stack
_stack
;
// Stack used to avoid recursion
protected:
// Idealize new Node 'n' with respect to its inputs and its value
...
...
@@ -438,8 +440,8 @@ public:
// It is significant only for debugging and profiling.
Node
*
register_new_node_with_optimizer
(
Node
*
n
,
Node
*
orig
=
NULL
);
// Kill a globally dead Node.
It is allowed to have uses which
are
// a
ssumed dead and left 'in limbo'
.
// Kill a globally dead Node.
All uses are also globally dead and
are
// a
ggressively trimmed
.
void
remove_globally_dead_node
(
Node
*
dead
);
// Kill all inputs to a dead node, recursively making more dead nodes.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录