annotate src/cpu/x86/vm/frame_x86.hpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents 4ca6dc0799b6
children 89152779163c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14518
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1204
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1204
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1204
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef CPU_X86_VM_FRAME_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define CPU_X86_VM_FRAME_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // A frame represents a physical stack frame (an activation). Frames can be
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // C or Java frames, and the Java frames can be interpreted or compiled.
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // In contrast, vframes represent source-level activations, so that one physical frame
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // can correspond to multiple source level frames because of inlining.
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // A frame is comprised of {pc, fp, sp}
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // ------------------------------ Asm interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // Layout of asm interpreter frame:
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // [expression stack ] * <- sp
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // [monitors ] \
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // ... | monitor block size
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // [monitors ] /
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // [monitor block size ]
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // [byte code index/pointr] = bcx() bcx_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // [pointer to locals ] = locals() locals_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // [constant pool cache ] = cache() cache_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // [methodData ] = mdp() mdx_offset
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4806
diff changeset
47 // [Method* ] = method() method_offset
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // [last sp ] = last_sp() last_sp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // [old stack pointer ] (sender_sp) sender_sp_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // [old frame pointer ] <- fp = link()
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // [return pc ]
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // [oop temp ] (only for native calls)
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // [locals and parameters ]
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // <- sender sp
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // ------------------------------ Asm interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // ------------------------------ C++ interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
58 //
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Layout of C++ interpreter frame: (While executing in BytecodeInterpreter::run)
a61af66fc99e Initial load
duke
parents:
diff changeset
60 //
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // <- SP (current esp/rsp)
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // [local variables ] BytecodeInterpreter::run local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // ... BytecodeInterpreter::run local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // [local variables ] BytecodeInterpreter::run local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // [old frame pointer ] fp [ BytecodeInterpreter::run's ebp/rbp ]
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // [return pc ] (return to frame manager)
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // [interpreter_state* ] (arg to BytecodeInterpreter::run) --------------
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // [expression stack ] <- last_Java_sp |
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // [... ] * <- interpreter_state.stack |
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // [expression stack ] * <- interpreter_state.stack_base |
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // [monitors ] \ |
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // ... | monitor block size |
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // [monitors ] / <- interpreter_state.monitor_base |
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // [struct interpretState ] <-----------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // [return pc ] (return to callee of frame manager [1]
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // [locals and parameters ]
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // <- sender sp
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // [1] When the c++ interpreter calls a new method it returns to the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // manager which allocates a new frame on the stack. In that case there
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // is no real callee of this newly allocated frame. The frame manager is
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // aware of the additional frame(s) and will pop them as nested calls
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // complete. Howevers tTo make it look good in the debugger the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // manager actually installs a dummy pc pointing to RecursiveInterpreterActivation
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // with a fake interpreter_state* parameter to make it easy to debug
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // nested calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Note that contrary to the layout for the assembly interpreter the
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // expression stack allocated for the C++ interpreter is full sized.
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // However this is not as bad as it seems as the interpreter frame_manager
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // will truncate the unused space on succesive method calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 //
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // ------------------------------ C++ interpreter ----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
96 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 pc_return_offset = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // All frames
a61af66fc99e Initial load
duke
parents:
diff changeset
99 link_offset = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 return_addr_offset = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // non-interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
102 sender_sp_offset = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Interpreter frames
a61af66fc99e Initial load
duke
parents:
diff changeset
107 interpreter_frame_result_handler_offset = 3, // for native calls only
a61af66fc99e Initial load
duke
parents:
diff changeset
108 interpreter_frame_oop_temp_offset = 2, // for native calls only
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 interpreter_frame_sender_sp_offset = -1,
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // outgoing sp before a call to an invoked method
a61af66fc99e Initial load
duke
parents:
diff changeset
112 interpreter_frame_last_sp_offset = interpreter_frame_sender_sp_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
113 interpreter_frame_method_offset = interpreter_frame_last_sp_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 interpreter_frame_mdx_offset = interpreter_frame_method_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 interpreter_frame_cache_offset = interpreter_frame_mdx_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
116 interpreter_frame_locals_offset = interpreter_frame_cache_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
117 interpreter_frame_bcx_offset = interpreter_frame_locals_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
118 interpreter_frame_initial_sp_offset = interpreter_frame_bcx_offset - 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 interpreter_frame_monitor_block_top_offset = interpreter_frame_initial_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
121 interpreter_frame_monitor_block_bottom_offset = interpreter_frame_initial_sp_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 #endif // CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // Entry frames
a61af66fc99e Initial load
duke
parents:
diff changeset
126 #ifdef AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
127 #ifdef _WIN64
2407
b1c22848507b 6741940: Nonvolatile XMM registers not preserved across JNI calls
iveresov
parents: 1972
diff changeset
128 entry_frame_after_call_words = 28,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 entry_frame_call_wrapper_offset = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 arg_reg_save_area_bytes = 32, // Register argument save area
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
133 entry_frame_after_call_words = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
134 entry_frame_call_wrapper_offset = -6,
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 arg_reg_save_area_bytes = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #endif // _WIN64
a61af66fc99e Initial load
duke
parents:
diff changeset
138 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
139 entry_frame_call_wrapper_offset = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #endif // AMD64
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Native frames
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 native_frame_initial_param_offset = 2
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 };
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 intptr_t ptr_at(int offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return *ptr_at_addr(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 void ptr_at_put(int offset, intptr_t value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 *ptr_at_addr(offset) = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // an additional field beyond _sp and _pc:
a61af66fc99e Initial load
duke
parents:
diff changeset
158 intptr_t* _fp; // frame pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // The interpreter and adapters will extend the frame of the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Since oopMaps are based on the sp of the caller before extension
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // we need to know that value. However in order to compute the address
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // of the return address we need the real "raw" sp. Since sparc already
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // uses sp() to mean "raw" sp and unextended_sp() to mean the caller's
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // original sp we use that convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 intptr_t* _unextended_sp;
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
167 void adjust_unextended_sp();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 intptr_t* ptr_at_addr(int offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 return (intptr_t*) addr_at(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
8721
47bc9800972c 8006498: #if <symbol> is wrong in the code.
jprovino
parents: 6725
diff changeset
173 #ifdef ASSERT
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
174 // Used in frame::sender_for_{interpreter,compiled}_frame
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
175 static void verify_deopt_original_pc( nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return = false);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
176 static void verify_deopt_mh_original_pc(nmethod* nm, intptr_t* unextended_sp) {
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
177 verify_deopt_original_pc(nm, unextended_sp, true);
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
178 }
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
179 #endif
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 0
diff changeset
180
0
a61af66fc99e Initial load
duke
parents:
diff changeset
181 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Constructors
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 frame(intptr_t* sp, intptr_t* fp, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 frame(intptr_t* sp, intptr_t* fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // accessors for the instance variables
4806
eaa9557116a2 7120448: Fix FP values for compiled frames in frame::describe
bdelsart
parents: 3363
diff changeset
191 // Note: not necessarily the real 'frame pointer' (see real_fp)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 intptr_t* fp() const { return _fp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 inline address* sender_pc_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // return address of param, zero origin index.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 inline address* native_param_addr(int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // expression stack tos if we are nested in a java call
a61af66fc99e Initial load
duke
parents:
diff changeset
200 intptr_t* interpreter_frame_last_sp() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
201
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
202 // helper to update a map with callee-saved RBP
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
203 static void update_map_with_saved_link(RegisterMap* map, intptr_t** link_addr);
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 2407
diff changeset
204
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
207 void interpreter_frame_set_last_sp(intptr_t* sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 #endif // CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
211 inline interpreterState get_interpreterState() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 #endif // CC_INTERP
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
213
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
214 #endif // CPU_X86_VM_FRAME_X86_HPP