< 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 >