src/share/vm/opto/superword.cpp

changeset 4103
137868b7aa6f
parent 4006
5af51c882207
child 4105
8ae8f9dd7099
     1.1 --- a/src/share/vm/opto/superword.cpp	Mon Sep 17 17:02:10 2012 -0700
     1.2 +++ b/src/share/vm/opto/superword.cpp	Mon Sep 17 19:39:07 2012 -0700
     1.3 @@ -1350,11 +1350,14 @@
     1.4      insert_extracts(_packset.at(i));
     1.5    }
     1.6  
     1.7 +  Compile* C = _phase->C;
     1.8 +  uint max_vlen_in_bytes = 0;
     1.9    for (int i = 0; i < _block.length(); i++) {
    1.10      Node* n = _block.at(i);
    1.11      Node_List* p = my_pack(n);
    1.12      if (p && n == executed_last(p)) {
    1.13        uint vlen = p->size();
    1.14 +      uint vlen_in_bytes = 0;
    1.15        Node* vn = NULL;
    1.16        Node* low_adr = p->at(0);
    1.17        Node* first   = executed_first(p);
    1.18 @@ -1364,7 +1367,8 @@
    1.19          Node* mem = first->in(MemNode::Memory);
    1.20          Node* adr = low_adr->in(MemNode::Address);
    1.21          const TypePtr* atyp = n->adr_type();
    1.22 -        vn = LoadVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));
    1.23 +        vn = LoadVectorNode::make(C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));
    1.24 +        vlen_in_bytes = vn->as_LoadVector()->memory_size();
    1.25        } else if (n->is_Store()) {
    1.26          // Promote value to be stored to vector
    1.27          Node* val = vector_opd(p, MemNode::ValueIn);
    1.28 @@ -1372,7 +1376,8 @@
    1.29          Node* mem = first->in(MemNode::Memory);
    1.30          Node* adr = low_adr->in(MemNode::Address);
    1.31          const TypePtr* atyp = n->adr_type();
    1.32 -        vn = StoreVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen);
    1.33 +        vn = StoreVectorNode::make(C, opc, ctl, mem, adr, atyp, val, vlen);
    1.34 +        vlen_in_bytes = vn->as_StoreVector()->memory_size();
    1.35        } else if (n->req() == 3) {
    1.36          // Promote operands to vector
    1.37          Node* in1 = vector_opd(p, 1);
    1.38 @@ -1383,7 +1388,8 @@
    1.39            in1 = in2;
    1.40            in2 = tmp;
    1.41          }
    1.42 -        vn = VectorNode::make(_phase->C, opc, in1, in2, vlen, velt_basic_type(n));
    1.43 +        vn = VectorNode::make(C, opc, in1, in2, vlen, velt_basic_type(n));
    1.44 +        vlen_in_bytes = vn->as_Vector()->length_in_bytes();
    1.45        } else {
    1.46          ShouldNotReachHere();
    1.47        }
    1.48 @@ -1395,6 +1401,10 @@
    1.49          _igvn.replace_node(pm, vn);
    1.50        }
    1.51        _igvn._worklist.push(vn);
    1.52 +
    1.53 +      if (vlen_in_bytes > max_vlen_in_bytes) {
    1.54 +        max_vlen_in_bytes = vlen_in_bytes;
    1.55 +      }
    1.56  #ifdef ASSERT
    1.57        if (TraceNewVectors) {
    1.58          tty->print("new Vector node: ");
    1.59 @@ -1403,6 +1413,7 @@
    1.60  #endif
    1.61      }
    1.62    }
    1.63 +  C->set_max_vector_size(max_vlen_in_bytes);
    1.64  }
    1.65  
    1.66  //------------------------------vector_opd---------------------------
    1.67 @@ -1439,7 +1450,7 @@
    1.68          }
    1.69          assert(opd->bottom_type()->isa_int(), "int type only");
    1.70          // Move non constant shift count into XMM register.
    1.71 -        cnt = new (_phase->C, 2) MoveI2FNode(cnt);
    1.72 +        cnt = new (C, 2) MoveI2FNode(cnt);
    1.73        }
    1.74        if (cnt != opd) {
    1.75          _phase->_igvn.register_new_node_with_optimizer(cnt);
    1.76 @@ -1480,10 +1491,10 @@
    1.77    _phase->_igvn.register_new_node_with_optimizer(pk);
    1.78    _phase->set_ctrl(pk, _phase->get_ctrl(opd));
    1.79  #ifdef ASSERT
    1.80 -    if (TraceNewVectors) {
    1.81 -      tty->print("new Vector node: ");
    1.82 -      pk->dump();
    1.83 -    }
    1.84 +  if (TraceNewVectors) {
    1.85 +    tty->print("new Vector node: ");
    1.86 +    pk->dump();
    1.87 +  }
    1.88  #endif
    1.89    return pk;
    1.90  }

mercurial