Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
f317413f
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看板
提交
f317413f
编写于
3月 16, 2012
作者:
J
jcoomes
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
86b977d9
33c403cd
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
3203 addition
and
3003 deletion
+3203
-3003
src/share/vm/opto/bytecodeInfo.cpp
src/share/vm/opto/bytecodeInfo.cpp
+12
-12
src/share/vm/opto/c2_globals.hpp
src/share/vm/opto/c2_globals.hpp
+4
-1
src/share/vm/opto/callnode.cpp
src/share/vm/opto/callnode.cpp
+3
-9
src/share/vm/opto/callnode.hpp
src/share/vm/opto/callnode.hpp
+7
-1
src/share/vm/opto/compile.cpp
src/share/vm/opto/compile.cpp
+3
-3
src/share/vm/opto/escape.cpp
src/share/vm/opto/escape.cpp
+2773
-2796
src/share/vm/opto/escape.hpp
src/share/vm/opto/escape.hpp
+369
-163
src/share/vm/opto/phase.cpp
src/share/vm/opto/phase.cpp
+9
-4
src/share/vm/opto/phase.hpp
src/share/vm/opto/phase.hpp
+7
-2
src/share/vm/runtime/arguments.cpp
src/share/vm/runtime/arguments.cpp
+0
-9
src/share/vm/utilities/growableArray.hpp
src/share/vm/utilities/growableArray.hpp
+16
-3
未找到文件。
src/share/vm/opto/bytecodeInfo.cpp
浏览文件 @
f317413f
...
@@ -257,6 +257,18 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
...
@@ -257,6 +257,18 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
return
"exception method"
;
return
"exception method"
;
}
}
if
(
callee_method
->
should_not_inline
())
{
return
"disallowed by CompilerOracle"
;
}
if
(
UseStringCache
)
{
// Do not inline StringCache::profile() method used only at the beginning.
if
(
callee_method
->
name
()
==
ciSymbol
::
profile_name
()
&&
callee_method
->
holder
()
->
name
()
==
ciSymbol
::
java_lang_StringCache
())
{
return
"profiling method"
;
}
}
// use frequency-based objections only for non-trivial methods
// use frequency-based objections only for non-trivial methods
if
(
callee_method
->
code_size_for_inlining
()
<=
MaxTrivialSize
)
return
NULL
;
if
(
callee_method
->
code_size_for_inlining
()
<=
MaxTrivialSize
)
return
NULL
;
...
@@ -278,18 +290,6 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
...
@@ -278,18 +290,6 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
}
}
}
}
if
(
callee_method
->
should_not_inline
())
{
return
"disallowed by CompilerOracle"
;
}
if
(
UseStringCache
)
{
// Do not inline StringCache::profile() method used only at the beginning.
if
(
callee_method
->
name
()
==
ciSymbol
::
profile_name
()
&&
callee_method
->
holder
()
->
name
()
==
ciSymbol
::
java_lang_StringCache
())
{
return
"profiling method"
;
}
}
return
NULL
;
return
NULL
;
}
}
...
...
src/share/vm/opto/c2_globals.hpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 2000, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -465,6 +465,9 @@
...
@@ -465,6 +465,9 @@
notproduct(bool, PrintOptimizePtrCompare, false, \
notproduct(bool, PrintOptimizePtrCompare, false, \
"Print information about optimized pointers compare") \
"Print information about optimized pointers compare") \
\
\
notproduct(bool, VerifyConnectionGraph , true, \
"Verify Connection Graph construction in Escape Analysis") \
\
product(bool, UseOptoBiasInlining, true, \
product(bool, UseOptoBiasInlining, true, \
"Generate biased locking code in C2 ideal graph") \
"Generate biased locking code in C2 ideal graph") \
\
\
...
...
src/share/vm/opto/callnode.cpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 1997, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -1538,10 +1538,7 @@ Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
...
@@ -1538,10 +1538,7 @@ Node *LockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// If we are locking an unescaped object, the lock/unlock is unnecessary
// If we are locking an unescaped object, the lock/unlock is unnecessary
//
//
ConnectionGraph
*
cgr
=
phase
->
C
->
congraph
();
ConnectionGraph
*
cgr
=
phase
->
C
->
congraph
();
PointsToNode
::
EscapeState
es
=
PointsToNode
::
GlobalEscape
;
if
(
cgr
!=
NULL
&&
cgr
->
not_global_escape
(
obj_node
()))
{
if
(
cgr
!=
NULL
)
es
=
cgr
->
escape_state
(
obj_node
());
if
(
es
!=
PointsToNode
::
UnknownEscape
&&
es
!=
PointsToNode
::
GlobalEscape
)
{
assert
(
!
is_eliminated
()
||
is_coarsened
(),
"sanity"
);
assert
(
!
is_eliminated
()
||
is_coarsened
(),
"sanity"
);
// The lock could be marked eliminated by lock coarsening
// The lock could be marked eliminated by lock coarsening
// code during first IGVN before EA. Replace coarsened flag
// code during first IGVN before EA. Replace coarsened flag
...
@@ -1680,10 +1677,7 @@ Node *UnlockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
...
@@ -1680,10 +1677,7 @@ Node *UnlockNode::Ideal(PhaseGVN *phase, bool can_reshape) {
// If we are unlocking an unescaped object, the lock/unlock is unnecessary.
// If we are unlocking an unescaped object, the lock/unlock is unnecessary.
//
//
ConnectionGraph
*
cgr
=
phase
->
C
->
congraph
();
ConnectionGraph
*
cgr
=
phase
->
C
->
congraph
();
PointsToNode
::
EscapeState
es
=
PointsToNode
::
GlobalEscape
;
if
(
cgr
!=
NULL
&&
cgr
->
not_global_escape
(
obj_node
()))
{
if
(
cgr
!=
NULL
)
es
=
cgr
->
escape_state
(
obj_node
());
if
(
es
!=
PointsToNode
::
UnknownEscape
&&
es
!=
PointsToNode
::
GlobalEscape
)
{
assert
(
!
is_eliminated
()
||
is_coarsened
(),
"sanity"
);
assert
(
!
is_eliminated
()
||
is_coarsened
(),
"sanity"
);
// The lock could be marked eliminated by lock coarsening
// The lock could be marked eliminated by lock coarsening
// code during first IGVN before EA. Replace coarsened flag
// code during first IGVN before EA. Replace coarsened flag
...
...
src/share/vm/opto/callnode.hpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -546,6 +546,12 @@ public:
...
@@ -546,6 +546,12 @@ public:
// or result projection is there are several CheckCastPP
// or result projection is there are several CheckCastPP
// or returns NULL if there is no one.
// or returns NULL if there is no one.
Node
*
result_cast
();
Node
*
result_cast
();
// Does this node returns pointer?
bool
returns_pointer
()
const
{
const
TypeTuple
*
r
=
tf
()
->
range
();
return
(
r
->
cnt
()
>
TypeFunc
::
Parms
&&
r
->
field_at
(
TypeFunc
::
Parms
)
->
isa_ptr
());
}
// Collect all the interesting edges from a call for use in
// Collect all the interesting edges from a call for use in
// replacing the call by something else. Used by macro expansion
// replacing the call by something else. Used by macro expansion
...
...
src/share/vm/opto/compile.cpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -1707,7 +1707,6 @@ void Compile::Optimize() {
...
@@ -1707,7 +1707,6 @@ void Compile::Optimize() {
if
(
major_progress
())
print_method
(
"PhaseIdealLoop before EA"
,
2
);
if
(
major_progress
())
print_method
(
"PhaseIdealLoop before EA"
,
2
);
if
(
failing
())
return
;
if
(
failing
())
return
;
}
}
TracePhase
t2
(
"escapeAnalysis"
,
&
_t_escapeAnalysis
,
true
);
ConnectionGraph
::
do_analysis
(
this
,
&
igvn
);
ConnectionGraph
::
do_analysis
(
this
,
&
igvn
);
if
(
failing
())
return
;
if
(
failing
())
return
;
...
@@ -1719,6 +1718,7 @@ void Compile::Optimize() {
...
@@ -1719,6 +1718,7 @@ void Compile::Optimize() {
if
(
failing
())
return
;
if
(
failing
())
return
;
if
(
congraph
()
!=
NULL
&&
macro_count
()
>
0
)
{
if
(
congraph
()
!=
NULL
&&
macro_count
()
>
0
)
{
NOT_PRODUCT
(
TracePhase
t2
(
"macroEliminate"
,
&
_t_macroEliminate
,
TimeCompiler
);
)
PhaseMacroExpand
mexp
(
igvn
);
PhaseMacroExpand
mexp
(
igvn
);
mexp
.
eliminate_macro_nodes
();
mexp
.
eliminate_macro_nodes
();
igvn
.
set_delay_transform
(
false
);
igvn
.
set_delay_transform
(
false
);
...
@@ -1875,10 +1875,10 @@ void Compile::Code_Gen() {
...
@@ -1875,10 +1875,10 @@ void Compile::Code_Gen() {
cfg
.
Estimate_Block_Frequency
();
cfg
.
Estimate_Block_Frequency
();
cfg
.
GlobalCodeMotion
(
m
,
unique
(),
proj_list
);
cfg
.
GlobalCodeMotion
(
m
,
unique
(),
proj_list
);
if
(
failing
())
return
;
print_method
(
"Global code motion"
,
2
);
print_method
(
"Global code motion"
,
2
);
if
(
failing
())
return
;
NOT_PRODUCT
(
verify_graph_edges
();
)
NOT_PRODUCT
(
verify_graph_edges
();
)
debug_only
(
cfg
.
verify
();
)
debug_only
(
cfg
.
verify
();
)
...
...
src/share/vm/opto/escape.cpp
浏览文件 @
f317413f
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
src/share/vm/opto/escape.hpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 2005, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -115,18 +115,36 @@ class Node;
...
@@ -115,18 +115,36 @@ class Node;
class
CallNode
;
class
CallNode
;
class
PhiNode
;
class
PhiNode
;
class
PhaseTransform
;
class
PhaseTransform
;
class
PointsToNode
;
class
Type
;
class
Type
;
class
TypePtr
;
class
TypePtr
;
class
VectorSet
;
class
VectorSet
;
class
PointsToNode
{
class
JavaObjectNode
;
friend
class
ConnectionGraph
;
class
LocalVarNode
;
class
FieldNode
;
class
ArraycopyNode
;
// ConnectionGraph nodes
class
PointsToNode
:
public
ResourceObj
{
GrowableArray
<
PointsToNode
*>
_edges
;
// List of nodes this node points to
GrowableArray
<
PointsToNode
*>
_uses
;
// List of nodes which point to this node
const
u1
_type
;
// NodeType
u1
_flags
;
// NodeFlags
u1
_escape
;
// EscapeState of object
u1
_fields_escape
;
// EscapeState of object's fields
Node
*
const
_node
;
// Ideal node corresponding to this PointsTo node.
const
int
_idx
;
// Cached ideal node's _idx
public:
public:
typedef
enum
{
typedef
enum
{
UnknownType
=
0
,
UnknownType
=
0
,
JavaObject
=
1
,
JavaObject
=
1
,
LocalVar
=
2
,
LocalVar
=
2
,
Field
=
3
Field
=
3
,
Arraycopy
=
4
}
NodeType
;
}
NodeType
;
typedef
enum
{
typedef
enum
{
...
@@ -140,178 +158,387 @@ public:
...
@@ -140,178 +158,387 @@ public:
}
EscapeState
;
}
EscapeState
;
typedef
enum
{
typedef
enum
{
UnknownEdge
=
0
,
ScalarReplaceable
=
1
,
// Not escaped object could be replaced with scalar
PointsToEdge
=
1
,
PointsToUnknown
=
2
,
// Has edge to phantom_object
DeferredEdge
=
2
,
ArraycopySrc
=
4
,
// Has edge from Arraycopy node
FieldEdge
=
3
ArraycopyDst
=
8
// Has edge to Arraycopy node
}
EdgeType
;
}
NodeFlags
;
PointsToNode
(
Compile
*
C
,
Node
*
n
,
EscapeState
es
,
NodeType
type
)
:
_edges
(
C
->
comp_arena
(),
2
,
0
,
NULL
),
_uses
(
C
->
comp_arena
(),
2
,
0
,
NULL
),
_node
(
n
),
_idx
(
n
->
_idx
),
_type
((
u1
)
type
),
_escape
((
u1
)
es
),
_fields_escape
((
u1
)
es
),
_flags
(
ScalarReplaceable
)
{
assert
(
n
!=
NULL
&&
es
!=
UnknownEscape
,
"sanity"
);
}
private:
Node
*
ideal_node
()
const
{
return
_node
;
}
enum
{
int
idx
()
const
{
return
_idx
;
}
EdgeMask
=
3
,
EdgeShift
=
2
,
INITIAL_EDGE_COUNT
=
4
bool
is_JavaObject
()
const
{
return
_type
==
(
u1
)
JavaObject
;
}
};
bool
is_LocalVar
()
const
{
return
_type
==
(
u1
)
LocalVar
;
}
bool
is_Field
()
const
{
return
_type
==
(
u1
)
Field
;
}
bool
is_Arraycopy
()
const
{
return
_type
==
(
u1
)
Arraycopy
;
}
NodeType
_type
;
JavaObjectNode
*
as_JavaObject
()
{
assert
(
is_JavaObject
(),
""
);
return
(
JavaObjectNode
*
)
this
;
}
EscapeState
_escape
;
LocalVarNode
*
as_LocalVar
()
{
assert
(
is_LocalVar
(),
""
);
return
(
LocalVarNode
*
)
this
;
}
GrowableArray
<
uint
>*
_edges
;
// outgoing edges
FieldNode
*
as_Field
()
{
assert
(
is_Field
(),
""
);
return
(
FieldNode
*
)
this
;
}
Node
*
_node
;
// Ideal node corresponding to this PointsTo node.
ArraycopyNode
*
as_Arraycopy
()
{
assert
(
is_Arraycopy
(),
""
);
return
(
ArraycopyNode
*
)
this
;
}
int
_offset
;
// Object fields offsets.
bool
_scalar_replaceable
;
// Not escaped object could be replaced with scalar
bool
_has_unknown_ptr
;
// Has edge to phantom_object
public:
EscapeState
escape_state
()
const
{
return
(
EscapeState
)
_escape
;
}
PointsToNode
()
:
void
set_escape_state
(
EscapeState
state
)
{
_escape
=
(
u1
)
state
;
}
_type
(
UnknownType
),
_escape
(
UnknownEscape
),
_edges
(
NULL
),
_node
(
NULL
),
_offset
(
-
1
),
_has_unknown_ptr
(
false
),
_scalar_replaceable
(
true
)
{}
EscapeState
escape_state
()
const
{
return
_escape
;
}
NodeType
node_type
()
const
{
return
_type
;}
int
offset
()
{
return
_offset
;}
bool
scalar_replaceable
()
{
return
_scalar_replaceable
;}
bool
has_unknown_ptr
()
{
return
_has_unknown_ptr
;}
void
set_offset
(
int
offs
)
{
_offset
=
offs
;}
void
set_escape_state
(
EscapeState
state
)
{
_escape
=
state
;
}
void
set_node_type
(
NodeType
ntype
)
{
assert
(
_type
==
UnknownType
||
_type
==
ntype
,
"Can't change node type"
);
_type
=
ntype
;
}
void
set_scalar_replaceable
(
bool
v
)
{
_scalar_replaceable
=
v
;
}
void
set_has_unknown_ptr
()
{
_has_unknown_ptr
=
true
;
}
// count of outgoing edges
EscapeState
fields_escape_state
()
const
{
return
(
EscapeState
)
_fields_escape
;
}
uint
edge_count
()
const
{
return
(
_edges
==
NULL
)
?
0
:
_edges
->
length
()
;
}
void
set_fields_escape_state
(
EscapeState
state
)
{
_fields_escape
=
(
u1
)
state
;
}
// node index of target of outgoing edge "e"
bool
has_unknown_ptr
()
const
{
return
(
_flags
&
PointsToUnknown
)
!=
0
;
}
uint
edge_target
(
uint
e
)
const
{
void
set_has_unknown_ptr
()
{
_flags
|=
PointsToUnknown
;
}
assert
(
_edges
!=
NULL
,
"valid edge index"
);
return
(
_edges
->
at
(
e
)
>>
EdgeShift
);
bool
arraycopy_src
()
const
{
return
(
_flags
&
ArraycopySrc
)
!=
0
;
}
}
void
set_arraycopy_src
()
{
_flags
|=
ArraycopySrc
;
}
// type of outgoing edge "e"
bool
arraycopy_dst
()
const
{
return
(
_flags
&
ArraycopyDst
)
!=
0
;
}
EdgeType
edge_type
(
uint
e
)
const
{
void
set_arraycopy_dst
()
{
_flags
|=
ArraycopyDst
;
}
assert
(
_edges
!=
NULL
,
"valid edge index"
);
return
(
EdgeType
)
(
_edges
->
at
(
e
)
&
EdgeMask
);
bool
scalar_replaceable
()
const
{
return
(
_flags
&
ScalarReplaceable
)
!=
0
;}
void
set_scalar_replaceable
(
bool
v
)
{
if
(
v
)
_flags
|=
ScalarReplaceable
;
else
_flags
&=
~
ScalarReplaceable
;
}
}
// add a edge of the specified type pointing to the specified target
int
edge_count
()
const
{
return
_edges
.
length
();
}
void
add_edge
(
uint
targIdx
,
EdgeType
et
);
PointsToNode
*
edge
(
int
e
)
const
{
return
_edges
.
at
(
e
);
}
bool
add_edge
(
PointsToNode
*
edge
)
{
return
_edges
.
append_if_missing
(
edge
);
}
int
use_count
()
const
{
return
_uses
.
length
();
}
PointsToNode
*
use
(
int
e
)
const
{
return
_uses
.
at
(
e
);
}
bool
add_use
(
PointsToNode
*
use
)
{
return
_uses
.
append_if_missing
(
use
);
}
// remove an edge of the specified type pointing to the specified target
// Mark base edge use to distinguish from stored value edge.
void
remove_edge
(
uint
targIdx
,
EdgeType
et
);
bool
add_base_use
(
FieldNode
*
use
)
{
return
_uses
.
append_if_missing
((
PointsToNode
*
)((
intptr_t
)
use
+
1
));
}
static
bool
is_base_use
(
PointsToNode
*
use
)
{
return
(((
intptr_t
)
use
)
&
1
);
}
static
PointsToNode
*
get_use_node
(
PointsToNode
*
use
)
{
return
(
PointsToNode
*
)(((
intptr_t
)
use
)
&
~
1
);
}
// Return true if this node points to specified node or nodes it points to.
bool
points_to
(
JavaObjectNode
*
ptn
)
const
;
// Return true if this node points only to non-escaping allocations.
bool
non_escaping_allocation
();
// Return true if one node points to an other.
bool
meet
(
PointsToNode
*
ptn
);
#ifndef PRODUCT
#ifndef PRODUCT
NodeType
node_type
()
const
{
return
(
NodeType
)
_type
;}
void
dump
(
bool
print_state
=
true
)
const
;
void
dump
(
bool
print_state
=
true
)
const
;
#endif
#endif
};
};
class
LocalVarNode
:
public
PointsToNode
{
public:
LocalVarNode
(
Compile
*
C
,
Node
*
n
,
EscapeState
es
)
:
PointsToNode
(
C
,
n
,
es
,
LocalVar
)
{}
};
class
JavaObjectNode
:
public
PointsToNode
{
public:
JavaObjectNode
(
Compile
*
C
,
Node
*
n
,
EscapeState
es
)
:
PointsToNode
(
C
,
n
,
es
,
JavaObject
)
{
if
(
es
>
NoEscape
)
set_scalar_replaceable
(
false
);
}
};
class
FieldNode
:
public
PointsToNode
{
GrowableArray
<
PointsToNode
*>
_bases
;
// List of JavaObject nodes which point to this node
const
int
_offset
;
// Field's offset.
const
bool
_is_oop
;
// Field points to object
bool
_has_unknown_base
;
// Has phantom_object base
public:
FieldNode
(
Compile
*
C
,
Node
*
n
,
EscapeState
es
,
int
offs
,
bool
is_oop
)
:
PointsToNode
(
C
,
n
,
es
,
Field
),
_offset
(
offs
),
_is_oop
(
is_oop
),
_has_unknown_base
(
false
)
{}
int
offset
()
const
{
return
_offset
;}
bool
is_oop
()
const
{
return
_is_oop
;}
bool
has_unknown_base
()
const
{
return
_has_unknown_base
;
}
void
set_has_unknown_base
()
{
_has_unknown_base
=
true
;
}
int
base_count
()
const
{
return
_bases
.
length
();
}
PointsToNode
*
base
(
int
e
)
const
{
return
_bases
.
at
(
e
);
}
bool
add_base
(
PointsToNode
*
base
)
{
return
_bases
.
append_if_missing
(
base
);
}
#ifdef ASSERT
// Return true if bases points to this java object.
bool
has_base
(
JavaObjectNode
*
ptn
)
const
;
#endif
};
class
ArraycopyNode
:
public
PointsToNode
{
public:
ArraycopyNode
(
Compile
*
C
,
Node
*
n
,
EscapeState
es
)
:
PointsToNode
(
C
,
n
,
es
,
Arraycopy
)
{}
};
// Iterators for PointsTo node's edges:
// for (EdgeIterator i(n); i.has_next(); i.next()) {
// PointsToNode* u = i.get();
class
PointsToIterator
:
public
StackObj
{
protected:
const
PointsToNode
*
node
;
const
int
cnt
;
int
i
;
public:
inline
PointsToIterator
(
const
PointsToNode
*
n
,
int
cnt
)
:
node
(
n
),
cnt
(
cnt
),
i
(
0
)
{
}
inline
bool
has_next
()
const
{
return
i
<
cnt
;
}
inline
void
next
()
{
i
++
;
}
PointsToNode
*
get
()
const
{
ShouldNotCallThis
();
return
NULL
;
}
};
class
EdgeIterator
:
public
PointsToIterator
{
public:
inline
EdgeIterator
(
const
PointsToNode
*
n
)
:
PointsToIterator
(
n
,
n
->
edge_count
())
{
}
inline
PointsToNode
*
get
()
const
{
return
node
->
edge
(
i
);
}
};
class
UseIterator
:
public
PointsToIterator
{
public:
inline
UseIterator
(
const
PointsToNode
*
n
)
:
PointsToIterator
(
n
,
n
->
use_count
())
{
}
inline
PointsToNode
*
get
()
const
{
return
node
->
use
(
i
);
}
};
class
BaseIterator
:
public
PointsToIterator
{
public:
inline
BaseIterator
(
const
FieldNode
*
n
)
:
PointsToIterator
(
n
,
n
->
base_count
())
{
}
inline
PointsToNode
*
get
()
const
{
return
((
PointsToNode
*
)
node
)
->
as_Field
()
->
base
(
i
);
}
};
class
ConnectionGraph
:
public
ResourceObj
{
class
ConnectionGraph
:
public
ResourceObj
{
private:
private:
GrowableArray
<
PointsToNode
>
_nodes
;
// Connection graph nodes indexed
GrowableArray
<
PointsToNode
*>
_nodes
;
// Map from ideal nodes to
// by ideal node index
.
// ConnectionGraph nodes
.
Unique_Node_List
_delayed_worklist
;
// Nodes to be processed before
GrowableArray
<
PointsToNode
*>
_worklist
;
// Nodes to be processed
// the call build_connection_graph().
GrowableArray
<
MergeMemNode
*>
_mergemem_worklist
;
// List of all MergeMem nodes
bool
_collecting
;
// Indicates whether escape information
// is still being collected. If false,
// no new nodes will be processed.
VectorSet
_processed
;
// Records which nodes have been
bool
_verify
;
// verify graph
// processed.
bool
_collecting
;
// Indicates whether escape information
JavaObjectNode
*
phantom_obj
;
// Unknown object
// is still being collected. If false,
JavaObjectNode
*
null_obj
;
// no new nodes will be processed.
Node
*
_pcmp_neq
;
// ConI(#CC_GT)
Node
*
_pcmp_eq
;
// ConI(#CC_EQ)
bool
_progress
;
// Indicates whether new Graph's edges
Compile
*
_compile
;
// Compile object for current compilation
// were created.
PhaseIterGVN
*
_igvn
;
// Value numbering
uint
_phantom_object
;
// Index of globally escaping object
Unique_Node_List
ideal_nodes
;
// Used by CG construction and types splitting.
// that pointer values loaded from
// a field which has not been set
// are assumed to point to.
uint
_oop_null
;
// ConP(#NULL)->_idx
uint
_noop_null
;
// ConN(#NULL)->_idx
Node
*
_pcmp_neq
;
// ConI(#CC_GT)
Node
*
_pcmp_eq
;
// ConI(#CC_EQ)
Compile
*
_compile
;
// Compile object for current compilation
PhaseIterGVN
*
_igvn
;
// Value numbering
// Address of an element in _nodes. Used when the element is to be modified
// Address of an element in _nodes. Used when the element is to be modified
PointsToNode
*
ptnode_adr
(
u
int
idx
)
const
{
PointsToNode
*
ptnode_adr
(
int
idx
)
const
{
// There should be no new ideal nodes during ConnectionGraph build,
// There should be no new ideal nodes during ConnectionGraph build,
// growableArray::a
dr_a
t() will throw assert otherwise.
// growableArray::at() will throw assert otherwise.
return
_nodes
.
a
dr_a
t
(
idx
);
return
_nodes
.
at
(
idx
);
}
}
uint
nodes_size
()
const
{
return
_nodes
.
length
();
}
uint
nodes_size
()
const
{
return
_nodes
.
length
();
}
bool
is_null_ptr
(
uint
idx
)
const
{
return
(
idx
==
_noop_null
||
idx
==
_oop_null
);
}
// Add nodes to ConnectionGraph.
void
add_local_var
(
Node
*
n
,
PointsToNode
::
EscapeState
es
);
void
add_java_object
(
Node
*
n
,
PointsToNode
::
EscapeState
es
);
void
add_field
(
Node
*
n
,
PointsToNode
::
EscapeState
es
,
int
offset
);
void
add_arraycopy
(
Node
*
n
,
PointsToNode
::
EscapeState
es
,
PointsToNode
*
src
,
PointsToNode
*
dst
);
//
Add node to ConnectionGraph
.
//
Compute the escape state for arguments to a call
.
void
add_node
(
Node
*
n
,
PointsToNode
::
NodeType
nt
,
PointsToNode
::
EscapeState
es
,
bool
done
);
void
process_call_arguments
(
CallNode
*
call
);
//
offset of a field reference
//
Add PointsToNode node corresponding to a call
int
address_offset
(
Node
*
adr
,
PhaseTransform
*
phase
);
void
add_call_node
(
CallNode
*
call
);
// compute the escape state for arguments to a call
// Map ideal node to existing PointsTo node (usually phantom_object).
void
process_call_arguments
(
CallNode
*
call
,
PhaseTransform
*
phase
);
void
map_ideal_node
(
Node
*
n
,
PointsToNode
*
ptn
)
{
assert
(
ptn
!=
NULL
,
"only existing PointsTo node"
);
_nodes
.
at_put
(
n
->
_idx
,
ptn
);
}
//
compute the escape state for the return value of a call
//
Create PointsToNode node and add it to Connection Graph.
void
process_call_result
(
ProjNode
*
resproj
,
PhaseTransform
*
phase
);
void
add_node_to_connection_graph
(
Node
*
n
,
Unique_Node_List
*
delayed_worklist
);
//
Populate Connection Graph with Ideal nodes
.
//
Add final simple edges to graph
.
void
record_for_escape_analysis
(
Node
*
n
,
PhaseTransform
*
phase
);
void
add_final_edges
(
Node
*
n
);
// Build Connection Graph and set nodes escape state.
// Finish Graph construction.
void
build_connection_graph
(
Node
*
n
,
PhaseTransform
*
phase
);
bool
complete_connection_graph
(
GrowableArray
<
PointsToNode
*>&
ptnodes_worklist
,
GrowableArray
<
JavaObjectNode
*>&
non_escaped_worklist
,
GrowableArray
<
JavaObjectNode
*>&
java_objects_worklist
,
GrowableArray
<
FieldNode
*>&
oop_fields_worklist
);
// walk the connection graph starting at the node corresponding to "n" and
#ifdef ASSERT
// add the index of everything it could point to, to "ptset". This may cause
void
verify_connection_graph
(
GrowableArray
<
PointsToNode
*>&
ptnodes_worklist
,
// Phi's encountered to get (re)processed (which requires "phase".)
GrowableArray
<
JavaObjectNode
*>&
non_escaped_worklist
,
VectorSet
*
PointsTo
(
Node
*
n
);
GrowableArray
<
JavaObjectNode
*>&
java_objects_worklist
,
GrowableArray
<
Node
*>&
addp_worklist
);
#endif
// Reused structures for PointsTo().
// Add all references to this JavaObject node.
VectorSet
pt_ptset
;
int
add_java_object_edges
(
JavaObjectNode
*
jobj
,
bool
populate_worklist
);
VectorSet
pt_visited
;
GrowableArray
<
uint
>
pt_worklist
;
// Edge manipulation. The "from_i" and "to_i" arguments are the
// Put node on worklist if it is (or was) not there.
// node indices of the source and destination of the edge
void
add_to_worklist
(
PointsToNode
*
pt
)
{
void
add_pointsto_edge
(
uint
from_i
,
uint
to_i
);
_worklist
.
push
(
pt
);
void
add_deferred_edge
(
uint
from_i
,
uint
to_i
);
return
;
void
add_field_edge
(
uint
from_i
,
uint
to_i
,
int
offs
);
}
// Put on worklist all uses of this node.
void
add_uses_to_worklist
(
PointsToNode
*
pt
)
{
for
(
UseIterator
i
(
pt
);
i
.
has_next
();
i
.
next
())
_worklist
.
push
(
i
.
get
());
}
// Put on worklist all field's uses and related field nodes.
void
add_field_uses_to_worklist
(
FieldNode
*
field
);
// Put on worklist all related field nodes.
void
add_fields_to_worklist
(
FieldNode
*
field
,
PointsToNode
*
base
);
// Find fields which have unknown value.
int
find_field_value
(
FieldNode
*
field
);
// Find fields initializing values for allocations.
int
find_init_values
(
JavaObjectNode
*
ptn
,
PointsToNode
*
init_val
,
PhaseTransform
*
phase
);
// Set the escape state of an object and its fields.
void
set_escape_state
(
PointsToNode
*
ptn
,
PointsToNode
::
EscapeState
esc
)
{
// Don't change non-escaping state of NULL pointer.
if
(
ptn
!=
null_obj
)
{
if
(
ptn
->
escape_state
()
<
esc
)
ptn
->
set_escape_state
(
esc
);
if
(
ptn
->
fields_escape_state
()
<
esc
)
ptn
->
set_fields_escape_state
(
esc
);
}
}
void
set_fields_escape_state
(
PointsToNode
*
ptn
,
PointsToNode
::
EscapeState
esc
)
{
// Don't change non-escaping state of NULL pointer.
if
(
ptn
!=
null_obj
)
{
if
(
ptn
->
fields_escape_state
()
<
esc
)
ptn
->
set_fields_escape_state
(
esc
);
}
}
// Propagate GlobalEscape and ArgEscape escape states to all nodes
// and check that we still have non-escaping java objects.
bool
find_non_escaped_objects
(
GrowableArray
<
PointsToNode
*>&
ptnodes_worklist
,
GrowableArray
<
JavaObjectNode
*>&
non_escaped_worklist
);
// Adjust scalar_replaceable state after Connection Graph is built.
void
adjust_scalar_replaceable_state
(
JavaObjectNode
*
jobj
);
// Optimize ideal graph.
void
optimize_ideal_graph
(
GrowableArray
<
Node
*>&
ptr_cmp_worklist
,
GrowableArray
<
Node
*>&
storestore_worklist
);
// Optimize objects compare.
Node
*
optimize_ptr_compare
(
Node
*
n
);
// Returns unique corresponding java object or NULL.
JavaObjectNode
*
unique_java_object
(
Node
*
n
);
// Add an edge of the specified type pointing to the specified target.
// Add an edge of the specified type pointing to the specified target.
// Set _progress if new edge is added.
bool
add_edge
(
PointsToNode
*
from
,
PointsToNode
*
to
)
{
void
add_edge
(
PointsToNode
*
f
,
uint
to_i
,
PointsToNode
::
EdgeType
et
)
{
assert
(
!
from
->
is_Field
()
||
from
->
as_Field
()
->
is_oop
(),
"sanity"
);
uint
e_cnt
=
f
->
edge_count
();
f
->
add_edge
(
to_i
,
et
);
if
(
to
==
phantom_obj
)
{
_progress
|=
(
f
->
edge_count
()
!=
e_cnt
);
if
(
from
->
has_unknown_ptr
())
{
return
false
;
// already points to phantom_obj
}
from
->
set_has_unknown_ptr
();
}
bool
is_new
=
from
->
add_edge
(
to
);
assert
(
to
!=
phantom_obj
||
is_new
,
"sanity"
);
if
(
is_new
)
{
// New edge?
assert
(
!
_verify
,
"graph is incomplete"
);
is_new
=
to
->
add_use
(
from
);
assert
(
is_new
,
"use should be also new"
);
}
return
is_new
;
}
// Add an edge from Field node to its base and back.
bool
add_base
(
FieldNode
*
from
,
PointsToNode
*
to
)
{
assert
(
!
to
->
is_Arraycopy
(),
"sanity"
);
if
(
to
==
phantom_obj
)
{
if
(
from
->
has_unknown_base
())
{
return
false
;
// already has phantom_obj base
}
from
->
set_has_unknown_base
();
}
bool
is_new
=
from
->
add_base
(
to
);
assert
(
to
!=
phantom_obj
||
is_new
,
"sanity"
);
if
(
is_new
)
{
// New edge?
assert
(
!
_verify
,
"graph is incomplete"
);
if
(
to
==
null_obj
)
return
is_new
;
// Don't add fields to NULL pointer.
if
(
to
->
is_JavaObject
())
{
is_new
=
to
->
add_edge
(
from
);
}
else
{
is_new
=
to
->
add_base_use
(
from
);
}
assert
(
is_new
,
"use should be also new"
);
}
return
is_new
;
}
}
// Add an edge to node given by "to_i" from any field of adr_i whose offset
// Add LocalVar node and edge if possible
// matches "offset" A deferred edge is added if to_i is a LocalVar, and
void
add_local_var_and_edge
(
Node
*
n
,
PointsToNode
::
EscapeState
es
,
Node
*
to
,
// a pointsto edge is added if it is a JavaObject
Unique_Node_List
*
delayed_worklist
)
{
void
add_edge_from_fields
(
uint
adr
,
uint
to_i
,
int
offs
);
PointsToNode
*
ptn
=
ptnode_adr
(
to
->
_idx
);
if
(
delayed_worklist
!=
NULL
)
{
// First iteration of CG construction
add_local_var
(
n
,
es
);
if
(
ptn
==
NULL
)
{
delayed_worklist
->
push
(
n
);
return
;
// Process it later.
}
}
else
{
assert
(
ptn
!=
NULL
,
"node should be registered"
);
}
add_edge
(
ptnode_adr
(
n
->
_idx
),
ptn
);
}
// Helper functions
bool
is_oop_field
(
Node
*
n
,
int
offset
);
static
Node
*
get_addp_base
(
Node
*
addp
);
static
Node
*
find_second_addp
(
Node
*
addp
,
Node
*
n
);
// offset of a field reference
int
address_offset
(
Node
*
adr
,
PhaseTransform
*
phase
);
// Propagate unique types created for unescaped allocated objects
// through the graph
void
split_unique_types
(
GrowableArray
<
Node
*>
&
alloc_worklist
);
// Helper methods for unique types split.
bool
split_AddP
(
Node
*
addp
,
Node
*
base
);
// Add a deferred edge from node given by "from_i" to any field
PhiNode
*
create_split_phi
(
PhiNode
*
orig_phi
,
int
alias_idx
,
GrowableArray
<
PhiNode
*>
&
orig_phi_worklist
,
bool
&
new_created
);
// of adr_i whose offset matches "offset"
PhiNode
*
split_memory_phi
(
PhiNode
*
orig_phi
,
int
alias_idx
,
GrowableArray
<
PhiNode
*>
&
orig_phi_worklist
);
void
add_deferred_edge_to_fields
(
uint
from_i
,
uint
adr
,
int
offs
);
void
move_inst_mem
(
Node
*
n
,
GrowableArray
<
PhiNode
*>
&
orig_phis
);
Node
*
find_inst_mem
(
Node
*
mem
,
int
alias_idx
,
GrowableArray
<
PhiNode
*>
&
orig_phi_worklist
);
Node
*
step_through_mergemem
(
MergeMemNode
*
mmem
,
int
alias_idx
,
const
TypeOopPtr
*
toop
);
// Remove outgoing deferred edges from the node referenced by "ni".
// Any outgoing edges from the target of the deferred edge are copied
GrowableArray
<
MergeMemNode
*>
_mergemem_worklist
;
// List of all MergeMem nodes
// to "ni".
void
remove_deferred
(
uint
ni
,
GrowableArray
<
uint
>*
deferred_edges
,
VectorSet
*
visited
);
Node_Array
_node_map
;
// used for bookeeping during type splitting
Node_Array
_node_map
;
// used for bookeeping during type splitting
// Used for the following purposes:
// Used for the following purposes:
...
@@ -320,21 +547,18 @@ private:
...
@@ -320,21 +547,18 @@ private:
// MemNode - new memory input for this node
// MemNode - new memory input for this node
// ChecCastPP - allocation that this is a cast of
// ChecCastPP - allocation that this is a cast of
// allocation - CheckCastPP of the allocation
// allocation - CheckCastPP of the allocation
bool
split_AddP
(
Node
*
addp
,
Node
*
base
,
PhaseGVN
*
igvn
);
PhiNode
*
create_split_phi
(
PhiNode
*
orig_phi
,
int
alias_idx
,
GrowableArray
<
PhiNode
*>
&
orig_phi_worklist
,
PhaseGVN
*
igvn
,
bool
&
new_created
);
PhiNode
*
split_memory_phi
(
PhiNode
*
orig_phi
,
int
alias_idx
,
GrowableArray
<
PhiNode
*>
&
orig_phi_worklist
,
PhaseGVN
*
igvn
);
void
move_inst_mem
(
Node
*
n
,
GrowableArray
<
PhiNode
*>
&
orig_phis
,
PhaseGVN
*
igvn
);
Node
*
find_inst_mem
(
Node
*
mem
,
int
alias_idx
,
GrowableArray
<
PhiNode
*>
&
orig_phi_worklist
,
PhaseGVN
*
igvn
);
// Propagate unique types created for unescaped allocated objects
// through the graph
void
split_unique_types
(
GrowableArray
<
Node
*>
&
alloc_worklist
);
// manage entries in _node_map
// manage entries in _node_map
void
set_map
(
int
idx
,
Node
*
n
)
{
_node_map
.
map
(
idx
,
n
);
}
Node
*
get_map
(
int
idx
)
{
return
_node_map
[
idx
];
}
void
set_map
(
Node
*
from
,
Node
*
to
)
{
PhiNode
*
get_map_phi
(
int
idx
)
{
ideal_nodes
.
push
(
from
);
Node
*
phi
=
_node_map
[
idx
];
_node_map
.
map
(
from
->
_idx
,
to
);
}
Node
*
get_map
(
int
idx
)
{
return
_node_map
[
idx
];
}
PhiNode
*
get_map_phi
(
int
idx
)
{
Node
*
phi
=
_node_map
[
idx
];
return
(
phi
==
NULL
)
?
NULL
:
phi
->
as_Phi
();
return
(
phi
==
NULL
)
?
NULL
:
phi
->
as_Phi
();
}
}
...
@@ -344,23 +568,6 @@ private:
...
@@ -344,23 +568,6 @@ private:
_igvn
->
add_users_to_worklist
(
n
);
_igvn
->
add_users_to_worklist
(
n
);
}
}
// Set the escape state of a node
void
set_escape_state
(
uint
ni
,
PointsToNode
::
EscapeState
es
);
// Find fields initializing values for allocations.
void
find_init_values
(
Node
*
n
,
VectorSet
*
visited
,
PhaseTransform
*
phase
);
// Adjust escape state after Connection Graph is built.
void
adjust_escape_state
(
Node
*
n
);
// Propagate escape states to referenced nodes.
bool
propagate_escape_state
(
GrowableArray
<
int
>*
cg_worklist
,
GrowableArray
<
uint
>*
worklist
,
PointsToNode
::
EscapeState
esc_state
);
// Optimize objects compare.
Node
*
optimize_ptr_compare
(
Node
*
n
);
// Compute the escape information
// Compute the escape information
bool
compute_escape
();
bool
compute_escape
();
...
@@ -373,11 +580,10 @@ public:
...
@@ -373,11 +580,10 @@ public:
// Perform escape analysis
// Perform escape analysis
static
void
do_analysis
(
Compile
*
C
,
PhaseIterGVN
*
igvn
);
static
void
do_analysis
(
Compile
*
C
,
PhaseIterGVN
*
igvn
);
// escape state of a node
bool
not_global_escape
(
Node
*
n
);
PointsToNode
::
EscapeState
escape_state
(
Node
*
n
);
#ifndef PRODUCT
#ifndef PRODUCT
void
dump
();
void
dump
(
GrowableArray
<
PointsToNode
*>&
ptnodes_worklist
);
#endif
#endif
};
};
...
...
src/share/vm/opto/phase.cpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -39,8 +39,9 @@ elapsedTimer Phase::_t_stubCompilation;
...
@@ -39,8 +39,9 @@ elapsedTimer Phase::_t_stubCompilation;
// The next timers used for LogCompilation
// The next timers used for LogCompilation
elapsedTimer
Phase
::
_t_parser
;
elapsedTimer
Phase
::
_t_parser
;
elapsedTimer
Phase
::
_t_escapeAnalysis
;
elapsedTimer
Phase
::
_t_optimizer
;
elapsedTimer
Phase
::
_t_optimizer
;
elapsedTimer
Phase
::
_t_escapeAnalysis
;
elapsedTimer
Phase
::
_t_connectionGraph
;
elapsedTimer
Phase
::
_t_idealLoop
;
elapsedTimer
Phase
::
_t_idealLoop
;
elapsedTimer
Phase
::
_t_ccp
;
elapsedTimer
Phase
::
_t_ccp
;
elapsedTimer
Phase
::
_t_matcher
;
elapsedTimer
Phase
::
_t_matcher
;
...
@@ -51,6 +52,7 @@ elapsedTimer Phase::_t_output;
...
@@ -51,6 +52,7 @@ elapsedTimer Phase::_t_output;
elapsedTimer
Phase
::
_t_graphReshaping
;
elapsedTimer
Phase
::
_t_graphReshaping
;
elapsedTimer
Phase
::
_t_scheduler
;
elapsedTimer
Phase
::
_t_scheduler
;
elapsedTimer
Phase
::
_t_blockOrdering
;
elapsedTimer
Phase
::
_t_blockOrdering
;
elapsedTimer
Phase
::
_t_macroEliminate
;
elapsedTimer
Phase
::
_t_macroExpand
;
elapsedTimer
Phase
::
_t_macroExpand
;
elapsedTimer
Phase
::
_t_peephole
;
elapsedTimer
Phase
::
_t_peephole
;
elapsedTimer
Phase
::
_t_codeGeneration
;
elapsedTimer
Phase
::
_t_codeGeneration
;
...
@@ -104,6 +106,8 @@ void Phase::print_timers() {
...
@@ -104,6 +106,8 @@ void Phase::print_timers() {
if
(
DoEscapeAnalysis
)
{
if
(
DoEscapeAnalysis
)
{
// EA is part of Optimizer.
// EA is part of Optimizer.
tty
->
print_cr
(
" escape analysis: %3.3f sec"
,
Phase
::
_t_escapeAnalysis
.
seconds
());
tty
->
print_cr
(
" escape analysis: %3.3f sec"
,
Phase
::
_t_escapeAnalysis
.
seconds
());
tty
->
print_cr
(
" connection graph: %3.3f sec"
,
Phase
::
_t_connectionGraph
.
seconds
());
tty
->
print_cr
(
" macroEliminate : %3.3f sec"
,
Phase
::
_t_macroEliminate
.
seconds
());
}
}
tty
->
print_cr
(
" iterGVN : %3.3f sec"
,
Phase
::
_t_iterGVN
.
seconds
());
tty
->
print_cr
(
" iterGVN : %3.3f sec"
,
Phase
::
_t_iterGVN
.
seconds
());
tty
->
print_cr
(
" idealLoop : %3.3f sec"
,
Phase
::
_t_idealLoop
.
seconds
());
tty
->
print_cr
(
" idealLoop : %3.3f sec"
,
Phase
::
_t_idealLoop
.
seconds
());
...
@@ -112,9 +116,10 @@ void Phase::print_timers() {
...
@@ -112,9 +116,10 @@ void Phase::print_timers() {
tty
->
print_cr
(
" iterGVN2 : %3.3f sec"
,
Phase
::
_t_iterGVN2
.
seconds
());
tty
->
print_cr
(
" iterGVN2 : %3.3f sec"
,
Phase
::
_t_iterGVN2
.
seconds
());
tty
->
print_cr
(
" macroExpand : %3.3f sec"
,
Phase
::
_t_macroExpand
.
seconds
());
tty
->
print_cr
(
" macroExpand : %3.3f sec"
,
Phase
::
_t_macroExpand
.
seconds
());
tty
->
print_cr
(
" graphReshape : %3.3f sec"
,
Phase
::
_t_graphReshaping
.
seconds
());
tty
->
print_cr
(
" graphReshape : %3.3f sec"
,
Phase
::
_t_graphReshaping
.
seconds
());
double
optimizer_subtotal
=
Phase
::
_t_iterGVN
.
seconds
()
+
double
optimizer_subtotal
=
Phase
::
_t_iterGVN
.
seconds
()
+
Phase
::
_t_iterGVN2
.
seconds
()
+
Phase
::
_t_escapeAnalysis
.
seconds
()
+
Phase
::
_t_macroEliminate
.
seconds
()
+
Phase
::
_t_idealLoop
.
seconds
()
+
Phase
::
_t_ccp
.
seconds
()
+
Phase
::
_t_idealLoop
.
seconds
()
+
Phase
::
_t_ccp
.
seconds
()
+
Phase
::
_t_graphReshaping
.
seconds
();
Phase
::
_t_
macroExpand
.
seconds
()
+
Phase
::
_t_
graphReshaping
.
seconds
();
double
percent_of_optimizer
=
((
optimizer_subtotal
==
0.0
)
?
0.0
:
(
optimizer_subtotal
/
Phase
::
_t_optimizer
.
seconds
()
*
100.0
));
double
percent_of_optimizer
=
((
optimizer_subtotal
==
0.0
)
?
0.0
:
(
optimizer_subtotal
/
Phase
::
_t_optimizer
.
seconds
()
*
100.0
));
tty
->
print_cr
(
" subtotal : %3.3f sec, %3.2f %%"
,
optimizer_subtotal
,
percent_of_optimizer
);
tty
->
print_cr
(
" subtotal : %3.3f sec, %3.2f %%"
,
optimizer_subtotal
,
percent_of_optimizer
);
}
}
...
...
src/share/vm/opto/phase.hpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 1997, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -72,8 +72,12 @@ protected:
...
@@ -72,8 +72,12 @@ protected:
// The next timers used for LogCompilation
// The next timers used for LogCompilation
static
elapsedTimer
_t_parser
;
static
elapsedTimer
_t_parser
;
static
elapsedTimer
_t_escapeAnalysis
;
static
elapsedTimer
_t_optimizer
;
static
elapsedTimer
_t_optimizer
;
public:
// ConnectionGraph can't be Phase since it is used after EA done.
static
elapsedTimer
_t_escapeAnalysis
;
static
elapsedTimer
_t_connectionGraph
;
protected:
static
elapsedTimer
_t_idealLoop
;
static
elapsedTimer
_t_idealLoop
;
static
elapsedTimer
_t_ccp
;
static
elapsedTimer
_t_ccp
;
static
elapsedTimer
_t_matcher
;
static
elapsedTimer
_t_matcher
;
...
@@ -84,6 +88,7 @@ protected:
...
@@ -84,6 +88,7 @@ protected:
static
elapsedTimer
_t_graphReshaping
;
static
elapsedTimer
_t_graphReshaping
;
static
elapsedTimer
_t_scheduler
;
static
elapsedTimer
_t_scheduler
;
static
elapsedTimer
_t_blockOrdering
;
static
elapsedTimer
_t_blockOrdering
;
static
elapsedTimer
_t_macroEliminate
;
static
elapsedTimer
_t_macroExpand
;
static
elapsedTimer
_t_macroExpand
;
static
elapsedTimer
_t_peephole
;
static
elapsedTimer
_t_peephole
;
static
elapsedTimer
_t_codeGeneration
;
static
elapsedTimer
_t_codeGeneration
;
...
...
src/share/vm/runtime/arguments.cpp
浏览文件 @
f317413f
...
@@ -2523,15 +2523,6 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
...
@@ -2523,15 +2523,6 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
// was arrived at by experimenting with specjbb.
// was arrived at by experimenting with specjbb.
FLAG_SET_CMDLINE
(
uintx
,
OldPLABSize
,
8
*
K
);
// Note: this is in words
FLAG_SET_CMDLINE
(
uintx
,
OldPLABSize
,
8
*
K
);
// Note: this is in words
// CompilationPolicyChoice=0 causes the server compiler to adopt
// a more conservative which-method-do-I-compile policy when one
// of the counters maintained by the interpreter trips. The
// result is reduced startup time and improved specjbb and
// alacrity performance. Zero is the default, but we set it
// explicitly here in case the default changes.
// See runtime/compilationPolicy.*.
FLAG_SET_CMDLINE
(
intx
,
CompilationPolicyChoice
,
0
);
// Enable parallel GC and adaptive generation sizing
// Enable parallel GC and adaptive generation sizing
FLAG_SET_CMDLINE
(
bool
,
UseParallelGC
,
true
);
FLAG_SET_CMDLINE
(
bool
,
UseParallelGC
,
true
);
FLAG_SET_DEFAULT
(
ParallelGCThreads
,
FLAG_SET_DEFAULT
(
ParallelGCThreads
,
...
...
src/share/vm/utilities/growableArray.hpp
浏览文件 @
f317413f
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -198,8 +198,11 @@ template<class E> class GrowableArray : public GenericGrowableArray {
...
@@ -198,8 +198,11 @@ template<class E> class GrowableArray : public GenericGrowableArray {
return
idx
;
return
idx
;
}
}
void
append_if_missing
(
const
E
&
elem
)
{
bool
append_if_missing
(
const
E
&
elem
)
{
if
(
!
contains
(
elem
))
append
(
elem
);
// Returns TRUE if elem is added.
bool
missed
=
!
contains
(
elem
);
if
(
missed
)
append
(
elem
);
return
missed
;
}
}
E
at
(
int
i
)
const
{
E
at
(
int
i
)
const
{
...
@@ -292,12 +295,22 @@ template<class E> class GrowableArray : public GenericGrowableArray {
...
@@ -292,12 +295,22 @@ template<class E> class GrowableArray : public GenericGrowableArray {
ShouldNotReachHere
();
ShouldNotReachHere
();
}
}
// The order is preserved.
void
remove_at
(
int
index
)
{
void
remove_at
(
int
index
)
{
assert
(
0
<=
index
&&
index
<
_len
,
"illegal index"
);
assert
(
0
<=
index
&&
index
<
_len
,
"illegal index"
);
for
(
int
j
=
index
+
1
;
j
<
_len
;
j
++
)
_data
[
j
-
1
]
=
_data
[
j
];
for
(
int
j
=
index
+
1
;
j
<
_len
;
j
++
)
_data
[
j
-
1
]
=
_data
[
j
];
_len
--
;
_len
--
;
}
}
// The order is changed.
void
delete_at
(
int
index
)
{
assert
(
0
<=
index
&&
index
<
_len
,
"illegal index"
);
if
(
index
<
--
_len
)
{
// Replace removed element with last one.
_data
[
index
]
=
_data
[
_len
];
}
}
// inserts the given element before the element at index i
// inserts the given element before the element at index i
void
insert_before
(
const
int
idx
,
const
E
&
elem
)
{
void
insert_before
(
const
int
idx
,
const
E
&
elem
)
{
check_nesting
();
check_nesting
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录