1376 Node* first = executed_first(p); |
1376 Node* first = executed_first(p); |
1377 int opc = n->Opcode(); |
1377 int opc = n->Opcode(); |
1378 if (n->is_Load()) { |
1378 if (n->is_Load()) { |
1379 Node* ctl = n->in(MemNode::Control); |
1379 Node* ctl = n->in(MemNode::Control); |
1380 Node* mem = first->in(MemNode::Memory); |
1380 Node* mem = first->in(MemNode::Memory); |
|
1381 SWPointer p1(n->as_Mem(), this); |
|
1382 // Identify the memory dependency for the new loadVector node by |
|
1383 // walking up through memory chain. |
|
1384 // This is done to give flexibility to the new loadVector node so that |
|
1385 // it can move above independent storeVector nodes. |
|
1386 while (mem->is_StoreVector()) { |
|
1387 SWPointer p2(mem->as_Mem(), this); |
|
1388 int cmp = p1.cmp(p2); |
|
1389 if (SWPointer::not_equal(cmp) || !SWPointer::comparable(cmp)) { |
|
1390 mem = mem->in(MemNode::Memory); |
|
1391 } else { |
|
1392 break; // dependent memory |
|
1393 } |
|
1394 } |
1381 Node* adr = low_adr->in(MemNode::Address); |
1395 Node* adr = low_adr->in(MemNode::Address); |
1382 const TypePtr* atyp = n->adr_type(); |
1396 const TypePtr* atyp = n->adr_type(); |
1383 vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); |
1397 vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); |
1384 vlen_in_bytes = vn->as_LoadVector()->memory_size(); |
1398 vlen_in_bytes = vn->as_LoadVector()->memory_size(); |
1385 } else if (n->is_Store()) { |
1399 } else if (n->is_Store()) { |