Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
4e692b86
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看板
提交
4e692b86
编写于
10月 11, 2013
作者:
R
rbackman
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8025657: compiler/intrinsics/mathexact/ConstantTest.java fails on assert in lcm.cpp on solaris x64
Reviewed-by: kvn, twisti
上级
567856a1
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
176 addition
and
7 deletion
+176
-7
src/share/vm/opto/compile.cpp
src/share/vm/opto/compile.cpp
+27
-0
src/share/vm/opto/mathexactnode.cpp
src/share/vm/opto/mathexactnode.cpp
+33
-5
src/share/vm/opto/mathexactnode.hpp
src/share/vm/opto/mathexactnode.hpp
+9
-2
test/compiler/intrinsics/mathexact/RepeatTest.java
test/compiler/intrinsics/mathexact/RepeatTest.java
+107
-0
未找到文件。
src/share/vm/opto/compile.cpp
浏览文件 @
4e692b86
...
...
@@ -47,6 +47,7 @@
#include "opto/machnode.hpp"
#include "opto/macro.hpp"
#include "opto/matcher.hpp"
#include "opto/mathexactnode.hpp"
#include "opto/memnode.hpp"
#include "opto/mulnode.hpp"
#include "opto/node.hpp"
...
...
@@ -2986,6 +2987,32 @@ void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
n
->
set_req
(
MemBarNode
::
Precedent
,
top
());
}
break
;
// Must set a control edge on all nodes that produce a FlagsProj
// so they can't escape the block that consumes the flags.
// Must also set the non throwing branch as the control
// for all nodes that depends on the result. Unless the node
// already have a control that isn't the control of the
// flag producer
case
Op_FlagsProj
:
{
MathExactNode
*
math
=
(
MathExactNode
*
)
n
->
in
(
0
);
Node
*
ctrl
=
math
->
control_node
();
Node
*
non_throwing
=
math
->
non_throwing_branch
();
math
->
set_req
(
0
,
ctrl
);
Node
*
result
=
math
->
result_node
();
if
(
result
!=
NULL
)
{
for
(
DUIterator_Fast
jmax
,
j
=
result
->
fast_outs
(
jmax
);
j
<
jmax
;
j
++
)
{
Node
*
out
=
result
->
fast_out
(
j
);
if
(
out
->
in
(
0
)
==
NULL
)
{
out
->
set_req
(
0
,
non_throwing
);
}
else
if
(
out
->
in
(
0
)
==
ctrl
)
{
out
->
set_req
(
0
,
non_throwing
);
}
}
}
}
break
;
default:
assert
(
!
n
->
is_Call
(),
""
);
assert
(
!
n
->
is_Mem
(),
""
);
...
...
src/share/vm/opto/mathexactnode.cpp
浏览文件 @
4e692b86
...
...
@@ -25,9 +25,10 @@
#include "precompiled.hpp"
#include "memory/allocation.inline.hpp"
#include "opto/addnode.hpp"
#include "opto/cfgnode.hpp"
#include "opto/machnode.hpp"
#include "opto/mathexactnode.hpp"
#include "opto/matcher.hpp"
#include "opto/mathexactnode.hpp"
#include "opto/subnode.hpp"
MathExactNode
::
MathExactNode
(
Node
*
ctrl
,
Node
*
n1
,
Node
*
n2
)
:
MultiNode
(
3
)
{
...
...
@@ -36,6 +37,33 @@ MathExactNode::MathExactNode(Node* ctrl, Node* n1, Node* n2) : MultiNode(3) {
init_req
(
2
,
n2
);
}
BoolNode
*
MathExactNode
::
bool_node
()
const
{
Node
*
flags
=
flags_node
();
BoolNode
*
boolnode
=
flags
->
unique_out
()
->
as_Bool
();
assert
(
boolnode
!=
NULL
,
"must have BoolNode"
);
return
boolnode
;
}
IfNode
*
MathExactNode
::
if_node
()
const
{
BoolNode
*
boolnode
=
bool_node
();
IfNode
*
ifnode
=
boolnode
->
unique_out
()
->
as_If
();
assert
(
ifnode
!=
NULL
,
"must have IfNode"
);
return
ifnode
;
}
Node
*
MathExactNode
::
control_node
()
const
{
IfNode
*
ifnode
=
if_node
();
return
ifnode
->
in
(
0
);
}
Node
*
MathExactNode
::
non_throwing_branch
()
const
{
IfNode
*
ifnode
=
if_node
();
if
(
bool_node
()
->
_test
.
_test
==
BoolTest
::
overflow
)
{
return
ifnode
->
proj_out
(
0
);
}
return
ifnode
->
proj_out
(
1
);
}
Node
*
AddExactINode
::
match
(
const
ProjNode
*
proj
,
const
Matcher
*
m
)
{
uint
ideal_reg
=
proj
->
ideal_reg
();
RegMask
rm
;
...
...
@@ -62,15 +90,15 @@ Node* MathExactNode::no_overflow(PhaseGVN *phase, Node* new_result) {
}
if
(
flags
!=
NULL
)
{
BoolNode
*
bo
lnode
=
(
BoolNode
*
)
flags
->
unique_out
();
switch
(
bolnode
->
_test
.
_test
)
{
BoolNode
*
bo
olnode
=
bool_node
();
switch
(
bo
o
lnode
->
_test
.
_test
)
{
case
BoolTest
::
overflow
:
// if the check is for overflow - never taken
igvn
->
replace_node
(
bolnode
,
phase
->
intcon
(
0
));
igvn
->
replace_node
(
bo
o
lnode
,
phase
->
intcon
(
0
));
break
;
case
BoolTest
::
no_overflow
:
// if the check is for no overflow - always taken
igvn
->
replace_node
(
bolnode
,
phase
->
intcon
(
1
));
igvn
->
replace_node
(
bo
o
lnode
,
phase
->
intcon
(
1
));
break
;
default:
fatal
(
"Unexpected value of BoolTest"
);
...
...
src/share/vm/opto/mathexactnode.hpp
浏览文件 @
4e692b86
...
...
@@ -27,8 +27,11 @@
#include "opto/multnode.hpp"
#include "opto/node.hpp"
#include "opto/subnode.hpp"
#include "opto/type.hpp"
class
BoolNode
;
class
IfNode
;
class
Node
;
class
PhaseGVN
;
...
...
@@ -49,9 +52,13 @@ public:
virtual
bool
is_CFG
()
const
{
return
false
;
}
virtual
uint
ideal_reg
()
const
{
return
NotAMachineReg
;
}
ProjNode
*
result_node
()
{
return
proj_out
(
result_proj_node
);
}
ProjNode
*
flags_node
()
{
return
proj_out
(
flags_proj_node
);
}
ProjNode
*
result_node
()
const
{
return
proj_out
(
result_proj_node
);
}
ProjNode
*
flags_node
()
const
{
return
proj_out
(
flags_proj_node
);
}
Node
*
control_node
()
const
;
Node
*
non_throwing_branch
()
const
;
protected:
IfNode
*
if_node
()
const
;
BoolNode
*
bool_node
()
const
;
Node
*
no_overflow
(
PhaseGVN
*
phase
,
Node
*
new_result
);
};
...
...
test/compiler/intrinsics/mathexact/RepeatTest.java
0 → 100644
浏览文件 @
4e692b86
/*
* Copyright (c) 2013, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8025657
* @summary Test repeating addExact
* @compile RepeatTest.java
* @run main RepeatTest
*
*/
import
java.lang.ArithmeticException
;
public
class
RepeatTest
{
public
static
void
main
(
String
[]
args
)
{
java
.
util
.
Random
rnd
=
new
java
.
util
.
Random
();
for
(
int
i
=
0
;
i
<
50000
;
++
i
)
{
int
x
=
Integer
.
MAX_VALUE
-
10
;
int
y
=
Integer
.
MAX_VALUE
-
10
+
rnd
.
nextInt
(
5
);
//rnd.nextInt() / 2;
int
c
=
rnd
.
nextInt
()
/
2
;
int
d
=
rnd
.
nextInt
()
/
2
;
int
a
=
addExact
(
x
,
y
);
if
(
a
!=
36
)
{
throw
new
RuntimeException
(
"a != 0 : "
+
a
);
}
int
b
=
nonExact
(
c
,
d
);
int
n
=
addExact2
(
c
,
d
);
if
(
n
!=
b
)
{
throw
new
RuntimeException
(
"n != b : "
+
n
+
" != "
+
b
);
}
}
}
public
static
int
addExact2
(
int
x
,
int
y
)
{
int
result
=
0
;
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
return
result
;
}
public
static
int
addExact
(
int
x
,
int
y
)
{
int
result
=
0
;
try
{
result
+=
5
;
result
=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
}
catch
(
ArithmeticException
e
)
{
result
+=
1
;
}
try
{
result
+=
6
;
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
}
catch
(
ArithmeticException
e
)
{
result
+=
2
;
}
try
{
result
+=
7
;
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
}
catch
(
ArithmeticException
e
)
{
result
+=
3
;
}
try
{
result
+=
8
;
result
+=
java
.
lang
.
Math
.
addExact
(
x
,
y
);
}
catch
(
ArithmeticException
e
)
{
result
+=
4
;
}
return
result
;
}
public
static
int
nonExact
(
int
x
,
int
y
)
{
int
result
=
x
+
y
;
result
+=
x
+
y
;
result
+=
x
+
y
;
result
+=
x
+
y
;
return
result
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录