src/share/vm/opto/callnode.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/opto/callnode.cpp
src/share/vm/opto/callnode.cpp
Print this page
rev 8568 : 8086046: escape analysis generates incorrect code as of B67
Summary: load bypasses arraycopy that sets the value after the ArrayCopyNode is expanded
Reviewed-by:
*** 722,731 ****
--- 722,751 ----
// Determine whether the call could modify the field of the specified
// instance at the specified offset.
//
bool CallNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
assert((t_oop != NULL), "sanity");
+ if (is_call_to_arraycopystub()) {
+ const TypeTuple* args = _tf->domain();
+ Node* dest = NULL;
+ // Stubs that can be called once an ArrayCopyNode is expanded have
+ // different signatures. Look for the second pointer argument,
+ // that is the destination of the copy.
+ for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) {
+ if (args->field_at(i)->isa_ptr()) {
+ j++;
+ if (j == 2) {
+ dest = in(i);
+ break;
+ }
+ }
+ }
+ if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
+ return true;
+ }
+ return false;
+ }
if (t_oop->is_known_instance()) {
// The instance_id is set only for scalar-replaceable allocations which
// are not passed as arguments according to Escape Analysis.
return false;
}
*** 907,916 ****
--- 927,942 ----
}
}
return SafePointNode::Ideal(phase, can_reshape);
}
+ bool CallNode::is_call_to_arraycopystub() const {
+ if (_name != NULL && strstr(_name, "arraycopy") != 0) {
+ return true;
+ }
+ return false;
+ }
//=============================================================================
uint CallJavaNode::size_of() const { return sizeof(*this); }
uint CallJavaNode::cmp( const Node &n ) const {
CallJavaNode &call = (CallJavaNode&)n;
*** 1005,1022 ****
//=============================================================================
//------------------------------calling_convention-----------------------------
//=============================================================================
- bool CallLeafNode::is_call_to_arraycopystub() const {
- if (_name != NULL && strstr(_name, "arraycopy") != 0) {
- return true;
- }
- return false;
- }
-
-
#ifndef PRODUCT
void CallLeafNode::dump_spec(outputStream *st) const {
st->print("# ");
st->print("%s", _name);
CallNode::dump_spec(st);
--- 1031,1040 ----
*** 1928,1955 ****
}
return true;
}
- bool CallLeafNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
- if (is_call_to_arraycopystub()) {
- const TypeTuple* args = _tf->domain();
- Node* dest = NULL;
- // Stubs that can be called once an ArrayCopyNode is expanded have
- // different signatures. Look for the second pointer argument,
- // that is the destination of the copy.
- for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) {
- if (args->field_at(i)->isa_ptr()) {
- j++;
- if (j == 2) {
- dest = in(i);
- break;
- }
- }
- }
- if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
- return true;
- }
- return false;
- }
- return CallNode::may_modify(t_oop, phase);
- }
--- 1946,1950 ----
src/share/vm/opto/callnode.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File