--- a/hotspot/src/share/vm/opto/cfgnode.hpp Mon Nov 09 22:43:30 2015 +0000
+++ b/hotspot/src/share/vm/opto/cfgnode.hpp Mon Nov 09 11:28:31 2015 +0100
@@ -270,7 +270,6 @@
virtual uint size_of() const { return sizeof(*this); }
private:
- ProjNode* range_check_trap_proj(int& flip, Node*& l, Node*& r);
ProjNode* range_check_trap_proj() {
int flip_test = 0;
Node* l = NULL;
@@ -283,7 +282,7 @@
bool is_ctrl_folds(Node* ctrl, PhaseIterGVN* igvn);
bool has_shared_region(ProjNode* proj, ProjNode*& success, ProjNode*& fail);
bool has_only_uncommon_traps(ProjNode* proj, ProjNode*& success, ProjNode*& fail, PhaseIterGVN* igvn);
- static void merge_uncommon_traps(ProjNode* proj, ProjNode* success, ProjNode* fail, PhaseIterGVN* igvn);
+ Node* merge_uncommon_traps(ProjNode* proj, ProjNode* success, ProjNode* fail, PhaseIterGVN* igvn);
static void improve_address_types(Node* l, Node* r, ProjNode* fail, PhaseIterGVN* igvn);
bool is_cmp_with_loadrange(ProjNode* proj);
bool is_null_check(ProjNode* proj, PhaseIterGVN* igvn);
@@ -292,6 +291,12 @@
ProjNode* uncommon_trap_proj(CallStaticJavaNode*& call) const;
bool fold_compares_helper(ProjNode* proj, ProjNode* success, ProjNode* fail, PhaseIterGVN* igvn);
+protected:
+ ProjNode* range_check_trap_proj(int& flip, Node*& l, Node*& r);
+ Node* Ideal_common(PhaseGVN *phase, bool can_reshape);
+ Node* dominated_by(Node* prev_dom, PhaseIterGVN* igvn);
+ Node* search_identical(int dist);
+
public:
// Degrees of branch prediction probability by order of magnitude:
@@ -375,8 +380,6 @@
virtual const Type *Value( PhaseTransform *phase ) const;
virtual int required_outcnt() const { return 2; }
virtual const RegMask &out_RegMask() const;
- void dominated_by(Node* prev_dom, PhaseIterGVN* igvn);
- int is_range_check(Node* &range, Node* &index, jint &offset);
Node* fold_compares(PhaseIterGVN* phase);
static Node* up_one_dom(Node* curr, bool linear_only = false);
@@ -391,6 +394,20 @@
#endif
};
+class RangeCheckNode : public IfNode {
+private:
+ int is_range_check(Node* &range, Node* &index, jint &offset);
+
+public:
+ RangeCheckNode(Node* control, Node *b, float p, float fcnt)
+ : IfNode(control, b, p, fcnt) {
+ init_class_id(Class_RangeCheck);
+ }
+
+ virtual int Opcode() const;
+ virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
+};
+
class IfProjNode : public CProjNode {
public:
IfProjNode(IfNode *ifnode, uint idx) : CProjNode(ifnode,idx) {}