src/share/vm/opto/graphKit.cpp

Thu, 02 Dec 2010 17:21:12 -0800

author
iveresov
date
Thu, 02 Dec 2010 17:21:12 -0800
changeset 2349
5ddfcf4b079e
parent 2314
f95d63e2154a
child 2665
9dc311b8473e
permissions
-rw-r--r--

7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation.
Reviewed-by: kvn, never

duke@435 1 /*
trims@1907 2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "compiler/compileLog.hpp"
stefank@2314 27 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
stefank@2314 28 #include "gc_implementation/g1/heapRegion.hpp"
stefank@2314 29 #include "gc_interface/collectedHeap.hpp"
stefank@2314 30 #include "memory/barrierSet.hpp"
stefank@2314 31 #include "memory/cardTableModRefBS.hpp"
stefank@2314 32 #include "opto/addnode.hpp"
stefank@2314 33 #include "opto/graphKit.hpp"
stefank@2314 34 #include "opto/idealKit.hpp"
stefank@2314 35 #include "opto/locknode.hpp"
stefank@2314 36 #include "opto/machnode.hpp"
stefank@2314 37 #include "opto/parse.hpp"
stefank@2314 38 #include "opto/rootnode.hpp"
stefank@2314 39 #include "opto/runtime.hpp"
stefank@2314 40 #include "runtime/deoptimization.hpp"
stefank@2314 41 #include "runtime/sharedRuntime.hpp"
duke@435 42
duke@435 43 //----------------------------GraphKit-----------------------------------------
duke@435 44 // Main utility constructor.
duke@435 45 GraphKit::GraphKit(JVMState* jvms)
duke@435 46 : Phase(Phase::Parser),
duke@435 47 _env(C->env()),
duke@435 48 _gvn(*C->initial_gvn())
duke@435 49 {
duke@435 50 _exceptions = jvms->map()->next_exception();
duke@435 51 if (_exceptions != NULL) jvms->map()->set_next_exception(NULL);
duke@435 52 set_jvms(jvms);
duke@435 53 }
duke@435 54
duke@435 55 // Private constructor for parser.
duke@435 56 GraphKit::GraphKit()
duke@435 57 : Phase(Phase::Parser),
duke@435 58 _env(C->env()),
duke@435 59 _gvn(*C->initial_gvn())
duke@435 60 {
duke@435 61 _exceptions = NULL;
duke@435 62 set_map(NULL);
duke@435 63 debug_only(_sp = -99);
duke@435 64 debug_only(set_bci(-99));
duke@435 65 }
duke@435 66
duke@435 67
duke@435 68
duke@435 69 //---------------------------clean_stack---------------------------------------
duke@435 70 // Clear away rubbish from the stack area of the JVM state.
duke@435 71 // This destroys any arguments that may be waiting on the stack.
duke@435 72 void GraphKit::clean_stack(int from_sp) {
duke@435 73 SafePointNode* map = this->map();
duke@435 74 JVMState* jvms = this->jvms();
duke@435 75 int stk_size = jvms->stk_size();
duke@435 76 int stkoff = jvms->stkoff();
duke@435 77 Node* top = this->top();
duke@435 78 for (int i = from_sp; i < stk_size; i++) {
duke@435 79 if (map->in(stkoff + i) != top) {
duke@435 80 map->set_req(stkoff + i, top);
duke@435 81 }
duke@435 82 }
duke@435 83 }
duke@435 84
duke@435 85
duke@435 86 //--------------------------------sync_jvms-----------------------------------
duke@435 87 // Make sure our current jvms agrees with our parse state.
duke@435 88 JVMState* GraphKit::sync_jvms() const {
duke@435 89 JVMState* jvms = this->jvms();
duke@435 90 jvms->set_bci(bci()); // Record the new bci in the JVMState
duke@435 91 jvms->set_sp(sp()); // Record the new sp in the JVMState
duke@435 92 assert(jvms_in_sync(), "jvms is now in sync");
duke@435 93 return jvms;
duke@435 94 }
duke@435 95
duke@435 96 #ifdef ASSERT
duke@435 97 bool GraphKit::jvms_in_sync() const {
duke@435 98 Parse* parse = is_Parse();
duke@435 99 if (parse == NULL) {
duke@435 100 if (bci() != jvms()->bci()) return false;
duke@435 101 if (sp() != (int)jvms()->sp()) return false;
duke@435 102 return true;
duke@435 103 }
duke@435 104 if (jvms()->method() != parse->method()) return false;
duke@435 105 if (jvms()->bci() != parse->bci()) return false;
duke@435 106 int jvms_sp = jvms()->sp();
duke@435 107 if (jvms_sp != parse->sp()) return false;
duke@435 108 int jvms_depth = jvms()->depth();
duke@435 109 if (jvms_depth != parse->depth()) return false;
duke@435 110 return true;
duke@435 111 }
duke@435 112
duke@435 113 // Local helper checks for special internal merge points
duke@435 114 // used to accumulate and merge exception states.
duke@435 115 // They are marked by the region's in(0) edge being the map itself.
duke@435 116 // Such merge points must never "escape" into the parser at large,
duke@435 117 // until they have been handed to gvn.transform.
duke@435 118 static bool is_hidden_merge(Node* reg) {
duke@435 119 if (reg == NULL) return false;
duke@435 120 if (reg->is_Phi()) {
duke@435 121 reg = reg->in(0);
duke@435 122 if (reg == NULL) return false;
duke@435 123 }
duke@435 124 return reg->is_Region() && reg->in(0) != NULL && reg->in(0)->is_Root();
duke@435 125 }
duke@435 126
duke@435 127 void GraphKit::verify_map() const {
duke@435 128 if (map() == NULL) return; // null map is OK
duke@435 129 assert(map()->req() <= jvms()->endoff(), "no extra garbage on map");
duke@435 130 assert(!map()->has_exceptions(), "call add_exception_states_from 1st");
duke@435 131 assert(!is_hidden_merge(control()), "call use_exception_state, not set_map");
duke@435 132 }
duke@435 133
duke@435 134 void GraphKit::verify_exception_state(SafePointNode* ex_map) {
duke@435 135 assert(ex_map->next_exception() == NULL, "not already part of a chain");
duke@435 136 assert(has_saved_ex_oop(ex_map), "every exception state has an ex_oop");
duke@435 137 }
duke@435 138 #endif
duke@435 139
duke@435 140 //---------------------------stop_and_kill_map---------------------------------
duke@435 141 // Set _map to NULL, signalling a stop to further bytecode execution.
duke@435 142 // First smash the current map's control to a constant, to mark it dead.
duke@435 143 void GraphKit::stop_and_kill_map() {
duke@435 144 SafePointNode* dead_map = stop();
duke@435 145 if (dead_map != NULL) {
duke@435 146 dead_map->disconnect_inputs(NULL); // Mark the map as killed.
duke@435 147 assert(dead_map->is_killed(), "must be so marked");
duke@435 148 }
duke@435 149 }
duke@435 150
duke@435 151
duke@435 152 //--------------------------------stopped--------------------------------------
duke@435 153 // Tell if _map is NULL, or control is top.
duke@435 154 bool GraphKit::stopped() {
duke@435 155 if (map() == NULL) return true;
duke@435 156 else if (control() == top()) return true;
duke@435 157 else return false;
duke@435 158 }
duke@435 159
duke@435 160
duke@435 161 //-----------------------------has_ex_handler----------------------------------
duke@435 162 // Tell if this method or any caller method has exception handlers.
duke@435 163 bool GraphKit::has_ex_handler() {
duke@435 164 for (JVMState* jvmsp = jvms(); jvmsp != NULL; jvmsp = jvmsp->caller()) {
duke@435 165 if (jvmsp->has_method() && jvmsp->method()->has_exception_handlers()) {
duke@435 166 return true;
duke@435 167 }
duke@435 168 }
duke@435 169 return false;
duke@435 170 }
duke@435 171
duke@435 172 //------------------------------save_ex_oop------------------------------------
duke@435 173 // Save an exception without blowing stack contents or other JVM state.
duke@435 174 void GraphKit::set_saved_ex_oop(SafePointNode* ex_map, Node* ex_oop) {
duke@435 175 assert(!has_saved_ex_oop(ex_map), "clear ex-oop before setting again");
duke@435 176 ex_map->add_req(ex_oop);
duke@435 177 debug_only(verify_exception_state(ex_map));
duke@435 178 }
duke@435 179
duke@435 180 inline static Node* common_saved_ex_oop(SafePointNode* ex_map, bool clear_it) {
duke@435 181 assert(GraphKit::has_saved_ex_oop(ex_map), "ex_oop must be there");
duke@435 182 Node* ex_oop = ex_map->in(ex_map->req()-1);
duke@435 183 if (clear_it) ex_map->del_req(ex_map->req()-1);
duke@435 184 return ex_oop;
duke@435 185 }
duke@435 186
duke@435 187 //-----------------------------saved_ex_oop------------------------------------
duke@435 188 // Recover a saved exception from its map.
duke@435 189 Node* GraphKit::saved_ex_oop(SafePointNode* ex_map) {
duke@435 190 return common_saved_ex_oop(ex_map, false);
duke@435 191 }
duke@435 192
duke@435 193 //--------------------------clear_saved_ex_oop---------------------------------
duke@435 194 // Erase a previously saved exception from its map.
duke@435 195 Node* GraphKit::clear_saved_ex_oop(SafePointNode* ex_map) {
duke@435 196 return common_saved_ex_oop(ex_map, true);
duke@435 197 }
duke@435 198
duke@435 199 #ifdef ASSERT
duke@435 200 //---------------------------has_saved_ex_oop----------------------------------
duke@435 201 // Erase a previously saved exception from its map.
duke@435 202 bool GraphKit::has_saved_ex_oop(SafePointNode* ex_map) {
duke@435 203 return ex_map->req() == ex_map->jvms()->endoff()+1;
duke@435 204 }
duke@435 205 #endif
duke@435 206
duke@435 207 //-------------------------make_exception_state--------------------------------
duke@435 208 // Turn the current JVM state into an exception state, appending the ex_oop.
duke@435 209 SafePointNode* GraphKit::make_exception_state(Node* ex_oop) {
duke@435 210 sync_jvms();
duke@435 211 SafePointNode* ex_map = stop(); // do not manipulate this map any more
duke@435 212 set_saved_ex_oop(ex_map, ex_oop);
duke@435 213 return ex_map;
duke@435 214 }
duke@435 215
duke@435 216
duke@435 217 //--------------------------add_exception_state--------------------------------
duke@435 218 // Add an exception to my list of exceptions.
duke@435 219 void GraphKit::add_exception_state(SafePointNode* ex_map) {
duke@435 220 if (ex_map == NULL || ex_map->control() == top()) {
duke@435 221 return;
duke@435 222 }
duke@435 223 #ifdef ASSERT
duke@435 224 verify_exception_state(ex_map);
duke@435 225 if (has_exceptions()) {
duke@435 226 assert(ex_map->jvms()->same_calls_as(_exceptions->jvms()), "all collected exceptions must come from the same place");
duke@435 227 }
duke@435 228 #endif
duke@435 229
duke@435 230 // If there is already an exception of exactly this type, merge with it.
duke@435 231 // In particular, null-checks and other low-level exceptions common up here.
duke@435 232 Node* ex_oop = saved_ex_oop(ex_map);
duke@435 233 const Type* ex_type = _gvn.type(ex_oop);
duke@435 234 if (ex_oop == top()) {
duke@435 235 // No action needed.
duke@435 236 return;
duke@435 237 }
duke@435 238 assert(ex_type->isa_instptr(), "exception must be an instance");
duke@435 239 for (SafePointNode* e2 = _exceptions; e2 != NULL; e2 = e2->next_exception()) {
duke@435 240 const Type* ex_type2 = _gvn.type(saved_ex_oop(e2));
duke@435 241 // We check sp also because call bytecodes can generate exceptions
duke@435 242 // both before and after arguments are popped!
duke@435 243 if (ex_type2 == ex_type
duke@435 244 && e2->_jvms->sp() == ex_map->_jvms->sp()) {
duke@435 245 combine_exception_states(ex_map, e2);
duke@435 246 return;
duke@435 247 }
duke@435 248 }
duke@435 249
duke@435 250 // No pre-existing exception of the same type. Chain it on the list.
duke@435 251 push_exception_state(ex_map);
duke@435 252 }
duke@435 253
duke@435 254 //-----------------------add_exception_states_from-----------------------------
duke@435 255 void GraphKit::add_exception_states_from(JVMState* jvms) {
duke@435 256 SafePointNode* ex_map = jvms->map()->next_exception();
duke@435 257 if (ex_map != NULL) {
duke@435 258 jvms->map()->set_next_exception(NULL);
duke@435 259 for (SafePointNode* next_map; ex_map != NULL; ex_map = next_map) {
duke@435 260 next_map = ex_map->next_exception();
duke@435 261 ex_map->set_next_exception(NULL);
duke@435 262 add_exception_state(ex_map);
duke@435 263 }
duke@435 264 }
duke@435 265 }
duke@435 266
duke@435 267 //-----------------------transfer_exceptions_into_jvms-------------------------
duke@435 268 JVMState* GraphKit::transfer_exceptions_into_jvms() {
duke@435 269 if (map() == NULL) {
duke@435 270 // We need a JVMS to carry the exceptions, but the map has gone away.
duke@435 271 // Create a scratch JVMS, cloned from any of the exception states...
duke@435 272 if (has_exceptions()) {
duke@435 273 _map = _exceptions;
duke@435 274 _map = clone_map();
duke@435 275 _map->set_next_exception(NULL);
duke@435 276 clear_saved_ex_oop(_map);
duke@435 277 debug_only(verify_map());
duke@435 278 } else {
duke@435 279 // ...or created from scratch
duke@435 280 JVMState* jvms = new (C) JVMState(_method, NULL);
duke@435 281 jvms->set_bci(_bci);
duke@435 282 jvms->set_sp(_sp);
duke@435 283 jvms->set_map(new (C, TypeFunc::Parms) SafePointNode(TypeFunc::Parms, jvms));
duke@435 284 set_jvms(jvms);
duke@435 285 for (uint i = 0; i < map()->req(); i++) map()->init_req(i, top());
duke@435 286 set_all_memory(top());
duke@435 287 while (map()->req() < jvms->endoff()) map()->add_req(top());
duke@435 288 }
duke@435 289 // (This is a kludge, in case you didn't notice.)
duke@435 290 set_control(top());
duke@435 291 }
duke@435 292 JVMState* jvms = sync_jvms();
duke@435 293 assert(!jvms->map()->has_exceptions(), "no exceptions on this map yet");
duke@435 294 jvms->map()->set_next_exception(_exceptions);
duke@435 295 _exceptions = NULL; // done with this set of exceptions
duke@435 296 return jvms;
duke@435 297 }
duke@435 298
duke@435 299 static inline void add_n_reqs(Node* dstphi, Node* srcphi) {
duke@435 300 assert(is_hidden_merge(dstphi), "must be a special merge node");
duke@435 301 assert(is_hidden_merge(srcphi), "must be a special merge node");
duke@435 302 uint limit = srcphi->req();
duke@435 303 for (uint i = PhiNode::Input; i < limit; i++) {
duke@435 304 dstphi->add_req(srcphi->in(i));
duke@435 305 }
duke@435 306 }
duke@435 307 static inline void add_one_req(Node* dstphi, Node* src) {
duke@435 308 assert(is_hidden_merge(dstphi), "must be a special merge node");
duke@435 309 assert(!is_hidden_merge(src), "must not be a special merge node");
duke@435 310 dstphi->add_req(src);
duke@435 311 }
duke@435 312
duke@435 313 //-----------------------combine_exception_states------------------------------
duke@435 314 // This helper function combines exception states by building phis on a
duke@435 315 // specially marked state-merging region. These regions and phis are
duke@435 316 // untransformed, and can build up gradually. The region is marked by
duke@435 317 // having a control input of its exception map, rather than NULL. Such
duke@435 318 // regions do not appear except in this function, and in use_exception_state.
duke@435 319 void GraphKit::combine_exception_states(SafePointNode* ex_map, SafePointNode* phi_map) {
duke@435 320 if (failing()) return; // dying anyway...
duke@435 321 JVMState* ex_jvms = ex_map->_jvms;
duke@435 322 assert(ex_jvms->same_calls_as(phi_map->_jvms), "consistent call chains");
duke@435 323 assert(ex_jvms->stkoff() == phi_map->_jvms->stkoff(), "matching locals");
duke@435 324 assert(ex_jvms->sp() == phi_map->_jvms->sp(), "matching stack sizes");
duke@435 325 assert(ex_jvms->monoff() == phi_map->_jvms->monoff(), "matching JVMS");
duke@435 326 assert(ex_map->req() == phi_map->req(), "matching maps");
duke@435 327 uint tos = ex_jvms->stkoff() + ex_jvms->sp();
duke@435 328 Node* hidden_merge_mark = root();
duke@435 329 Node* region = phi_map->control();
duke@435 330 MergeMemNode* phi_mem = phi_map->merged_memory();
duke@435 331 MergeMemNode* ex_mem = ex_map->merged_memory();
duke@435 332 if (region->in(0) != hidden_merge_mark) {
duke@435 333 // The control input is not (yet) a specially-marked region in phi_map.
duke@435 334 // Make it so, and build some phis.
duke@435 335 region = new (C, 2) RegionNode(2);
duke@435 336 _gvn.set_type(region, Type::CONTROL);
duke@435 337 region->set_req(0, hidden_merge_mark); // marks an internal ex-state
duke@435 338 region->init_req(1, phi_map->control());
duke@435 339 phi_map->set_control(region);
duke@435 340 Node* io_phi = PhiNode::make(region, phi_map->i_o(), Type::ABIO);
duke@435 341 record_for_igvn(io_phi);
duke@435 342 _gvn.set_type(io_phi, Type::ABIO);
duke@435 343 phi_map->set_i_o(io_phi);
duke@435 344 for (MergeMemStream mms(phi_mem); mms.next_non_empty(); ) {
duke@435 345 Node* m = mms.memory();
duke@435 346 Node* m_phi = PhiNode::make(region, m, Type::MEMORY, mms.adr_type(C));
duke@435 347 record_for_igvn(m_phi);
duke@435 348 _gvn.set_type(m_phi, Type::MEMORY);
duke@435 349 mms.set_memory(m_phi);
duke@435 350 }
duke@435 351 }
duke@435 352
duke@435 353 // Either or both of phi_map and ex_map might already be converted into phis.
duke@435 354 Node* ex_control = ex_map->control();
duke@435 355 // if there is special marking on ex_map also, we add multiple edges from src
duke@435 356 bool add_multiple = (ex_control->in(0) == hidden_merge_mark);
duke@435 357 // how wide was the destination phi_map, originally?
duke@435 358 uint orig_width = region->req();
duke@435 359
duke@435 360 if (add_multiple) {
duke@435 361 add_n_reqs(region, ex_control);
duke@435 362 add_n_reqs(phi_map->i_o(), ex_map->i_o());
duke@435 363 } else {
duke@435 364 // ex_map has no merges, so we just add single edges everywhere
duke@435 365 add_one_req(region, ex_control);
duke@435 366 add_one_req(phi_map->i_o(), ex_map->i_o());
duke@435 367 }
duke@435 368 for (MergeMemStream mms(phi_mem, ex_mem); mms.next_non_empty2(); ) {
duke@435 369 if (mms.is_empty()) {
duke@435 370 // get a copy of the base memory, and patch some inputs into it
duke@435 371 const TypePtr* adr_type = mms.adr_type(C);
duke@435 372 Node* phi = mms.force_memory()->as_Phi()->slice_memory(adr_type);
duke@435 373 assert(phi->as_Phi()->region() == mms.base_memory()->in(0), "");
duke@435 374 mms.set_memory(phi);
duke@435 375 // Prepare to append interesting stuff onto the newly sliced phi:
duke@435 376 while (phi->req() > orig_width) phi->del_req(phi->req()-1);
duke@435 377 }
duke@435 378 // Append stuff from ex_map:
duke@435 379 if (add_multiple) {
duke@435 380 add_n_reqs(mms.memory(), mms.memory2());
duke@435 381 } else {
duke@435 382 add_one_req(mms.memory(), mms.memory2());
duke@435 383 }
duke@435 384 }
duke@435 385 uint limit = ex_map->req();
duke@435 386 for (uint i = TypeFunc::Parms; i < limit; i++) {
duke@435 387 // Skip everything in the JVMS after tos. (The ex_oop follows.)
duke@435 388 if (i == tos) i = ex_jvms->monoff();
duke@435 389 Node* src = ex_map->in(i);
duke@435 390 Node* dst = phi_map->in(i);
duke@435 391 if (src != dst) {
duke@435 392 PhiNode* phi;
duke@435 393 if (dst->in(0) != region) {
duke@435 394 dst = phi = PhiNode::make(region, dst, _gvn.type(dst));
duke@435 395 record_for_igvn(phi);
duke@435 396 _gvn.set_type(phi, phi->type());
duke@435 397 phi_map->set_req(i, dst);
duke@435 398 // Prepare to append interesting stuff onto the new phi:
duke@435 399 while (dst->req() > orig_width) dst->del_req(dst->req()-1);
duke@435 400 } else {
duke@435 401 assert(dst->is_Phi(), "nobody else uses a hidden region");
duke@435 402 phi = (PhiNode*)dst;
duke@435 403 }
duke@435 404 if (add_multiple && src->in(0) == ex_control) {
duke@435 405 // Both are phis.
duke@435 406 add_n_reqs(dst, src);
duke@435 407 } else {
duke@435 408 while (dst->req() < region->req()) add_one_req(dst, src);
duke@435 409 }
duke@435 410 const Type* srctype = _gvn.type(src);
duke@435 411 if (phi->type() != srctype) {
duke@435 412 const Type* dsttype = phi->type()->meet(srctype);
duke@435 413 if (phi->type() != dsttype) {
duke@435 414 phi->set_type(dsttype);
duke@435 415 _gvn.set_type(phi, dsttype);
duke@435 416 }
duke@435 417 }
duke@435 418 }
duke@435 419 }
duke@435 420 }
duke@435 421
duke@435 422 //--------------------------use_exception_state--------------------------------
duke@435 423 Node* GraphKit::use_exception_state(SafePointNode* phi_map) {
duke@435 424 if (failing()) { stop(); return top(); }
duke@435 425 Node* region = phi_map->control();
duke@435 426 Node* hidden_merge_mark = root();
duke@435 427 assert(phi_map->jvms()->map() == phi_map, "sanity: 1-1 relation");
duke@435 428 Node* ex_oop = clear_saved_ex_oop(phi_map);
duke@435 429 if (region->in(0) == hidden_merge_mark) {
duke@435 430 // Special marking for internal ex-states. Process the phis now.
duke@435 431 region->set_req(0, region); // now it's an ordinary region
duke@435 432 set_jvms(phi_map->jvms()); // ...so now we can use it as a map
duke@435 433 // Note: Setting the jvms also sets the bci and sp.
duke@435 434 set_control(_gvn.transform(region));
duke@435 435 uint tos = jvms()->stkoff() + sp();
duke@435 436 for (uint i = 1; i < tos; i++) {
duke@435 437 Node* x = phi_map->in(i);
duke@435 438 if (x->in(0) == region) {
duke@435 439 assert(x->is_Phi(), "expected a special phi");
duke@435 440 phi_map->set_req(i, _gvn.transform(x));
duke@435 441 }
duke@435 442 }
duke@435 443 for (MergeMemStream mms(merged_memory()); mms.next_non_empty(); ) {
duke@435 444 Node* x = mms.memory();
duke@435 445 if (x->in(0) == region) {
duke@435 446 assert(x->is_Phi(), "nobody else uses a hidden region");
duke@435 447 mms.set_memory(_gvn.transform(x));
duke@435 448 }
duke@435 449 }
duke@435 450 if (ex_oop->in(0) == region) {
duke@435 451 assert(ex_oop->is_Phi(), "expected a special phi");
duke@435 452 ex_oop = _gvn.transform(ex_oop);
duke@435 453 }
duke@435 454 } else {
duke@435 455 set_jvms(phi_map->jvms());
duke@435 456 }
duke@435 457
duke@435 458 assert(!is_hidden_merge(phi_map->control()), "hidden ex. states cleared");
duke@435 459 assert(!is_hidden_merge(phi_map->i_o()), "hidden ex. states cleared");
duke@435 460 return ex_oop;
duke@435 461 }
duke@435 462
duke@435 463 //---------------------------------java_bc-------------------------------------
duke@435 464 Bytecodes::Code GraphKit::java_bc() const {
duke@435 465 ciMethod* method = this->method();
duke@435 466 int bci = this->bci();
duke@435 467 if (method != NULL && bci != InvocationEntryBci)
duke@435 468 return method->java_code_at_bci(bci);
duke@435 469 else
duke@435 470 return Bytecodes::_illegal;
duke@435 471 }
duke@435 472
dcubed@1648 473 void GraphKit::uncommon_trap_if_should_post_on_exceptions(Deoptimization::DeoptReason reason,
dcubed@1648 474 bool must_throw) {
dcubed@1648 475 // if the exception capability is set, then we will generate code
dcubed@1648 476 // to check the JavaThread.should_post_on_exceptions flag to see
dcubed@1648 477 // if we actually need to report exception events (for this
dcubed@1648 478 // thread). If we don't need to report exception events, we will
dcubed@1648 479 // take the normal fast path provided by add_exception_events. If
dcubed@1648 480 // exception event reporting is enabled for this thread, we will
dcubed@1648 481 // take the uncommon_trap in the BuildCutout below.
dcubed@1648 482
dcubed@1648 483 // first must access the should_post_on_exceptions_flag in this thread's JavaThread
dcubed@1648 484 Node* jthread = _gvn.transform(new (C, 1) ThreadLocalNode());
dcubed@1648 485 Node* adr = basic_plus_adr(top(), jthread, in_bytes(JavaThread::should_post_on_exceptions_flag_offset()));
dcubed@1648 486 Node* should_post_flag = make_load(control(), adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw, false);
dcubed@1648 487
dcubed@1648 488 // Test the should_post_on_exceptions_flag vs. 0
dcubed@1648 489 Node* chk = _gvn.transform( new (C, 3) CmpINode(should_post_flag, intcon(0)) );
dcubed@1648 490 Node* tst = _gvn.transform( new (C, 2) BoolNode(chk, BoolTest::eq) );
dcubed@1648 491
dcubed@1648 492 // Branch to slow_path if should_post_on_exceptions_flag was true
dcubed@1648 493 { BuildCutout unless(this, tst, PROB_MAX);
dcubed@1648 494 // Do not try anything fancy if we're notifying the VM on every throw.
dcubed@1648 495 // Cf. case Bytecodes::_athrow in parse2.cpp.
dcubed@1648 496 uncommon_trap(reason, Deoptimization::Action_none,
dcubed@1648 497 (ciKlass*)NULL, (char*)NULL, must_throw);
dcubed@1648 498 }
dcubed@1648 499
dcubed@1648 500 }
dcubed@1648 501
duke@435 502 //------------------------------builtin_throw----------------------------------
duke@435 503 void GraphKit::builtin_throw(Deoptimization::DeoptReason reason, Node* arg) {
duke@435 504 bool must_throw = true;
duke@435 505
dcubed@1648 506 if (env()->jvmti_can_post_on_exceptions()) {
dcubed@1648 507 // check if we must post exception events, take uncommon trap if so
dcubed@1648 508 uncommon_trap_if_should_post_on_exceptions(reason, must_throw);
dcubed@1648 509 // here if should_post_on_exceptions is false
dcubed@1648 510 // continue on with the normal codegen
duke@435 511 }
duke@435 512
duke@435 513 // If this particular condition has not yet happened at this
duke@435 514 // bytecode, then use the uncommon trap mechanism, and allow for
duke@435 515 // a future recompilation if several traps occur here.
duke@435 516 // If the throw is hot, try to use a more complicated inline mechanism
duke@435 517 // which keeps execution inside the compiled code.
duke@435 518 bool treat_throw_as_hot = false;
duke@435 519 ciMethodData* md = method()->method_data();
duke@435 520
duke@435 521 if (ProfileTraps) {
duke@435 522 if (too_many_traps(reason)) {
duke@435 523 treat_throw_as_hot = true;
duke@435 524 }
duke@435 525 // (If there is no MDO at all, assume it is early in
duke@435 526 // execution, and that any deopts are part of the
duke@435 527 // startup transient, and don't need to be remembered.)
duke@435 528
duke@435 529 // Also, if there is a local exception handler, treat all throws
duke@435 530 // as hot if there has been at least one in this method.
duke@435 531 if (C->trap_count(reason) != 0
duke@435 532 && method()->method_data()->trap_count(reason) != 0
duke@435 533 && has_ex_handler()) {
duke@435 534 treat_throw_as_hot = true;
duke@435 535 }
duke@435 536 }
duke@435 537
duke@435 538 // If this throw happens frequently, an uncommon trap might cause
duke@435 539 // a performance pothole. If there is a local exception handler,
duke@435 540 // and if this particular bytecode appears to be deoptimizing often,
duke@435 541 // let us handle the throw inline, with a preconstructed instance.
duke@435 542 // Note: If the deopt count has blown up, the uncommon trap
duke@435 543 // runtime is going to flush this nmethod, not matter what.
duke@435 544 if (treat_throw_as_hot
duke@435 545 && (!StackTraceInThrowable || OmitStackTraceInFastThrow)) {
duke@435 546 // If the throw is local, we use a pre-existing instance and
duke@435 547 // punt on the backtrace. This would lead to a missing backtrace
duke@435 548 // (a repeat of 4292742) if the backtrace object is ever asked
duke@435 549 // for its backtrace.
duke@435 550 // Fixing this remaining case of 4292742 requires some flavor of
duke@435 551 // escape analysis. Leave that for the future.
duke@435 552 ciInstance* ex_obj = NULL;
duke@435 553 switch (reason) {
duke@435 554 case Deoptimization::Reason_null_check:
duke@435 555 ex_obj = env()->NullPointerException_instance();
duke@435 556 break;
duke@435 557 case Deoptimization::Reason_div0_check:
duke@435 558 ex_obj = env()->ArithmeticException_instance();
duke@435 559 break;
duke@435 560 case Deoptimization::Reason_range_check:
duke@435 561 ex_obj = env()->ArrayIndexOutOfBoundsException_instance();
duke@435 562 break;
duke@435 563 case Deoptimization::Reason_class_check:
duke@435 564 if (java_bc() == Bytecodes::_aastore) {
duke@435 565 ex_obj = env()->ArrayStoreException_instance();
duke@435 566 } else {
duke@435 567 ex_obj = env()->ClassCastException_instance();
duke@435 568 }
duke@435 569 break;
duke@435 570 }
duke@435 571 if (failing()) { stop(); return; } // exception allocation might fail
duke@435 572 if (ex_obj != NULL) {
duke@435 573 // Cheat with a preallocated exception object.
duke@435 574 if (C->log() != NULL)
duke@435 575 C->log()->elem("hot_throw preallocated='1' reason='%s'",
duke@435 576 Deoptimization::trap_reason_name(reason));
duke@435 577 const TypeInstPtr* ex_con = TypeInstPtr::make(ex_obj);
kvn@599 578 Node* ex_node = _gvn.transform( ConNode::make(C, ex_con) );
duke@435 579
duke@435 580 // Clear the detail message of the preallocated exception object.
duke@435 581 // Weblogic sometimes mutates the detail message of exceptions
duke@435 582 // using reflection.
duke@435 583 int offset = java_lang_Throwable::get_detailMessage_offset();
duke@435 584 const TypePtr* adr_typ = ex_con->add_offset(offset);
duke@435 585
duke@435 586 Node *adr = basic_plus_adr(ex_node, ex_node, offset);
kvn@2307 587 const TypeOopPtr* val_type = TypeOopPtr::make_from_klass(env()->String_klass());
kvn@2307 588 Node *store = store_oop_to_object(control(), ex_node, adr, adr_typ, null(), val_type, T_OBJECT);
duke@435 589
duke@435 590 add_exception_state(make_exception_state(ex_node));
duke@435 591 return;
duke@435 592 }
duke@435 593 }
duke@435 594
duke@435 595 // %%% Maybe add entry to OptoRuntime which directly throws the exc.?
duke@435 596 // It won't be much cheaper than bailing to the interp., since we'll
duke@435 597 // have to pass up all the debug-info, and the runtime will have to
duke@435 598 // create the stack trace.
duke@435 599
duke@435 600 // Usual case: Bail to interpreter.
duke@435 601 // Reserve the right to recompile if we haven't seen anything yet.
duke@435 602
duke@435 603 Deoptimization::DeoptAction action = Deoptimization::Action_maybe_recompile;
duke@435 604 if (treat_throw_as_hot
duke@435 605 && (method()->method_data()->trap_recompiled_at(bci())
duke@435 606 || C->too_many_traps(reason))) {
duke@435 607 // We cannot afford to take more traps here. Suffer in the interpreter.
duke@435 608 if (C->log() != NULL)
duke@435 609 C->log()->elem("hot_throw preallocated='0' reason='%s' mcount='%d'",
duke@435 610 Deoptimization::trap_reason_name(reason),
duke@435 611 C->trap_count(reason));
duke@435 612 action = Deoptimization::Action_none;
duke@435 613 }
duke@435 614
duke@435 615 // "must_throw" prunes the JVM state to include only the stack, if there
duke@435 616 // are no local exception handlers. This should cut down on register
duke@435 617 // allocation time and code size, by drastically reducing the number
duke@435 618 // of in-edges on the call to the uncommon trap.
duke@435 619
duke@435 620 uncommon_trap(reason, action, (ciKlass*)NULL, (char*)NULL, must_throw);
duke@435 621 }
duke@435 622
duke@435 623
duke@435 624 //----------------------------PreserveJVMState---------------------------------
duke@435 625 PreserveJVMState::PreserveJVMState(GraphKit* kit, bool clone_map) {
duke@435 626 debug_only(kit->verify_map());
duke@435 627 _kit = kit;
duke@435 628 _map = kit->map(); // preserve the map
duke@435 629 _sp = kit->sp();
duke@435 630 kit->set_map(clone_map ? kit->clone_map() : NULL);
duke@435 631 #ifdef ASSERT
duke@435 632 _bci = kit->bci();
duke@435 633 Parse* parser = kit->is_Parse();
never@802 634 int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->rpo();
duke@435 635 _block = block;
duke@435 636 #endif
duke@435 637 }
duke@435 638 PreserveJVMState::~PreserveJVMState() {
duke@435 639 GraphKit* kit = _kit;
duke@435 640 #ifdef ASSERT
duke@435 641 assert(kit->bci() == _bci, "bci must not shift");
duke@435 642 Parse* parser = kit->is_Parse();
never@802 643 int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->rpo();
duke@435 644 assert(block == _block, "block must not shift");
duke@435 645 #endif
duke@435 646 kit->set_map(_map);
duke@435 647 kit->set_sp(_sp);
duke@435 648 }
duke@435 649
duke@435 650
duke@435 651 //-----------------------------BuildCutout-------------------------------------
duke@435 652 BuildCutout::BuildCutout(GraphKit* kit, Node* p, float prob, float cnt)
duke@435 653 : PreserveJVMState(kit)
duke@435 654 {
duke@435 655 assert(p->is_Con() || p->is_Bool(), "test must be a bool");
duke@435 656 SafePointNode* outer_map = _map; // preserved map is caller's
duke@435 657 SafePointNode* inner_map = kit->map();
duke@435 658 IfNode* iff = kit->create_and_map_if(outer_map->control(), p, prob, cnt);
duke@435 659 outer_map->set_control(kit->gvn().transform( new (kit->C, 1) IfTrueNode(iff) ));
duke@435 660 inner_map->set_control(kit->gvn().transform( new (kit->C, 1) IfFalseNode(iff) ));
duke@435 661 }
duke@435 662 BuildCutout::~BuildCutout() {
duke@435 663 GraphKit* kit = _kit;
duke@435 664 assert(kit->stopped(), "cutout code must stop, throw, return, etc.");
duke@435 665 }
duke@435 666
cfang@1335 667 //---------------------------PreserveReexecuteState----------------------------
cfang@1335 668 PreserveReexecuteState::PreserveReexecuteState(GraphKit* kit) {
kvn@1385 669 assert(!kit->stopped(), "must call stopped() before");
cfang@1335 670 _kit = kit;
cfang@1335 671 _sp = kit->sp();
cfang@1335 672 _reexecute = kit->jvms()->_reexecute;
cfang@1335 673 }
cfang@1335 674 PreserveReexecuteState::~PreserveReexecuteState() {
kvn@1385 675 if (_kit->stopped()) return;
cfang@1335 676 _kit->jvms()->_reexecute = _reexecute;
cfang@1335 677 _kit->set_sp(_sp);
cfang@1335 678 }
duke@435 679
duke@435 680 //------------------------------clone_map--------------------------------------
duke@435 681 // Implementation of PreserveJVMState
duke@435 682 //
duke@435 683 // Only clone_map(...) here. If this function is only used in the
duke@435 684 // PreserveJVMState class we may want to get rid of this extra
duke@435 685 // function eventually and do it all there.
duke@435 686
duke@435 687 SafePointNode* GraphKit::clone_map() {
duke@435 688 if (map() == NULL) return NULL;
duke@435 689
duke@435 690 // Clone the memory edge first
duke@435 691 Node* mem = MergeMemNode::make(C, map()->memory());
duke@435 692 gvn().set_type_bottom(mem);
duke@435 693
duke@435 694 SafePointNode *clonemap = (SafePointNode*)map()->clone();
duke@435 695 JVMState* jvms = this->jvms();
duke@435 696 JVMState* clonejvms = jvms->clone_shallow(C);
duke@435 697 clonemap->set_memory(mem);
duke@435 698 clonemap->set_jvms(clonejvms);
duke@435 699 clonejvms->set_map(clonemap);
duke@435 700 record_for_igvn(clonemap);
duke@435 701 gvn().set_type_bottom(clonemap);
duke@435 702 return clonemap;
duke@435 703 }
duke@435 704
duke@435 705
duke@435 706 //-----------------------------set_map_clone-----------------------------------
duke@435 707 void GraphKit::set_map_clone(SafePointNode* m) {
duke@435 708 _map = m;
duke@435 709 _map = clone_map();
duke@435 710 _map->set_next_exception(NULL);
duke@435 711 debug_only(verify_map());
duke@435 712 }
duke@435 713
duke@435 714
duke@435 715 //----------------------------kill_dead_locals---------------------------------
duke@435 716 // Detect any locals which are known to be dead, and force them to top.
duke@435 717 void GraphKit::kill_dead_locals() {
duke@435 718 // Consult the liveness information for the locals. If any
duke@435 719 // of them are unused, then they can be replaced by top(). This
duke@435 720 // should help register allocation time and cut down on the size
duke@435 721 // of the deoptimization information.
duke@435 722
duke@435 723 // This call is made from many of the bytecode handling
duke@435 724 // subroutines called from the Big Switch in do_one_bytecode.
duke@435 725 // Every bytecode which might include a slow path is responsible
duke@435 726 // for killing its dead locals. The more consistent we
duke@435 727 // are about killing deads, the fewer useless phis will be
duke@435 728 // constructed for them at various merge points.
duke@435 729
duke@435 730 // bci can be -1 (InvocationEntryBci). We return the entry
duke@435 731 // liveness for the method.
duke@435 732
duke@435 733 if (method() == NULL || method()->code_size() == 0) {
duke@435 734 // We are building a graph for a call to a native method.
duke@435 735 // All locals are live.
duke@435 736 return;
duke@435 737 }
duke@435 738
duke@435 739 ResourceMark rm;
duke@435 740
duke@435 741 // Consult the liveness information for the locals. If any
duke@435 742 // of them are unused, then they can be replaced by top(). This
duke@435 743 // should help register allocation time and cut down on the size
duke@435 744 // of the deoptimization information.
duke@435 745 MethodLivenessResult live_locals = method()->liveness_at_bci(bci());
duke@435 746
duke@435 747 int len = (int)live_locals.size();
duke@435 748 assert(len <= jvms()->loc_size(), "too many live locals");
duke@435 749 for (int local = 0; local < len; local++) {
duke@435 750 if (!live_locals.at(local)) {
duke@435 751 set_local(local, top());
duke@435 752 }
duke@435 753 }
duke@435 754 }
duke@435 755
duke@435 756 #ifdef ASSERT
duke@435 757 //-------------------------dead_locals_are_killed------------------------------
duke@435 758 // Return true if all dead locals are set to top in the map.
duke@435 759 // Used to assert "clean" debug info at various points.
duke@435 760 bool GraphKit::dead_locals_are_killed() {
duke@435 761 if (method() == NULL || method()->code_size() == 0) {
duke@435 762 // No locals need to be dead, so all is as it should be.
duke@435 763 return true;
duke@435 764 }
duke@435 765
duke@435 766 // Make sure somebody called kill_dead_locals upstream.
duke@435 767 ResourceMark rm;
duke@435 768 for (JVMState* jvms = this->jvms(); jvms != NULL; jvms = jvms->caller()) {
duke@435 769 if (jvms->loc_size() == 0) continue; // no locals to consult
duke@435 770 SafePointNode* map = jvms->map();
duke@435 771 ciMethod* method = jvms->method();
duke@435 772 int bci = jvms->bci();
duke@435 773 if (jvms == this->jvms()) {
duke@435 774 bci = this->bci(); // it might not yet be synched
duke@435 775 }
duke@435 776 MethodLivenessResult live_locals = method->liveness_at_bci(bci);
duke@435 777 int len = (int)live_locals.size();
duke@435 778 if (!live_locals.is_valid() || len == 0)
duke@435 779 // This method is trivial, or is poisoned by a breakpoint.
duke@435 780 return true;
duke@435 781 assert(len == jvms->loc_size(), "live map consistent with locals map");
duke@435 782 for (int local = 0; local < len; local++) {
duke@435 783 if (!live_locals.at(local) && map->local(jvms, local) != top()) {
duke@435 784 if (PrintMiscellaneous && (Verbose || WizardMode)) {
duke@435 785 tty->print_cr("Zombie local %d: ", local);
duke@435 786 jvms->dump();
duke@435 787 }
duke@435 788 return false;
duke@435 789 }
duke@435 790 }
duke@435 791 }
duke@435 792 return true;
duke@435 793 }
duke@435 794
duke@435 795 #endif //ASSERT
duke@435 796
cfang@1335 797 // Helper function for enforcing certain bytecodes to reexecute if
cfang@1335 798 // deoptimization happens
kvn@1687 799 static bool should_reexecute_implied_by_bytecode(JVMState *jvms, bool is_anewarray) {
cfang@1335 800 ciMethod* cur_method = jvms->method();
cfang@1335 801 int cur_bci = jvms->bci();
cfang@1335 802 if (cur_method != NULL && cur_bci != InvocationEntryBci) {
cfang@1335 803 Bytecodes::Code code = cur_method->java_code_at_bci(cur_bci);
kvn@1687 804 return Interpreter::bytecode_should_reexecute(code) ||
kvn@1687 805 is_anewarray && code == Bytecodes::_multianewarray;
kvn@1687 806 // Reexecute _multianewarray bytecode which was replaced with
kvn@1687 807 // sequence of [a]newarray. See Parse::do_multianewarray().
kvn@1687 808 //
kvn@1687 809 // Note: interpreter should not have it set since this optimization
kvn@1687 810 // is limited by dimensions and guarded by flag so in some cases
kvn@1687 811 // multianewarray() runtime calls will be generated and
kvn@1687 812 // the bytecode should not be reexecutes (stack will not be reset).
cfang@1335 813 } else
cfang@1335 814 return false;
cfang@1335 815 }
cfang@1335 816
duke@435 817 // Helper function for adding JVMState and debug information to node
duke@435 818 void GraphKit::add_safepoint_edges(SafePointNode* call, bool must_throw) {
duke@435 819 // Add the safepoint edges to the call (or other safepoint).
duke@435 820
duke@435 821 // Make sure dead locals are set to top. This
duke@435 822 // should help register allocation time and cut down on the size
duke@435 823 // of the deoptimization information.
duke@435 824 assert(dead_locals_are_killed(), "garbage in debug info before safepoint");
duke@435 825
duke@435 826 // Walk the inline list to fill in the correct set of JVMState's
duke@435 827 // Also fill in the associated edges for each JVMState.
duke@435 828
duke@435 829 JVMState* youngest_jvms = sync_jvms();
duke@435 830
duke@435 831 // If we are guaranteed to throw, we can prune everything but the
duke@435 832 // input to the current bytecode.
duke@435 833 bool can_prune_locals = false;
duke@435 834 uint stack_slots_not_pruned = 0;
duke@435 835 int inputs = 0, depth = 0;
duke@435 836 if (must_throw) {
duke@435 837 assert(method() == youngest_jvms->method(), "sanity");
duke@435 838 if (compute_stack_effects(inputs, depth)) {
duke@435 839 can_prune_locals = true;
duke@435 840 stack_slots_not_pruned = inputs;
duke@435 841 }
duke@435 842 }
duke@435 843
never@1832 844 if (env()->jvmti_can_access_local_variables()) {
duke@435 845 // At any safepoint, this method can get breakpointed, which would
duke@435 846 // then require an immediate deoptimization.
duke@435 847 can_prune_locals = false; // do not prune locals
duke@435 848 stack_slots_not_pruned = 0;
duke@435 849 }
duke@435 850
duke@435 851 // do not scribble on the input jvms
duke@435 852 JVMState* out_jvms = youngest_jvms->clone_deep(C);
duke@435 853 call->set_jvms(out_jvms); // Start jvms list for call node
duke@435 854
cfang@1335 855 // For a known set of bytecodes, the interpreter should reexecute them if
cfang@1335 856 // deoptimization happens. We set the reexecute state for them here
cfang@1335 857 if (out_jvms->is_reexecute_undefined() && //don't change if already specified
kvn@1687 858 should_reexecute_implied_by_bytecode(out_jvms, call->is_AllocateArray())) {
cfang@1335 859 out_jvms->set_should_reexecute(true); //NOTE: youngest_jvms not changed
cfang@1335 860 }
cfang@1335 861
duke@435 862 // Presize the call:
duke@435 863 debug_only(uint non_debug_edges = call->req());
duke@435 864 call->add_req_batch(top(), youngest_jvms->debug_depth());
duke@435 865 assert(call->req() == non_debug_edges + youngest_jvms->debug_depth(), "");
duke@435 866
duke@435 867 // Set up edges so that the call looks like this:
duke@435 868 // Call [state:] ctl io mem fptr retadr
duke@435 869 // [parms:] parm0 ... parmN
duke@435 870 // [root:] loc0 ... locN stk0 ... stkSP mon0 obj0 ... monN objN
duke@435 871 // [...mid:] loc0 ... locN stk0 ... stkSP mon0 obj0 ... monN objN [...]
duke@435 872 // [young:] loc0 ... locN stk0 ... stkSP mon0 obj0 ... monN objN
duke@435 873 // Note that caller debug info precedes callee debug info.
duke@435 874
duke@435 875 // Fill pointer walks backwards from "young:" to "root:" in the diagram above:
duke@435 876 uint debug_ptr = call->req();
duke@435 877
duke@435 878 // Loop over the map input edges associated with jvms, add them
duke@435 879 // to the call node, & reset all offsets to match call node array.
duke@435 880 for (JVMState* in_jvms = youngest_jvms; in_jvms != NULL; ) {
duke@435 881 uint debug_end = debug_ptr;
duke@435 882 uint debug_start = debug_ptr - in_jvms->debug_size();
duke@435 883 debug_ptr = debug_start; // back up the ptr
duke@435 884
duke@435 885 uint p = debug_start; // walks forward in [debug_start, debug_end)
duke@435 886 uint j, k, l;
duke@435 887 SafePointNode* in_map = in_jvms->map();
duke@435 888 out_jvms->set_map(call);
duke@435 889
duke@435 890 if (can_prune_locals) {
duke@435 891 assert(in_jvms->method() == out_jvms->method(), "sanity");
duke@435 892 // If the current throw can reach an exception handler in this JVMS,
duke@435 893 // then we must keep everything live that can reach that handler.
duke@435 894 // As a quick and dirty approximation, we look for any handlers at all.
duke@435 895 if (in_jvms->method()->has_exception_handlers()) {
duke@435 896 can_prune_locals = false;
duke@435 897 }
duke@435 898 }
duke@435 899
duke@435 900 // Add the Locals
duke@435 901 k = in_jvms->locoff();
duke@435 902 l = in_jvms->loc_size();
duke@435 903 out_jvms->set_locoff(p);
never@1832 904 if (!can_prune_locals) {
duke@435 905 for (j = 0; j < l; j++)
duke@435 906 call->set_req(p++, in_map->in(k+j));
duke@435 907 } else {
duke@435 908 p += l; // already set to top above by add_req_batch
duke@435 909 }
duke@435 910
duke@435 911 // Add the Expression Stack
duke@435 912 k = in_jvms->stkoff();
duke@435 913 l = in_jvms->sp();
duke@435 914 out_jvms->set_stkoff(p);
never@1832 915 if (!can_prune_locals) {
duke@435 916 for (j = 0; j < l; j++)
duke@435 917 call->set_req(p++, in_map->in(k+j));
duke@435 918 } else if (can_prune_locals && stack_slots_not_pruned != 0) {
duke@435 919 // Divide stack into {S0,...,S1}, where S0 is set to top.
duke@435 920 uint s1 = stack_slots_not_pruned;
duke@435 921 stack_slots_not_pruned = 0; // for next iteration
duke@435 922 if (s1 > l) s1 = l;
duke@435 923 uint s0 = l - s1;
duke@435 924 p += s0; // skip the tops preinstalled by add_req_batch
duke@435 925 for (j = s0; j < l; j++)
duke@435 926 call->set_req(p++, in_map->in(k+j));
duke@435 927 } else {
duke@435 928 p += l; // already set to top above by add_req_batch
duke@435 929 }
duke@435 930
duke@435 931 // Add the Monitors
duke@435 932 k = in_jvms->monoff();
duke@435 933 l = in_jvms->mon_size();
duke@435 934 out_jvms->set_monoff(p);
duke@435 935 for (j = 0; j < l; j++)
duke@435 936 call->set_req(p++, in_map->in(k+j));
duke@435 937
kvn@498 938 // Copy any scalar object fields.
kvn@498 939 k = in_jvms->scloff();
kvn@498 940 l = in_jvms->scl_size();
kvn@498 941 out_jvms->set_scloff(p);
kvn@498 942 for (j = 0; j < l; j++)
kvn@498 943 call->set_req(p++, in_map->in(k+j));
kvn@498 944
duke@435 945 // Finish the new jvms.
duke@435 946 out_jvms->set_endoff(p);
duke@435 947
duke@435 948 assert(out_jvms->endoff() == debug_end, "fill ptr must match");
duke@435 949 assert(out_jvms->depth() == in_jvms->depth(), "depth must match");
duke@435 950 assert(out_jvms->loc_size() == in_jvms->loc_size(), "size must match");
duke@435 951 assert(out_jvms->mon_size() == in_jvms->mon_size(), "size must match");
kvn@498 952 assert(out_jvms->scl_size() == in_jvms->scl_size(), "size must match");
duke@435 953 assert(out_jvms->debug_size() == in_jvms->debug_size(), "size must match");
duke@435 954
duke@435 955 // Update the two tail pointers in parallel.
duke@435 956 out_jvms = out_jvms->caller();
duke@435 957 in_jvms = in_jvms->caller();
duke@435 958 }
duke@435 959
duke@435 960 assert(debug_ptr == non_debug_edges, "debug info must fit exactly");
duke@435 961
duke@435 962 // Test the correctness of JVMState::debug_xxx accessors:
duke@435 963 assert(call->jvms()->debug_start() == non_debug_edges, "");
duke@435 964 assert(call->jvms()->debug_end() == call->req(), "");
duke@435 965 assert(call->jvms()->debug_depth() == call->req() - non_debug_edges, "");
duke@435 966 }
duke@435 967
duke@435 968 bool GraphKit::compute_stack_effects(int& inputs, int& depth) {
duke@435 969 Bytecodes::Code code = java_bc();
duke@435 970 if (code == Bytecodes::_wide) {
duke@435 971 code = method()->java_code_at_bci(bci() + 1);
duke@435 972 }
duke@435 973
duke@435 974 BasicType rtype = T_ILLEGAL;
duke@435 975 int rsize = 0;
duke@435 976
duke@435 977 if (code != Bytecodes::_illegal) {
duke@435 978 depth = Bytecodes::depth(code); // checkcast=0, athrow=-1
duke@435 979 rtype = Bytecodes::result_type(code); // checkcast=P, athrow=V
duke@435 980 if (rtype < T_CONFLICT)
duke@435 981 rsize = type2size[rtype];
duke@435 982 }
duke@435 983
duke@435 984 switch (code) {
duke@435 985 case Bytecodes::_illegal:
duke@435 986 return false;
duke@435 987
duke@435 988 case Bytecodes::_ldc:
duke@435 989 case Bytecodes::_ldc_w:
duke@435 990 case Bytecodes::_ldc2_w:
duke@435 991 inputs = 0;
duke@435 992 break;
duke@435 993
duke@435 994 case Bytecodes::_dup: inputs = 1; break;
duke@435 995 case Bytecodes::_dup_x1: inputs = 2; break;
duke@435 996 case Bytecodes::_dup_x2: inputs = 3; break;
duke@435 997 case Bytecodes::_dup2: inputs = 2; break;
duke@435 998 case Bytecodes::_dup2_x1: inputs = 3; break;
duke@435 999 case Bytecodes::_dup2_x2: inputs = 4; break;
duke@435 1000 case Bytecodes::_swap: inputs = 2; break;
duke@435 1001 case Bytecodes::_arraylength: inputs = 1; break;
duke@435 1002
duke@435 1003 case Bytecodes::_getstatic:
duke@435 1004 case Bytecodes::_putstatic:
duke@435 1005 case Bytecodes::_getfield:
duke@435 1006 case Bytecodes::_putfield:
duke@435 1007 {
duke@435 1008 bool is_get = (depth >= 0), is_static = (depth & 1);
duke@435 1009 bool ignore;
duke@435 1010 ciBytecodeStream iter(method());
duke@435 1011 iter.reset_to_bci(bci());
duke@435 1012 iter.next();
duke@435 1013 ciField* field = iter.get_field(ignore);
duke@435 1014 int size = field->type()->size();
duke@435 1015 inputs = (is_static ? 0 : 1);
duke@435 1016 if (is_get) {
duke@435 1017 depth = size - inputs;
duke@435 1018 } else {
duke@435 1019 inputs += size; // putxxx pops the value from the stack
duke@435 1020 depth = - inputs;
duke@435 1021 }
duke@435 1022 }
duke@435 1023 break;
duke@435 1024
duke@435 1025 case Bytecodes::_invokevirtual:
duke@435 1026 case Bytecodes::_invokespecial:
duke@435 1027 case Bytecodes::_invokestatic:
jrose@1161 1028 case Bytecodes::_invokedynamic:
duke@435 1029 case Bytecodes::_invokeinterface:
duke@435 1030 {
duke@435 1031 bool ignore;
duke@435 1032 ciBytecodeStream iter(method());
duke@435 1033 iter.reset_to_bci(bci());
duke@435 1034 iter.next();
duke@435 1035 ciMethod* method = iter.get_method(ignore);
duke@435 1036 inputs = method->arg_size_no_receiver();
twisti@1572 1037 // Add a receiver argument, maybe:
twisti@1572 1038 if (code != Bytecodes::_invokestatic &&
twisti@1572 1039 code != Bytecodes::_invokedynamic)
twisti@1572 1040 inputs += 1;
twisti@1572 1041 // (Do not use ciMethod::arg_size(), because
twisti@1572 1042 // it might be an unloaded method, which doesn't
twisti@1572 1043 // know whether it is static or not.)
duke@435 1044 int size = method->return_type()->size();
duke@435 1045 depth = size - inputs;
duke@435 1046 }
duke@435 1047 break;
duke@435 1048
duke@435 1049 case Bytecodes::_multianewarray:
duke@435 1050 {
duke@435 1051 ciBytecodeStream iter(method());
duke@435 1052 iter.reset_to_bci(bci());
duke@435 1053 iter.next();
duke@435 1054 inputs = iter.get_dimensions();
duke@435 1055 assert(rsize == 1, "");
duke@435 1056 depth = rsize - inputs;
duke@435 1057 }
duke@435 1058 break;
duke@435 1059
duke@435 1060 case Bytecodes::_ireturn:
duke@435 1061 case Bytecodes::_lreturn:
duke@435 1062 case Bytecodes::_freturn:
duke@435 1063 case Bytecodes::_dreturn:
duke@435 1064 case Bytecodes::_areturn:
duke@435 1065 assert(rsize = -depth, "");
duke@435 1066 inputs = rsize;
duke@435 1067 break;
duke@435 1068
duke@435 1069 case Bytecodes::_jsr:
duke@435 1070 case Bytecodes::_jsr_w:
duke@435 1071 inputs = 0;
duke@435 1072 depth = 1; // S.B. depth=1, not zero
duke@435 1073 break;
duke@435 1074
duke@435 1075 default:
duke@435 1076 // bytecode produces a typed result
duke@435 1077 inputs = rsize - depth;
duke@435 1078 assert(inputs >= 0, "");
duke@435 1079 break;
duke@435 1080 }
duke@435 1081
duke@435 1082 #ifdef ASSERT
duke@435 1083 // spot check
duke@435 1084 int outputs = depth + inputs;
duke@435 1085 assert(outputs >= 0, "sanity");
duke@435 1086 switch (code) {
duke@435 1087 case Bytecodes::_checkcast: assert(inputs == 1 && outputs == 1, ""); break;
duke@435 1088 case Bytecodes::_athrow: assert(inputs == 1 && outputs == 0, ""); break;
duke@435 1089 case Bytecodes::_aload_0: assert(inputs == 0 && outputs == 1, ""); break;
duke@435 1090 case Bytecodes::_return: assert(inputs == 0 && outputs == 0, ""); break;
duke@435 1091 case Bytecodes::_drem: assert(inputs == 4 && outputs == 2, ""); break;
duke@435 1092 }
duke@435 1093 #endif //ASSERT
duke@435 1094
duke@435 1095 return true;
duke@435 1096 }
duke@435 1097
duke@435 1098
duke@435 1099
duke@435 1100 //------------------------------basic_plus_adr---------------------------------
duke@435 1101 Node* GraphKit::basic_plus_adr(Node* base, Node* ptr, Node* offset) {
duke@435 1102 // short-circuit a common case
duke@435 1103 if (offset == intcon(0)) return ptr;
duke@435 1104 return _gvn.transform( new (C, 4) AddPNode(base, ptr, offset) );
duke@435 1105 }
duke@435 1106
duke@435 1107 Node* GraphKit::ConvI2L(Node* offset) {
duke@435 1108 // short-circuit a common case
duke@435 1109 jint offset_con = find_int_con(offset, Type::OffsetBot);
duke@435 1110 if (offset_con != Type::OffsetBot) {
duke@435 1111 return longcon((long) offset_con);
duke@435 1112 }
duke@435 1113 return _gvn.transform( new (C, 2) ConvI2LNode(offset));
duke@435 1114 }
duke@435 1115 Node* GraphKit::ConvL2I(Node* offset) {
duke@435 1116 // short-circuit a common case
duke@435 1117 jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot);
duke@435 1118 if (offset_con != (jlong)Type::OffsetBot) {
duke@435 1119 return intcon((int) offset_con);
duke@435 1120 }
duke@435 1121 return _gvn.transform( new (C, 2) ConvL2INode(offset));
duke@435 1122 }
duke@435 1123
duke@435 1124 //-------------------------load_object_klass-----------------------------------
duke@435 1125 Node* GraphKit::load_object_klass(Node* obj) {
duke@435 1126 // Special-case a fresh allocation to avoid building nodes:
duke@435 1127 Node* akls = AllocateNode::Ideal_klass(obj, &_gvn);
duke@435 1128 if (akls != NULL) return akls;
duke@435 1129 Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
kvn@599 1130 return _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), k_adr, TypeInstPtr::KLASS) );
duke@435 1131 }
duke@435 1132
duke@435 1133 //-------------------------load_array_length-----------------------------------
duke@435 1134 Node* GraphKit::load_array_length(Node* array) {
duke@435 1135 // Special-case a fresh allocation to avoid building nodes:
rasbold@801 1136 AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array, &_gvn);
rasbold@801 1137 Node *alen;
rasbold@801 1138 if (alloc == NULL) {
rasbold@801 1139 Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes());
rasbold@801 1140 alen = _gvn.transform( new (C, 3) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS));
rasbold@801 1141 } else {
rasbold@801 1142 alen = alloc->Ideal_length();
kvn@1389 1143 Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_oopptr(), &_gvn);
rasbold@801 1144 if (ccast != alen) {
rasbold@801 1145 alen = _gvn.transform(ccast);
rasbold@801 1146 }
rasbold@801 1147 }
rasbold@801 1148 return alen;
duke@435 1149 }
duke@435 1150
duke@435 1151 //------------------------------do_null_check----------------------------------
duke@435 1152 // Helper function to do a NULL pointer check. Returned value is
duke@435 1153 // the incoming address with NULL casted away. You are allowed to use the
duke@435 1154 // not-null value only if you are control dependent on the test.
duke@435 1155 extern int explicit_null_checks_inserted,
duke@435 1156 explicit_null_checks_elided;
duke@435 1157 Node* GraphKit::null_check_common(Node* value, BasicType type,
duke@435 1158 // optional arguments for variations:
duke@435 1159 bool assert_null,
duke@435 1160 Node* *null_control) {
duke@435 1161 assert(!assert_null || null_control == NULL, "not both at once");
duke@435 1162 if (stopped()) return top();
duke@435 1163 if (!GenerateCompilerNullChecks && !assert_null && null_control == NULL) {
duke@435 1164 // For some performance testing, we may wish to suppress null checking.
duke@435 1165 value = cast_not_null(value); // Make it appear to be non-null (4962416).
duke@435 1166 return value;
duke@435 1167 }
duke@435 1168 explicit_null_checks_inserted++;
duke@435 1169
duke@435 1170 // Construct NULL check
duke@435 1171 Node *chk = NULL;
duke@435 1172 switch(type) {
duke@435 1173 case T_LONG : chk = new (C, 3) CmpLNode(value, _gvn.zerocon(T_LONG)); break;
duke@435 1174 case T_INT : chk = new (C, 3) CmpINode( value, _gvn.intcon(0)); break;
duke@435 1175 case T_ARRAY : // fall through
duke@435 1176 type = T_OBJECT; // simplify further tests
duke@435 1177 case T_OBJECT : {
duke@435 1178 const Type *t = _gvn.type( value );
duke@435 1179
kvn@1385 1180 const TypeOopPtr* tp = t->isa_oopptr();
kvn@1390 1181 if (tp != NULL && tp->klass() != NULL && !tp->klass()->is_loaded()
duke@435 1182 // Only for do_null_check, not any of its siblings:
duke@435 1183 && !assert_null && null_control == NULL) {
duke@435 1184 // Usually, any field access or invocation on an unloaded oop type
duke@435 1185 // will simply fail to link, since the statically linked class is
duke@435 1186 // likely also to be unloaded. However, in -Xcomp mode, sometimes
duke@435 1187 // the static class is loaded but the sharper oop type is not.
duke@435 1188 // Rather than checking for this obscure case in lots of places,
duke@435 1189 // we simply observe that a null check on an unloaded class
duke@435 1190 // will always be followed by a nonsense operation, so we
duke@435 1191 // can just issue the uncommon trap here.
duke@435 1192 // Our access to the unloaded class will only be correct
duke@435 1193 // after it has been loaded and initialized, which requires
duke@435 1194 // a trip through the interpreter.
duke@435 1195 #ifndef PRODUCT
duke@435 1196 if (WizardMode) { tty->print("Null check of unloaded "); tp->klass()->print(); tty->cr(); }
duke@435 1197 #endif
duke@435 1198 uncommon_trap(Deoptimization::Reason_unloaded,
duke@435 1199 Deoptimization::Action_reinterpret,
duke@435 1200 tp->klass(), "!loaded");
duke@435 1201 return top();
duke@435 1202 }
duke@435 1203
duke@435 1204 if (assert_null) {
duke@435 1205 // See if the type is contained in NULL_PTR.
duke@435 1206 // If so, then the value is already null.
duke@435 1207 if (t->higher_equal(TypePtr::NULL_PTR)) {
duke@435 1208 explicit_null_checks_elided++;
duke@435 1209 return value; // Elided null assert quickly!
duke@435 1210 }
duke@435 1211 } else {
duke@435 1212 // See if mixing in the NULL pointer changes type.
duke@435 1213 // If so, then the NULL pointer was not allowed in the original
duke@435 1214 // type. In other words, "value" was not-null.
duke@435 1215 if (t->meet(TypePtr::NULL_PTR) != t) {
duke@435 1216 // same as: if (!TypePtr::NULL_PTR->higher_equal(t)) ...
duke@435 1217 explicit_null_checks_elided++;
duke@435 1218 return value; // Elided null check quickly!
duke@435 1219 }
duke@435 1220 }
duke@435 1221 chk = new (C, 3) CmpPNode( value, null() );
duke@435 1222 break;
duke@435 1223 }
duke@435 1224
duke@435 1225 default : ShouldNotReachHere();
duke@435 1226 }
duke@435 1227 assert(chk != NULL, "sanity check");
duke@435 1228 chk = _gvn.transform(chk);
duke@435 1229
duke@435 1230 BoolTest::mask btest = assert_null ? BoolTest::eq : BoolTest::ne;
duke@435 1231 BoolNode *btst = new (C, 2) BoolNode( chk, btest);
duke@435 1232 Node *tst = _gvn.transform( btst );
duke@435 1233
duke@435 1234 //-----------
twisti@1040 1235 // if peephole optimizations occurred, a prior test existed.
duke@435 1236 // If a prior test existed, maybe it dominates as we can avoid this test.
duke@435 1237 if (tst != btst && type == T_OBJECT) {
duke@435 1238 // At this point we want to scan up the CFG to see if we can
duke@435 1239 // find an identical test (and so avoid this test altogether).
duke@435 1240 Node *cfg = control();
duke@435 1241 int depth = 0;
duke@435 1242 while( depth < 16 ) { // Limit search depth for speed
duke@435 1243 if( cfg->Opcode() == Op_IfTrue &&
duke@435 1244 cfg->in(0)->in(1) == tst ) {
duke@435 1245 // Found prior test. Use "cast_not_null" to construct an identical
duke@435 1246 // CastPP (and hence hash to) as already exists for the prior test.
duke@435 1247 // Return that casted value.
duke@435 1248 if (assert_null) {
duke@435 1249 replace_in_map(value, null());
duke@435 1250 return null(); // do not issue the redundant test
duke@435 1251 }
duke@435 1252 Node *oldcontrol = control();
duke@435 1253 set_control(cfg);
duke@435 1254 Node *res = cast_not_null(value);
duke@435 1255 set_control(oldcontrol);
duke@435 1256 explicit_null_checks_elided++;
duke@435 1257 return res;
duke@435 1258 }
duke@435 1259 cfg = IfNode::up_one_dom(cfg, /*linear_only=*/ true);
duke@435 1260 if (cfg == NULL) break; // Quit at region nodes
duke@435 1261 depth++;
duke@435 1262 }
duke@435 1263 }
duke@435 1264
duke@435 1265 //-----------
duke@435 1266 // Branch to failure if null
duke@435 1267 float ok_prob = PROB_MAX; // a priori estimate: nulls never happen
duke@435 1268 Deoptimization::DeoptReason reason;
duke@435 1269 if (assert_null)
duke@435 1270 reason = Deoptimization::Reason_null_assert;
duke@435 1271 else if (type == T_OBJECT)
duke@435 1272 reason = Deoptimization::Reason_null_check;
duke@435 1273 else
duke@435 1274 reason = Deoptimization::Reason_div0_check;
duke@435 1275
ysr@777 1276 // %%% Since Reason_unhandled is not recorded on a per-bytecode basis,
ysr@777 1277 // ciMethodData::has_trap_at will return a conservative -1 if any
ysr@777 1278 // must-be-null assertion has failed. This could cause performance
ysr@777 1279 // problems for a method after its first do_null_assert failure.
ysr@777 1280 // Consider using 'Reason_class_check' instead?
ysr@777 1281
duke@435 1282 // To cause an implicit null check, we set the not-null probability
twisti@1040 1283 // to the maximum (PROB_MAX). For an explicit check the probability
duke@435 1284 // is set to a smaller value.
duke@435 1285 if (null_control != NULL || too_many_traps(reason)) {
duke@435 1286 // probability is less likely
duke@435 1287 ok_prob = PROB_LIKELY_MAG(3);
duke@435 1288 } else if (!assert_null &&
duke@435 1289 (ImplicitNullCheckThreshold > 0) &&
duke@435 1290 method() != NULL &&
duke@435 1291 (method()->method_data()->trap_count(reason)
duke@435 1292 >= (uint)ImplicitNullCheckThreshold)) {
duke@435 1293 ok_prob = PROB_LIKELY_MAG(3);
duke@435 1294 }
duke@435 1295
duke@435 1296 if (null_control != NULL) {
duke@435 1297 IfNode* iff = create_and_map_if(control(), tst, ok_prob, COUNT_UNKNOWN);
duke@435 1298 Node* null_true = _gvn.transform( new (C, 1) IfFalseNode(iff));
duke@435 1299 set_control( _gvn.transform( new (C, 1) IfTrueNode(iff)));
duke@435 1300 if (null_true == top())
duke@435 1301 explicit_null_checks_elided++;
duke@435 1302 (*null_control) = null_true;
duke@435 1303 } else {
duke@435 1304 BuildCutout unless(this, tst, ok_prob);
duke@435 1305 // Check for optimizer eliding test at parse time
duke@435 1306 if (stopped()) {
duke@435 1307 // Failure not possible; do not bother making uncommon trap.
duke@435 1308 explicit_null_checks_elided++;
duke@435 1309 } else if (assert_null) {
duke@435 1310 uncommon_trap(reason,
duke@435 1311 Deoptimization::Action_make_not_entrant,
duke@435 1312 NULL, "assert_null");
duke@435 1313 } else {
kvn@767 1314 replace_in_map(value, zerocon(type));
duke@435 1315 builtin_throw(reason);
duke@435 1316 }
duke@435 1317 }
duke@435 1318
duke@435 1319 // Must throw exception, fall-thru not possible?
duke@435 1320 if (stopped()) {
duke@435 1321 return top(); // No result
duke@435 1322 }
duke@435 1323
duke@435 1324 if (assert_null) {
duke@435 1325 // Cast obj to null on this path.
duke@435 1326 replace_in_map(value, zerocon(type));
duke@435 1327 return zerocon(type);
duke@435 1328 }
duke@435 1329
duke@435 1330 // Cast obj to not-null on this path, if there is no null_control.
duke@435 1331 // (If there is a null_control, a non-null value may come back to haunt us.)
duke@435 1332 if (type == T_OBJECT) {
duke@435 1333 Node* cast = cast_not_null(value, false);
duke@435 1334 if (null_control == NULL || (*null_control) == top())
duke@435 1335 replace_in_map(value, cast);
duke@435 1336 value = cast;
duke@435 1337 }
duke@435 1338
duke@435 1339 return value;
duke@435 1340 }
duke@435 1341
duke@435 1342
duke@435 1343 //------------------------------cast_not_null----------------------------------
duke@435 1344 // Cast obj to not-null on this path
duke@435 1345 Node* GraphKit::cast_not_null(Node* obj, bool do_replace_in_map) {
duke@435 1346 const Type *t = _gvn.type(obj);
duke@435 1347 const Type *t_not_null = t->join(TypePtr::NOTNULL);
duke@435 1348 // Object is already not-null?
duke@435 1349 if( t == t_not_null ) return obj;
duke@435 1350
duke@435 1351 Node *cast = new (C, 2) CastPPNode(obj,t_not_null);
duke@435 1352 cast->init_req(0, control());
duke@435 1353 cast = _gvn.transform( cast );
duke@435 1354
duke@435 1355 // Scan for instances of 'obj' in the current JVM mapping.
duke@435 1356 // These instances are known to be not-null after the test.
duke@435 1357 if (do_replace_in_map)
duke@435 1358 replace_in_map(obj, cast);
duke@435 1359
duke@435 1360 return cast; // Return casted value
duke@435 1361 }
duke@435 1362
duke@435 1363
duke@435 1364 //--------------------------replace_in_map-------------------------------------
duke@435 1365 void GraphKit::replace_in_map(Node* old, Node* neww) {
duke@435 1366 this->map()->replace_edge(old, neww);
duke@435 1367
duke@435 1368 // Note: This operation potentially replaces any edge
duke@435 1369 // on the map. This includes locals, stack, and monitors
duke@435 1370 // of the current (innermost) JVM state.
duke@435 1371
duke@435 1372 // We can consider replacing in caller maps.
duke@435 1373 // The idea would be that an inlined function's null checks
duke@435 1374 // can be shared with the entire inlining tree.
duke@435 1375 // The expense of doing this is that the PreserveJVMState class
duke@435 1376 // would have to preserve caller states too, with a deep copy.
duke@435 1377 }
duke@435 1378
duke@435 1379
duke@435 1380
duke@435 1381 //=============================================================================
duke@435 1382 //--------------------------------memory---------------------------------------
duke@435 1383 Node* GraphKit::memory(uint alias_idx) {
duke@435 1384 MergeMemNode* mem = merged_memory();
duke@435 1385 Node* p = mem->memory_at(alias_idx);
duke@435 1386 _gvn.set_type(p, Type::MEMORY); // must be mapped
duke@435 1387 return p;
duke@435 1388 }
duke@435 1389
duke@435 1390 //-----------------------------reset_memory------------------------------------
duke@435 1391 Node* GraphKit::reset_memory() {
duke@435 1392 Node* mem = map()->memory();
duke@435 1393 // do not use this node for any more parsing!
duke@435 1394 debug_only( map()->set_memory((Node*)NULL) );
duke@435 1395 return _gvn.transform( mem );
duke@435 1396 }
duke@435 1397
duke@435 1398 //------------------------------set_all_memory---------------------------------
duke@435 1399 void GraphKit::set_all_memory(Node* newmem) {
duke@435 1400 Node* mergemem = MergeMemNode::make(C, newmem);
duke@435 1401 gvn().set_type_bottom(mergemem);
duke@435 1402 map()->set_memory(mergemem);
duke@435 1403 }
duke@435 1404
duke@435 1405 //------------------------------set_all_memory_call----------------------------
never@1515 1406 void GraphKit::set_all_memory_call(Node* call, bool separate_io_proj) {
never@1515 1407 Node* newmem = _gvn.transform( new (C, 1) ProjNode(call, TypeFunc::Memory, separate_io_proj) );
duke@435 1408 set_all_memory(newmem);
duke@435 1409 }
duke@435 1410
duke@435 1411 //=============================================================================
duke@435 1412 //
duke@435 1413 // parser factory methods for MemNodes
duke@435 1414 //
duke@435 1415 // These are layered on top of the factory methods in LoadNode and StoreNode,
duke@435 1416 // and integrate with the parser's memory state and _gvn engine.
duke@435 1417 //
duke@435 1418
duke@435 1419 // factory methods in "int adr_idx"
duke@435 1420 Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
duke@435 1421 int adr_idx,
duke@435 1422 bool require_atomic_access) {
duke@435 1423 assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" );
duke@435 1424 const TypePtr* adr_type = NULL; // debug-mode-only argument
duke@435 1425 debug_only(adr_type = C->get_adr_type(adr_idx));
duke@435 1426 Node* mem = memory(adr_idx);
duke@435 1427 Node* ld;
duke@435 1428 if (require_atomic_access && bt == T_LONG) {
duke@435 1429 ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t);
duke@435 1430 } else {
coleenp@548 1431 ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt);
duke@435 1432 }
duke@435 1433 return _gvn.transform(ld);
duke@435 1434 }
duke@435 1435
duke@435 1436 Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt,
duke@435 1437 int adr_idx,
duke@435 1438 bool require_atomic_access) {
duke@435 1439 assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
duke@435 1440 const TypePtr* adr_type = NULL;
duke@435 1441 debug_only(adr_type = C->get_adr_type(adr_idx));
duke@435 1442 Node *mem = memory(adr_idx);
duke@435 1443 Node* st;
duke@435 1444 if (require_atomic_access && bt == T_LONG) {
duke@435 1445 st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val);
duke@435 1446 } else {
coleenp@548 1447 st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt);
duke@435 1448 }
duke@435 1449 st = _gvn.transform(st);
duke@435 1450 set_memory(st, adr_idx);
duke@435 1451 // Back-to-back stores can only remove intermediate store with DU info
duke@435 1452 // so push on worklist for optimizer.
duke@435 1453 if (mem->req() > MemNode::Address && adr == mem->in(MemNode::Address))
duke@435 1454 record_for_igvn(st);
duke@435 1455
duke@435 1456 return st;
duke@435 1457 }
duke@435 1458
kvn@1286 1459
duke@435 1460 void GraphKit::pre_barrier(Node* ctl,
duke@435 1461 Node* obj,
duke@435 1462 Node* adr,
kvn@1286 1463 uint adr_idx,
kvn@1286 1464 Node* val,
never@1260 1465 const TypeOopPtr* val_type,
duke@435 1466 BasicType bt) {
duke@435 1467 BarrierSet* bs = Universe::heap()->barrier_set();
duke@435 1468 set_control(ctl);
duke@435 1469 switch (bs->kind()) {
ysr@777 1470 case BarrierSet::G1SATBCT:
ysr@777 1471 case BarrierSet::G1SATBCTLogging:
kvn@1286 1472 g1_write_barrier_pre(obj, adr, adr_idx, val, val_type, bt);
ysr@777 1473 break;
duke@435 1474
duke@435 1475 case BarrierSet::CardTableModRef:
duke@435 1476 case BarrierSet::CardTableExtension:
duke@435 1477 case BarrierSet::ModRef:
duke@435 1478 break;
duke@435 1479
duke@435 1480 case BarrierSet::Other:
duke@435 1481 default :
duke@435 1482 ShouldNotReachHere();
duke@435 1483
duke@435 1484 }
duke@435 1485 }
duke@435 1486
duke@435 1487 void GraphKit::post_barrier(Node* ctl,
duke@435 1488 Node* store,
duke@435 1489 Node* obj,
duke@435 1490 Node* adr,
kvn@1286 1491 uint adr_idx,
kvn@1286 1492 Node* val,
duke@435 1493 BasicType bt,
duke@435 1494 bool use_precise) {
duke@435 1495 BarrierSet* bs = Universe::heap()->barrier_set();
duke@435 1496 set_control(ctl);
duke@435 1497 switch (bs->kind()) {
ysr@777 1498 case BarrierSet::G1SATBCT:
ysr@777 1499 case BarrierSet::G1SATBCTLogging:
kvn@1286 1500 g1_write_barrier_post(store, obj, adr, adr_idx, val, bt, use_precise);
ysr@777 1501 break;
duke@435 1502
duke@435 1503 case BarrierSet::CardTableModRef:
duke@435 1504 case BarrierSet::CardTableExtension:
cfang@1420 1505 write_barrier_post(store, obj, adr, adr_idx, val, use_precise);
duke@435 1506 break;
duke@435 1507
duke@435 1508 case BarrierSet::ModRef:
duke@435 1509 break;
duke@435 1510
duke@435 1511 case BarrierSet::Other:
duke@435 1512 default :
duke@435 1513 ShouldNotReachHere();
duke@435 1514
duke@435 1515 }
duke@435 1516 }
duke@435 1517
kvn@1286 1518 Node* GraphKit::store_oop(Node* ctl,
kvn@1286 1519 Node* obj,
kvn@1286 1520 Node* adr,
kvn@1286 1521 const TypePtr* adr_type,
kvn@1286 1522 Node* val,
kvn@1286 1523 const TypeOopPtr* val_type,
kvn@1286 1524 BasicType bt,
kvn@1286 1525 bool use_precise) {
kvn@1286 1526
kvn@1286 1527 set_control(ctl);
kvn@1286 1528 if (stopped()) return top(); // Dead path ?
kvn@1286 1529
kvn@1286 1530 assert(bt == T_OBJECT, "sanity");
kvn@1286 1531 assert(val != NULL, "not dead path");
duke@435 1532 uint adr_idx = C->get_alias_index(adr_type);
kvn@1286 1533 assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
kvn@1286 1534
kvn@1286 1535 pre_barrier(control(), obj, adr, adr_idx, val, val_type, bt);
kvn@1286 1536 Node* store = store_to_memory(control(), adr, val, bt, adr_idx);
kvn@1286 1537 post_barrier(control(), store, obj, adr, adr_idx, val, bt, use_precise);
duke@435 1538 return store;
duke@435 1539 }
duke@435 1540
kvn@1286 1541 // Could be an array or object we don't know at compile time (unsafe ref.)
duke@435 1542 Node* GraphKit::store_oop_to_unknown(Node* ctl,
kvn@1286 1543 Node* obj, // containing obj
kvn@1286 1544 Node* adr, // actual adress to store val at
kvn@1286 1545 const TypePtr* adr_type,
kvn@1286 1546 Node* val,
kvn@1286 1547 BasicType bt) {
never@1260 1548 Compile::AliasType* at = C->alias_type(adr_type);
never@1260 1549 const TypeOopPtr* val_type = NULL;
never@1260 1550 if (adr_type->isa_instptr()) {
never@1260 1551 if (at->field() != NULL) {
never@1260 1552 // known field. This code is a copy of the do_put_xxx logic.
never@1260 1553 ciField* field = at->field();
never@1260 1554 if (!field->type()->is_loaded()) {
never@1260 1555 val_type = TypeInstPtr::BOTTOM;
never@1260 1556 } else {
never@1260 1557 val_type = TypeOopPtr::make_from_klass(field->type()->as_klass());
never@1260 1558 }
never@1260 1559 }
never@1260 1560 } else if (adr_type->isa_aryptr()) {
never@1262 1561 val_type = adr_type->is_aryptr()->elem()->make_oopptr();
never@1260 1562 }
never@1260 1563 if (val_type == NULL) {
never@1260 1564 val_type = TypeInstPtr::BOTTOM;
never@1260 1565 }
kvn@1286 1566 return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true);
duke@435 1567 }
duke@435 1568
duke@435 1569
duke@435 1570 //-------------------------array_element_address-------------------------
duke@435 1571 Node* GraphKit::array_element_address(Node* ary, Node* idx, BasicType elembt,
duke@435 1572 const TypeInt* sizetype) {
kvn@464 1573 uint shift = exact_log2(type2aelembytes(elembt));
duke@435 1574 uint header = arrayOopDesc::base_offset_in_bytes(elembt);
duke@435 1575
duke@435 1576 // short-circuit a common case (saves lots of confusing waste motion)
duke@435 1577 jint idx_con = find_int_con(idx, -1);
duke@435 1578 if (idx_con >= 0) {
duke@435 1579 intptr_t offset = header + ((intptr_t)idx_con << shift);
duke@435 1580 return basic_plus_adr(ary, offset);
duke@435 1581 }
duke@435 1582
duke@435 1583 // must be correct type for alignment purposes
duke@435 1584 Node* base = basic_plus_adr(ary, header);
duke@435 1585 #ifdef _LP64
duke@435 1586 // The scaled index operand to AddP must be a clean 64-bit value.
duke@435 1587 // Java allows a 32-bit int to be incremented to a negative
duke@435 1588 // value, which appears in a 64-bit register as a large
duke@435 1589 // positive number. Using that large positive number as an
duke@435 1590 // operand in pointer arithmetic has bad consequences.
duke@435 1591 // On the other hand, 32-bit overflow is rare, and the possibility
duke@435 1592 // can often be excluded, if we annotate the ConvI2L node with
duke@435 1593 // a type assertion that its value is known to be a small positive
duke@435 1594 // number. (The prior range check has ensured this.)
duke@435 1595 // This assertion is used by ConvI2LNode::Ideal.
duke@435 1596 int index_max = max_jint - 1; // array size is max_jint, index is one less
duke@435 1597 if (sizetype != NULL) index_max = sizetype->_hi - 1;
duke@435 1598 const TypeLong* lidxtype = TypeLong::make(CONST64(0), index_max, Type::WidenMax);
duke@435 1599 idx = _gvn.transform( new (C, 2) ConvI2LNode(idx, lidxtype) );
duke@435 1600 #endif
duke@435 1601 Node* scale = _gvn.transform( new (C, 3) LShiftXNode(idx, intcon(shift)) );
duke@435 1602 return basic_plus_adr(ary, base, scale);
duke@435 1603 }
duke@435 1604
duke@435 1605 //-------------------------load_array_element-------------------------
duke@435 1606 Node* GraphKit::load_array_element(Node* ctl, Node* ary, Node* idx, const TypeAryPtr* arytype) {
duke@435 1607 const Type* elemtype = arytype->elem();
duke@435 1608 BasicType elembt = elemtype->array_element_basic_type();
duke@435 1609 Node* adr = array_element_address(ary, idx, elembt, arytype->size());
duke@435 1610 Node* ld = make_load(ctl, adr, elemtype, elembt, arytype);
duke@435 1611 return ld;
duke@435 1612 }
duke@435 1613
duke@435 1614 //-------------------------set_arguments_for_java_call-------------------------
duke@435 1615 // Arguments (pre-popped from the stack) are taken from the JVMS.
duke@435 1616 void GraphKit::set_arguments_for_java_call(CallJavaNode* call) {
duke@435 1617 // Add the call arguments:
duke@435 1618 uint nargs = call->method()->arg_size();
duke@435 1619 for (uint i = 0; i < nargs; i++) {
duke@435 1620 Node* arg = argument(i);
duke@435 1621 call->init_req(i + TypeFunc::Parms, arg);
duke@435 1622 }
duke@435 1623 }
duke@435 1624
duke@435 1625 //---------------------------set_edges_for_java_call---------------------------
duke@435 1626 // Connect a newly created call into the current JVMS.
duke@435 1627 // A return value node (if any) is returned from set_edges_for_java_call.
never@1515 1628 void GraphKit::set_edges_for_java_call(CallJavaNode* call, bool must_throw, bool separate_io_proj) {
duke@435 1629
duke@435 1630 // Add the predefined inputs:
duke@435 1631 call->init_req( TypeFunc::Control, control() );
duke@435 1632 call->init_req( TypeFunc::I_O , i_o() );
duke@435 1633 call->init_req( TypeFunc::Memory , reset_memory() );
duke@435 1634 call->init_req( TypeFunc::FramePtr, frameptr() );
duke@435 1635 call->init_req( TypeFunc::ReturnAdr, top() );
duke@435 1636
duke@435 1637 add_safepoint_edges(call, must_throw);
duke@435 1638
duke@435 1639 Node* xcall = _gvn.transform(call);
duke@435 1640
duke@435 1641 if (xcall == top()) {
duke@435 1642 set_control(top());
duke@435 1643 return;
duke@435 1644 }
duke@435 1645 assert(xcall == call, "call identity is stable");
duke@435 1646
duke@435 1647 // Re-use the current map to produce the result.
duke@435 1648
duke@435 1649 set_control(_gvn.transform(new (C, 1) ProjNode(call, TypeFunc::Control)));
never@1515 1650 set_i_o( _gvn.transform(new (C, 1) ProjNode(call, TypeFunc::I_O , separate_io_proj)));
never@1515 1651 set_all_memory_call(xcall, separate_io_proj);
duke@435 1652
duke@435 1653 //return xcall; // no need, caller already has it
duke@435 1654 }
duke@435 1655
never@1515 1656 Node* GraphKit::set_results_for_java_call(CallJavaNode* call, bool separate_io_proj) {
duke@435 1657 if (stopped()) return top(); // maybe the call folded up?
duke@435 1658
duke@435 1659 // Capture the return value, if any.
duke@435 1660 Node* ret;
duke@435 1661 if (call->method() == NULL ||
duke@435 1662 call->method()->return_type()->basic_type() == T_VOID)
duke@435 1663 ret = top();
duke@435 1664 else ret = _gvn.transform(new (C, 1) ProjNode(call, TypeFunc::Parms));
duke@435 1665
duke@435 1666 // Note: Since any out-of-line call can produce an exception,
duke@435 1667 // we always insert an I_O projection from the call into the result.
duke@435 1668
never@1515 1669 make_slow_call_ex(call, env()->Throwable_klass(), separate_io_proj);
never@1515 1670
never@1515 1671 if (separate_io_proj) {
never@1515 1672 // The caller requested separate projections be used by the fall
never@1515 1673 // through and exceptional paths, so replace the projections for
never@1515 1674 // the fall through path.
never@1515 1675 set_i_o(_gvn.transform( new (C, 1) ProjNode(call, TypeFunc::I_O) ));
never@1515 1676 set_all_memory(_gvn.transform( new (C, 1) ProjNode(call, TypeFunc::Memory) ));
never@1515 1677 }
duke@435 1678 return ret;
duke@435 1679 }
duke@435 1680
duke@435 1681 //--------------------set_predefined_input_for_runtime_call--------------------
duke@435 1682 // Reading and setting the memory state is way conservative here.
duke@435 1683 // The real problem is that I am not doing real Type analysis on memory,
duke@435 1684 // so I cannot distinguish card mark stores from other stores. Across a GC
duke@435 1685 // point the Store Barrier and the card mark memory has to agree. I cannot
duke@435 1686 // have a card mark store and its barrier split across the GC point from
duke@435 1687 // either above or below. Here I get that to happen by reading ALL of memory.
duke@435 1688 // A better answer would be to separate out card marks from other memory.
duke@435 1689 // For now, return the input memory state, so that it can be reused
duke@435 1690 // after the call, if this call has restricted memory effects.
duke@435 1691 Node* GraphKit::set_predefined_input_for_runtime_call(SafePointNode* call) {
duke@435 1692 // Set fixed predefined input arguments
duke@435 1693 Node* memory = reset_memory();
duke@435 1694 call->init_req( TypeFunc::Control, control() );
duke@435 1695 call->init_req( TypeFunc::I_O, top() ); // does no i/o
duke@435 1696 call->init_req( TypeFunc::Memory, memory ); // may gc ptrs
duke@435 1697 call->init_req( TypeFunc::FramePtr, frameptr() );
duke@435 1698 call->init_req( TypeFunc::ReturnAdr, top() );
duke@435 1699 return memory;
duke@435 1700 }
duke@435 1701
duke@435 1702 //-------------------set_predefined_output_for_runtime_call--------------------
duke@435 1703 // Set control and memory (not i_o) from the call.
duke@435 1704 // If keep_mem is not NULL, use it for the output state,
duke@435 1705 // except for the RawPtr output of the call, if hook_mem is TypeRawPtr::BOTTOM.
duke@435 1706 // If hook_mem is NULL, this call produces no memory effects at all.
duke@435 1707 // If hook_mem is a Java-visible memory slice (such as arraycopy operands),
duke@435 1708 // then only that memory slice is taken from the call.
duke@435 1709 // In the last case, we must put an appropriate memory barrier before
duke@435 1710 // the call, so as to create the correct anti-dependencies on loads
duke@435 1711 // preceding the call.
duke@435 1712 void GraphKit::set_predefined_output_for_runtime_call(Node* call,
duke@435 1713 Node* keep_mem,
duke@435 1714 const TypePtr* hook_mem) {
duke@435 1715 // no i/o
duke@435 1716 set_control(_gvn.transform( new (C, 1) ProjNode(call,TypeFunc::Control) ));
duke@435 1717 if (keep_mem) {
duke@435 1718 // First clone the existing memory state
duke@435 1719 set_all_memory(keep_mem);
duke@435 1720 if (hook_mem != NULL) {
duke@435 1721 // Make memory for the call
duke@435 1722 Node* mem = _gvn.transform( new (C, 1) ProjNode(call, TypeFunc::Memory) );
duke@435 1723 // Set the RawPtr memory state only. This covers all the heap top/GC stuff
duke@435 1724 // We also use hook_mem to extract specific effects from arraycopy stubs.
duke@435 1725 set_memory(mem, hook_mem);
duke@435 1726 }
duke@435 1727 // ...else the call has NO memory effects.
duke@435 1728
duke@435 1729 // Make sure the call advertises its memory effects precisely.
duke@435 1730 // This lets us build accurate anti-dependences in gcm.cpp.
duke@435 1731 assert(C->alias_type(call->adr_type()) == C->alias_type(hook_mem),
duke@435 1732 "call node must be constructed correctly");
duke@435 1733 } else {
duke@435 1734 assert(hook_mem == NULL, "");
duke@435 1735 // This is not a "slow path" call; all memory comes from the call.
duke@435 1736 set_all_memory_call(call);
duke@435 1737 }
duke@435 1738 }
duke@435 1739
never@1515 1740
never@1515 1741 // Replace the call with the current state of the kit.
never@1515 1742 void GraphKit::replace_call(CallNode* call, Node* result) {
never@1515 1743 JVMState* ejvms = NULL;
never@1515 1744 if (has_exceptions()) {
never@1515 1745 ejvms = transfer_exceptions_into_jvms();
never@1515 1746 }
never@1515 1747
never@1515 1748 SafePointNode* final_state = stop();
never@1515 1749
never@1515 1750 // Find all the needed outputs of this call
never@1515 1751 CallProjections callprojs;
never@1515 1752 call->extract_projections(&callprojs, true);
never@1515 1753
never@1515 1754 // Replace all the old call edges with the edges from the inlining result
never@1515 1755 C->gvn_replace_by(callprojs.fallthrough_catchproj, final_state->in(TypeFunc::Control));
never@1515 1756 C->gvn_replace_by(callprojs.fallthrough_memproj, final_state->in(TypeFunc::Memory));
never@1515 1757 C->gvn_replace_by(callprojs.fallthrough_ioproj, final_state->in(TypeFunc::I_O));
never@2141 1758 Node* final_mem = final_state->in(TypeFunc::Memory);
never@1515 1759
never@1515 1760 // Replace the result with the new result if it exists and is used
never@1515 1761 if (callprojs.resproj != NULL && result != NULL) {
never@1515 1762 C->gvn_replace_by(callprojs.resproj, result);
never@1515 1763 }
never@1515 1764
never@1515 1765 if (ejvms == NULL) {
never@1515 1766 // No exception edges to simply kill off those paths
never@1515 1767 C->gvn_replace_by(callprojs.catchall_catchproj, C->top());
never@1515 1768 C->gvn_replace_by(callprojs.catchall_memproj, C->top());
never@1515 1769 C->gvn_replace_by(callprojs.catchall_ioproj, C->top());
never@1534 1770
never@1534 1771 // Replace the old exception object with top
never@1534 1772 if (callprojs.exobj != NULL) {
never@1534 1773 C->gvn_replace_by(callprojs.exobj, C->top());
never@1534 1774 }
never@1515 1775 } else {
never@1515 1776 GraphKit ekit(ejvms);
never@1515 1777
never@1515 1778 // Load my combined exception state into the kit, with all phis transformed:
never@1515 1779 SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states();
never@1515 1780
never@1515 1781 Node* ex_oop = ekit.use_exception_state(ex_map);
never@1515 1782
never@1515 1783 C->gvn_replace_by(callprojs.catchall_catchproj, ekit.control());
never@1515 1784 C->gvn_replace_by(callprojs.catchall_memproj, ekit.reset_memory());
never@1515 1785 C->gvn_replace_by(callprojs.catchall_ioproj, ekit.i_o());
never@1515 1786
never@1515 1787 // Replace the old exception object with the newly created one
never@1515 1788 if (callprojs.exobj != NULL) {
never@1515 1789 C->gvn_replace_by(callprojs.exobj, ex_oop);
never@1515 1790 }
never@1515 1791 }
never@1515 1792
never@1515 1793 // Disconnect the call from the graph
never@1515 1794 call->disconnect_inputs(NULL);
never@1515 1795 C->gvn_replace_by(call, C->top());
never@2141 1796
never@2141 1797 // Clean up any MergeMems that feed other MergeMems since the
never@2141 1798 // optimizer doesn't like that.
never@2141 1799 if (final_mem->is_MergeMem()) {
never@2141 1800 Node_List wl;
never@2141 1801 for (SimpleDUIterator i(final_mem); i.has_next(); i.next()) {
never@2141 1802 Node* m = i.get();
never@2141 1803 if (m->is_MergeMem() && !wl.contains(m)) {
never@2141 1804 wl.push(m);
never@2141 1805 }
never@2141 1806 }
never@2141 1807 while (wl.size() > 0) {
never@2141 1808 _gvn.transform(wl.pop());
never@2141 1809 }
never@2141 1810 }
never@1515 1811 }
never@1515 1812
never@1515 1813
duke@435 1814 //------------------------------increment_counter------------------------------
duke@435 1815 // for statistics: increment a VM counter by 1
duke@435 1816
duke@435 1817 void GraphKit::increment_counter(address counter_addr) {
duke@435 1818 Node* adr1 = makecon(TypeRawPtr::make(counter_addr));
duke@435 1819 increment_counter(adr1);
duke@435 1820 }
duke@435 1821
duke@435 1822 void GraphKit::increment_counter(Node* counter_addr) {
duke@435 1823 int adr_type = Compile::AliasIdxRaw;
kvn@1964 1824 Node* ctrl = control();
kvn@1964 1825 Node* cnt = make_load(ctrl, counter_addr, TypeInt::INT, T_INT, adr_type);
duke@435 1826 Node* incr = _gvn.transform(new (C, 3) AddINode(cnt, _gvn.intcon(1)));
kvn@1964 1827 store_to_memory( ctrl, counter_addr, incr, T_INT, adr_type );
duke@435 1828 }
duke@435 1829
duke@435 1830
duke@435 1831 //------------------------------uncommon_trap----------------------------------
duke@435 1832 // Bail out to the interpreter in mid-method. Implemented by calling the
duke@435 1833 // uncommon_trap blob. This helper function inserts a runtime call with the
duke@435 1834 // right debug info.
duke@435 1835 void GraphKit::uncommon_trap(int trap_request,
duke@435 1836 ciKlass* klass, const char* comment,
duke@435 1837 bool must_throw,
duke@435 1838 bool keep_exact_action) {
duke@435 1839 if (failing()) stop();
duke@435 1840 if (stopped()) return; // trap reachable?
duke@435 1841
duke@435 1842 // Note: If ProfileTraps is true, and if a deopt. actually
duke@435 1843 // occurs here, the runtime will make sure an MDO exists. There is
iveresov@2349 1844 // no need to call method()->ensure_method_data() at this point.
duke@435 1845
duke@435 1846 #ifdef ASSERT
duke@435 1847 if (!must_throw) {
duke@435 1848 // Make sure the stack has at least enough depth to execute
duke@435 1849 // the current bytecode.
duke@435 1850 int inputs, ignore;
duke@435 1851 if (compute_stack_effects(inputs, ignore)) {
duke@435 1852 assert(sp() >= inputs, "must have enough JVMS stack to execute");
duke@435 1853 // It is a frequent error in library_call.cpp to issue an
duke@435 1854 // uncommon trap with the _sp value already popped.
duke@435 1855 }
duke@435 1856 }
duke@435 1857 #endif
duke@435 1858
duke@435 1859 Deoptimization::DeoptReason reason = Deoptimization::trap_request_reason(trap_request);
duke@435 1860 Deoptimization::DeoptAction action = Deoptimization::trap_request_action(trap_request);
duke@435 1861
duke@435 1862 switch (action) {
duke@435 1863 case Deoptimization::Action_maybe_recompile:
duke@435 1864 case Deoptimization::Action_reinterpret:
duke@435 1865 // Temporary fix for 6529811 to allow virtual calls to be sure they
duke@435 1866 // get the chance to go from mono->bi->mega
duke@435 1867 if (!keep_exact_action &&
duke@435 1868 Deoptimization::trap_request_index(trap_request) < 0 &&
duke@435 1869 too_many_recompiles(reason)) {
duke@435 1870 // This BCI is causing too many recompilations.
duke@435 1871 action = Deoptimization::Action_none;
duke@435 1872 trap_request = Deoptimization::make_trap_request(reason, action);
duke@435 1873 } else {
duke@435 1874 C->set_trap_can_recompile(true);
duke@435 1875 }
duke@435 1876 break;
duke@435 1877 case Deoptimization::Action_make_not_entrant:
duke@435 1878 C->set_trap_can_recompile(true);
duke@435 1879 break;
duke@435 1880 #ifdef ASSERT
duke@435 1881 case Deoptimization::Action_none:
duke@435 1882 case Deoptimization::Action_make_not_compilable:
duke@435 1883 break;
duke@435 1884 default:
duke@435 1885 assert(false, "bad action");
duke@435 1886 #endif
duke@435 1887 }
duke@435 1888
duke@435 1889 if (TraceOptoParse) {
duke@435 1890 char buf[100];
duke@435 1891 tty->print_cr("Uncommon trap %s at bci:%d",
duke@435 1892 Deoptimization::format_trap_request(buf, sizeof(buf),
duke@435 1893 trap_request), bci());
duke@435 1894 }
duke@435 1895
duke@435 1896 CompileLog* log = C->log();
duke@435 1897 if (log != NULL) {
duke@435 1898 int kid = (klass == NULL)? -1: log->identify(klass);
duke@435 1899 log->begin_elem("uncommon_trap bci='%d'", bci());
duke@435 1900 char buf[100];
duke@435 1901 log->print(" %s", Deoptimization::format_trap_request(buf, sizeof(buf),
duke@435 1902 trap_request));
duke@435 1903 if (kid >= 0) log->print(" klass='%d'", kid);
duke@435 1904 if (comment != NULL) log->print(" comment='%s'", comment);
duke@435 1905 log->end_elem();
duke@435 1906 }
duke@435 1907
duke@435 1908 // Make sure any guarding test views this path as very unlikely
duke@435 1909 Node *i0 = control()->in(0);
duke@435 1910 if (i0 != NULL && i0->is_If()) { // Found a guarding if test?
duke@435 1911 IfNode *iff = i0->as_If();
duke@435 1912 float f = iff->_prob; // Get prob
duke@435 1913 if (control()->Opcode() == Op_IfTrue) {
duke@435 1914 if (f > PROB_UNLIKELY_MAG(4))
duke@435 1915 iff->_prob = PROB_MIN;
duke@435 1916 } else {
duke@435 1917 if (f < PROB_LIKELY_MAG(4))
duke@435 1918 iff->_prob = PROB_MAX;
duke@435 1919 }
duke@435 1920 }
duke@435 1921
duke@435 1922 // Clear out dead values from the debug info.
duke@435 1923 kill_dead_locals();
duke@435 1924
duke@435 1925 // Now insert the uncommon trap subroutine call
twisti@2103 1926 address call_addr = SharedRuntime::uncommon_trap_blob()->entry_point();
duke@435 1927 const TypePtr* no_memory_effects = NULL;
duke@435 1928 // Pass the index of the class to be loaded
duke@435 1929 Node* call = make_runtime_call(RC_NO_LEAF | RC_UNCOMMON |
duke@435 1930 (must_throw ? RC_MUST_THROW : 0),
duke@435 1931 OptoRuntime::uncommon_trap_Type(),
duke@435 1932 call_addr, "uncommon_trap", no_memory_effects,
duke@435 1933 intcon(trap_request));
duke@435 1934 assert(call->as_CallStaticJava()->uncommon_trap_request() == trap_request,
duke@435 1935 "must extract request correctly from the graph");
duke@435 1936 assert(trap_request != 0, "zero value reserved by uncommon_trap_request");
duke@435 1937
duke@435 1938 call->set_req(TypeFunc::ReturnAdr, returnadr());
duke@435 1939 // The debug info is the only real input to this call.
duke@435 1940
duke@435 1941 // Halt-and-catch fire here. The above call should never return!
duke@435 1942 HaltNode* halt = new(C, TypeFunc::Parms) HaltNode(control(), frameptr());
duke@435 1943 _gvn.set_type_bottom(halt);
duke@435 1944 root()->add_req(halt);
duke@435 1945
duke@435 1946 stop_and_kill_map();
duke@435 1947 }
duke@435 1948
duke@435 1949
duke@435 1950 //--------------------------just_allocated_object------------------------------
duke@435 1951 // Report the object that was just allocated.
duke@435 1952 // It must be the case that there are no intervening safepoints.
duke@435 1953 // We use this to determine if an object is so "fresh" that
duke@435 1954 // it does not require card marks.
duke@435 1955 Node* GraphKit::just_allocated_object(Node* current_control) {
duke@435 1956 if (C->recent_alloc_ctl() == current_control)
duke@435 1957 return C->recent_alloc_obj();
duke@435 1958 return NULL;
duke@435 1959 }
duke@435 1960
duke@435 1961
duke@435 1962 void GraphKit::round_double_arguments(ciMethod* dest_method) {
duke@435 1963 // (Note: TypeFunc::make has a cache that makes this fast.)
duke@435 1964 const TypeFunc* tf = TypeFunc::make(dest_method);
duke@435 1965 int nargs = tf->_domain->_cnt - TypeFunc::Parms;
duke@435 1966 for (int j = 0; j < nargs; j++) {
duke@435 1967 const Type *targ = tf->_domain->field_at(j + TypeFunc::Parms);
duke@435 1968 if( targ->basic_type() == T_DOUBLE ) {
duke@435 1969 // If any parameters are doubles, they must be rounded before
duke@435 1970 // the call, dstore_rounding does gvn.transform
duke@435 1971 Node *arg = argument(j);
duke@435 1972 arg = dstore_rounding(arg);
duke@435 1973 set_argument(j, arg);
duke@435 1974 }
duke@435 1975 }
duke@435 1976 }
duke@435 1977
duke@435 1978 void GraphKit::round_double_result(ciMethod* dest_method) {
duke@435 1979 // A non-strict method may return a double value which has an extended
duke@435 1980 // exponent, but this must not be visible in a caller which is 'strict'
duke@435 1981 // If a strict caller invokes a non-strict callee, round a double result
duke@435 1982
duke@435 1983 BasicType result_type = dest_method->return_type()->basic_type();
duke@435 1984 assert( method() != NULL, "must have caller context");
duke@435 1985 if( result_type == T_DOUBLE && method()->is_strict() && !dest_method->is_strict() ) {
duke@435 1986 // Destination method's return value is on top of stack
duke@435 1987 // dstore_rounding() does gvn.transform
duke@435 1988 Node *result = pop_pair();
duke@435 1989 result = dstore_rounding(result);
duke@435 1990 push_pair(result);
duke@435 1991 }
duke@435 1992 }
duke@435 1993
duke@435 1994 // rounding for strict float precision conformance
duke@435 1995 Node* GraphKit::precision_rounding(Node* n) {
duke@435 1996 return UseStrictFP && _method->flags().is_strict()
duke@435 1997 && UseSSE == 0 && Matcher::strict_fp_requires_explicit_rounding
duke@435 1998 ? _gvn.transform( new (C, 2) RoundFloatNode(0, n) )
duke@435 1999 : n;
duke@435 2000 }
duke@435 2001
duke@435 2002 // rounding for strict double precision conformance
duke@435 2003 Node* GraphKit::dprecision_rounding(Node *n) {
duke@435 2004 return UseStrictFP && _method->flags().is_strict()
duke@435 2005 && UseSSE <= 1 && Matcher::strict_fp_requires_explicit_rounding
duke@435 2006 ? _gvn.transform( new (C, 2) RoundDoubleNode(0, n) )
duke@435 2007 : n;
duke@435 2008 }
duke@435 2009
duke@435 2010 // rounding for non-strict double stores
duke@435 2011 Node* GraphKit::dstore_rounding(Node* n) {
duke@435 2012 return Matcher::strict_fp_requires_explicit_rounding
duke@435 2013 && UseSSE <= 1
duke@435 2014 ? _gvn.transform( new (C, 2) RoundDoubleNode(0, n) )
duke@435 2015 : n;
duke@435 2016 }
duke@435 2017
duke@435 2018 //=============================================================================
duke@435 2019 // Generate a fast path/slow path idiom. Graph looks like:
duke@435 2020 // [foo] indicates that 'foo' is a parameter
duke@435 2021 //
duke@435 2022 // [in] NULL
duke@435 2023 // \ /
duke@435 2024 // CmpP
duke@435 2025 // Bool ne
duke@435 2026 // If
duke@435 2027 // / \
duke@435 2028 // True False-<2>
duke@435 2029 // / |
duke@435 2030 // / cast_not_null
duke@435 2031 // Load | | ^
duke@435 2032 // [fast_test] | |
duke@435 2033 // gvn to opt_test | |
duke@435 2034 // / \ | <1>
duke@435 2035 // True False |
duke@435 2036 // | \\ |
duke@435 2037 // [slow_call] \[fast_result]
duke@435 2038 // Ctl Val \ \
duke@435 2039 // | \ \
duke@435 2040 // Catch <1> \ \
duke@435 2041 // / \ ^ \ \
duke@435 2042 // Ex No_Ex | \ \
duke@435 2043 // | \ \ | \ <2> \
duke@435 2044 // ... \ [slow_res] | | \ [null_result]
duke@435 2045 // \ \--+--+--- | |
duke@435 2046 // \ | / \ | /
duke@435 2047 // --------Region Phi
duke@435 2048 //
duke@435 2049 //=============================================================================
duke@435 2050 // Code is structured as a series of driver functions all called 'do_XXX' that
duke@435 2051 // call a set of helper functions. Helper functions first, then drivers.
duke@435 2052
duke@435 2053 //------------------------------null_check_oop---------------------------------
duke@435 2054 // Null check oop. Set null-path control into Region in slot 3.
duke@435 2055 // Make a cast-not-nullness use the other not-null control. Return cast.
duke@435 2056 Node* GraphKit::null_check_oop(Node* value, Node* *null_control,
duke@435 2057 bool never_see_null) {
duke@435 2058 // Initial NULL check taken path
duke@435 2059 (*null_control) = top();
duke@435 2060 Node* cast = null_check_common(value, T_OBJECT, false, null_control);
duke@435 2061
duke@435 2062 // Generate uncommon_trap:
duke@435 2063 if (never_see_null && (*null_control) != top()) {
duke@435 2064 // If we see an unexpected null at a check-cast we record it and force a
duke@435 2065 // recompile; the offending check-cast will be compiled to handle NULLs.
duke@435 2066 // If we see more than one offending BCI, then all checkcasts in the
duke@435 2067 // method will be compiled to handle NULLs.
duke@435 2068 PreserveJVMState pjvms(this);
duke@435 2069 set_control(*null_control);
kvn@767 2070 replace_in_map(value, null());
duke@435 2071 uncommon_trap(Deoptimization::Reason_null_check,
duke@435 2072 Deoptimization::Action_make_not_entrant);
duke@435 2073 (*null_control) = top(); // NULL path is dead
duke@435 2074 }
duke@435 2075
duke@435 2076 // Cast away null-ness on the result
duke@435 2077 return cast;
duke@435 2078 }
duke@435 2079
duke@435 2080 //------------------------------opt_iff----------------------------------------
duke@435 2081 // Optimize the fast-check IfNode. Set the fast-path region slot 2.
duke@435 2082 // Return slow-path control.
duke@435 2083 Node* GraphKit::opt_iff(Node* region, Node* iff) {
duke@435 2084 IfNode *opt_iff = _gvn.transform(iff)->as_If();
duke@435 2085
duke@435 2086 // Fast path taken; set region slot 2
duke@435 2087 Node *fast_taken = _gvn.transform( new (C, 1) IfFalseNode(opt_iff) );
duke@435 2088 region->init_req(2,fast_taken); // Capture fast-control
duke@435 2089
duke@435 2090 // Fast path not-taken, i.e. slow path
duke@435 2091 Node *slow_taken = _gvn.transform( new (C, 1) IfTrueNode(opt_iff) );
duke@435 2092 return slow_taken;
duke@435 2093 }
duke@435 2094
duke@435 2095 //-----------------------------make_runtime_call-------------------------------
duke@435 2096 Node* GraphKit::make_runtime_call(int flags,
duke@435 2097 const TypeFunc* call_type, address call_addr,
duke@435 2098 const char* call_name,
duke@435 2099 const TypePtr* adr_type,
duke@435 2100 // The following parms are all optional.
duke@435 2101 // The first NULL ends the list.
duke@435 2102 Node* parm0, Node* parm1,
duke@435 2103 Node* parm2, Node* parm3,
duke@435 2104 Node* parm4, Node* parm5,
duke@435 2105 Node* parm6, Node* parm7) {
duke@435 2106 // Slow-path call
duke@435 2107 int size = call_type->domain()->cnt();
duke@435 2108 bool is_leaf = !(flags & RC_NO_LEAF);
duke@435 2109 bool has_io = (!is_leaf && !(flags & RC_NO_IO));
duke@435 2110 if (call_name == NULL) {
duke@435 2111 assert(!is_leaf, "must supply name for leaf");
duke@435 2112 call_name = OptoRuntime::stub_name(call_addr);
duke@435 2113 }
duke@435 2114 CallNode* call;
duke@435 2115 if (!is_leaf) {
duke@435 2116 call = new(C, size) CallStaticJavaNode(call_type, call_addr, call_name,
duke@435 2117 bci(), adr_type);
duke@435 2118 } else if (flags & RC_NO_FP) {
duke@435 2119 call = new(C, size) CallLeafNoFPNode(call_type, call_addr, call_name, adr_type);
duke@435 2120 } else {
duke@435 2121 call = new(C, size) CallLeafNode(call_type, call_addr, call_name, adr_type);
duke@435 2122 }
duke@435 2123
duke@435 2124 // The following is similar to set_edges_for_java_call,
duke@435 2125 // except that the memory effects of the call are restricted to AliasIdxRaw.
duke@435 2126
duke@435 2127 // Slow path call has no side-effects, uses few values
duke@435 2128 bool wide_in = !(flags & RC_NARROW_MEM);
duke@435 2129 bool wide_out = (C->get_alias_index(adr_type) == Compile::AliasIdxBot);
duke@435 2130
duke@435 2131 Node* prev_mem = NULL;
duke@435 2132 if (wide_in) {
duke@435 2133 prev_mem = set_predefined_input_for_runtime_call(call);
duke@435 2134 } else {
duke@435 2135 assert(!wide_out, "narrow in => narrow out");
duke@435 2136 Node* narrow_mem = memory(adr_type);
duke@435 2137 prev_mem = reset_memory();
duke@435 2138 map()->set_memory(narrow_mem);
duke@435 2139 set_predefined_input_for_runtime_call(call);
duke@435 2140 }
duke@435 2141
duke@435 2142 // Hook each parm in order. Stop looking at the first NULL.
duke@435 2143 if (parm0 != NULL) { call->init_req(TypeFunc::Parms+0, parm0);
duke@435 2144 if (parm1 != NULL) { call->init_req(TypeFunc::Parms+1, parm1);
duke@435 2145 if (parm2 != NULL) { call->init_req(TypeFunc::Parms+2, parm2);
duke@435 2146 if (parm3 != NULL) { call->init_req(TypeFunc::Parms+3, parm3);
duke@435 2147 if (parm4 != NULL) { call->init_req(TypeFunc::Parms+4, parm4);
duke@435 2148 if (parm5 != NULL) { call->init_req(TypeFunc::Parms+5, parm5);
duke@435 2149 if (parm6 != NULL) { call->init_req(TypeFunc::Parms+6, parm6);
duke@435 2150 if (parm7 != NULL) { call->init_req(TypeFunc::Parms+7, parm7);
duke@435 2151 /* close each nested if ===> */ } } } } } } } }
duke@435 2152 assert(call->in(call->req()-1) != NULL, "must initialize all parms");
duke@435 2153
duke@435 2154 if (!is_leaf) {
duke@435 2155 // Non-leaves can block and take safepoints:
duke@435 2156 add_safepoint_edges(call, ((flags & RC_MUST_THROW) != 0));
duke@435 2157 }
duke@435 2158 // Non-leaves can throw exceptions:
duke@435 2159 if (has_io) {
duke@435 2160 call->set_req(TypeFunc::I_O, i_o());
duke@435 2161 }
duke@435 2162
duke@435 2163 if (flags & RC_UNCOMMON) {
duke@435 2164 // Set the count to a tiny probability. Cf. Estimate_Block_Frequency.
duke@435 2165 // (An "if" probability corresponds roughly to an unconditional count.
duke@435 2166 // Sort of.)
duke@435 2167 call->set_cnt(PROB_UNLIKELY_MAG(4));
duke@435 2168 }
duke@435 2169
duke@435 2170 Node* c = _gvn.transform(call);
duke@435 2171 assert(c == call, "cannot disappear");
duke@435 2172
duke@435 2173 if (wide_out) {
duke@435 2174 // Slow path call has full side-effects.
duke@435 2175 set_predefined_output_for_runtime_call(call);
duke@435 2176 } else {
duke@435 2177 // Slow path call has few side-effects, and/or sets few values.
duke@435 2178 set_predefined_output_for_runtime_call(call, prev_mem, adr_type);
duke@435 2179 }
duke@435 2180
duke@435 2181 if (has_io) {
duke@435 2182 set_i_o(_gvn.transform(new (C, 1) ProjNode(call, TypeFunc::I_O)));
duke@435 2183 }
duke@435 2184 return call;
duke@435 2185
duke@435 2186 }
duke@435 2187
duke@435 2188 //------------------------------merge_memory-----------------------------------
duke@435 2189 // Merge memory from one path into the current memory state.
duke@435 2190 void GraphKit::merge_memory(Node* new_mem, Node* region, int new_path) {
duke@435 2191 for (MergeMemStream mms(merged_memory(), new_mem->as_MergeMem()); mms.next_non_empty2(); ) {
duke@435 2192 Node* old_slice = mms.force_memory();
duke@435 2193 Node* new_slice = mms.memory2();
duke@435 2194 if (old_slice != new_slice) {
duke@435 2195 PhiNode* phi;
duke@435 2196 if (new_slice->is_Phi() && new_slice->as_Phi()->region() == region) {
duke@435 2197 phi = new_slice->as_Phi();
duke@435 2198 #ifdef ASSERT
duke@435 2199 if (old_slice->is_Phi() && old_slice->as_Phi()->region() == region)
duke@435 2200 old_slice = old_slice->in(new_path);
duke@435 2201 // Caller is responsible for ensuring that any pre-existing
duke@435 2202 // phis are already aware of old memory.
duke@435 2203 int old_path = (new_path > 1) ? 1 : 2; // choose old_path != new_path
duke@435 2204 assert(phi->in(old_path) == old_slice, "pre-existing phis OK");
duke@435 2205 #endif
duke@435 2206 mms.set_memory(phi);
duke@435 2207 } else {
duke@435 2208 phi = PhiNode::make(region, old_slice, Type::MEMORY, mms.adr_type(C));
duke@435 2209 _gvn.set_type(phi, Type::MEMORY);
duke@435 2210 phi->set_req(new_path, new_slice);
duke@435 2211 mms.set_memory(_gvn.transform(phi)); // assume it is complete
duke@435 2212 }
duke@435 2213 }
duke@435 2214 }
duke@435 2215 }
duke@435 2216
duke@435 2217 //------------------------------make_slow_call_ex------------------------------
duke@435 2218 // Make the exception handler hookups for the slow call
duke@435 2219 void GraphKit::make_slow_call_ex(Node* call, ciInstanceKlass* ex_klass, bool separate_io_proj) {
duke@435 2220 if (stopped()) return;
duke@435 2221
duke@435 2222 // Make a catch node with just two handlers: fall-through and catch-all
duke@435 2223 Node* i_o = _gvn.transform( new (C, 1) ProjNode(call, TypeFunc::I_O, separate_io_proj) );
duke@435 2224 Node* catc = _gvn.transform( new (C, 2) CatchNode(control(), i_o, 2) );
duke@435 2225 Node* norm = _gvn.transform( new (C, 1) CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci) );
duke@435 2226 Node* excp = _gvn.transform( new (C, 1) CatchProjNode(catc, CatchProjNode::catch_all_index, CatchProjNode::no_handler_bci) );
duke@435 2227
duke@435 2228 { PreserveJVMState pjvms(this);
duke@435 2229 set_control(excp);
duke@435 2230 set_i_o(i_o);
duke@435 2231
duke@435 2232 if (excp != top()) {
duke@435 2233 // Create an exception state also.
duke@435 2234 // Use an exact type if the caller has specified a specific exception.
duke@435 2235 const Type* ex_type = TypeOopPtr::make_from_klass_unique(ex_klass)->cast_to_ptr_type(TypePtr::NotNull);
duke@435 2236 Node* ex_oop = new (C, 2) CreateExNode(ex_type, control(), i_o);
duke@435 2237 add_exception_state(make_exception_state(_gvn.transform(ex_oop)));
duke@435 2238 }
duke@435 2239 }
duke@435 2240
duke@435 2241 // Get the no-exception control from the CatchNode.
duke@435 2242 set_control(norm);
duke@435 2243 }
duke@435 2244
duke@435 2245
duke@435 2246 //-------------------------------gen_subtype_check-----------------------------
duke@435 2247 // Generate a subtyping check. Takes as input the subtype and supertype.
duke@435 2248 // Returns 2 values: sets the default control() to the true path and returns
duke@435 2249 // the false path. Only reads invariant memory; sets no (visible) memory.
duke@435 2250 // The PartialSubtypeCheckNode sets the hidden 1-word cache in the encoding
duke@435 2251 // but that's not exposed to the optimizer. This call also doesn't take in an
duke@435 2252 // Object; if you wish to check an Object you need to load the Object's class
duke@435 2253 // prior to coming here.
duke@435 2254 Node* GraphKit::gen_subtype_check(Node* subklass, Node* superklass) {
duke@435 2255 // Fast check for identical types, perhaps identical constants.
duke@435 2256 // The types can even be identical non-constants, in cases
duke@435 2257 // involving Array.newInstance, Object.clone, etc.
duke@435 2258 if (subklass == superklass)
duke@435 2259 return top(); // false path is dead; no test needed.
duke@435 2260
duke@435 2261 if (_gvn.type(superklass)->singleton()) {
duke@435 2262 ciKlass* superk = _gvn.type(superklass)->is_klassptr()->klass();
duke@435 2263 ciKlass* subk = _gvn.type(subklass)->is_klassptr()->klass();
duke@435 2264
duke@435 2265 // In the common case of an exact superklass, try to fold up the
duke@435 2266 // test before generating code. You may ask, why not just generate
duke@435 2267 // the code and then let it fold up? The answer is that the generated
duke@435 2268 // code will necessarily include null checks, which do not always
duke@435 2269 // completely fold away. If they are also needless, then they turn
duke@435 2270 // into a performance loss. Example:
duke@435 2271 // Foo[] fa = blah(); Foo x = fa[0]; fa[1] = x;
duke@435 2272 // Here, the type of 'fa' is often exact, so the store check
duke@435 2273 // of fa[1]=x will fold up, without testing the nullness of x.
duke@435 2274 switch (static_subtype_check(superk, subk)) {
duke@435 2275 case SSC_always_false:
duke@435 2276 {
duke@435 2277 Node* always_fail = control();
duke@435 2278 set_control(top());
duke@435 2279 return always_fail;
duke@435 2280 }
duke@435 2281 case SSC_always_true:
duke@435 2282 return top();
duke@435 2283 case SSC_easy_test:
duke@435 2284 {
duke@435 2285 // Just do a direct pointer compare and be done.
duke@435 2286 Node* cmp = _gvn.transform( new(C, 3) CmpPNode(subklass, superklass) );
duke@435 2287 Node* bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::eq) );
duke@435 2288 IfNode* iff = create_and_xform_if(control(), bol, PROB_STATIC_FREQUENT, COUNT_UNKNOWN);
duke@435 2289 set_control( _gvn.transform( new(C, 1) IfTrueNode (iff) ) );
duke@435 2290 return _gvn.transform( new(C, 1) IfFalseNode(iff) );
duke@435 2291 }
duke@435 2292 case SSC_full_test:
duke@435 2293 break;
duke@435 2294 default:
duke@435 2295 ShouldNotReachHere();
duke@435 2296 }
duke@435 2297 }
duke@435 2298
duke@435 2299 // %%% Possible further optimization: Even if the superklass is not exact,
duke@435 2300 // if the subklass is the unique subtype of the superklass, the check
duke@435 2301 // will always succeed. We could leave a dependency behind to ensure this.
duke@435 2302
duke@435 2303 // First load the super-klass's check-offset
duke@435 2304 Node *p1 = basic_plus_adr( superklass, superklass, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes() );
duke@435 2305 Node *chk_off = _gvn.transform( new (C, 3) LoadINode( NULL, memory(p1), p1, _gvn.type(p1)->is_ptr() ) );
duke@435 2306 int cacheoff_con = sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes();
duke@435 2307 bool might_be_cache = (find_int_con(chk_off, cacheoff_con) == cacheoff_con);
duke@435 2308
duke@435 2309 // Load from the sub-klass's super-class display list, or a 1-word cache of
duke@435 2310 // the secondary superclass list, or a failing value with a sentinel offset
duke@435 2311 // if the super-klass is an interface or exceptionally deep in the Java
duke@435 2312 // hierarchy and we have to scan the secondary superclass list the hard way.
duke@435 2313 // Worst-case type is a little odd: NULL is allowed as a result (usually
duke@435 2314 // klass loads can never produce a NULL).
duke@435 2315 Node *chk_off_X = ConvI2X(chk_off);
duke@435 2316 Node *p2 = _gvn.transform( new (C, 4) AddPNode(subklass,subklass,chk_off_X) );
duke@435 2317 // For some types like interfaces the following loadKlass is from a 1-word
duke@435 2318 // cache which is mutable so can't use immutable memory. Other
duke@435 2319 // types load from the super-class display table which is immutable.
duke@435 2320 Node *kmem = might_be_cache ? memory(p2) : immutable_memory();
kvn@599 2321 Node *nkls = _gvn.transform( LoadKlassNode::make( _gvn, kmem, p2, _gvn.type(p2)->is_ptr(), TypeKlassPtr::OBJECT_OR_NULL ) );
duke@435 2322
duke@435 2323 // Compile speed common case: ARE a subtype and we canNOT fail
duke@435 2324 if( superklass == nkls )
duke@435 2325 return top(); // false path is dead; no test needed.
duke@435 2326
duke@435 2327 // See if we get an immediate positive hit. Happens roughly 83% of the
duke@435 2328 // time. Test to see if the value loaded just previously from the subklass
duke@435 2329 // is exactly the superklass.
duke@435 2330 Node *cmp1 = _gvn.transform( new (C, 3) CmpPNode( superklass, nkls ) );
duke@435 2331 Node *bol1 = _gvn.transform( new (C, 2) BoolNode( cmp1, BoolTest::eq ) );
duke@435 2332 IfNode *iff1 = create_and_xform_if( control(), bol1, PROB_LIKELY(0.83f), COUNT_UNKNOWN );
duke@435 2333 Node *iftrue1 = _gvn.transform( new (C, 1) IfTrueNode ( iff1 ) );
duke@435 2334 set_control( _gvn.transform( new (C, 1) IfFalseNode( iff1 ) ) );
duke@435 2335
duke@435 2336 // Compile speed common case: Check for being deterministic right now. If
duke@435 2337 // chk_off is a constant and not equal to cacheoff then we are NOT a
duke@435 2338 // subklass. In this case we need exactly the 1 test above and we can
duke@435 2339 // return those results immediately.
duke@435 2340 if (!might_be_cache) {
duke@435 2341 Node* not_subtype_ctrl = control();
duke@435 2342 set_control(iftrue1); // We need exactly the 1 test above
duke@435 2343 return not_subtype_ctrl;
duke@435 2344 }
duke@435 2345
duke@435 2346 // Gather the various success & failures here
duke@435 2347 RegionNode *r_ok_subtype = new (C, 4) RegionNode(4);
duke@435 2348 record_for_igvn(r_ok_subtype);
duke@435 2349 RegionNode *r_not_subtype = new (C, 3) RegionNode(3);
duke@435 2350 record_for_igvn(r_not_subtype);
duke@435 2351
duke@435 2352 r_ok_subtype->init_req(1, iftrue1);
duke@435 2353
duke@435 2354 // Check for immediate negative hit. Happens roughly 11% of the time (which
duke@435 2355 // is roughly 63% of the remaining cases). Test to see if the loaded
duke@435 2356 // check-offset points into the subklass display list or the 1-element
duke@435 2357 // cache. If it points to the display (and NOT the cache) and the display
duke@435 2358 // missed then it's not a subtype.
duke@435 2359 Node *cacheoff = _gvn.intcon(cacheoff_con);
duke@435 2360 Node *cmp2 = _gvn.transform( new (C, 3) CmpINode( chk_off, cacheoff ) );
duke@435 2361 Node *bol2 = _gvn.transform( new (C, 2) BoolNode( cmp2, BoolTest::ne ) );
duke@435 2362 IfNode *iff2 = create_and_xform_if( control(), bol2, PROB_LIKELY(0.63f), COUNT_UNKNOWN );
duke@435 2363 r_not_subtype->init_req(1, _gvn.transform( new (C, 1) IfTrueNode (iff2) ) );
duke@435 2364 set_control( _gvn.transform( new (C, 1) IfFalseNode(iff2) ) );
duke@435 2365
jrose@1079 2366 // Check for self. Very rare to get here, but it is taken 1/3 the time.
duke@435 2367 // No performance impact (too rare) but allows sharing of secondary arrays
duke@435 2368 // which has some footprint reduction.
duke@435 2369 Node *cmp3 = _gvn.transform( new (C, 3) CmpPNode( subklass, superklass ) );
duke@435 2370 Node *bol3 = _gvn.transform( new (C, 2) BoolNode( cmp3, BoolTest::eq ) );
duke@435 2371 IfNode *iff3 = create_and_xform_if( control(), bol3, PROB_LIKELY(0.36f), COUNT_UNKNOWN );
duke@435 2372 r_ok_subtype->init_req(2, _gvn.transform( new (C, 1) IfTrueNode ( iff3 ) ) );
duke@435 2373 set_control( _gvn.transform( new (C, 1) IfFalseNode( iff3 ) ) );
duke@435 2374
jrose@1079 2375 // -- Roads not taken here: --
jrose@1079 2376 // We could also have chosen to perform the self-check at the beginning
jrose@1079 2377 // of this code sequence, as the assembler does. This would not pay off
jrose@1079 2378 // the same way, since the optimizer, unlike the assembler, can perform
jrose@1079 2379 // static type analysis to fold away many successful self-checks.
jrose@1079 2380 // Non-foldable self checks work better here in second position, because
jrose@1079 2381 // the initial primary superclass check subsumes a self-check for most
jrose@1079 2382 // types. An exception would be a secondary type like array-of-interface,
jrose@1079 2383 // which does not appear in its own primary supertype display.
jrose@1079 2384 // Finally, we could have chosen to move the self-check into the
jrose@1079 2385 // PartialSubtypeCheckNode, and from there out-of-line in a platform
jrose@1079 2386 // dependent manner. But it is worthwhile to have the check here,
jrose@1079 2387 // where it can be perhaps be optimized. The cost in code space is
jrose@1079 2388 // small (register compare, branch).
jrose@1079 2389
duke@435 2390 // Now do a linear scan of the secondary super-klass array. Again, no real
duke@435 2391 // performance impact (too rare) but it's gotta be done.
duke@435 2392 // Since the code is rarely used, there is no penalty for moving it
jrose@1079 2393 // out of line, and it can only improve I-cache density.
jrose@1079 2394 // The decision to inline or out-of-line this final check is platform
jrose@1079 2395 // dependent, and is found in the AD file definition of PartialSubtypeCheck.
duke@435 2396 Node* psc = _gvn.transform(
duke@435 2397 new (C, 3) PartialSubtypeCheckNode(control(), subklass, superklass) );
duke@435 2398
duke@435 2399 Node *cmp4 = _gvn.transform( new (C, 3) CmpPNode( psc, null() ) );
duke@435 2400 Node *bol4 = _gvn.transform( new (C, 2) BoolNode( cmp4, BoolTest::ne ) );
duke@435 2401 IfNode *iff4 = create_and_xform_if( control(), bol4, PROB_FAIR, COUNT_UNKNOWN );
duke@435 2402 r_not_subtype->init_req(2, _gvn.transform( new (C, 1) IfTrueNode (iff4) ) );
duke@435 2403 r_ok_subtype ->init_req(3, _gvn.transform( new (C, 1) IfFalseNode(iff4) ) );
duke@435 2404
duke@435 2405 // Return false path; set default control to true path.
duke@435 2406 set_control( _gvn.transform(r_ok_subtype) );
duke@435 2407 return _gvn.transform(r_not_subtype);
duke@435 2408 }
duke@435 2409
duke@435 2410 //----------------------------static_subtype_check-----------------------------
duke@435 2411 // Shortcut important common cases when superklass is exact:
duke@435 2412 // (0) superklass is java.lang.Object (can occur in reflective code)
duke@435 2413 // (1) subklass is already limited to a subtype of superklass => always ok
duke@435 2414 // (2) subklass does not overlap with superklass => always fail
duke@435 2415 // (3) superklass has NO subtypes and we can check with a simple compare.
duke@435 2416 int GraphKit::static_subtype_check(ciKlass* superk, ciKlass* subk) {
duke@435 2417 if (StressReflectiveCode) {
duke@435 2418 return SSC_full_test; // Let caller generate the general case.
duke@435 2419 }
duke@435 2420
duke@435 2421 if (superk == env()->Object_klass()) {
duke@435 2422 return SSC_always_true; // (0) this test cannot fail
duke@435 2423 }
duke@435 2424
duke@435 2425 ciType* superelem = superk;
duke@435 2426 if (superelem->is_array_klass())
duke@435 2427 superelem = superelem->as_array_klass()->base_element_type();
duke@435 2428
duke@435 2429 if (!subk->is_interface()) { // cannot trust static interface types yet
duke@435 2430 if (subk->is_subtype_of(superk)) {
duke@435 2431 return SSC_always_true; // (1) false path dead; no dynamic test needed
duke@435 2432 }
duke@435 2433 if (!(superelem->is_klass() && superelem->as_klass()->is_interface()) &&
duke@435 2434 !superk->is_subtype_of(subk)) {
duke@435 2435 return SSC_always_false;
duke@435 2436 }
duke@435 2437 }
duke@435 2438
duke@435 2439 // If casting to an instance klass, it must have no subtypes
duke@435 2440 if (superk->is_interface()) {
duke@435 2441 // Cannot trust interfaces yet.
duke@435 2442 // %%% S.B. superk->nof_implementors() == 1
duke@435 2443 } else if (superelem->is_instance_klass()) {
duke@435 2444 ciInstanceKlass* ik = superelem->as_instance_klass();
duke@435 2445 if (!ik->has_subklass() && !ik->is_interface()) {
duke@435 2446 if (!ik->is_final()) {
duke@435 2447 // Add a dependency if there is a chance of a later subclass.
duke@435 2448 C->dependencies()->assert_leaf_type(ik);
duke@435 2449 }
duke@435 2450 return SSC_easy_test; // (3) caller can do a simple ptr comparison
duke@435 2451 }
duke@435 2452 } else {
duke@435 2453 // A primitive array type has no subtypes.
duke@435 2454 return SSC_easy_test; // (3) caller can do a simple ptr comparison
duke@435 2455 }
duke@435 2456
duke@435 2457 return SSC_full_test;
duke@435 2458 }
duke@435 2459
duke@435 2460 // Profile-driven exact type check:
duke@435 2461 Node* GraphKit::type_check_receiver(Node* receiver, ciKlass* klass,
duke@435 2462 float prob,
duke@435 2463 Node* *casted_receiver) {
duke@435 2464 const TypeKlassPtr* tklass = TypeKlassPtr::make(klass);
duke@435 2465 Node* recv_klass = load_object_klass(receiver);
duke@435 2466 Node* want_klass = makecon(tklass);
duke@435 2467 Node* cmp = _gvn.transform( new(C, 3) CmpPNode(recv_klass, want_klass) );
duke@435 2468 Node* bol = _gvn.transform( new(C, 2) BoolNode(cmp, BoolTest::eq) );
duke@435 2469 IfNode* iff = create_and_xform_if(control(), bol, prob, COUNT_UNKNOWN);
duke@435 2470 set_control( _gvn.transform( new(C, 1) IfTrueNode (iff) ));
duke@435 2471 Node* fail = _gvn.transform( new(C, 1) IfFalseNode(iff) );
duke@435 2472
duke@435 2473 const TypeOopPtr* recv_xtype = tklass->as_instance_type();
duke@435 2474 assert(recv_xtype->klass_is_exact(), "");
duke@435 2475
duke@435 2476 // Subsume downstream occurrences of receiver with a cast to
duke@435 2477 // recv_xtype, since now we know what the type will be.
duke@435 2478 Node* cast = new(C, 2) CheckCastPPNode(control(), receiver, recv_xtype);
duke@435 2479 (*casted_receiver) = _gvn.transform(cast);
duke@435 2480 // (User must make the replace_in_map call.)
duke@435 2481
duke@435 2482 return fail;
duke@435 2483 }
duke@435 2484
duke@435 2485
jrose@2101 2486 //------------------------------seems_never_null-------------------------------
jrose@2101 2487 // Use null_seen information if it is available from the profile.
jrose@2101 2488 // If we see an unexpected null at a type check we record it and force a
jrose@2101 2489 // recompile; the offending check will be recompiled to handle NULLs.
jrose@2101 2490 // If we see several offending BCIs, then all checks in the
jrose@2101 2491 // method will be recompiled.
jrose@2101 2492 bool GraphKit::seems_never_null(Node* obj, ciProfileData* data) {
jrose@2101 2493 if (UncommonNullCast // Cutout for this technique
jrose@2101 2494 && obj != null() // And not the -Xcomp stupid case?
jrose@2101 2495 && !too_many_traps(Deoptimization::Reason_null_check)
jrose@2101 2496 ) {
jrose@2101 2497 if (data == NULL)
jrose@2101 2498 // Edge case: no mature data. Be optimistic here.
jrose@2101 2499 return true;
jrose@2101 2500 // If the profile has not seen a null, assume it won't happen.
jrose@2101 2501 assert(java_bc() == Bytecodes::_checkcast ||
jrose@2101 2502 java_bc() == Bytecodes::_instanceof ||
jrose@2101 2503 java_bc() == Bytecodes::_aastore, "MDO must collect null_seen bit here");
jrose@2101 2504 return !data->as_BitData()->null_seen();
jrose@2101 2505 }
jrose@2101 2506 return false;
jrose@2101 2507 }
jrose@2101 2508
jrose@2101 2509 //------------------------maybe_cast_profiled_receiver-------------------------
jrose@2101 2510 // If the profile has seen exactly one type, narrow to exactly that type.
jrose@2101 2511 // Subsequent type checks will always fold up.
jrose@2101 2512 Node* GraphKit::maybe_cast_profiled_receiver(Node* not_null_obj,
jrose@2101 2513 ciProfileData* data,
jrose@2101 2514 ciKlass* require_klass) {
jrose@2101 2515 if (!UseTypeProfile || !TypeProfileCasts) return NULL;
jrose@2101 2516 if (data == NULL) return NULL;
jrose@2101 2517
jrose@2101 2518 // Make sure we haven't already deoptimized from this tactic.
jrose@2101 2519 if (too_many_traps(Deoptimization::Reason_class_check))
jrose@2101 2520 return NULL;
jrose@2101 2521
jrose@2101 2522 // (No, this isn't a call, but it's enough like a virtual call
jrose@2101 2523 // to use the same ciMethod accessor to get the profile info...)
jrose@2101 2524 ciCallProfile profile = method()->call_profile_at_bci(bci());
jrose@2101 2525 if (profile.count() >= 0 && // no cast failures here
jrose@2101 2526 profile.has_receiver(0) &&
jrose@2101 2527 profile.morphism() == 1) {
jrose@2101 2528 ciKlass* exact_kls = profile.receiver(0);
jrose@2101 2529 if (require_klass == NULL ||
jrose@2101 2530 static_subtype_check(require_klass, exact_kls) == SSC_always_true) {
jrose@2101 2531 // If we narrow the type to match what the type profile sees,
jrose@2101 2532 // we can then remove the rest of the cast.
jrose@2101 2533 // This is a win, even if the exact_kls is very specific,
jrose@2101 2534 // because downstream operations, such as method calls,
jrose@2101 2535 // will often benefit from the sharper type.
jrose@2101 2536 Node* exact_obj = not_null_obj; // will get updated in place...
jrose@2101 2537 Node* slow_ctl = type_check_receiver(exact_obj, exact_kls, 1.0,
jrose@2101 2538 &exact_obj);
jrose@2101 2539 { PreserveJVMState pjvms(this);
jrose@2101 2540 set_control(slow_ctl);
jrose@2101 2541 uncommon_trap(Deoptimization::Reason_class_check,
jrose@2101 2542 Deoptimization::Action_maybe_recompile);
jrose@2101 2543 }
jrose@2101 2544 replace_in_map(not_null_obj, exact_obj);
jrose@2101 2545 return exact_obj;
jrose@2101 2546 }
jrose@2101 2547 // assert(ssc == SSC_always_true)... except maybe the profile lied to us.
jrose@2101 2548 }
jrose@2101 2549
jrose@2101 2550 return NULL;
jrose@2101 2551 }
jrose@2101 2552
jrose@2101 2553
duke@435 2554 //-------------------------------gen_instanceof--------------------------------
duke@435 2555 // Generate an instance-of idiom. Used by both the instance-of bytecode
duke@435 2556 // and the reflective instance-of call.
jrose@2101 2557 Node* GraphKit::gen_instanceof(Node* obj, Node* superklass) {
jrose@2101 2558 kill_dead_locals(); // Benefit all the uncommon traps
duke@435 2559 assert( !stopped(), "dead parse path should be checked in callers" );
duke@435 2560 assert(!TypePtr::NULL_PTR->higher_equal(_gvn.type(superklass)->is_klassptr()),
duke@435 2561 "must check for not-null not-dead klass in callers");
duke@435 2562
duke@435 2563 // Make the merge point
duke@435 2564 enum { _obj_path = 1, _fail_path, _null_path, PATH_LIMIT };
duke@435 2565 RegionNode* region = new(C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 2566 Node* phi = new(C, PATH_LIMIT) PhiNode(region, TypeInt::BOOL);
duke@435 2567 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 2568
jrose@2101 2569 ciProfileData* data = NULL;
jrose@2101 2570 if (java_bc() == Bytecodes::_instanceof) { // Only for the bytecode
jrose@2101 2571 data = method()->method_data()->bci_to_data(bci());
jrose@2101 2572 }
jrose@2101 2573 bool never_see_null = (ProfileDynamicTypes // aggressive use of profile
jrose@2101 2574 && seems_never_null(obj, data));
jrose@2101 2575
duke@435 2576 // Null check; get casted pointer; set region slot 3
duke@435 2577 Node* null_ctl = top();
jrose@2101 2578 Node* not_null_obj = null_check_oop(obj, &null_ctl, never_see_null);
duke@435 2579
duke@435 2580 // If not_null_obj is dead, only null-path is taken
duke@435 2581 if (stopped()) { // Doing instance-of on a NULL?
duke@435 2582 set_control(null_ctl);
duke@435 2583 return intcon(0);
duke@435 2584 }
duke@435 2585 region->init_req(_null_path, null_ctl);
duke@435 2586 phi ->init_req(_null_path, intcon(0)); // Set null path value
jrose@2101 2587 if (null_ctl == top()) {
jrose@2101 2588 // Do this eagerly, so that pattern matches like is_diamond_phi
jrose@2101 2589 // will work even during parsing.
jrose@2101 2590 assert(_null_path == PATH_LIMIT-1, "delete last");
jrose@2101 2591 region->del_req(_null_path);
jrose@2101 2592 phi ->del_req(_null_path);
jrose@2101 2593 }
jrose@2101 2594
jrose@2101 2595 if (ProfileDynamicTypes && data != NULL) {
jrose@2101 2596 Node* cast_obj = maybe_cast_profiled_receiver(not_null_obj, data, NULL);
jrose@2101 2597 if (stopped()) { // Profile disagrees with this path.
jrose@2101 2598 set_control(null_ctl); // Null is the only remaining possibility.
jrose@2101 2599 return intcon(0);
jrose@2101 2600 }
jrose@2101 2601 if (cast_obj != NULL)
jrose@2101 2602 not_null_obj = cast_obj;
jrose@2101 2603 }
duke@435 2604
duke@435 2605 // Load the object's klass
duke@435 2606 Node* obj_klass = load_object_klass(not_null_obj);
duke@435 2607
duke@435 2608 // Generate the subtype check
duke@435 2609 Node* not_subtype_ctrl = gen_subtype_check(obj_klass, superklass);
duke@435 2610
duke@435 2611 // Plug in the success path to the general merge in slot 1.
duke@435 2612 region->init_req(_obj_path, control());
duke@435 2613 phi ->init_req(_obj_path, intcon(1));
duke@435 2614
duke@435 2615 // Plug in the failing path to the general merge in slot 2.
duke@435 2616 region->init_req(_fail_path, not_subtype_ctrl);
duke@435 2617 phi ->init_req(_fail_path, intcon(0));
duke@435 2618
duke@435 2619 // Return final merged results
duke@435 2620 set_control( _gvn.transform(region) );
duke@435 2621 record_for_igvn(region);
duke@435 2622 return _gvn.transform(phi);
duke@435 2623 }
duke@435 2624
duke@435 2625 //-------------------------------gen_checkcast---------------------------------
duke@435 2626 // Generate a checkcast idiom. Used by both the checkcast bytecode and the
duke@435 2627 // array store bytecode. Stack must be as-if BEFORE doing the bytecode so the
duke@435 2628 // uncommon-trap paths work. Adjust stack after this call.
duke@435 2629 // If failure_control is supplied and not null, it is filled in with
duke@435 2630 // the control edge for the cast failure. Otherwise, an appropriate
duke@435 2631 // uncommon trap or exception is thrown.
duke@435 2632 Node* GraphKit::gen_checkcast(Node *obj, Node* superklass,
duke@435 2633 Node* *failure_control) {
duke@435 2634 kill_dead_locals(); // Benefit all the uncommon traps
duke@435 2635 const TypeKlassPtr *tk = _gvn.type(superklass)->is_klassptr();
duke@435 2636 const Type *toop = TypeOopPtr::make_from_klass(tk->klass());
duke@435 2637
duke@435 2638 // Fast cutout: Check the case that the cast is vacuously true.
duke@435 2639 // This detects the common cases where the test will short-circuit
duke@435 2640 // away completely. We do this before we perform the null check,
duke@435 2641 // because if the test is going to turn into zero code, we don't
duke@435 2642 // want a residual null check left around. (Causes a slowdown,
duke@435 2643 // for example, in some objArray manipulations, such as a[i]=a[j].)
duke@435 2644 if (tk->singleton()) {
duke@435 2645 const TypeOopPtr* objtp = _gvn.type(obj)->isa_oopptr();
duke@435 2646 if (objtp != NULL && objtp->klass() != NULL) {
duke@435 2647 switch (static_subtype_check(tk->klass(), objtp->klass())) {
duke@435 2648 case SSC_always_true:
duke@435 2649 return obj;
duke@435 2650 case SSC_always_false:
duke@435 2651 // It needs a null check because a null will *pass* the cast check.
duke@435 2652 // A non-null value will always produce an exception.
duke@435 2653 return do_null_assert(obj, T_OBJECT);
duke@435 2654 }
duke@435 2655 }
duke@435 2656 }
duke@435 2657
duke@435 2658 ciProfileData* data = NULL;
duke@435 2659 if (failure_control == NULL) { // use MDO in regular case only
duke@435 2660 assert(java_bc() == Bytecodes::_aastore ||
duke@435 2661 java_bc() == Bytecodes::_checkcast,
duke@435 2662 "interpreter profiles type checks only for these BCs");
duke@435 2663 data = method()->method_data()->bci_to_data(bci());
duke@435 2664 }
duke@435 2665
duke@435 2666 // Make the merge point
duke@435 2667 enum { _obj_path = 1, _null_path, PATH_LIMIT };
duke@435 2668 RegionNode* region = new (C, PATH_LIMIT) RegionNode(PATH_LIMIT);
duke@435 2669 Node* phi = new (C, PATH_LIMIT) PhiNode(region, toop);
duke@435 2670 C->set_has_split_ifs(true); // Has chance for split-if optimization
duke@435 2671
duke@435 2672 // Use null-cast information if it is available
jrose@2101 2673 bool never_see_null = ((failure_control == NULL) // regular case only
jrose@2101 2674 && seems_never_null(obj, data));
duke@435 2675
duke@435 2676 // Null check; get casted pointer; set region slot 3
duke@435 2677 Node* null_ctl = top();
duke@435 2678 Node* not_null_obj = null_check_oop(obj, &null_ctl, never_see_null);
duke@435 2679
duke@435 2680 // If not_null_obj is dead, only null-path is taken
duke@435 2681 if (stopped()) { // Doing instance-of on a NULL?
duke@435 2682 set_control(null_ctl);
duke@435 2683 return null();
duke@435 2684 }
duke@435 2685 region->init_req(_null_path, null_ctl);
duke@435 2686 phi ->init_req(_null_path, null()); // Set null path value
jrose@2101 2687 if (null_ctl == top()) {
jrose@2101 2688 // Do this eagerly, so that pattern matches like is_diamond_phi
jrose@2101 2689 // will work even during parsing.
jrose@2101 2690 assert(_null_path == PATH_LIMIT-1, "delete last");
jrose@2101 2691 region->del_req(_null_path);
jrose@2101 2692 phi ->del_req(_null_path);
jrose@2101 2693 }
jrose@2101 2694
jrose@2101 2695 Node* cast_obj = NULL;
jrose@2101 2696 if (data != NULL &&
duke@435 2697 // Counter has never been decremented (due to cast failure).
duke@435 2698 // ...This is a reasonable thing to expect. It is true of
duke@435 2699 // all casts inserted by javac to implement generic types.
jrose@2101 2700 data->as_CounterData()->count() >= 0) {
jrose@2101 2701 cast_obj = maybe_cast_profiled_receiver(not_null_obj, data, tk->klass());
jrose@2101 2702 if (cast_obj != NULL) {
jrose@2101 2703 if (failure_control != NULL) // failure is now impossible
jrose@2101 2704 (*failure_control) = top();
jrose@2101 2705 // adjust the type of the phi to the exact klass:
jrose@2101 2706 phi->raise_bottom_type(_gvn.type(cast_obj)->meet(TypePtr::NULL_PTR));
duke@435 2707 }
duke@435 2708 }
duke@435 2709
duke@435 2710 if (cast_obj == NULL) {
duke@435 2711 // Load the object's klass
duke@435 2712 Node* obj_klass = load_object_klass(not_null_obj);
duke@435 2713
duke@435 2714 // Generate the subtype check
duke@435 2715 Node* not_subtype_ctrl = gen_subtype_check( obj_klass, superklass );
duke@435 2716
duke@435 2717 // Plug in success path into the merge
duke@435 2718 cast_obj = _gvn.transform(new (C, 2) CheckCastPPNode(control(),
duke@435 2719 not_null_obj, toop));
duke@435 2720 // Failure path ends in uncommon trap (or may be dead - failure impossible)
duke@435 2721 if (failure_control == NULL) {
duke@435 2722 if (not_subtype_ctrl != top()) { // If failure is possible
duke@435 2723 PreserveJVMState pjvms(this);
duke@435 2724 set_control(not_subtype_ctrl);
duke@435 2725 builtin_throw(Deoptimization::Reason_class_check, obj_klass);
duke@435 2726 }
duke@435 2727 } else {
duke@435 2728 (*failure_control) = not_subtype_ctrl;
duke@435 2729 }
duke@435 2730 }
duke@435 2731
duke@435 2732 region->init_req(_obj_path, control());
duke@435 2733 phi ->init_req(_obj_path, cast_obj);
duke@435 2734
duke@435 2735 // A merge of NULL or Casted-NotNull obj
duke@435 2736 Node* res = _gvn.transform(phi);
duke@435 2737
duke@435 2738 // Note I do NOT always 'replace_in_map(obj,result)' here.
duke@435 2739 // if( tk->klass()->can_be_primary_super() )
duke@435 2740 // This means that if I successfully store an Object into an array-of-String
duke@435 2741 // I 'forget' that the Object is really now known to be a String. I have to
duke@435 2742 // do this because we don't have true union types for interfaces - if I store
duke@435 2743 // a Baz into an array-of-Interface and then tell the optimizer it's an
duke@435 2744 // Interface, I forget that it's also a Baz and cannot do Baz-like field
duke@435 2745 // references to it. FIX THIS WHEN UNION TYPES APPEAR!
duke@435 2746 // replace_in_map( obj, res );
duke@435 2747
duke@435 2748 // Return final merged results
duke@435 2749 set_control( _gvn.transform(region) );
duke@435 2750 record_for_igvn(region);
duke@435 2751 return res;
duke@435 2752 }
duke@435 2753
duke@435 2754 //------------------------------next_monitor-----------------------------------
duke@435 2755 // What number should be given to the next monitor?
duke@435 2756 int GraphKit::next_monitor() {
duke@435 2757 int current = jvms()->monitor_depth()* C->sync_stack_slots();
duke@435 2758 int next = current + C->sync_stack_slots();
duke@435 2759 // Keep the toplevel high water mark current:
duke@435 2760 if (C->fixed_slots() < next) C->set_fixed_slots(next);
duke@435 2761 return current;
duke@435 2762 }
duke@435 2763
duke@435 2764 //------------------------------insert_mem_bar---------------------------------
duke@435 2765 // Memory barrier to avoid floating things around
duke@435 2766 // The membar serves as a pinch point between both control and all memory slices.
duke@435 2767 Node* GraphKit::insert_mem_bar(int opcode, Node* precedent) {
duke@435 2768 MemBarNode* mb = MemBarNode::make(C, opcode, Compile::AliasIdxBot, precedent);
duke@435 2769 mb->init_req(TypeFunc::Control, control());
duke@435 2770 mb->init_req(TypeFunc::Memory, reset_memory());
duke@435 2771 Node* membar = _gvn.transform(mb);
duke@435 2772 set_control(_gvn.transform(new (C, 1) ProjNode(membar,TypeFunc::Control) ));
duke@435 2773 set_all_memory_call(membar);
duke@435 2774 return membar;
duke@435 2775 }
duke@435 2776
duke@435 2777 //-------------------------insert_mem_bar_volatile----------------------------
duke@435 2778 // Memory barrier to avoid floating things around
duke@435 2779 // The membar serves as a pinch point between both control and memory(alias_idx).
duke@435 2780 // If you want to make a pinch point on all memory slices, do not use this
duke@435 2781 // function (even with AliasIdxBot); use insert_mem_bar() instead.
duke@435 2782 Node* GraphKit::insert_mem_bar_volatile(int opcode, int alias_idx, Node* precedent) {
duke@435 2783 // When Parse::do_put_xxx updates a volatile field, it appends a series
duke@435 2784 // of MemBarVolatile nodes, one for *each* volatile field alias category.
duke@435 2785 // The first membar is on the same memory slice as the field store opcode.
duke@435 2786 // This forces the membar to follow the store. (Bug 6500685 broke this.)
duke@435 2787 // All the other membars (for other volatile slices, including AliasIdxBot,
duke@435 2788 // which stands for all unknown volatile slices) are control-dependent
duke@435 2789 // on the first membar. This prevents later volatile loads or stores
duke@435 2790 // from sliding up past the just-emitted store.
duke@435 2791
duke@435 2792 MemBarNode* mb = MemBarNode::make(C, opcode, alias_idx, precedent);
duke@435 2793 mb->set_req(TypeFunc::Control,control());
duke@435 2794 if (alias_idx == Compile::AliasIdxBot) {
duke@435 2795 mb->set_req(TypeFunc::Memory, merged_memory()->base_memory());
duke@435 2796 } else {
duke@435 2797 assert(!(opcode == Op_Initialize && alias_idx != Compile::AliasIdxRaw), "fix caller");
duke@435 2798 mb->set_req(TypeFunc::Memory, memory(alias_idx));
duke@435 2799 }
duke@435 2800 Node* membar = _gvn.transform(mb);
duke@435 2801 set_control(_gvn.transform(new (C, 1) ProjNode(membar, TypeFunc::Control)));
duke@435 2802 if (alias_idx == Compile::AliasIdxBot) {
duke@435 2803 merged_memory()->set_base_memory(_gvn.transform(new (C, 1) ProjNode(membar, TypeFunc::Memory)));
duke@435 2804 } else {
duke@435 2805 set_memory(_gvn.transform(new (C, 1) ProjNode(membar, TypeFunc::Memory)),alias_idx);
duke@435 2806 }
duke@435 2807 return membar;
duke@435 2808 }
duke@435 2809
duke@435 2810 //------------------------------shared_lock------------------------------------
duke@435 2811 // Emit locking code.
duke@435 2812 FastLockNode* GraphKit::shared_lock(Node* obj) {
duke@435 2813 // bci is either a monitorenter bc or InvocationEntryBci
duke@435 2814 // %%% SynchronizationEntryBCI is redundant; use InvocationEntryBci in interfaces
duke@435 2815 assert(SynchronizationEntryBCI == InvocationEntryBci, "");
duke@435 2816
duke@435 2817 if( !GenerateSynchronizationCode )
duke@435 2818 return NULL; // Not locking things?
duke@435 2819 if (stopped()) // Dead monitor?
duke@435 2820 return NULL;
duke@435 2821
duke@435 2822 assert(dead_locals_are_killed(), "should kill locals before sync. point");
duke@435 2823
duke@435 2824 // Box the stack location
duke@435 2825 Node* box = _gvn.transform(new (C, 1) BoxLockNode(next_monitor()));
duke@435 2826 Node* mem = reset_memory();
duke@435 2827
duke@435 2828 FastLockNode * flock = _gvn.transform(new (C, 3) FastLockNode(0, obj, box) )->as_FastLock();
duke@435 2829 if (PrintPreciseBiasedLockingStatistics) {
duke@435 2830 // Create the counters for this fast lock.
duke@435 2831 flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci
duke@435 2832 }
duke@435 2833 // Add monitor to debug info for the slow path. If we block inside the
duke@435 2834 // slow path and de-opt, we need the monitor hanging around
duke@435 2835 map()->push_monitor( flock );
duke@435 2836
duke@435 2837 const TypeFunc *tf = LockNode::lock_type();
duke@435 2838 LockNode *lock = new (C, tf->domain()->cnt()) LockNode(C, tf);
duke@435 2839
duke@435 2840 lock->init_req( TypeFunc::Control, control() );
duke@435 2841 lock->init_req( TypeFunc::Memory , mem );
duke@435 2842 lock->init_req( TypeFunc::I_O , top() ) ; // does no i/o
duke@435 2843 lock->init_req( TypeFunc::FramePtr, frameptr() );
duke@435 2844 lock->init_req( TypeFunc::ReturnAdr, top() );
duke@435 2845
duke@435 2846 lock->init_req(TypeFunc::Parms + 0, obj);
duke@435 2847 lock->init_req(TypeFunc::Parms + 1, box);
duke@435 2848 lock->init_req(TypeFunc::Parms + 2, flock);
duke@435 2849 add_safepoint_edges(lock);
duke@435 2850
duke@435 2851 lock = _gvn.transform( lock )->as_Lock();
duke@435 2852
duke@435 2853 // lock has no side-effects, sets few values
duke@435 2854 set_predefined_output_for_runtime_call(lock, mem, TypeRawPtr::BOTTOM);
duke@435 2855
duke@435 2856 insert_mem_bar(Op_MemBarAcquire);
duke@435 2857
duke@435 2858 // Add this to the worklist so that the lock can be eliminated
duke@435 2859 record_for_igvn(lock);
duke@435 2860
duke@435 2861 #ifndef PRODUCT
duke@435 2862 if (PrintLockStatistics) {
duke@435 2863 // Update the counter for this lock. Don't bother using an atomic
duke@435 2864 // operation since we don't require absolute accuracy.
duke@435 2865 lock->create_lock_counter(map()->jvms());
kvn@1964 2866 increment_counter(lock->counter()->addr());
duke@435 2867 }
duke@435 2868 #endif
duke@435 2869
duke@435 2870 return flock;
duke@435 2871 }
duke@435 2872
duke@435 2873
duke@435 2874 //------------------------------shared_unlock----------------------------------
duke@435 2875 // Emit unlocking code.
duke@435 2876 void GraphKit::shared_unlock(Node* box, Node* obj) {
duke@435 2877 // bci is either a monitorenter bc or InvocationEntryBci
duke@435 2878 // %%% SynchronizationEntryBCI is redundant; use InvocationEntryBci in interfaces
duke@435 2879 assert(SynchronizationEntryBCI == InvocationEntryBci, "");
duke@435 2880
duke@435 2881 if( !GenerateSynchronizationCode )
duke@435 2882 return;
duke@435 2883 if (stopped()) { // Dead monitor?
duke@435 2884 map()->pop_monitor(); // Kill monitor from debug info
duke@435 2885 return;
duke@435 2886 }
duke@435 2887
duke@435 2888 // Memory barrier to avoid floating things down past the locked region
duke@435 2889 insert_mem_bar(Op_MemBarRelease);
duke@435 2890
duke@435 2891 const TypeFunc *tf = OptoRuntime::complete_monitor_exit_Type();
duke@435 2892 UnlockNode *unlock = new (C, tf->domain()->cnt()) UnlockNode(C, tf);
duke@435 2893 uint raw_idx = Compile::AliasIdxRaw;
duke@435 2894 unlock->init_req( TypeFunc::Control, control() );
duke@435 2895 unlock->init_req( TypeFunc::Memory , memory(raw_idx) );
duke@435 2896 unlock->init_req( TypeFunc::I_O , top() ) ; // does no i/o
duke@435 2897 unlock->init_req( TypeFunc::FramePtr, frameptr() );
duke@435 2898 unlock->init_req( TypeFunc::ReturnAdr, top() );
duke@435 2899
duke@435 2900 unlock->init_req(TypeFunc::Parms + 0, obj);
duke@435 2901 unlock->init_req(TypeFunc::Parms + 1, box);
duke@435 2902 unlock = _gvn.transform(unlock)->as_Unlock();
duke@435 2903
duke@435 2904 Node* mem = reset_memory();
duke@435 2905
duke@435 2906 // unlock has no side-effects, sets few values
duke@435 2907 set_predefined_output_for_runtime_call(unlock, mem, TypeRawPtr::BOTTOM);
duke@435 2908
duke@435 2909 // Kill monitor from debug info
duke@435 2910 map()->pop_monitor( );
duke@435 2911 }
duke@435 2912
duke@435 2913 //-------------------------------get_layout_helper-----------------------------
duke@435 2914 // If the given klass is a constant or known to be an array,
duke@435 2915 // fetch the constant layout helper value into constant_value
duke@435 2916 // and return (Node*)NULL. Otherwise, load the non-constant
duke@435 2917 // layout helper value, and return the node which represents it.
duke@435 2918 // This two-faced routine is useful because allocation sites
duke@435 2919 // almost always feature constant types.
duke@435 2920 Node* GraphKit::get_layout_helper(Node* klass_node, jint& constant_value) {
duke@435 2921 const TypeKlassPtr* inst_klass = _gvn.type(klass_node)->isa_klassptr();
duke@435 2922 if (!StressReflectiveCode && inst_klass != NULL) {
duke@435 2923 ciKlass* klass = inst_klass->klass();
duke@435 2924 bool xklass = inst_klass->klass_is_exact();
duke@435 2925 if (xklass || klass->is_array_klass()) {
duke@435 2926 jint lhelper = klass->layout_helper();
duke@435 2927 if (lhelper != Klass::_lh_neutral_value) {
duke@435 2928 constant_value = lhelper;
duke@435 2929 return (Node*) NULL;
duke@435 2930 }
duke@435 2931 }
duke@435 2932 }
duke@435 2933 constant_value = Klass::_lh_neutral_value; // put in a known value
duke@435 2934 Node* lhp = basic_plus_adr(klass_node, klass_node, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc));
duke@435 2935 return make_load(NULL, lhp, TypeInt::INT, T_INT);
duke@435 2936 }
duke@435 2937
duke@435 2938 // We just put in an allocate/initialize with a big raw-memory effect.
duke@435 2939 // Hook selected additional alias categories on the initialization.
duke@435 2940 static void hook_memory_on_init(GraphKit& kit, int alias_idx,
duke@435 2941 MergeMemNode* init_in_merge,
duke@435 2942 Node* init_out_raw) {
duke@435 2943 DEBUG_ONLY(Node* init_in_raw = init_in_merge->base_memory());
duke@435 2944 assert(init_in_merge->memory_at(alias_idx) == init_in_raw, "");
duke@435 2945
duke@435 2946 Node* prevmem = kit.memory(alias_idx);
duke@435 2947 init_in_merge->set_memory_at(alias_idx, prevmem);
duke@435 2948 kit.set_memory(init_out_raw, alias_idx);
duke@435 2949 }
duke@435 2950
duke@435 2951 //---------------------------set_output_for_allocation-------------------------
duke@435 2952 Node* GraphKit::set_output_for_allocation(AllocateNode* alloc,
duke@435 2953 const TypeOopPtr* oop_type,
duke@435 2954 bool raw_mem_only) {
duke@435 2955 int rawidx = Compile::AliasIdxRaw;
duke@435 2956 alloc->set_req( TypeFunc::FramePtr, frameptr() );
duke@435 2957 add_safepoint_edges(alloc);
duke@435 2958 Node* allocx = _gvn.transform(alloc);
duke@435 2959 set_control( _gvn.transform(new (C, 1) ProjNode(allocx, TypeFunc::Control) ) );
duke@435 2960 // create memory projection for i_o
duke@435 2961 set_memory ( _gvn.transform( new (C, 1) ProjNode(allocx, TypeFunc::Memory, true) ), rawidx );
duke@435 2962 make_slow_call_ex(allocx, env()->OutOfMemoryError_klass(), true);
duke@435 2963
duke@435 2964 // create a memory projection as for the normal control path
duke@435 2965 Node* malloc = _gvn.transform(new (C, 1) ProjNode(allocx, TypeFunc::Memory));
duke@435 2966 set_memory(malloc, rawidx);
duke@435 2967
duke@435 2968 // a normal slow-call doesn't change i_o, but an allocation does
duke@435 2969 // we create a separate i_o projection for the normal control path
duke@435 2970 set_i_o(_gvn.transform( new (C, 1) ProjNode(allocx, TypeFunc::I_O, false) ) );
duke@435 2971 Node* rawoop = _gvn.transform( new (C, 1) ProjNode(allocx, TypeFunc::Parms) );
duke@435 2972
duke@435 2973 // put in an initialization barrier
duke@435 2974 InitializeNode* init = insert_mem_bar_volatile(Op_Initialize, rawidx,
duke@435 2975 rawoop)->as_Initialize();
duke@435 2976 assert(alloc->initialization() == init, "2-way macro link must work");
duke@435 2977 assert(init ->allocation() == alloc, "2-way macro link must work");
duke@435 2978 if (ReduceFieldZeroing && !raw_mem_only) {
duke@435 2979 // Extract memory strands which may participate in the new object's
duke@435 2980 // initialization, and source them from the new InitializeNode.
duke@435 2981 // This will allow us to observe initializations when they occur,
duke@435 2982 // and link them properly (as a group) to the InitializeNode.
duke@435 2983 assert(init->in(InitializeNode::Memory) == malloc, "");
duke@435 2984 MergeMemNode* minit_in = MergeMemNode::make(C, malloc);
duke@435 2985 init->set_req(InitializeNode::Memory, minit_in);
duke@435 2986 record_for_igvn(minit_in); // fold it up later, if possible
duke@435 2987 Node* minit_out = memory(rawidx);
duke@435 2988 assert(minit_out->is_Proj() && minit_out->in(0) == init, "");
duke@435 2989 if (oop_type->isa_aryptr()) {
duke@435 2990 const TypePtr* telemref = oop_type->add_offset(Type::OffsetBot);
duke@435 2991 int elemidx = C->get_alias_index(telemref);
duke@435 2992 hook_memory_on_init(*this, elemidx, minit_in, minit_out);
duke@435 2993 } else if (oop_type->isa_instptr()) {
duke@435 2994 ciInstanceKlass* ik = oop_type->klass()->as_instance_klass();
duke@435 2995 for (int i = 0, len = ik->nof_nonstatic_fields(); i < len; i++) {
duke@435 2996 ciField* field = ik->nonstatic_field_at(i);
kvn@458 2997 if (field->offset() >= TrackedInitializationLimit * HeapWordSize)
duke@435 2998 continue; // do not bother to track really large numbers of fields
duke@435 2999 // Find (or create) the alias category for this field:
duke@435 3000 int fieldidx = C->alias_type(field)->index();
duke@435 3001 hook_memory_on_init(*this, fieldidx, minit_in, minit_out);
duke@435 3002 }
duke@435 3003 }
duke@435 3004 }
duke@435 3005
duke@435 3006 // Cast raw oop to the real thing...
duke@435 3007 Node* javaoop = new (C, 2) CheckCastPPNode(control(), rawoop, oop_type);
duke@435 3008 javaoop = _gvn.transform(javaoop);
duke@435 3009 C->set_recent_alloc(control(), javaoop);
duke@435 3010 assert(just_allocated_object(control()) == javaoop, "just allocated");
duke@435 3011
duke@435 3012 #ifdef ASSERT
rasbold@801 3013 { // Verify that the AllocateNode::Ideal_allocation recognizers work:
rasbold@801 3014 assert(AllocateNode::Ideal_allocation(rawoop, &_gvn) == alloc,
rasbold@801 3015 "Ideal_allocation works");
rasbold@801 3016 assert(AllocateNode::Ideal_allocation(javaoop, &_gvn) == alloc,
rasbold@801 3017 "Ideal_allocation works");
duke@435 3018 if (alloc->is_AllocateArray()) {
rasbold@801 3019 assert(AllocateArrayNode::Ideal_array_allocation(rawoop, &_gvn) == alloc->as_AllocateArray(),
rasbold@801 3020 "Ideal_allocation works");
rasbold@801 3021 assert(AllocateArrayNode::Ideal_array_allocation(javaoop, &_gvn) == alloc->as_AllocateArray(),
rasbold@801 3022 "Ideal_allocation works");
duke@435 3023 } else {
rasbold@801 3024 assert(alloc->in(AllocateNode::ALength)->is_top(), "no length, please");
duke@435 3025 }
duke@435 3026 }
duke@435 3027 #endif //ASSERT
duke@435 3028
duke@435 3029 return javaoop;
duke@435 3030 }
duke@435 3031
duke@435 3032 //---------------------------new_instance--------------------------------------
duke@435 3033 // This routine takes a klass_node which may be constant (for a static type)
duke@435 3034 // or may be non-constant (for reflective code). It will work equally well
duke@435 3035 // for either, and the graph will fold nicely if the optimizer later reduces
duke@435 3036 // the type to a constant.
duke@435 3037 // The optional arguments are for specialized use by intrinsics:
duke@435 3038 // - If 'extra_slow_test' if not null is an extra condition for the slow-path.
duke@435 3039 // - If 'raw_mem_only', do not cast the result to an oop.
duke@435 3040 // - If 'return_size_val', report the the total object size to the caller.
duke@435 3041 Node* GraphKit::new_instance(Node* klass_node,
duke@435 3042 Node* extra_slow_test,
duke@435 3043 bool raw_mem_only, // affect only raw memory
duke@435 3044 Node* *return_size_val) {
duke@435 3045 // Compute size in doublewords
duke@435 3046 // The size is always an integral number of doublewords, represented
duke@435 3047 // as a positive bytewise size stored in the klass's layout_helper.
duke@435 3048 // The layout_helper also encodes (in a low bit) the need for a slow path.
duke@435 3049 jint layout_con = Klass::_lh_neutral_value;
duke@435 3050 Node* layout_val = get_layout_helper(klass_node, layout_con);
duke@435 3051 int layout_is_con = (layout_val == NULL);
duke@435 3052
duke@435 3053 if (extra_slow_test == NULL) extra_slow_test = intcon(0);
duke@435 3054 // Generate the initial go-slow test. It's either ALWAYS (return a
duke@435 3055 // Node for 1) or NEVER (return a NULL) or perhaps (in the reflective
duke@435 3056 // case) a computed value derived from the layout_helper.
duke@435 3057 Node* initial_slow_test = NULL;
duke@435 3058 if (layout_is_con) {
duke@435 3059 assert(!StressReflectiveCode, "stress mode does not use these paths");
duke@435 3060 bool must_go_slow = Klass::layout_helper_needs_slow_path(layout_con);
duke@435 3061 initial_slow_test = must_go_slow? intcon(1): extra_slow_test;
duke@435 3062
duke@435 3063 } else { // reflective case
duke@435 3064 // This reflective path is used by Unsafe.allocateInstance.
duke@435 3065 // (It may be stress-tested by specifying StressReflectiveCode.)
duke@435 3066 // Basically, we want to get into the VM is there's an illegal argument.
duke@435 3067 Node* bit = intcon(Klass::_lh_instance_slow_path_bit);
duke@435 3068 initial_slow_test = _gvn.transform( new (C, 3) AndINode(layout_val, bit) );
duke@435 3069 if (extra_slow_test != intcon(0)) {
duke@435 3070 initial_slow_test = _gvn.transform( new (C, 3) OrINode(initial_slow_test, extra_slow_test) );
duke@435 3071 }
duke@435 3072 // (Macro-expander will further convert this to a Bool, if necessary.)
duke@435 3073 }
duke@435 3074
duke@435 3075 // Find the size in bytes. This is easy; it's the layout_helper.
duke@435 3076 // The size value must be valid even if the slow path is taken.
duke@435 3077 Node* size = NULL;
duke@435 3078 if (layout_is_con) {
duke@435 3079 size = MakeConX(Klass::layout_helper_size_in_bytes(layout_con));
duke@435 3080 } else { // reflective case
duke@435 3081 // This reflective path is used by clone and Unsafe.allocateInstance.
duke@435 3082 size = ConvI2X(layout_val);
duke@435 3083
duke@435 3084 // Clear the low bits to extract layout_helper_size_in_bytes:
duke@435 3085 assert((int)Klass::_lh_instance_slow_path_bit < BytesPerLong, "clear bit");
duke@435 3086 Node* mask = MakeConX(~ (intptr_t)right_n_bits(LogBytesPerLong));
duke@435 3087 size = _gvn.transform( new (C, 3) AndXNode(size, mask) );
duke@435 3088 }
duke@435 3089 if (return_size_val != NULL) {
duke@435 3090 (*return_size_val) = size;
duke@435 3091 }
duke@435 3092
duke@435 3093 // This is a precise notnull oop of the klass.
duke@435 3094 // (Actually, it need not be precise if this is a reflective allocation.)
duke@435 3095 // It's what we cast the result to.
duke@435 3096 const TypeKlassPtr* tklass = _gvn.type(klass_node)->isa_klassptr();
duke@435 3097 if (!tklass) tklass = TypeKlassPtr::OBJECT;
duke@435 3098 const TypeOopPtr* oop_type = tklass->as_instance_type();
duke@435 3099
duke@435 3100 // Now generate allocation code
kvn@509 3101
kvn@1000 3102 // The entire memory state is needed for slow path of the allocation
kvn@1000 3103 // since GC and deoptimization can happened.
kvn@1000 3104 Node *mem = reset_memory();
kvn@1000 3105 set_all_memory(mem); // Create new memory state
kvn@509 3106
duke@435 3107 AllocateNode* alloc
duke@435 3108 = new (C, AllocateNode::ParmLimit)
duke@435 3109 AllocateNode(C, AllocateNode::alloc_type(),
kvn@509 3110 control(), mem, i_o(),
duke@435 3111 size, klass_node,
duke@435 3112 initial_slow_test);
duke@435 3113
duke@435 3114 return set_output_for_allocation(alloc, oop_type, raw_mem_only);
duke@435 3115 }
duke@435 3116
duke@435 3117 //-------------------------------new_array-------------------------------------
duke@435 3118 // helper for both newarray and anewarray
duke@435 3119 // The 'length' parameter is (obviously) the length of the array.
duke@435 3120 // See comments on new_instance for the meaning of the other arguments.
duke@435 3121 Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable)
duke@435 3122 Node* length, // number of array elements
cfang@1165 3123 int nargs, // number of arguments to push back for uncommon trap
duke@435 3124 bool raw_mem_only, // affect only raw memory
duke@435 3125 Node* *return_size_val) {
duke@435 3126 jint layout_con = Klass::_lh_neutral_value;
duke@435 3127 Node* layout_val = get_layout_helper(klass_node, layout_con);
duke@435 3128 int layout_is_con = (layout_val == NULL);
duke@435 3129
duke@435 3130 if (!layout_is_con && !StressReflectiveCode &&
duke@435 3131 !too_many_traps(Deoptimization::Reason_class_check)) {
duke@435 3132 // This is a reflective array creation site.
duke@435 3133 // Optimistically assume that it is a subtype of Object[],
duke@435 3134 // so that we can fold up all the address arithmetic.
duke@435 3135 layout_con = Klass::array_layout_helper(T_OBJECT);
duke@435 3136 Node* cmp_lh = _gvn.transform( new(C, 3) CmpINode(layout_val, intcon(layout_con)) );
duke@435 3137 Node* bol_lh = _gvn.transform( new(C, 2) BoolNode(cmp_lh, BoolTest::eq) );
duke@435 3138 { BuildCutout unless(this, bol_lh, PROB_MAX);
cfang@1165 3139 _sp += nargs;
duke@435 3140 uncommon_trap(Deoptimization::Reason_class_check,
duke@435 3141 Deoptimization::Action_maybe_recompile);
duke@435 3142 }
duke@435 3143 layout_val = NULL;
duke@435 3144 layout_is_con = true;
duke@435 3145 }
duke@435 3146
duke@435 3147 // Generate the initial go-slow test. Make sure we do not overflow
duke@435 3148 // if length is huge (near 2Gig) or negative! We do not need
duke@435 3149 // exact double-words here, just a close approximation of needed
duke@435 3150 // double-words. We can't add any offset or rounding bits, lest we
duke@435 3151 // take a size -1 of bytes and make it positive. Use an unsigned
duke@435 3152 // compare, so negative sizes look hugely positive.
duke@435 3153 int fast_size_limit = FastAllocateSizeLimit;
duke@435 3154 if (layout_is_con) {
duke@435 3155 assert(!StressReflectiveCode, "stress mode does not use these paths");
duke@435 3156 // Increase the size limit if we have exact knowledge of array type.
duke@435 3157 int log2_esize = Klass::layout_helper_log2_element_size(layout_con);
duke@435 3158 fast_size_limit <<= (LogBytesPerLong - log2_esize);
duke@435 3159 }
duke@435 3160
duke@435 3161 Node* initial_slow_cmp = _gvn.transform( new (C, 3) CmpUNode( length, intcon( fast_size_limit ) ) );
duke@435 3162 Node* initial_slow_test = _gvn.transform( new (C, 2) BoolNode( initial_slow_cmp, BoolTest::gt ) );
duke@435 3163 if (initial_slow_test->is_Bool()) {
duke@435 3164 // Hide it behind a CMoveI, or else PhaseIdealLoop::split_up will get sick.
duke@435 3165 initial_slow_test = initial_slow_test->as_Bool()->as_int_value(&_gvn);
duke@435 3166 }
duke@435 3167
duke@435 3168 // --- Size Computation ---
duke@435 3169 // array_size = round_to_heap(array_header + (length << elem_shift));
duke@435 3170 // where round_to_heap(x) == round_to(x, MinObjAlignmentInBytes)
duke@435 3171 // and round_to(x, y) == ((x + y-1) & ~(y-1))
duke@435 3172 // The rounding mask is strength-reduced, if possible.
duke@435 3173 int round_mask = MinObjAlignmentInBytes - 1;
duke@435 3174 Node* header_size = NULL;
duke@435 3175 int header_size_min = arrayOopDesc::base_offset_in_bytes(T_BYTE);
duke@435 3176 // (T_BYTE has the weakest alignment and size restrictions...)
duke@435 3177 if (layout_is_con) {
duke@435 3178 int hsize = Klass::layout_helper_header_size(layout_con);
duke@435 3179 int eshift = Klass::layout_helper_log2_element_size(layout_con);
duke@435 3180 BasicType etype = Klass::layout_helper_element_type(layout_con);
duke@435 3181 if ((round_mask & ~right_n_bits(eshift)) == 0)
duke@435 3182 round_mask = 0; // strength-reduce it if it goes away completely
duke@435 3183 assert((hsize & right_n_bits(eshift)) == 0, "hsize is pre-rounded");
duke@435 3184 assert(header_size_min <= hsize, "generic minimum is smallest");
duke@435 3185 header_size_min = hsize;
duke@435 3186 header_size = intcon(hsize + round_mask);
duke@435 3187 } else {
duke@435 3188 Node* hss = intcon(Klass::_lh_header_size_shift);
duke@435 3189 Node* hsm = intcon(Klass::_lh_header_size_mask);
duke@435 3190 Node* hsize = _gvn.transform( new(C, 3) URShiftINode(layout_val, hss) );
duke@435 3191 hsize = _gvn.transform( new(C, 3) AndINode(hsize, hsm) );
duke@435 3192 Node* mask = intcon(round_mask);
duke@435 3193 header_size = _gvn.transform( new(C, 3) AddINode(hsize, mask) );
duke@435 3194 }
duke@435 3195
duke@435 3196 Node* elem_shift = NULL;
duke@435 3197 if (layout_is_con) {
duke@435 3198 int eshift = Klass::layout_helper_log2_element_size(layout_con);
duke@435 3199 if (eshift != 0)
duke@435 3200 elem_shift = intcon(eshift);
duke@435 3201 } else {
duke@435 3202 // There is no need to mask or shift this value.
duke@435 3203 // The semantics of LShiftINode include an implicit mask to 0x1F.
duke@435 3204 assert(Klass::_lh_log2_element_size_shift == 0, "use shift in place");
duke@435 3205 elem_shift = layout_val;
duke@435 3206 }
duke@435 3207
duke@435 3208 // Transition to native address size for all offset calculations:
duke@435 3209 Node* lengthx = ConvI2X(length);
duke@435 3210 Node* headerx = ConvI2X(header_size);
duke@435 3211 #ifdef _LP64
duke@435 3212 { const TypeLong* tllen = _gvn.find_long_type(lengthx);
duke@435 3213 if (tllen != NULL && tllen->_lo < 0) {
duke@435 3214 // Add a manual constraint to a positive range. Cf. array_element_address.
duke@435 3215 jlong size_max = arrayOopDesc::max_array_length(T_BYTE);
duke@435 3216 if (size_max > tllen->_hi) size_max = tllen->_hi;
duke@435 3217 const TypeLong* tlcon = TypeLong::make(CONST64(0), size_max, Type::WidenMin);
duke@435 3218 lengthx = _gvn.transform( new (C, 2) ConvI2LNode(length, tlcon));
duke@435 3219 }
duke@435 3220 }
duke@435 3221 #endif
duke@435 3222
duke@435 3223 // Combine header size (plus rounding) and body size. Then round down.
duke@435 3224 // This computation cannot overflow, because it is used only in two
duke@435 3225 // places, one where the length is sharply limited, and the other
duke@435 3226 // after a successful allocation.
duke@435 3227 Node* abody = lengthx;
duke@435 3228 if (elem_shift != NULL)
duke@435 3229 abody = _gvn.transform( new(C, 3) LShiftXNode(lengthx, elem_shift) );
duke@435 3230 Node* size = _gvn.transform( new(C, 3) AddXNode(headerx, abody) );
duke@435 3231 if (round_mask != 0) {
duke@435 3232 Node* mask = MakeConX(~round_mask);
duke@435 3233 size = _gvn.transform( new(C, 3) AndXNode(size, mask) );
duke@435 3234 }
duke@435 3235 // else if round_mask == 0, the size computation is self-rounding
duke@435 3236
duke@435 3237 if (return_size_val != NULL) {
duke@435 3238 // This is the size
duke@435 3239 (*return_size_val) = size;
duke@435 3240 }
duke@435 3241
duke@435 3242 // Now generate allocation code
kvn@509 3243
kvn@1000 3244 // The entire memory state is needed for slow path of the allocation
kvn@1000 3245 // since GC and deoptimization can happened.
kvn@1000 3246 Node *mem = reset_memory();
kvn@1000 3247 set_all_memory(mem); // Create new memory state
kvn@509 3248
duke@435 3249 // Create the AllocateArrayNode and its result projections
duke@435 3250 AllocateArrayNode* alloc
duke@435 3251 = new (C, AllocateArrayNode::ParmLimit)
duke@435 3252 AllocateArrayNode(C, AllocateArrayNode::alloc_type(),
kvn@509 3253 control(), mem, i_o(),
duke@435 3254 size, klass_node,
duke@435 3255 initial_slow_test,
duke@435 3256 length);
duke@435 3257
duke@435 3258 // Cast to correct type. Note that the klass_node may be constant or not,
duke@435 3259 // and in the latter case the actual array type will be inexact also.
duke@435 3260 // (This happens via a non-constant argument to inline_native_newArray.)
duke@435 3261 // In any case, the value of klass_node provides the desired array type.
duke@435 3262 const TypeInt* length_type = _gvn.find_int_type(length);
duke@435 3263 const TypeOopPtr* ary_type = _gvn.type(klass_node)->is_klassptr()->as_instance_type();
duke@435 3264 if (ary_type->isa_aryptr() && length_type != NULL) {
duke@435 3265 // Try to get a better type than POS for the size
duke@435 3266 ary_type = ary_type->is_aryptr()->cast_to_size(length_type);
duke@435 3267 }
duke@435 3268
duke@435 3269 Node* javaoop = set_output_for_allocation(alloc, ary_type, raw_mem_only);
duke@435 3270
rasbold@801 3271 // Cast length on remaining path to be as narrow as possible
rasbold@801 3272 if (map()->find_edge(length) >= 0) {
rasbold@801 3273 Node* ccast = alloc->make_ideal_length(ary_type, &_gvn);
rasbold@801 3274 if (ccast != length) {
rasbold@801 3275 _gvn.set_type_bottom(ccast);
rasbold@801 3276 record_for_igvn(ccast);
duke@435 3277 replace_in_map(length, ccast);
duke@435 3278 }
duke@435 3279 }
duke@435 3280
duke@435 3281 return javaoop;
duke@435 3282 }
duke@435 3283
duke@435 3284 // The following "Ideal_foo" functions are placed here because they recognize
duke@435 3285 // the graph shapes created by the functions immediately above.
duke@435 3286
duke@435 3287 //---------------------------Ideal_allocation----------------------------------
duke@435 3288 // Given an oop pointer or raw pointer, see if it feeds from an AllocateNode.
duke@435 3289 AllocateNode* AllocateNode::Ideal_allocation(Node* ptr, PhaseTransform* phase) {
duke@435 3290 if (ptr == NULL) { // reduce dumb test in callers
duke@435 3291 return NULL;
duke@435 3292 }
duke@435 3293 if (ptr->is_CheckCastPP()) { // strip a raw-to-oop cast
duke@435 3294 ptr = ptr->in(1);
duke@435 3295 if (ptr == NULL) return NULL;
duke@435 3296 }
duke@435 3297 if (ptr->is_Proj()) {
duke@435 3298 Node* allo = ptr->in(0);
duke@435 3299 if (allo != NULL && allo->is_Allocate()) {
duke@435 3300 return allo->as_Allocate();
duke@435 3301 }
duke@435 3302 }
duke@435 3303 // Report failure to match.
duke@435 3304 return NULL;
duke@435 3305 }
duke@435 3306
duke@435 3307 // Fancy version which also strips off an offset (and reports it to caller).
duke@435 3308 AllocateNode* AllocateNode::Ideal_allocation(Node* ptr, PhaseTransform* phase,
duke@435 3309 intptr_t& offset) {
duke@435 3310 Node* base = AddPNode::Ideal_base_and_offset(ptr, phase, offset);
duke@435 3311 if (base == NULL) return NULL;
duke@435 3312 return Ideal_allocation(base, phase);
duke@435 3313 }
duke@435 3314
duke@435 3315 // Trace Initialize <- Proj[Parm] <- Allocate
duke@435 3316 AllocateNode* InitializeNode::allocation() {
duke@435 3317 Node* rawoop = in(InitializeNode::RawAddress);
duke@435 3318 if (rawoop->is_Proj()) {
duke@435 3319 Node* alloc = rawoop->in(0);
duke@435 3320 if (alloc->is_Allocate()) {
duke@435 3321 return alloc->as_Allocate();
duke@435 3322 }
duke@435 3323 }
duke@435 3324 return NULL;
duke@435 3325 }
duke@435 3326
duke@435 3327 // Trace Allocate -> Proj[Parm] -> Initialize
duke@435 3328 InitializeNode* AllocateNode::initialization() {
duke@435 3329 ProjNode* rawoop = proj_out(AllocateNode::RawAddress);
duke@435 3330 if (rawoop == NULL) return NULL;
duke@435 3331 for (DUIterator_Fast imax, i = rawoop->fast_outs(imax); i < imax; i++) {
duke@435 3332 Node* init = rawoop->fast_out(i);
duke@435 3333 if (init->is_Initialize()) {
duke@435 3334 assert(init->as_Initialize()->allocation() == this, "2-way link");
duke@435 3335 return init->as_Initialize();
duke@435 3336 }
duke@435 3337 }
duke@435 3338 return NULL;
duke@435 3339 }
ysr@777 3340
kvn@1286 3341 //----------------------------- store barriers ----------------------------
kvn@1286 3342 #define __ ideal.
kvn@1286 3343
kvn@1286 3344 void GraphKit::sync_kit(IdealKit& ideal) {
kvn@1286 3345 // Final sync IdealKit and graphKit.
kvn@1286 3346 __ drain_delay_transform();
kvn@1286 3347 set_all_memory(__ merged_memory());
kvn@1286 3348 set_control(__ ctrl());
kvn@1286 3349 }
kvn@1286 3350
kvn@1286 3351 // vanilla/CMS post barrier
kvn@1286 3352 // Insert a write-barrier store. This is to let generational GC work; we have
kvn@1286 3353 // to flag all oop-stores before the next GC point.
kvn@1286 3354 void GraphKit::write_barrier_post(Node* oop_store,
kvn@1286 3355 Node* obj,
kvn@1286 3356 Node* adr,
cfang@1420 3357 uint adr_idx,
kvn@1286 3358 Node* val,
kvn@1286 3359 bool use_precise) {
kvn@1286 3360 // No store check needed if we're storing a NULL or an old object
kvn@1286 3361 // (latter case is probably a string constant). The concurrent
kvn@1286 3362 // mark sweep garbage collector, however, needs to have all nonNull
kvn@1286 3363 // oop updates flagged via card-marks.
kvn@1286 3364 if (val != NULL && val->is_Con()) {
kvn@1286 3365 // must be either an oop or NULL
kvn@1286 3366 const Type* t = val->bottom_type();
kvn@1286 3367 if (t == TypePtr::NULL_PTR || t == Type::TOP)
kvn@1286 3368 // stores of null never (?) need barriers
kvn@1286 3369 return;
kvn@1286 3370 ciObject* con = t->is_oopptr()->const_oop();
kvn@1286 3371 if (con != NULL
kvn@1286 3372 && con->is_perm()
kvn@1286 3373 && Universe::heap()->can_elide_permanent_oop_store_barriers())
kvn@1286 3374 // no store barrier needed, because no old-to-new ref created
kvn@1286 3375 return;
kvn@1286 3376 }
kvn@1286 3377
ysr@1462 3378 if (use_ReduceInitialCardMarks()
ysr@1462 3379 && obj == just_allocated_object(control())) {
ysr@1462 3380 // We can skip marks on a freshly-allocated object in Eden.
ysr@1601 3381 // Keep this code in sync with new_store_pre_barrier() in runtime.cpp.
ysr@1601 3382 // That routine informs GC to take appropriate compensating steps,
ysr@1601 3383 // upon a slow-path allocation, so as to make this card-mark
ysr@1601 3384 // elision safe.
ysr@1462 3385 return;
ysr@1462 3386 }
ysr@1462 3387
kvn@1286 3388 if (!use_precise) {
kvn@1286 3389 // All card marks for a (non-array) instance are in one place:
kvn@1286 3390 adr = obj;
kvn@1286 3391 }
kvn@1286 3392 // (Else it's an array (or unknown), and we want more precise card marks.)
kvn@1286 3393 assert(adr != NULL, "");
kvn@1286 3394
kvn@1286 3395 IdealKit ideal(gvn(), control(), merged_memory(), true);
kvn@1286 3396
kvn@1286 3397 // Convert the pointer to an int prior to doing math on it
kvn@1286 3398 Node* cast = __ CastPX(__ ctrl(), adr);
kvn@1286 3399
kvn@1286 3400 // Divide by card size
kvn@1286 3401 assert(Universe::heap()->barrier_set()->kind() == BarrierSet::CardTableModRef,
kvn@1286 3402 "Only one we handle so far.");
kvn@1286 3403 Node* card_offset = __ URShiftX( cast, __ ConI(CardTableModRefBS::card_shift) );
kvn@1286 3404
kvn@1286 3405 // Combine card table base and card offset
kvn@1286 3406 Node* card_adr = __ AddP(__ top(), byte_map_base_node(), card_offset );
kvn@1286 3407
kvn@1286 3408 // Get the alias_index for raw card-mark memory
kvn@1286 3409 int adr_type = Compile::AliasIdxRaw;
kvn@1286 3410 // Smash zero into card
kvn@1286 3411 Node* zero = __ ConI(0);
kvn@1286 3412 BasicType bt = T_BYTE;
kvn@1286 3413 if( !UseConcMarkSweepGC ) {
kvn@1286 3414 __ store(__ ctrl(), card_adr, zero, bt, adr_type);
kvn@1286 3415 } else {
kvn@1286 3416 // Specialized path for CM store barrier
cfang@1420 3417 __ storeCM(__ ctrl(), card_adr, zero, oop_store, adr_idx, bt, adr_type);
kvn@1286 3418 }
kvn@1286 3419
kvn@1286 3420 // Final sync IdealKit and GraphKit.
kvn@1286 3421 sync_kit(ideal);
kvn@1286 3422 }
kvn@1286 3423
kvn@1286 3424 // G1 pre/post barriers
ysr@777 3425 void GraphKit::g1_write_barrier_pre(Node* obj,
ysr@777 3426 Node* adr,
ysr@777 3427 uint alias_idx,
ysr@777 3428 Node* val,
never@1260 3429 const TypeOopPtr* val_type,
ysr@777 3430 BasicType bt) {
ysr@777 3431 IdealKit ideal(gvn(), control(), merged_memory(), true);
kvn@1286 3432
kvn@1286 3433 Node* tls = __ thread(); // ThreadLocalStorage
ysr@777 3434
ysr@777 3435 Node* no_ctrl = NULL;
ysr@777 3436 Node* no_base = __ top();
ysr@777 3437 Node* zero = __ ConI(0);
ysr@777 3438
ysr@777 3439 float likely = PROB_LIKELY(0.999);
ysr@777 3440 float unlikely = PROB_UNLIKELY(0.999);
ysr@777 3441
ysr@777 3442 BasicType active_type = in_bytes(PtrQueue::byte_width_of_active()) == 4 ? T_INT : T_BYTE;
ysr@777 3443 assert(in_bytes(PtrQueue::byte_width_of_active()) == 4 || in_bytes(PtrQueue::byte_width_of_active()) == 1, "flag width");
ysr@777 3444
ysr@777 3445 // Offsets into the thread
ysr@777 3446 const int marking_offset = in_bytes(JavaThread::satb_mark_queue_offset() + // 648
ysr@777 3447 PtrQueue::byte_offset_of_active());
ysr@777 3448 const int index_offset = in_bytes(JavaThread::satb_mark_queue_offset() + // 656
ysr@777 3449 PtrQueue::byte_offset_of_index());
ysr@777 3450 const int buffer_offset = in_bytes(JavaThread::satb_mark_queue_offset() + // 652
ysr@777 3451 PtrQueue::byte_offset_of_buf());
ysr@777 3452 // Now the actual pointers into the thread
ysr@777 3453
ysr@777 3454 // set_control( ctl);
ysr@777 3455
kvn@1286 3456 Node* marking_adr = __ AddP(no_base, tls, __ ConX(marking_offset));
kvn@1286 3457 Node* buffer_adr = __ AddP(no_base, tls, __ ConX(buffer_offset));
kvn@1286 3458 Node* index_adr = __ AddP(no_base, tls, __ ConX(index_offset));
ysr@777 3459
ysr@777 3460 // Now some of the values
ysr@777 3461
never@979 3462 Node* marking = __ load(__ ctrl(), marking_adr, TypeInt::INT, active_type, Compile::AliasIdxRaw);
ysr@777 3463
ysr@777 3464 // if (!marking)
ysr@777 3465 __ if_then(marking, BoolTest::ne, zero); {
never@979 3466 Node* index = __ load(__ ctrl(), index_adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw);
ysr@777 3467
ysr@777 3468 const Type* t1 = adr->bottom_type();
ysr@777 3469 const Type* t2 = val->bottom_type();
ysr@777 3470
ysr@777 3471 Node* orig = __ load(no_ctrl, adr, val_type, bt, alias_idx);
ysr@777 3472 // if (orig != NULL)
ysr@777 3473 __ if_then(orig, BoolTest::ne, null()); {
never@979 3474 Node* buffer = __ load(__ ctrl(), buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw);
ysr@777 3475
ysr@777 3476 // load original value
ysr@777 3477 // alias_idx correct??
ysr@777 3478
ysr@777 3479 // is the queue for this thread full?
ysr@777 3480 __ if_then(index, BoolTest::ne, zero, likely); {
ysr@777 3481
ysr@777 3482 // decrement the index
ysr@777 3483 Node* next_index = __ SubI(index, __ ConI(sizeof(intptr_t)));
ysr@777 3484 Node* next_indexX = next_index;
ysr@777 3485 #ifdef _LP64
kvn@1286 3486 // We could refine the type for what it's worth
kvn@1286 3487 // const TypeLong* lidxtype = TypeLong::make(CONST64(0), get_size_from_queue);
kvn@1286 3488 next_indexX = _gvn.transform( new (C, 2) ConvI2LNode(next_index, TypeLong::make(0, max_jlong, Type::WidenMax)) );
kvn@1286 3489 #endif
ysr@777 3490
ysr@777 3491 // Now get the buffer location we will log the original value into and store it
ysr@777 3492 Node *log_addr = __ AddP(no_base, buffer, next_indexX);
ysr@777 3493 __ store(__ ctrl(), log_addr, orig, T_OBJECT, Compile::AliasIdxRaw);
ysr@777 3494
ysr@777 3495 // update the index
kvn@1286 3496 __ store(__ ctrl(), index_adr, next_index, T_INT, Compile::AliasIdxRaw);
ysr@777 3497
ysr@777 3498 } __ else_(); {
ysr@777 3499
ysr@777 3500 // logging buffer is full, call the runtime
ysr@777 3501 const TypeFunc *tf = OptoRuntime::g1_wb_pre_Type();
kvn@1286 3502 __ make_leaf_call(tf, CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), "g1_wb_pre", orig, tls);
kvn@1286 3503 } __ end_if(); // (!index)
kvn@1286 3504 } __ end_if(); // (orig != NULL)
kvn@1286 3505 } __ end_if(); // (!marking)
kvn@1286 3506
kvn@1286 3507 // Final sync IdealKit and GraphKit.
kvn@1286 3508 sync_kit(ideal);
ysr@777 3509 }
ysr@777 3510
ysr@777 3511 //
ysr@777 3512 // Update the card table and add card address to the queue
ysr@777 3513 //
kvn@1286 3514 void GraphKit::g1_mark_card(IdealKit& ideal,
kvn@1286 3515 Node* card_adr,
kvn@1286 3516 Node* oop_store,
cfang@1420 3517 uint oop_alias_idx,
kvn@1286 3518 Node* index,
kvn@1286 3519 Node* index_adr,
kvn@1286 3520 Node* buffer,
kvn@1286 3521 const TypeFunc* tf) {
kvn@1286 3522
ysr@777 3523 Node* zero = __ ConI(0);
ysr@777 3524 Node* no_base = __ top();
ysr@777 3525 BasicType card_bt = T_BYTE;
ysr@777 3526 // Smash zero into card. MUST BE ORDERED WRT TO STORE
cfang@1420 3527 __ storeCM(__ ctrl(), card_adr, zero, oop_store, oop_alias_idx, card_bt, Compile::AliasIdxRaw);
ysr@777 3528
ysr@777 3529 // Now do the queue work
ysr@777 3530 __ if_then(index, BoolTest::ne, zero); {
ysr@777 3531
kvn@1286 3532 Node* next_index = __ SubI(index, __ ConI(sizeof(intptr_t)));
ysr@777 3533 Node* next_indexX = next_index;
ysr@777 3534 #ifdef _LP64
ysr@777 3535 // We could refine the type for what it's worth
ysr@777 3536 // const TypeLong* lidxtype = TypeLong::make(CONST64(0), get_size_from_queue);
ysr@777 3537 next_indexX = _gvn.transform( new (C, 2) ConvI2LNode(next_index, TypeLong::make(0, max_jlong, Type::WidenMax)) );
ysr@777 3538 #endif // _LP64
ysr@777 3539 Node* log_addr = __ AddP(no_base, buffer, next_indexX);
ysr@777 3540
ysr@777 3541 __ store(__ ctrl(), log_addr, card_adr, T_ADDRESS, Compile::AliasIdxRaw);
ysr@777 3542 __ store(__ ctrl(), index_adr, next_index, T_INT, Compile::AliasIdxRaw);
ysr@777 3543
ysr@777 3544 } __ else_(); {
ysr@777 3545 __ make_leaf_call(tf, CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), "g1_wb_post", card_adr, __ thread());
ysr@777 3546 } __ end_if();
kvn@1286 3547
ysr@777 3548 }
ysr@777 3549
kvn@1286 3550 void GraphKit::g1_write_barrier_post(Node* oop_store,
ysr@777 3551 Node* obj,
ysr@777 3552 Node* adr,
ysr@777 3553 uint alias_idx,
ysr@777 3554 Node* val,
ysr@777 3555 BasicType bt,
ysr@777 3556 bool use_precise) {
ysr@777 3557 // If we are writing a NULL then we need no post barrier
ysr@777 3558
ysr@777 3559 if (val != NULL && val->is_Con() && val->bottom_type() == TypePtr::NULL_PTR) {
ysr@777 3560 // Must be NULL
ysr@777 3561 const Type* t = val->bottom_type();
ysr@777 3562 assert(t == Type::TOP || t == TypePtr::NULL_PTR, "must be NULL");
ysr@777 3563 // No post barrier if writing NULLx
ysr@777 3564 return;
ysr@777 3565 }
ysr@777 3566
ysr@777 3567 if (!use_precise) {
ysr@777 3568 // All card marks for a (non-array) instance are in one place:
ysr@777 3569 adr = obj;
ysr@777 3570 }
ysr@777 3571 // (Else it's an array (or unknown), and we want more precise card marks.)
ysr@777 3572 assert(adr != NULL, "");
ysr@777 3573
ysr@777 3574 IdealKit ideal(gvn(), control(), merged_memory(), true);
kvn@1286 3575
kvn@1286 3576 Node* tls = __ thread(); // ThreadLocalStorage
ysr@777 3577
ysr@777 3578 Node* no_base = __ top();
ysr@777 3579 float likely = PROB_LIKELY(0.999);
ysr@777 3580 float unlikely = PROB_UNLIKELY(0.999);
ysr@777 3581 Node* zero = __ ConI(0);
ysr@777 3582 Node* zeroX = __ ConX(0);
ysr@777 3583
ysr@777 3584 // Get the alias_index for raw card-mark memory
ysr@777 3585 const TypePtr* card_type = TypeRawPtr::BOTTOM;
ysr@777 3586
ysr@777 3587 const TypeFunc *tf = OptoRuntime::g1_wb_post_Type();
ysr@777 3588
ysr@777 3589 // Offsets into the thread
ysr@777 3590 const int index_offset = in_bytes(JavaThread::dirty_card_queue_offset() +
ysr@777 3591 PtrQueue::byte_offset_of_index());
ysr@777 3592 const int buffer_offset = in_bytes(JavaThread::dirty_card_queue_offset() +
ysr@777 3593 PtrQueue::byte_offset_of_buf());
ysr@777 3594
ysr@777 3595 // Pointers into the thread
ysr@777 3596
kvn@1286 3597 Node* buffer_adr = __ AddP(no_base, tls, __ ConX(buffer_offset));
kvn@1286 3598 Node* index_adr = __ AddP(no_base, tls, __ ConX(index_offset));
ysr@777 3599
ysr@777 3600 // Now some values
johnc@1948 3601 // Use ctrl to avoid hoisting these values past a safepoint, which could
johnc@1948 3602 // potentially reset these fields in the JavaThread.
johnc@1948 3603 Node* index = __ load(__ ctrl(), index_adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw);
johnc@1948 3604 Node* buffer = __ load(__ ctrl(), buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw);
ysr@777 3605
ysr@777 3606 // Convert the store obj pointer to an int prior to doing math on it
ysr@777 3607 // Must use ctrl to prevent "integerized oop" existing across safepoint
kvn@1286 3608 Node* cast = __ CastPX(__ ctrl(), adr);
ysr@777 3609
ysr@777 3610 // Divide pointer by card size
ysr@777 3611 Node* card_offset = __ URShiftX( cast, __ ConI(CardTableModRefBS::card_shift) );
ysr@777 3612
ysr@777 3613 // Combine card table base and card offset
kvn@1286 3614 Node* card_adr = __ AddP(no_base, byte_map_base_node(), card_offset );
ysr@777 3615
ysr@777 3616 // If we know the value being stored does it cross regions?
ysr@777 3617
ysr@777 3618 if (val != NULL) {
ysr@777 3619 // Does the store cause us to cross regions?
ysr@777 3620
ysr@777 3621 // Should be able to do an unsigned compare of region_size instead of
ysr@777 3622 // and extra shift. Do we have an unsigned compare??
ysr@777 3623 // Node* region_size = __ ConI(1 << HeapRegion::LogOfHRGrainBytes);
ysr@777 3624 Node* xor_res = __ URShiftX ( __ XorX( cast, __ CastPX(__ ctrl(), val)), __ ConI(HeapRegion::LogOfHRGrainBytes));
ysr@777 3625
ysr@777 3626 // if (xor_res == 0) same region so skip
ysr@777 3627 __ if_then(xor_res, BoolTest::ne, zeroX); {
ysr@777 3628
ysr@777 3629 // No barrier if we are storing a NULL
ysr@777 3630 __ if_then(val, BoolTest::ne, null(), unlikely); {
ysr@777 3631
ysr@777 3632 // Ok must mark the card if not already dirty
ysr@777 3633
ysr@777 3634 // load the original value of the card
ysr@777 3635 Node* card_val = __ load(__ ctrl(), card_adr, TypeInt::INT, T_BYTE, Compile::AliasIdxRaw);
ysr@777 3636
ysr@777 3637 __ if_then(card_val, BoolTest::ne, zero); {
cfang@1420 3638 g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
ysr@777 3639 } __ end_if();
ysr@777 3640 } __ end_if();
ysr@777 3641 } __ end_if();
ysr@777 3642 } else {
kvn@1286 3643 // Object.clone() instrinsic uses this path.
cfang@1420 3644 g1_mark_card(ideal, card_adr, oop_store, alias_idx, index, index_adr, buffer, tf);
ysr@777 3645 }
ysr@777 3646
kvn@1286 3647 // Final sync IdealKit and GraphKit.
kvn@1286 3648 sync_kit(ideal);
kvn@1286 3649 }
ysr@777 3650 #undef __

mercurial