< prev index next >
src/share/vm/opto/callnode.hpp
Print this page
rev 5784 : 8026796: Make replace_in_map() on parent maps generic
Summary: propagate node replacements along control flow edges to callers
Reviewed-by: kvn, vlivanov
rev 5786 : 8174164: SafePointNode::_replaced_nodes breaks with irreducible loops
Reviewed-by: kvn
@@ -28,10 +28,11 @@
#include "opto/connode.hpp"
#include "opto/mulnode.hpp"
#include "opto/multnode.hpp"
#include "opto/opcodes.hpp"
#include "opto/phaseX.hpp"
+#include "opto/replacednodes.hpp"
#include "opto/type.hpp"
// Portions of code courtesy of Clifford Click
// Optimization - Graph Style
@@ -330,10 +331,11 @@
}
OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
JVMState* const _jvms; // Pointer to list of JVM State objects
const TypePtr* _adr_type; // What type of memory does this node produce?
+ ReplacedNodes _replaced_nodes; // During parsing: list of pair of nodes from calls to GraphKit::replace_in_map()
// Many calls take *all* of memory as input,
// but some produce a limited subset of that memory as output.
// The adr_type reports the call's behavior as a store, not a load.
@@ -421,10 +423,41 @@
// for JVM states during parsing, intrinsic expansion, etc.
SafePointNode* next_exception() const;
void set_next_exception(SafePointNode* n);
bool has_exceptions() const { return next_exception() != NULL; }
+ // Helper methods to operate on replaced nodes
+ ReplacedNodes replaced_nodes() const {
+ return _replaced_nodes;
+ }
+
+ void set_replaced_nodes(ReplacedNodes replaced_nodes) {
+ _replaced_nodes = replaced_nodes;
+ }
+
+ void clone_replaced_nodes() {
+ _replaced_nodes.clone();
+ }
+ void record_replaced_node(Node* initial, Node* improved) {
+ _replaced_nodes.record(initial, improved);
+ }
+ void transfer_replaced_nodes_from(SafePointNode* sfpt, uint idx = 0) {
+ _replaced_nodes.transfer_from(sfpt->_replaced_nodes, idx);
+ }
+ void delete_replaced_nodes() {
+ _replaced_nodes.reset();
+ }
+ void apply_replaced_nodes(uint idx) {
+ _replaced_nodes.apply(this, idx);
+ }
+ void merge_replaced_nodes_with(SafePointNode* sfpt) {
+ _replaced_nodes.merge_with(sfpt->_replaced_nodes);
+ }
+ bool has_replaced_nodes() const {
+ return !_replaced_nodes.is_empty();
+ }
+
// Standard Node stuff
virtual int Opcode() const;
virtual bool pinned() const { return true; }
virtual const Type *Value( PhaseTransform *phase ) const;
virtual const Type *bottom_type() const { return Type::CONTROL; }
< prev index next >