Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/ci/bcEscapeAnalyzer.hpp
32285 views
1
/*
2
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_VM_CI_BCESCAPEANALYZER_HPP
26
#define SHARE_VM_CI_BCESCAPEANALYZER_HPP
27
28
#ifdef COMPILER2
29
#include "ci/ciObject.hpp"
30
#include "ci/ciMethod.hpp"
31
#include "ci/ciMethodData.hpp"
32
#include "code/dependencies.hpp"
33
#include "libadt/vectset.hpp"
34
#include "memory/allocation.hpp"
35
#include "utilities/growableArray.hpp"
36
#endif
37
38
// This class implements a fast, conservative analysis of effect of methods
39
// on the escape state of their arguments. The analysis is at the bytecode
40
// level.
41
42
class ciMethodBlocks;
43
class ciBlock;
44
45
class BCEscapeAnalyzer : public ResourceObj {
46
private:
47
Arena* _arena; // ciEnv arena
48
49
bool _conservative; // If true, return maximally
50
// conservative results.
51
ciMethod* _method;
52
ciMethodData* _methodData;
53
int _arg_size;
54
VectorSet _arg_local;
55
VectorSet _arg_stack;
56
VectorSet _arg_returned;
57
VectorSet _dirty;
58
enum{ ARG_OFFSET_MAX = 31};
59
uint *_arg_modified;
60
61
bool _return_local;
62
bool _return_allocated;
63
bool _allocated_escapes;
64
bool _unknown_modified;
65
66
GrowableArray<ciMetadata *> _dependencies;
67
68
ciMethodBlocks *_methodBlocks;
69
70
BCEscapeAnalyzer* _parent;
71
int _level;
72
73
public:
74
class ArgumentMap;
75
class StateInfo;
76
77
private:
78
// helper functions
79
bool is_argument(int i) { return i >= 0 && i < _arg_size; }
80
void set_returned(ArgumentMap vars);
81
bool is_argument(ArgumentMap vars);
82
bool is_arg_stack(ArgumentMap vars);
83
bool returns_all(ArgumentMap vars);
84
void clear_bits(ArgumentMap vars, VectorSet &bs);
85
void set_method_escape(ArgumentMap vars);
86
void set_global_escape(ArgumentMap vars, bool merge = false);
87
void set_dirty(ArgumentMap vars);
88
void set_modified(ArgumentMap vars, int offs, int size);
89
90
bool is_recursive_call(ciMethod* callee);
91
void add_dependence(ciKlass *klass, ciMethod *meth);
92
void propagate_dependencies(ciMethod *meth);
93
void invoke(StateInfo &state, Bytecodes::Code code, ciMethod* target, ciKlass* holder);
94
95
void iterate_one_block(ciBlock *blk, StateInfo &state, GrowableArray<ciBlock *> &successors);
96
void iterate_blocks(Arena *);
97
void merge_block_states(StateInfo *blockstates, ciBlock *dest, StateInfo *s_state);
98
99
// analysis
100
void initialize();
101
void clear_escape_info();
102
void compute_escape_info();
103
vmIntrinsics::ID known_intrinsic();
104
void compute_escape_for_intrinsic(vmIntrinsics::ID iid);
105
void do_analysis();
106
107
void read_escape_info();
108
109
bool contains(uint arg_set1, uint arg_set2);
110
111
public:
112
BCEscapeAnalyzer(ciMethod* method, BCEscapeAnalyzer* parent = NULL);
113
114
// accessors
115
ciMethod* method() const { return _method; }
116
ciMethodData* methodData() const { return _methodData; }
117
BCEscapeAnalyzer* parent() const { return _parent; }
118
int level() const { return _level; }
119
GrowableArray<ciMetadata *>* dependencies() { return &_dependencies; }
120
bool has_dependencies() const { return !_dependencies.is_empty(); }
121
122
// retrieval of interprocedural escape information
123
124
// The given argument does not escape the callee.
125
bool is_arg_local(int i) const {
126
return !_conservative && _arg_local.test(i);
127
}
128
129
// The given argument escapes the callee, but does not become globally
130
// reachable.
131
bool is_arg_stack(int i) const {
132
return !_conservative && _arg_stack.test(i);
133
}
134
135
// The given argument does not escape globally, and may be returned.
136
bool is_arg_returned(int i) const {
137
return !_conservative && _arg_returned.test(i); }
138
139
// True iff only input arguments are returned.
140
bool is_return_local() const {
141
return !_conservative && _return_local;
142
}
143
144
// True iff only newly allocated unescaped objects are returned.
145
bool is_return_allocated() const {
146
return !_conservative && _return_allocated && !_allocated_escapes;
147
}
148
149
// Tracking of argument modification
150
151
enum {OFFSET_ANY = -1};
152
bool is_arg_modified(int arg, int offset, int size_in_bytes);
153
void set_arg_modified(int arg, int offset, int size_in_bytes);
154
bool has_non_arg_side_affects() { return _unknown_modified; }
155
156
// Copy dependencies from this analysis into "deps"
157
void copy_dependencies(Dependencies *deps);
158
159
#ifndef PRODUCT
160
// dump escape information
161
void dump();
162
#endif
163
};
164
165
#endif // SHARE_VM_CI_BCESCAPEANALYZER_HPP
166
167