< prev index next >
src/hotspot/share/opto/memnode.cpp
Print this page
@@ -620,11 +620,12 @@
if ((adr_maybe_raw || check_if_adr_maybe_raw(st_adr)) && st_base != base) {
break;
}
if (st_offset != offset && st_offset != Type::OffsetBot) {
- const int MAX_STORE = BytesPerLong;
+ const int MAX_STORE = MAX2(BytesPerLong, (int)MaxVectorSize);
+ assert(mem->as_Store()->memory_size() <= MAX_STORE, "");
if (st_offset >= offset + size_in_bytes ||
st_offset <= offset - MAX_STORE ||
st_offset <= offset - mem->as_Store()->memory_size()) {
// Success: The offsets are provably independent.
// (You may ask, why not just test st_offset != offset and be done?
@@ -1089,11 +1090,16 @@
(ld_off >= st->in(0)->as_Allocate()->minimum_header_size())) {
// return a zero value for the load's basic type
// (This is one of the few places where a generic PhaseTransform
// can create new nodes. Think of it as lazily manifesting
// virtually pre-existing constants.)
+ if (memory_type() != T_VOID) {
return phase->zerocon(memory_type());
+ } else {
+ // TODO: materialize all-zero vector constant
+ assert(!isa_Load() || as_Load()->type()->isa_vect(), "");
+ }
}
// A load from an initialization barrier can match a captured store.
if (st->is_Proj() && st->in(0)->is_Initialize()) {
InitializeNode* init = st->in(0)->as_Initialize();
@@ -3722,11 +3728,11 @@
// or if dead code is encountered.
// If size_in_bytes is zero, do not bother with overlap checks.
int InitializeNode::captured_store_insertion_point(intptr_t start,
int size_in_bytes,
PhaseTransform* phase) {
- const int FAIL = 0, MAX_STORE = BytesPerLong;
+ const int FAIL = 0, MAX_STORE = MAX2(BytesPerLong, (int)MaxVectorSize);
if (is_complete())
return FAIL; // arraycopy got here first; punt
assert(allocation() != NULL, "must be present");
@@ -3752,10 +3758,11 @@
if (st_off < start + size_in_bytes) {
return FAIL; // the next store overlaps
}
return -(int)i; // not found; here is where to put it
} else if (st_off < start) {
+ assert(st->as_Store()->memory_size() <= MAX_STORE, "");
if (size_in_bytes != 0 &&
start < st_off + MAX_STORE &&
start < st_off + st->as_Store()->memory_size()) {
return FAIL; // the previous store overlaps
}
< prev index next >