--- old/src/share/vm/opto/compile.hpp 2016-01-14 16:04:43.974237894 +0100 +++ new/src/share/vm/opto/compile.hpp 2016-01-14 16:04:43.906237896 +0100 @@ -400,6 +400,9 @@ GrowableArray* _macro_nodes; // List of nodes which need to be expanded before matching. GrowableArray* _predicate_opaqs; // List of Opaque1 nodes for the loop predicates. GrowableArray* _expensive_nodes; // List of nodes that are expensive to compute and that we'd better not let the GVN freely common +#ifdef _LP64 + GrowableArray* _range_check_casts; // List of CastII nodes with a range check dependency +#endif ConnectionGraph* _congraph; #ifndef PRODUCT IdealGraphPrinter* _printer; @@ -753,7 +756,7 @@ void set_congraph(ConnectionGraph* congraph) { _congraph = congraph;} void add_macro_node(Node * n) { //assert(n->is_macro(), "must be a macro node"); - assert(!_macro_nodes->contains(n), " duplicate entry in expand list"); + assert(!_macro_nodes->contains(n), "duplicate entry in expand list"); _macro_nodes->append(n); } void remove_macro_node(Node * n) { @@ -773,10 +776,25 @@ } } void add_predicate_opaq(Node * n) { - assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1"); + assert(!_predicate_opaqs->contains(n), "duplicate entry in predicate opaque1"); assert(_macro_nodes->contains(n), "should have already been in macro list"); _predicate_opaqs->append(n); } + +#ifdef _LP64 + // Range check dependent CastII nodes that can be removed after loop optimizations + void add_range_check_cast(Node* n); + void remove_range_check_cast(Node* n) { + if (_range_check_casts->contains(n)) { + _range_check_casts->remove(n); + } + } + Node* range_check_cast_node(int idx) const { return _range_check_casts->at(idx); } + int range_check_cast_count() const { return _range_check_casts->length(); } + // Remove all range check dependent CastIINodes. + void remove_range_check_casts(PhaseIterGVN &igvn); +#endif + // remove the opaque nodes that protect the predicates so that the unused checks and // uncommon traps will be eliminated from the graph. void cleanup_loop_predicates(PhaseIterGVN &igvn); @@ -1292,7 +1310,14 @@ enum { SSC_always_false, SSC_always_true, SSC_easy_test, SSC_full_test }; int static_subtype_check(ciKlass* superk, ciKlass* subk); - static Node* conv_I2X_index(PhaseGVN *phase, Node* offset, const TypeInt* sizetype); + static Node* conv_I2X_index(PhaseGVN* phase, Node* offset, const TypeInt* sizetype, + // Optional control dependency (for example, on range check) + Node* ctrl = NULL); + +#ifdef _LP64 + // Convert integer value to a narrowed long type dependent on ctrl (for example, a range check) + static Node* constrained_convI2L(PhaseGVN* phase, Node* value, const TypeInt* itype, Node* ctrl); +#endif // Auxiliary method for randomized fuzzing/stressing static bool randomized_select(int count);