src/share/vm/opto/graphKit.hpp

Print this page

        

*** 752,768 **** // Generate a check-cast idiom. Used by both the check-cast bytecode // and the array-store bytecode Node* gen_checkcast( Node *subobj, Node* superkls, Node* *failure_control = NULL ); // Generate a subtyping check. Takes as input the subtype and supertype. // Returns 2 values: sets the default control() to the true path and // returns the false path. Only reads from constant memory taken from the // default memory; does not write anything. It also doesn't take in an // Object; if you wish to check an Object you need to load the Object's // class prior to coming here. ! Node* gen_subtype_check(Node* subklass, Node* superklass); // Exact type check used for predicted calls and casts. // Rewrites (*casted_receiver) to be casted to the stronger type. // (Caller is responsible for doing replace_in_map.) Node* type_check_receiver(Node* receiver, ciKlass* klass, float prob, --- 752,794 ---- // Generate a check-cast idiom. Used by both the check-cast bytecode // and the array-store bytecode Node* gen_checkcast( Node *subobj, Node* superkls, Node* *failure_control = NULL ); + // helper functions that correctly interacts with the GVN depending + // on the current compiler phase + static Node *gvn_transform(Node *n, PhaseGVN* gvn) { + if (gvn->is_IterGVN() == NULL) { + return gvn->transform(n); + } else { + gvn->is_IterGVN()->register_new_node_with_optimizer(n); + return n; + } + return NULL; + } + + static void gvn_transform_ctrl(Node *n, PhaseGVN* gvn) { + if (gvn->is_IterGVN() == NULL) { + gvn->C->record_for_igvn(n); + } + } + // Generate a subtyping check. Takes as input the subtype and supertype. // Returns 2 values: sets the default control() to the true path and // returns the false path. Only reads from constant memory taken from the // default memory; does not write anything. It also doesn't take in an // Object; if you wish to check an Object you need to load the Object's // class prior to coming here. ! static Node* gen_subtype_check_any_phase(Node* subklass, Node* superklass, Node** ctrl, MergeMemNode* mem, PhaseGVN* gvn); ! ! Node* gen_subtype_check(Node* subklass, Node* superklass) { ! MergeMemNode* mem = merged_memory(); ! Node* ctrl = control(); ! Node* n = gen_subtype_check_any_phase(subklass, superklass, &ctrl, mem, &_gvn); ! set_control(ctrl); ! return n; ! } // Exact type check used for predicted calls and casts. // Rewrites (*casted_receiver) to be casted to the stronger type. // (Caller is responsible for doing replace_in_map.) Node* type_check_receiver(Node* receiver, ciKlass* klass, float prob,