< prev index next >

src/share/vm/opto/callnode.cpp

Print this page
rev 10535 : incremental inlining fixes

*** 37,46 **** --- 37,47 ---- #include "opto/parse.hpp" #include "opto/regalloc.hpp" #include "opto/regmask.hpp" #include "opto/rootnode.hpp" #include "opto/runtime.hpp" + #include "opto/valuetypenode.hpp" // Portions of code courtesy of Clifford Click // Optimization - Graph Style
*** 1136,1146 **** //------------------------------Ideal------------------------------------------ // Skip over any collapsed Regions Node *SafePointNode::Ideal(PhaseGVN *phase, bool can_reshape) { ! return remove_dead_region(phase, can_reshape) ? this : NULL; } //------------------------------Identity--------------------------------------- // Remove obviously duplicate safepoints Node* SafePointNode::Identity(PhaseGVN* phase) { --- 1137,1171 ---- //------------------------------Ideal------------------------------------------ // Skip over any collapsed Regions Node *SafePointNode::Ideal(PhaseGVN *phase, bool can_reshape) { ! if (remove_dead_region(phase, can_reshape)) { ! return this; ! } ! if (jvms() != NULL) { ! bool progress = false; ! // A ValueTypeNode with a valid object input in the debug info? ! // Reference the object directly. Helps removal of useless value ! // type allocations with incremental inlining. ! for (uint i = jvms()->debug_start(); i < jvms()->debug_end(); i++) { ! Node *arg = in(i); ! if (arg->is_ValueType()) { ! ValueTypeNode* vt = arg->as_ValueType(); ! Node* in_oop = vt->get_oop(); ! const Type* oop_type = phase->type(in_oop); ! if (oop_type->meet(TypePtr::NULL_PTR) != oop_type) { ! set_req(i, in_oop); ! progress = true; ! } ! } ! } ! if (progress) { ! return this; ! } ! } ! return NULL; } //------------------------------Identity--------------------------------------- // Remove obviously duplicate safepoints Node* SafePointNode::Identity(PhaseGVN* phase) {
*** 1375,1385 **** } } //============================================================================= Node* AllocateArrayNode::Ideal(PhaseGVN *phase, bool can_reshape) { ! if (remove_dead_region(phase, can_reshape)) return this; // Don't bother trying to transform a dead node if (in(0) && in(0)->is_top()) return NULL; const Type* type = phase->type(Ideal_length()); if (type->isa_int() && type->is_int()->_hi < 0) { --- 1400,1413 ---- } } //============================================================================= Node* AllocateArrayNode::Ideal(PhaseGVN *phase, bool can_reshape) { ! Node* res = SafePointNode::Ideal(phase, can_reshape); ! if (res != NULL) { ! return res; ! } // Don't bother trying to transform a dead node if (in(0) && in(0)->is_top()) return NULL; const Type* type = phase->type(Ideal_length()); if (type->isa_int() && type->is_int()->_hi < 0) {
< prev index next >