Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
7b36652c
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看板
提交
7b36652c
编写于
8月 31, 2017
作者:
S
shshahma
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8148786: xml.tranform fails on x86-64
Summary: CCP computes wrong type for CountedLoop iv Phi Reviewed-by: kvn
上级
909c2ad8
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
57 addition
and
19 deletion
+57
-19
src/share/vm/opto/loopnode.hpp
src/share/vm/opto/loopnode.hpp
+14
-4
src/share/vm/opto/phaseX.cpp
src/share/vm/opto/phaseX.cpp
+41
-13
src/share/vm/opto/phaseX.hpp
src/share/vm/opto/phaseX.hpp
+2
-2
未找到文件。
src/share/vm/opto/loopnode.hpp
浏览文件 @
7b36652c
/*
* Copyright (c) 1998, 201
5
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 201
7
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -257,19 +257,29 @@ public:
Node
*
incr
()
const
{
Node
*
tmp
=
cmp_node
();
return
(
tmp
&&
tmp
->
req
()
==
3
)
?
tmp
->
in
(
1
)
:
NULL
;
}
Node
*
limit
()
const
{
Node
*
tmp
=
cmp_node
();
return
(
tmp
&&
tmp
->
req
()
==
3
)
?
tmp
->
in
(
2
)
:
NULL
;
}
Node
*
stride
()
const
{
Node
*
tmp
=
incr
();
return
(
tmp
&&
tmp
->
req
()
==
3
)
?
tmp
->
in
(
2
)
:
NULL
;
}
Node
*
phi
()
const
{
Node
*
tmp
=
incr
();
return
(
tmp
&&
tmp
->
req
()
==
3
)
?
tmp
->
in
(
1
)
:
NULL
;
}
Node
*
init_trip
()
const
{
Node
*
tmp
=
phi
();
return
(
tmp
&&
tmp
->
req
()
==
3
)
?
tmp
->
in
(
1
)
:
NULL
;
}
int
stride_con
()
const
;
bool
stride_is_con
()
const
{
Node
*
tmp
=
stride
();
return
(
tmp
!=
NULL
&&
tmp
->
is_Con
());
}
BoolTest
::
mask
test_trip
()
const
{
return
in
(
TestValue
)
->
as_Bool
()
->
_test
.
_test
;
}
PhiNode
*
phi
()
const
{
Node
*
tmp
=
incr
();
if
(
tmp
&&
tmp
->
req
()
==
3
)
{
Node
*
phi
=
tmp
->
in
(
1
);
if
(
phi
->
is_Phi
())
{
return
phi
->
as_Phi
();
}
}
return
NULL
;
}
CountedLoopNode
*
loopnode
()
const
{
// The CountedLoopNode that goes with this CountedLoopEndNode may
// have been optimized out by the IGVN so be cautious with the
// pattern matching on the graph
if
(
phi
()
==
NULL
)
{
PhiNode
*
iv_phi
=
phi
();
if
(
iv_phi
==
NULL
)
{
return
NULL
;
}
Node
*
ln
=
phi
()
->
in
(
0
);
Node
*
ln
=
iv_phi
->
in
(
0
);
if
(
ln
->
is_CountedLoop
()
&&
ln
->
as_CountedLoop
()
->
loopexit
()
==
this
)
{
return
(
CountedLoopNode
*
)
ln
;
}
...
...
src/share/vm/opto/phaseX.cpp
浏览文件 @
7b36652c
/*
* Copyright (c) 1997, 201
4
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
7
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -1416,6 +1416,27 @@ void PhaseIterGVN::add_users_to_worklist0( Node *n ) {
}
}
// Return counted loop Phi if as a counted loop exit condition, cmp
// compares the the induction variable with n
static
PhiNode
*
countedloop_phi_from_cmp
(
CmpINode
*
cmp
,
Node
*
n
)
{
for
(
DUIterator_Fast
imax
,
i
=
cmp
->
fast_outs
(
imax
);
i
<
imax
;
i
++
)
{
Node
*
bol
=
cmp
->
fast_out
(
i
);
for
(
DUIterator_Fast
i2max
,
i2
=
bol
->
fast_outs
(
i2max
);
i2
<
i2max
;
i2
++
)
{
Node
*
iff
=
bol
->
fast_out
(
i2
);
if
(
iff
->
is_CountedLoopEnd
())
{
CountedLoopEndNode
*
cle
=
iff
->
as_CountedLoopEnd
();
if
(
cle
->
limit
()
==
n
)
{
PhiNode
*
phi
=
cle
->
phi
();
if
(
phi
!=
NULL
)
{
return
phi
;
}
}
}
}
}
return
NULL
;
}
void
PhaseIterGVN
::
add_users_to_worklist
(
Node
*
n
)
{
add_users_to_worklist0
(
n
);
...
...
@@ -1445,18 +1466,7 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) {
Node
*
bol
=
use
->
raw_out
(
0
);
if
(
bol
->
outcnt
()
>
0
)
{
Node
*
iff
=
bol
->
raw_out
(
0
);
if
(
use_op
==
Op_CmpI
&&
iff
->
is_CountedLoopEnd
())
{
CountedLoopEndNode
*
cle
=
iff
->
as_CountedLoopEnd
();
if
(
cle
->
limit
()
==
n
&&
cle
->
phi
()
!=
NULL
)
{
// If an opaque node feeds into the limit condition of a
// CountedLoop, we need to process the Phi node for the
// induction variable when the opaque node is removed:
// the range of values taken by the Phi is now known and
// so its type is also known.
_worklist
.
push
(
cle
->
phi
());
}
}
else
if
(
iff
->
outcnt
()
==
2
)
{
if
(
iff
->
outcnt
()
==
2
)
{
// Look for the 'is_x2logic' pattern: "x ? : 0 : 1" and put the
// phi merging either 0 or 1 onto the worklist
Node
*
ifproj0
=
iff
->
raw_out
(
0
);
...
...
@@ -1471,6 +1481,15 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) {
}
}
if
(
use_op
==
Op_CmpI
)
{
Node
*
phi
=
countedloop_phi_from_cmp
((
CmpINode
*
)
use
,
n
);
if
(
phi
!=
NULL
)
{
// If an opaque node feeds into the limit condition of a
// CountedLoop, we need to process the Phi node for the
// induction variable when the opaque node is removed:
// the range of values taken by the Phi is now known and
// so its type is also known.
_worklist
.
push
(
phi
);
}
Node
*
in1
=
use
->
in
(
1
);
for
(
uint
i
=
0
;
i
<
in1
->
outcnt
();
i
++
)
{
if
(
in1
->
raw_out
(
i
)
->
Opcode
()
==
Op_CastII
)
{
...
...
@@ -1659,6 +1678,15 @@ void PhaseCCP::analyze() {
}
}
}
// If n is used in a counted loop exit condition then the type
// of the counted loop's Phi depends on the type of n. See
// PhiNode::Value().
if
(
m_op
==
Op_CmpI
)
{
PhiNode
*
phi
=
countedloop_phi_from_cmp
((
CmpINode
*
)
m
,
n
);
if
(
phi
!=
NULL
)
{
worklist
.
push
(
phi
);
}
}
}
}
}
...
...
src/share/vm/opto/phaseX.hpp
浏览文件 @
7b36652c
/*
* Copyright (c) 1997, 201
3
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
7
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -417,7 +417,7 @@ public:
// Phase for iteratively performing local, pessimistic GVN-style optimizations.
// and ideal transformations on the graph.
class
PhaseIterGVN
:
public
PhaseGVN
{
private:
private:
bool
_delay_transform
;
// When true simply register the node when calling transform
// instead of actually optimizing it
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录