Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
137a4214
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看板
提交
137a4214
编写于
3月 19, 2013
作者:
M
morris
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
d397d619
5d526cd3
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
25 addition
and
4 deletion
+25
-4
src/share/vm/oops/generateOopMap.cpp
src/share/vm/oops/generateOopMap.cpp
+4
-0
src/share/vm/opto/loopnode.hpp
src/share/vm/opto/loopnode.hpp
+6
-2
src/share/vm/opto/loopopts.cpp
src/share/vm/opto/loopopts.cpp
+15
-2
未找到文件。
src/share/vm/oops/generateOopMap.cpp
浏览文件 @
137a4214
...
@@ -762,6 +762,7 @@ void GenerateOopMap::copy_state(CellTypeState *dst, CellTypeState *src) {
...
@@ -762,6 +762,7 @@ void GenerateOopMap::copy_state(CellTypeState *dst, CellTypeState *src) {
// monitor matching is purely informational and doesn't say anything
// monitor matching is purely informational and doesn't say anything
// about the correctness of the code.
// about the correctness of the code.
void
GenerateOopMap
::
merge_state_into_bb
(
BasicBlock
*
bb
)
{
void
GenerateOopMap
::
merge_state_into_bb
(
BasicBlock
*
bb
)
{
guarantee
(
bb
!=
NULL
,
"null basicblock"
);
assert
(
bb
->
is_alive
(),
"merging state into a dead basicblock"
);
assert
(
bb
->
is_alive
(),
"merging state into a dead basicblock"
);
if
(
_stack_top
==
bb
->
_stack_top
)
{
if
(
_stack_top
==
bb
->
_stack_top
)
{
...
@@ -1189,6 +1190,7 @@ void GenerateOopMap::do_exception_edge(BytecodeStream* itr) {
...
@@ -1189,6 +1190,7 @@ void GenerateOopMap::do_exception_edge(BytecodeStream* itr) {
if
(
start_pc
<=
bci
&&
bci
<
end_pc
)
{
if
(
start_pc
<=
bci
&&
bci
<
end_pc
)
{
BasicBlock
*
excBB
=
get_basic_block_at
(
handler_pc
);
BasicBlock
*
excBB
=
get_basic_block_at
(
handler_pc
);
guarantee
(
excBB
!=
NULL
,
"no basic block for exception"
);
CellTypeState
*
excStk
=
excBB
->
stack
();
CellTypeState
*
excStk
=
excBB
->
stack
();
CellTypeState
*
cOpStck
=
stack
();
CellTypeState
*
cOpStck
=
stack
();
CellTypeState
cOpStck_0
=
cOpStck
[
0
];
CellTypeState
cOpStck_0
=
cOpStck
[
0
];
...
@@ -1803,6 +1805,7 @@ void GenerateOopMap::do_monitorexit(int bci) {
...
@@ -1803,6 +1805,7 @@ void GenerateOopMap::do_monitorexit(int bci) {
// possibility that this bytecode will throw an
// possibility that this bytecode will throw an
// exception.
// exception.
BasicBlock
*
bb
=
get_basic_block_containing
(
bci
);
BasicBlock
*
bb
=
get_basic_block_containing
(
bci
);
guarantee
(
bb
!=
NULL
,
"no basic block for bci"
);
bb
->
set_changed
(
true
);
bb
->
set_changed
(
true
);
bb
->
_monitor_top
=
bad_monitors
;
bb
->
_monitor_top
=
bad_monitors
;
...
@@ -2190,6 +2193,7 @@ void GenerateOopMap::result_for_basicblock(int bci) {
...
@@ -2190,6 +2193,7 @@ void GenerateOopMap::result_for_basicblock(int bci) {
// Find basicblock and report results
// Find basicblock and report results
BasicBlock
*
bb
=
get_basic_block_containing
(
bci
);
BasicBlock
*
bb
=
get_basic_block_containing
(
bci
);
guarantee
(
bb
!=
NULL
,
"no basic block for bci"
);
assert
(
bb
->
is_reachable
(),
"getting result from unreachable basicblock"
);
assert
(
bb
->
is_reachable
(),
"getting result from unreachable basicblock"
);
bb
->
set_changed
(
true
);
bb
->
set_changed
(
true
);
interp_bb
(
bb
);
interp_bb
(
bb
);
...
...
src/share/vm/opto/loopnode.hpp
浏览文件 @
137a4214
...
@@ -603,7 +603,10 @@ class PhaseIdealLoop : public PhaseTransform {
...
@@ -603,7 +603,10 @@ class PhaseIdealLoop : public PhaseTransform {
}
}
public:
public:
bool
has_node
(
Node
*
n
)
const
{
return
_nodes
[
n
->
_idx
]
!=
NULL
;
}
bool
has_node
(
Node
*
n
)
const
{
guarantee
(
n
!=
NULL
,
"No Node."
);
return
_nodes
[
n
->
_idx
]
!=
NULL
;
}
// check if transform created new nodes that need _ctrl recorded
// check if transform created new nodes that need _ctrl recorded
Node
*
get_late_ctrl
(
Node
*
n
,
Node
*
early
);
Node
*
get_late_ctrl
(
Node
*
n
,
Node
*
early
);
Node
*
get_early_ctrl
(
Node
*
n
);
Node
*
get_early_ctrl
(
Node
*
n
);
...
@@ -737,7 +740,8 @@ private:
...
@@ -737,7 +740,8 @@ private:
return
n
;
return
n
;
}
}
uint
dom_depth
(
Node
*
d
)
const
{
uint
dom_depth
(
Node
*
d
)
const
{
assert
(
d
->
_idx
<
_idom_size
,
""
);
guarantee
(
d
!=
NULL
,
"Null dominator info."
);
guarantee
(
d
->
_idx
<
_idom_size
,
""
);
return
_dom_depth
[
d
->
_idx
];
return
_dom_depth
[
d
->
_idx
];
}
}
void
set_idom
(
Node
*
d
,
Node
*
n
,
uint
dom_depth
);
void
set_idom
(
Node
*
d
,
Node
*
n
,
uint
dom_depth
);
...
...
src/share/vm/opto/loopopts.cpp
浏览文件 @
137a4214
...
@@ -232,7 +232,11 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc
...
@@ -232,7 +232,11 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc
// Loop predicates may have depending checks which should not
// Loop predicates may have depending checks which should not
// be skipped. For example, range check predicate has two checks
// be skipped. For example, range check predicate has two checks
// for lower and upper bounds.
// for lower and upper bounds.
ProjNode
*
unc_proj
=
iff
->
as_If
()
->
proj_out
(
1
-
dp
->
as_Proj
()
->
_con
)
->
as_Proj
();
if
(
dp
==
NULL
)
return
;
ProjNode
*
dp_proj
=
dp
->
as_Proj
();
ProjNode
*
unc_proj
=
iff
->
as_If
()
->
proj_out
(
1
-
dp_proj
->
_con
)
->
as_Proj
();
if
(
exclude_loop_predicate
&&
if
(
exclude_loop_predicate
&&
is_uncommon_trap_proj
(
unc_proj
,
Deoptimization
::
Reason_predicate
))
is_uncommon_trap_proj
(
unc_proj
,
Deoptimization
::
Reason_predicate
))
return
;
// Let IGVN transformation change control dependence.
return
;
// Let IGVN transformation change control dependence.
...
@@ -866,8 +870,11 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) {
...
@@ -866,8 +870,11 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) {
// Now split the bool up thru the phi
// Now split the bool up thru the phi
Node
*
bolphi
=
split_thru_phi
(
bol
,
n_ctrl
,
-
1
);
Node
*
bolphi
=
split_thru_phi
(
bol
,
n_ctrl
,
-
1
);
guarantee
(
bolphi
!=
NULL
,
"null boolean phi node"
);
_igvn
.
replace_node
(
bol
,
bolphi
);
_igvn
.
replace_node
(
bol
,
bolphi
);
assert
(
iff
->
in
(
1
)
==
bolphi
,
""
);
assert
(
iff
->
in
(
1
)
==
bolphi
,
""
);
if
(
bolphi
->
Value
(
&
_igvn
)
->
singleton
()
)
if
(
bolphi
->
Value
(
&
_igvn
)
->
singleton
()
)
return
;
return
;
...
@@ -1628,6 +1635,7 @@ ProjNode* PhaseIdealLoop::proj_clone(ProjNode* p, IfNode* iff) {
...
@@ -1628,6 +1635,7 @@ ProjNode* PhaseIdealLoop::proj_clone(ProjNode* p, IfNode* iff) {
//------------------------------ short_circuit_if -------------------------------------
//------------------------------ short_circuit_if -------------------------------------
// Force the iff control output to be the live_proj
// Force the iff control output to be the live_proj
Node
*
PhaseIdealLoop
::
short_circuit_if
(
IfNode
*
iff
,
ProjNode
*
live_proj
)
{
Node
*
PhaseIdealLoop
::
short_circuit_if
(
IfNode
*
iff
,
ProjNode
*
live_proj
)
{
guarantee
(
live_proj
!=
NULL
,
"null projection"
);
int
proj_con
=
live_proj
->
_con
;
int
proj_con
=
live_proj
->
_con
;
assert
(
proj_con
==
0
||
proj_con
==
1
,
"false or true projection"
);
assert
(
proj_con
==
0
||
proj_con
==
1
,
"false or true projection"
);
Node
*
con
=
_igvn
.
intcon
(
proj_con
);
Node
*
con
=
_igvn
.
intcon
(
proj_con
);
...
@@ -1686,6 +1694,7 @@ ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTes
...
@@ -1686,6 +1694,7 @@ ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTes
set_idom
(
proj
,
new_if
,
ddepth
);
set_idom
(
proj
,
new_if
,
ddepth
);
ProjNode
*
new_exit
=
proj_clone
(
other_proj
,
new_if
)
->
as_Proj
();
ProjNode
*
new_exit
=
proj_clone
(
other_proj
,
new_if
)
->
as_Proj
();
guarantee
(
new_exit
!=
NULL
,
"null exit node"
);
register_node
(
new_exit
,
get_loop
(
other_proj
),
new_if
,
ddepth
);
register_node
(
new_exit
,
get_loop
(
other_proj
),
new_if
,
ddepth
);
return
new_exit
;
return
new_exit
;
...
@@ -1793,7 +1802,10 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
...
@@ -1793,7 +1802,10 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
int
stride
=
stride_of_possible_iv
(
if_cmpu
);
int
stride
=
stride_of_possible_iv
(
if_cmpu
);
if
(
stride
==
0
)
return
NULL
;
if
(
stride
==
0
)
return
NULL
;
ProjNode
*
lp_continue
=
stay_in_loop
(
if_cmpu
,
loop
)
->
as_Proj
();
Node
*
lp_proj
=
stay_in_loop
(
if_cmpu
,
loop
);
guarantee
(
lp_proj
!=
NULL
,
"null loop node"
);
ProjNode
*
lp_continue
=
lp_proj
->
as_Proj
();
ProjNode
*
lp_exit
=
if_cmpu
->
proj_out
(
!
lp_continue
->
is_IfTrue
())
->
as_Proj
();
ProjNode
*
lp_exit
=
if_cmpu
->
proj_out
(
!
lp_continue
->
is_IfTrue
())
->
as_Proj
();
Node
*
limit
=
NULL
;
Node
*
limit
=
NULL
;
...
@@ -1805,6 +1817,7 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
...
@@ -1805,6 +1817,7 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
}
}
// Create a new region on the exit path
// Create a new region on the exit path
RegionNode
*
reg
=
insert_region_before_proj
(
lp_exit
);
RegionNode
*
reg
=
insert_region_before_proj
(
lp_exit
);
guarantee
(
reg
!=
NULL
,
"null region node"
);
// Clone the if-cmpu-true-false using a signed compare
// Clone the if-cmpu-true-false using a signed compare
BoolTest
::
mask
rel_i
=
stride
>
0
?
bol
->
_test
.
_test
:
BoolTest
::
ge
;
BoolTest
::
mask
rel_i
=
stride
>
0
?
bol
->
_test
.
_test
:
BoolTest
::
ge
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录