392 }
393 return NULL;
394 }
395
396 // record type from profiling with the type system
397 Node* record_profile_for_speculation(Node* n, ciKlass* exact_kls, bool maybe_null);
398 void record_profiled_arguments_for_speculation(ciMethod* dest_method, Bytecodes::Code bc);
399 void record_profiled_parameters_for_speculation();
400 void record_profiled_return_for_speculation();
401 Node* record_profiled_receiver_for_speculation(Node* n);
402
403 // Use the type profile to narrow an object type.
404 Node* maybe_cast_profiled_receiver(Node* not_null_obj,
405 ciKlass* require_klass,
406 ciKlass* spec,
407 bool safe_for_replace);
408
409 // Cast obj to type and emit guard unless we had too many traps here already
410 Node* maybe_cast_profiled_obj(Node* obj,
411 ciKlass* type,
412 bool not_null = false,
413 SafePointNode* sfpt = NULL);
414
415 // Cast obj to not-null on this path
416 Node* cast_not_null(Node* obj, bool do_replace_in_map = true);
417 // Replace all occurrences of one node by another.
418 void replace_in_map(Node* old, Node* neww);
419
420 void push(Node* n) { map_not_null(); _map->set_stack(_map->_jvms, _sp++ , n); }
421 Node* pop() { map_not_null(); return _map->stack( _map->_jvms, --_sp ); }
422 Node* peek(int off = 0) { map_not_null(); return _map->stack( _map->_jvms, _sp - off - 1 ); }
423
424 void push_pair(Node* ldval) {
425 push(ldval);
426 push(top()); // the halfword is merely a placeholder
427 }
428 void push_pair_local(int i) {
429 // longs are stored in locals in "push" order
430 push( local(i+0) ); // the real value
431 assert(local(i+1) == top(), "");
432 push(top()); // halfword placeholder
433 }
|
392 }
393 return NULL;
394 }
395
396 // record type from profiling with the type system
397 Node* record_profile_for_speculation(Node* n, ciKlass* exact_kls, bool maybe_null);
398 void record_profiled_arguments_for_speculation(ciMethod* dest_method, Bytecodes::Code bc);
399 void record_profiled_parameters_for_speculation();
400 void record_profiled_return_for_speculation();
401 Node* record_profiled_receiver_for_speculation(Node* n);
402
403 // Use the type profile to narrow an object type.
404 Node* maybe_cast_profiled_receiver(Node* not_null_obj,
405 ciKlass* require_klass,
406 ciKlass* spec,
407 bool safe_for_replace);
408
409 // Cast obj to type and emit guard unless we had too many traps here already
410 Node* maybe_cast_profiled_obj(Node* obj,
411 ciKlass* type,
412 bool not_null = false);
413
414 // Cast obj to not-null on this path
415 Node* cast_not_null(Node* obj, bool do_replace_in_map = true);
416 // Replace all occurrences of one node by another.
417 void replace_in_map(Node* old, Node* neww);
418
419 void push(Node* n) { map_not_null(); _map->set_stack(_map->_jvms, _sp++ , n); }
420 Node* pop() { map_not_null(); return _map->stack( _map->_jvms, --_sp ); }
421 Node* peek(int off = 0) { map_not_null(); return _map->stack( _map->_jvms, _sp - off - 1 ); }
422
423 void push_pair(Node* ldval) {
424 push(ldval);
425 push(top()); // the halfword is merely a placeholder
426 }
427 void push_pair_local(int i) {
428 // longs are stored in locals in "push" order
429 push( local(i+0) ); // the real value
430 assert(local(i+1) == top(), "");
431 push(top()); // halfword placeholder
432 }
|