diff src/share/vm/opto/superword.cpp @ 20311:b1bc1af04c6e

8052081: Optimize generated by C2 code for Intel's Atom processor Summary: Allow to execute vectorization and crc32 optimization on Atom. Enable UseFPUForSpilling by default on x86. Reviewed-by: roland
author kvn
date Tue, 05 Aug 2014 15:02:10 -0700
parents 42274879e644
children 7848fc12602b
line wrap: on
line diff
--- a/src/share/vm/opto/superword.cpp	Tue Aug 12 15:17:46 2014 +0000
+++ b/src/share/vm/opto/superword.cpp	Tue Aug 05 15:02:10 2014 -0700
@@ -1374,6 +1374,20 @@
       if (n->is_Load()) {
         Node* ctl = n->in(MemNode::Control);
         Node* mem = first->in(MemNode::Memory);
+        SWPointer p1(n->as_Mem(), this);
+        // Identify the memory dependency for the new loadVector node by
+        // walking up through memory chain.
+        // This is done to give flexibility to the new loadVector node so that
+        // it can move above independent storeVector nodes.
+        while (mem->is_StoreVector()) {
+          SWPointer p2(mem->as_Mem(), this);
+          int cmp = p1.cmp(p2);
+          if (SWPointer::not_equal(cmp) || !SWPointer::comparable(cmp)) {
+            mem = mem->in(MemNode::Memory);
+          } else {
+            break; // dependent memory
+          }
+        }
         Node* adr = low_adr->in(MemNode::Address);
         const TypePtr* atyp = n->adr_type();
         vn = LoadVectorNode::make(C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));