< prev index next >
src/share/vm/opto/memnode.cpp
Print this page
*** 2730,2739 ****
--- 2730,2742 ----
}
//------------------------------Idealize---------------------------------------
// Clearing a short array is faster with stores
Node *ClearArrayNode::Ideal(PhaseGVN *phase, bool can_reshape){
+ // Already know this is a large node, do not try to ideal it
+ if (_is_large) return NULL;
+
const int unit = BytesPerLong;
const TypeX* t = phase->type(in(2))->isa_intptr_t();
if (!t) return NULL;
if (!t->is_con()) return NULL;
intptr_t raw_count = t->get_con();
*** 2742,2753 ****
// Clearing nothing uses the Identity call.
// Negative clears are possible on dead ClearArrays
// (see jck test stmt114.stmt11402.val).
if (size <= 0 || size % unit != 0) return NULL;
intptr_t count = size / unit;
! // Length too long; use fast hardware clear
! if (size > Matcher::init_array_short_size) return NULL;
Node *mem = in(1);
if( phase->type(mem)==Type::TOP ) return NULL;
Node *adr = in(3);
const Type* at = phase->type(adr);
if( at==Type::TOP ) return NULL;
--- 2745,2759 ----
// Clearing nothing uses the Identity call.
// Negative clears are possible on dead ClearArrays
// (see jck test stmt114.stmt11402.val).
if (size <= 0 || size % unit != 0) return NULL;
intptr_t count = size / unit;
! // Length too long; communicate this to matchers and assemblers.
! // Assemblers are responsible to produce fast hardware clears for it.
! if (size > InitArrayShortSize) {
! return new ClearArrayNode(in(0), in(1), in(2), in(3), true);
! }
Node *mem = in(1);
if( phase->type(mem)==Type::TOP ) return NULL;
Node *adr = in(3);
const Type* at = phase->type(adr);
if( at==Type::TOP ) return NULL;
*** 3890,3900 ****
zeroes_done = align_size_down(zeroes_done, BytesPerInt);
rawmem = ClearArrayNode::clear_memory(rawctl, rawmem, rawptr,
zeroes_done, zeroes_needed,
phase);
zeroes_done = zeroes_needed;
! if (zsize > Matcher::init_array_short_size && ++big_init_gaps > 2)
do_zeroing = false; // leave the hole, next time
}
}
// Collect the store and move on:
--- 3896,3906 ----
zeroes_done = align_size_down(zeroes_done, BytesPerInt);
rawmem = ClearArrayNode::clear_memory(rawctl, rawmem, rawptr,
zeroes_done, zeroes_needed,
phase);
zeroes_done = zeroes_needed;
! if (zsize > InitArrayShortSize && ++big_init_gaps > 2)
do_zeroing = false; // leave the hole, next time
}
}
// Collect the store and move on:
< prev index next >