< prev index next >
src/hotspot/share/opto/memnode.cpp
Print this page
@@ -631,11 +631,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?
@@ -1099,11 +1100,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();
@@ -2544,10 +2550,12 @@
// Looking at a dead closed cycle of memory?
assert(st != st->in(MemNode::Memory), "dead loop in StoreNode::Ideal");
assert(Opcode() == st->Opcode() ||
st->Opcode() == Op_StoreVector ||
Opcode() == Op_StoreVector ||
+ st->Opcode() == Op_StoreVectorScatter ||
+ Opcode() == Op_StoreVectorScatter ||
phase->C->get_alias_index(adr_type()) == Compile::AliasIdxRaw ||
(Opcode() == Op_StoreL && st->Opcode() == Op_StoreI) || // expanded ClearArrayNode
(Opcode() == Op_StoreI && st->Opcode() == Op_StoreL) || // initialization by arraycopy
(is_mismatched_access() || st->as_Store()->is_mismatched_access()),
"no mismatched stores, except on raw memory: %s %s", NodeClassNames[Opcode()], NodeClassNames[st->Opcode()]);
@@ -3727,11 +3735,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");
@@ -3757,10 +3765,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 >