Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
336aaf16
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看板
提交
336aaf16
编写于
11月 08, 2012
作者:
N
neliasso
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
129193fe
e79bbbfe
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
201 addition
and
57 deletion
+201
-57
src/cpu/x86/vm/vm_version_x86.cpp
src/cpu/x86/vm/vm_version_x86.cpp
+2
-2
src/share/vm/interpreter/interpreterRuntime.cpp
src/share/vm/interpreter/interpreterRuntime.cpp
+2
-12
src/share/vm/oops/cpCache.cpp
src/share/vm/oops/cpCache.cpp
+9
-13
src/share/vm/oops/cpCache.hpp
src/share/vm/oops/cpCache.hpp
+5
-12
src/share/vm/opto/escape.cpp
src/share/vm/opto/escape.cpp
+85
-18
test/compiler/8002069/Test8002069.java
test/compiler/8002069/Test8002069.java
+98
-0
未找到文件。
src/cpu/x86/vm/vm_version_x86.cpp
浏览文件 @
336aaf16
...
...
@@ -488,8 +488,8 @@ void VM_Version::get_processor_features() {
}
// The AES intrinsic stubs require AES instruction support (of course)
// but also require AVX
mode for misaligned SSE access
if
(
UseAES
&&
(
UseAVX
>
0
))
{
// but also require AVX
and sse3 modes for instructions it use.
if
(
UseAES
&&
(
UseAVX
>
0
)
&&
(
UseSSE
>
2
)
)
{
if
(
FLAG_IS_DEFAULT
(
UseAESIntrinsics
))
{
UseAESIntrinsics
=
true
;
}
...
...
src/share/vm/interpreter/interpreterRuntime.cpp
浏览文件 @
336aaf16
...
...
@@ -733,12 +733,7 @@ IRT_ENTRY(void, InterpreterRuntime::resolve_invokehandle(JavaThread* thread)) {
get_index_u2_cpcache
(
thread
,
bytecode
),
bytecode
,
CHECK
);
}
// end JvmtiHideSingleStepping
cache_entry
(
thread
)
->
set_method_handle
(
pool
,
info
.
resolved_method
(),
info
.
resolved_appendix
(),
info
.
resolved_method_type
(),
pool
->
resolved_references
());
cache_entry
(
thread
)
->
set_method_handle
(
pool
,
info
);
}
IRT_END
...
...
@@ -762,12 +757,7 @@ IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) {
}
// end JvmtiHideSingleStepping
ConstantPoolCacheEntry
*
cp_cache_entry
=
pool
->
invokedynamic_cp_cache_entry_at
(
index
);
cp_cache_entry
->
set_dynamic_call
(
pool
,
info
.
resolved_method
(),
info
.
resolved_appendix
(),
info
.
resolved_method_type
(),
pool
->
resolved_references
());
cp_cache_entry
->
set_dynamic_call
(
pool
,
info
);
}
IRT_END
...
...
src/share/vm/oops/cpCache.cpp
浏览文件 @
336aaf16
...
...
@@ -243,25 +243,17 @@ void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index)
}
void
ConstantPoolCacheEntry
::
set_method_handle
(
constantPoolHandle
cpool
,
methodHandle
adapter
,
Handle
appendix
,
Handle
method_type
,
objArrayHandle
resolved_references
)
{
set_method_handle_common
(
cpool
,
Bytecodes
::
_invokehandle
,
adapter
,
appendix
,
method_type
,
resolved_references
);
void
ConstantPoolCacheEntry
::
set_method_handle
(
constantPoolHandle
cpool
,
const
CallInfo
&
call_info
)
{
set_method_handle_common
(
cpool
,
Bytecodes
::
_invokehandle
,
call_info
);
}
void
ConstantPoolCacheEntry
::
set_dynamic_call
(
constantPoolHandle
cpool
,
methodHandle
adapter
,
Handle
appendix
,
Handle
method_type
,
objArrayHandle
resolved_references
)
{
set_method_handle_common
(
cpool
,
Bytecodes
::
_invokedynamic
,
adapter
,
appendix
,
method_type
,
resolved_references
);
void
ConstantPoolCacheEntry
::
set_dynamic_call
(
constantPoolHandle
cpool
,
const
CallInfo
&
call_info
)
{
set_method_handle_common
(
cpool
,
Bytecodes
::
_invokedynamic
,
call_info
);
}
void
ConstantPoolCacheEntry
::
set_method_handle_common
(
constantPoolHandle
cpool
,
Bytecodes
::
Code
invoke_code
,
methodHandle
adapter
,
Handle
appendix
,
Handle
method_type
,
objArrayHandle
resolved_references
)
{
const
CallInfo
&
call_info
)
{
// NOTE: This CPCE can be the subject of data races.
// There are three words to update: flags, refs[f2], f1 (in that order).
// Writers must store all other values before f1.
...
...
@@ -276,6 +268,9 @@ void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
return
;
}
const
methodHandle
adapter
=
call_info
.
resolved_method
();
const
Handle
appendix
=
call_info
.
resolved_appendix
();
const
Handle
method_type
=
call_info
.
resolved_method_type
();
const
bool
has_appendix
=
appendix
.
not_null
();
const
bool
has_method_type
=
method_type
.
not_null
();
...
...
@@ -315,6 +310,7 @@ void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
// This allows us to create fewer method oops, while keeping type safety.
//
objArrayHandle
resolved_references
=
cpool
->
resolved_references
();
// Store appendix, if any.
if
(
has_appendix
)
{
const
int
appendix_index
=
f2_as_index
()
+
_indy_resolved_references_appendix_offset
;
...
...
src/share/vm/oops/cpCache.hpp
浏览文件 @
336aaf16
...
...
@@ -117,6 +117,8 @@ class PSPromotionManager;
// The fields are volatile so that they are stored in the order written in the
// source code. The _indices field with the bytecode must be written last.
class
CallInfo
;
class
ConstantPoolCacheEntry
VALUE_OBJ_CLASS_SPEC
{
friend
class
VMStructs
;
friend
class
constantPoolCacheKlass
;
...
...
@@ -223,18 +225,12 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
void
set_method_handle
(
constantPoolHandle
cpool
,
// holding constant pool (required for locking)
methodHandle
method
,
// adapter for invokeExact, etc.
Handle
appendix
,
// stored in refs[f2+0]; could be a java.lang.invoke.MethodType
Handle
method_type
,
// stored in refs[f2+1]; is a java.lang.invoke.MethodType
objArrayHandle
resolved_references
const
CallInfo
&
call_info
// Call link information
);
void
set_dynamic_call
(
constantPoolHandle
cpool
,
// holding constant pool (required for locking)
methodHandle
method
,
// adapter for this call site
Handle
appendix
,
// stored in refs[f2+0]; could be a java.lang.invoke.CallSite
Handle
method_type
,
// stored in refs[f2+1]; is a java.lang.invoke.MethodType
objArrayHandle
resolved_references
const
CallInfo
&
call_info
// Call link information
);
// Common code for invokedynamic and MH invocations.
...
...
@@ -255,10 +251,7 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
void
set_method_handle_common
(
constantPoolHandle
cpool
,
// holding constant pool (required for locking)
Bytecodes
::
Code
invoke_code
,
// _invokehandle or _invokedynamic
methodHandle
adapter
,
// invoker method (f1)
Handle
appendix
,
// appendix such as CallSite, MethodType, etc. (refs[f2+0])
Handle
method_type
,
// MethodType (refs[f2+1])
objArrayHandle
resolved_references
const
CallInfo
&
call_info
// Call link information
);
// invokedynamic and invokehandle call sites have two entries in the
...
...
src/share/vm/opto/escape.cpp
浏览文件 @
336aaf16
...
...
@@ -1386,12 +1386,12 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va
// Non-escaped allocation returned from Java or runtime call have
// unknown values in fields.
for
(
EdgeIterator
i
(
pta
);
i
.
has_next
();
i
.
next
())
{
PointsToNode
*
ptn
=
i
.
get
();
if
(
ptn
->
is_Field
()
&&
ptn
->
as_Field
()
->
is_oop
())
{
if
(
add_edge
(
ptn
,
phantom_obj
))
{
PointsToNode
*
field
=
i
.
get
();
if
(
field
->
is_Field
()
&&
field
->
as_Field
()
->
is_oop
())
{
if
(
add_edge
(
field
,
phantom_obj
))
{
// New edge was added
new_edges
++
;
add_field_uses_to_worklist
(
ptn
->
as_Field
());
add_field_uses_to_worklist
(
field
->
as_Field
());
}
}
}
...
...
@@ -1413,30 +1413,30 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va
// captured by Initialize node.
//
for
(
EdgeIterator
i
(
pta
);
i
.
has_next
();
i
.
next
())
{
PointsToNode
*
ptn
=
i
.
get
();
// Field (AddP)
if
(
!
ptn
->
is_Field
()
||
!
ptn
->
as_Field
()
->
is_oop
())
PointsToNode
*
field
=
i
.
get
();
// Field (AddP)
if
(
!
field
->
is_Field
()
||
!
field
->
as_Field
()
->
is_oop
())
continue
;
// Not oop field
int
offset
=
ptn
->
as_Field
()
->
offset
();
int
offset
=
field
->
as_Field
()
->
offset
();
if
(
offset
==
Type
::
OffsetBot
)
{
if
(
!
visited_bottom_offset
)
{
// OffsetBot is used to reference array's element,
// always add reference to NULL to all Field nodes since we don't
// known which element is referenced.
if
(
add_edge
(
ptn
,
null_obj
))
{
if
(
add_edge
(
field
,
null_obj
))
{
// New edge was added
new_edges
++
;
add_field_uses_to_worklist
(
ptn
->
as_Field
());
add_field_uses_to_worklist
(
field
->
as_Field
());
visited_bottom_offset
=
true
;
}
}
}
else
{
// Check only oop fields.
const
Type
*
adr_type
=
ptn
->
ideal_node
()
->
as_AddP
()
->
bottom_type
();
const
Type
*
adr_type
=
field
->
ideal_node
()
->
as_AddP
()
->
bottom_type
();
if
(
adr_type
->
isa_rawptr
())
{
#ifdef ASSERT
// Raw pointers are used for initializing stores so skip it
// since it should be recorded already
Node
*
base
=
get_addp_base
(
ptn
->
ideal_node
());
Node
*
base
=
get_addp_base
(
field
->
ideal_node
());
assert
(
adr_type
->
isa_rawptr
()
&&
base
->
is_Proj
()
&&
(
base
->
in
(
0
)
==
alloc
),
"unexpected pointer type"
);
#endif
...
...
@@ -1446,10 +1446,54 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va
offsets_worklist
.
append
(
offset
);
Node
*
value
=
NULL
;
if
(
ini
!=
NULL
)
{
BasicType
ft
=
UseCompressedOops
?
T_NARROWOOP
:
T_OBJECT
;
Node
*
store
=
ini
->
find_captured_store
(
offset
,
type2aelembytes
(
ft
),
phase
);
if
(
store
!=
NULL
&&
store
->
is_Store
())
{
// StoreP::memory_type() == T_ADDRESS
BasicType
ft
=
UseCompressedOops
?
T_NARROWOOP
:
T_ADDRESS
;
Node
*
store
=
ini
->
find_captured_store
(
offset
,
type2aelembytes
(
ft
,
true
),
phase
);
// Make sure initializing store has the same type as this AddP.
// This AddP may reference non existing field because it is on a
// dead branch of bimorphic call which is not eliminated yet.
if
(
store
!=
NULL
&&
store
->
is_Store
()
&&
store
->
as_Store
()
->
memory_type
()
==
ft
)
{
value
=
store
->
in
(
MemNode
::
ValueIn
);
#ifdef ASSERT
if
(
VerifyConnectionGraph
)
{
// Verify that AddP already points to all objects the value points to.
PointsToNode
*
val
=
ptnode_adr
(
value
->
_idx
);
assert
((
val
!=
NULL
),
"should be processed already"
);
PointsToNode
*
missed_obj
=
NULL
;
if
(
val
->
is_JavaObject
())
{
if
(
!
field
->
points_to
(
val
->
as_JavaObject
()))
{
missed_obj
=
val
;
}
}
else
{
if
(
!
val
->
is_LocalVar
()
||
(
val
->
edge_count
()
==
0
))
{
tty
->
print_cr
(
"----------init store has invalid value -----"
);
store
->
dump
();
val
->
dump
();
assert
(
val
->
is_LocalVar
()
&&
(
val
->
edge_count
()
>
0
),
"should be processed already"
);
}
for
(
EdgeIterator
j
(
val
);
j
.
has_next
();
j
.
next
())
{
PointsToNode
*
obj
=
j
.
get
();
if
(
obj
->
is_JavaObject
())
{
if
(
!
field
->
points_to
(
obj
->
as_JavaObject
()))
{
missed_obj
=
obj
;
break
;
}
}
}
}
if
(
missed_obj
!=
NULL
)
{
tty
->
print_cr
(
"----------field---------------------------------"
);
field
->
dump
();
tty
->
print_cr
(
"----------missed referernce to object-----------"
);
missed_obj
->
dump
();
tty
->
print_cr
(
"----------object referernced by init store -----"
);
store
->
dump
();
val
->
dump
();
assert
(
!
field
->
points_to
(
missed_obj
->
as_JavaObject
()),
"missed JavaObject reference"
);
}
}
#endif
}
else
{
// There could be initializing stores which follow allocation.
// For example, a volatile field store is not collected
...
...
@@ -1462,10 +1506,10 @@ int ConnectionGraph::find_init_values(JavaObjectNode* pta, PointsToNode* init_va
}
if
(
value
==
NULL
)
{
// A field's initializing value was not recorded. Add NULL.
if
(
add_edge
(
ptn
,
null_obj
))
{
if
(
add_edge
(
field
,
null_obj
))
{
// New edge was added
new_edges
++
;
add_field_uses_to_worklist
(
ptn
->
as_Field
());
add_field_uses_to_worklist
(
field
->
as_Field
());
}
}
}
...
...
@@ -1607,7 +1651,26 @@ void ConnectionGraph::verify_connection_graph(
}
// Verify that all fields have initializing values.
if
(
field
->
edge_count
()
==
0
)
{
tty
->
print_cr
(
"----------field does not have references----------"
);
field
->
dump
();
for
(
BaseIterator
i
(
field
);
i
.
has_next
();
i
.
next
())
{
PointsToNode
*
base
=
i
.
get
();
tty
->
print_cr
(
"----------field has next base---------------------"
);
base
->
dump
();
if
(
base
->
is_JavaObject
()
&&
(
base
!=
phantom_obj
)
&&
(
base
!=
null_obj
))
{
tty
->
print_cr
(
"----------base has fields-------------------------"
);
for
(
EdgeIterator
j
(
base
);
j
.
has_next
();
j
.
next
())
{
j
.
get
()
->
dump
();
}
tty
->
print_cr
(
"----------base has references---------------------"
);
for
(
UseIterator
j
(
base
);
j
.
has_next
();
j
.
next
())
{
j
.
get
()
->
dump
();
}
}
}
for
(
UseIterator
i
(
field
);
i
.
has_next
();
i
.
next
())
{
i
.
get
()
->
dump
();
}
assert
(
field
->
edge_count
()
>
0
,
"sanity"
);
}
}
...
...
@@ -1967,7 +2030,7 @@ bool PointsToNode::points_to(JavaObjectNode* ptn) const {
if
(
is_JavaObject
())
{
return
(
this
==
ptn
);
}
assert
(
is_LocalVar
(),
"sanity"
);
assert
(
is_LocalVar
()
||
is_Field
()
,
"sanity"
);
for
(
EdgeIterator
i
(
this
);
i
.
has_next
();
i
.
next
())
{
if
(
i
.
get
()
==
ptn
)
return
true
;
...
...
@@ -3127,10 +3190,14 @@ void PointsToNode::dump(bool print_state) const {
EscapeState
fields_es
=
fields_escape_state
();
tty
->
print
(
"%s(%s) "
,
esc_names
[(
int
)
es
],
esc_names
[(
int
)
fields_es
]);
if
(
nt
==
PointsToNode
::
JavaObject
&&
!
this
->
scalar_replaceable
())
tty
->
print
(
"NSR"
);
tty
->
print
(
"NSR
"
);
}
if
(
is_Field
())
{
FieldNode
*
f
=
(
FieldNode
*
)
this
;
if
(
f
->
is_oop
())
tty
->
print
(
"oop "
);
if
(
f
->
offset
()
>
0
)
tty
->
print
(
"+%d "
,
f
->
offset
());
tty
->
print
(
"("
);
for
(
BaseIterator
i
(
f
);
i
.
has_next
();
i
.
next
())
{
PointsToNode
*
b
=
i
.
get
();
...
...
test/compiler/8002069/Test8002069.java
0 → 100644
浏览文件 @
336aaf16
/*
* Copyright (c) 2012, 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 8002069
* @summary Assert failed in C2: assert(field->edge_count() > 0) failed: sanity
*
* @run main/othervm -Xmx32m -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:CompileCommand=exclude,Test8002069.dummy Test8002069
*/
abstract
class
O
{
int
f
;
public
O
()
{
f
=
5
;
}
abstract
void
put
(
int
i
);
public
int
foo
(
int
i
)
{
put
(
i
);
return
i
;
}
};
class
A
extends
O
{
int
[]
a
;
public
A
(
int
s
)
{
a
=
new
int
[
s
];
}
public
void
put
(
int
i
)
{
a
[
i
%
a
.
length
]
=
i
;
}
}
class
B
extends
O
{
int
sz
;
int
[]
a
;
public
B
(
int
s
)
{
sz
=
s
;
a
=
new
int
[
s
];
}
public
void
put
(
int
i
)
{
a
[
i
%
sz
]
=
i
;
}
}
public
class
Test8002069
{
public
static
void
main
(
String
args
[])
{
int
sum
=
0
;
for
(
int
i
=
0
;
i
<
8000
;
i
++)
{
sum
+=
test1
(
i
);
}
for
(
int
i
=
0
;
i
<
100000
;
i
++)
{
sum
+=
test2
(
i
);
}
System
.
out
.
println
(
"PASSED. sum = "
+
sum
);
}
private
O
o
;
private
int
foo
(
int
i
)
{
return
o
.
foo
(
i
);
}
static
int
test1
(
int
i
)
{
Test8002069
t
=
new
Test8002069
();
t
.
o
=
new
A
(
5
);
return
t
.
foo
(
i
);
}
static
int
test2
(
int
i
)
{
Test8002069
t
=
new
Test8002069
();
t
.
o
=
new
B
(
5
);
dummy
(
i
);
return
t
.
foo
(
i
);
}
static
int
dummy
(
int
i
)
{
return
i
*
2
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录