Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
5d526cd3
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看板
提交
5d526cd3
编写于
3月 19, 2013
作者:
M
morris
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8008811: [parfait] Null pointer deference in hotspot/src/share/vm/opto/loopopts.cpp
Summary: add guarantee() checks Reviewed-by: kvn
上级
5eeb77af
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
21 addition
and
4 deletion
+21
-4
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/opto/loopnode.hpp
浏览文件 @
5d526cd3
...
@@ -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
浏览文件 @
5d526cd3
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录