src/share/vm/opto/multnode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/opto/multnode.cpp

src/share/vm/opto/multnode.cpp

Print this page
rev 7884 : 8073480: C2 should optimize explicit range checks
Summary: explicit range checks should be recognized by C2
Reviewed-by:

*** 148,208 **** uint ProjNode::ideal_reg() const { return bottom_type()->ideal_reg(); } //-------------------------------is_uncommon_trap_proj---------------------------- ! // Return true if proj is the form of "proj->[region->..]call_uct" ! bool ProjNode::is_uncommon_trap_proj(Deoptimization::DeoptReason reason) { int path_limit = 10; Node* out = this; for (int ct = 0; ct < path_limit; ct++) { out = out->unique_ctrl_out(); if (out == NULL) ! return false; if (out->is_CallStaticJava()) { ! int req = out->as_CallStaticJava()->uncommon_trap_request(); if (req != 0) { Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req); if (trap_reason == reason || reason == Deoptimization::Reason_none) { ! return true; } } ! return false; // don't do further after call } if (out->Opcode() != Op_Region) ! return false; } ! return false; } //-------------------------------is_uncommon_trap_if_pattern------------------------- ! // Return true for "if(test)-> proj -> ... // | // V // other_proj->[region->..]call_uct" ! // // "must_reason_predicate" means the uct reason must be Reason_predicate ! bool ProjNode::is_uncommon_trap_if_pattern(Deoptimization::DeoptReason reason) { Node *in0 = in(0); ! if (!in0->is_If()) return false; // Variation of a dead If node. ! if (in0->outcnt() < 2) return false; IfNode* iff = in0->as_If(); // we need "If(Conv2B(Opaque1(...)))" pattern for reason_predicate if (reason != Deoptimization::Reason_none) { if (iff->in(1)->Opcode() != Op_Conv2B || iff->in(1)->in(1)->Opcode() != Op_Opaque1) { ! return false; } } ProjNode* other_proj = iff->proj_out(1-_con); if (other_proj == NULL) // Should never happen, but make Parfait happy. ! return false; ! if (other_proj->is_uncommon_trap_proj(reason)) { assert(reason == Deoptimization::Reason_none || Compile::current()->is_predicate_opaq(iff->in(1)->in(1)), "should be on the list"); ! return true; } ! return false; } --- 148,215 ---- uint ProjNode::ideal_reg() const { return bottom_type()->ideal_reg(); } //-------------------------------is_uncommon_trap_proj---------------------------- ! // Return uncommon trap call node if proj is for "proj->[region->..]call_uct" ! // NULL otherwise ! CallStaticJavaNode* ProjNode::is_uncommon_trap_proj(Deoptimization::DeoptReason reason) { int path_limit = 10; Node* out = this; for (int ct = 0; ct < path_limit; ct++) { out = out->unique_ctrl_out(); if (out == NULL) ! return NULL; if (out->is_CallStaticJava()) { ! CallStaticJavaNode* call = out->as_CallStaticJava(); ! int req = call->uncommon_trap_request(); if (req != 0) { Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req); if (trap_reason == reason || reason == Deoptimization::Reason_none) { ! return call; } } ! return NULL; // don't do further after call } if (out->Opcode() != Op_Region) ! return NULL; } ! return NULL; } //-------------------------------is_uncommon_trap_if_pattern------------------------- ! // Return uncommon trap call node for "if(test)-> proj -> ... // | // V // other_proj->[region->..]call_uct" ! // NULL otherwise // "must_reason_predicate" means the uct reason must be Reason_predicate ! CallStaticJavaNode* ProjNode::is_uncommon_trap_if_pattern(Deoptimization::DeoptReason reason) { Node *in0 = in(0); ! if (!in0->is_If()) return NULL; // Variation of a dead If node. ! if (in0->outcnt() < 2) return NULL; IfNode* iff = in0->as_If(); // we need "If(Conv2B(Opaque1(...)))" pattern for reason_predicate if (reason != Deoptimization::Reason_none) { if (iff->in(1)->Opcode() != Op_Conv2B || iff->in(1)->in(1)->Opcode() != Op_Opaque1) { ! return NULL; } } ProjNode* other_proj = iff->proj_out(1-_con); if (other_proj == NULL) // Should never happen, but make Parfait happy. ! return NULL; ! CallStaticJavaNode* call = other_proj->is_uncommon_trap_proj(reason); ! if (call != NULL) { assert(reason == Deoptimization::Reason_none || Compile::current()->is_predicate_opaq(iff->in(1)->in(1)), "should be on the list"); ! return call; } ! return NULL; ! } ! ! ProjNode* ProjNode::other_if_proj() const { ! return in(0)->as_If()->proj_out(1-_con); }
src/share/vm/opto/multnode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File