src/share/vm/opto/superword.cpp

changeset 4114
06f52c4d0e18
parent 4105
8ae8f9dd7099
child 4115
e626685e9f6c
     1.1 --- a/src/share/vm/opto/superword.cpp	Tue Sep 25 10:41:15 2012 -0700
     1.2 +++ b/src/share/vm/opto/superword.cpp	Tue Sep 25 15:48:17 2012 -0700
     1.3 @@ -1088,23 +1088,22 @@
     1.4    uint start, end;
     1.5    VectorNode::vector_operands(p0, &start, &end);
     1.6  
     1.7 -  // Return false if some input is not vector and inside block
     1.8 +  // Return false if some inputs are not vectors or vectors with different
     1.9 +  // size or alignment.
    1.10 +  // Also, for now, return false if not scalar promotion case when inputs are
    1.11 +  // the same. Later, implement PackNode and allow differing, non-vector inputs
    1.12 +  // (maybe just the ones from outside the block.)
    1.13    for (uint i = start; i < end; i++) {
    1.14 -    if (!is_vector_use(p0, i)) {
    1.15 -      // For now, return false if not scalar promotion case (inputs are the same.)
    1.16 -      // Later, implement PackNode and allow differing, non-vector inputs
    1.17 -      // (maybe just the ones from outside the block.)
    1.18 -      if (!same_inputs(p, i)) {
    1.19 -        return false;
    1.20 -      }
    1.21 -    }
    1.22 +    if (!is_vector_use(p0, i))
    1.23 +      return false;
    1.24    }
    1.25    if (VectorNode::is_shift(p0)) {
    1.26 -    // For now, return false if shift count is vector because
    1.27 -    // hw does not support it.
    1.28 -    if (is_vector_use(p0, 2))
    1.29 +    // For now, return false if shift count is vector or not scalar promotion
    1.30 +    // case (different shift counts) because it is not supported yet.
    1.31 +    Node* cnt = p0->in(2);
    1.32 +    Node_List* cnt_pk = my_pack(cnt);
    1.33 +    if (cnt_pk != NULL)
    1.34        return false;
    1.35 -    // For the same reason return false if different shift counts.
    1.36      if (!same_inputs(p, 2))
    1.37        return false;
    1.38    }
    1.39 @@ -1402,7 +1401,7 @@
    1.40          ShouldNotReachHere();
    1.41        }
    1.42        assert(vn != NULL, "sanity");
    1.43 -      _phase->_igvn.register_new_node_with_optimizer(vn);
    1.44 +      _igvn.register_new_node_with_optimizer(vn);
    1.45        _phase->set_ctrl(vn, _phase->get_ctrl(p->at(0)));
    1.46        for (uint j = 0; j < p->size(); j++) {
    1.47          Node* pm = p->at(j);
    1.48 @@ -1451,9 +1450,9 @@
    1.49        } else {
    1.50          if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) {
    1.51            cnt = ConNode::make(C, TypeInt::make(mask));
    1.52 -          _phase->_igvn.register_new_node_with_optimizer(cnt);
    1.53 +          _igvn.register_new_node_with_optimizer(cnt);
    1.54            cnt = new (C, 3) AndINode(opd, cnt);
    1.55 -          _phase->_igvn.register_new_node_with_optimizer(cnt);
    1.56 +          _igvn.register_new_node_with_optimizer(cnt);
    1.57            _phase->set_ctrl(cnt, _phase->get_ctrl(opd));
    1.58          }
    1.59          assert(opd->bottom_type()->isa_int(), "int type only");
    1.60 @@ -1461,7 +1460,7 @@
    1.61          cnt = new (C, 2) MoveI2FNode(cnt);
    1.62        }
    1.63        if (cnt != opd) {
    1.64 -        _phase->_igvn.register_new_node_with_optimizer(cnt);
    1.65 +        _igvn.register_new_node_with_optimizer(cnt);
    1.66          _phase->set_ctrl(cnt, _phase->get_ctrl(opd));
    1.67        }
    1.68        return cnt;
    1.69 @@ -1473,7 +1472,7 @@
    1.70      const Type* p0_t = velt_type(p0);
    1.71      VectorNode* vn = VectorNode::scalar2vector(_phase->C, opd, vlen, p0_t);
    1.72  
    1.73 -    _phase->_igvn.register_new_node_with_optimizer(vn);
    1.74 +    _igvn.register_new_node_with_optimizer(vn);
    1.75      _phase->set_ctrl(vn, _phase->get_ctrl(opd));
    1.76  #ifdef ASSERT
    1.77      if (TraceNewVectors) {
    1.78 @@ -1496,7 +1495,7 @@
    1.79      assert(opd_bt == in->bottom_type()->basic_type(), "all same type");
    1.80      pk->add_opd(in);
    1.81    }
    1.82 -  _phase->_igvn.register_new_node_with_optimizer(pk);
    1.83 +  _igvn.register_new_node_with_optimizer(pk);
    1.84    _phase->set_ctrl(pk, _phase->get_ctrl(opd));
    1.85  #ifdef ASSERT
    1.86    if (TraceNewVectors) {
    1.87 @@ -1543,7 +1542,7 @@
    1.88      int def_pos = alignment(def) / data_size(def);
    1.89  
    1.90      Node* ex = ExtractNode::make(_phase->C, def, def_pos, velt_basic_type(def));
    1.91 -    _phase->_igvn.register_new_node_with_optimizer(ex);
    1.92 +    _igvn.register_new_node_with_optimizer(ex);
    1.93      _phase->set_ctrl(ex, _phase->get_ctrl(def));
    1.94      _igvn.replace_input_of(use, idx, ex);
    1.95      _igvn._worklist.push(def);
    1.96 @@ -2023,33 +2022,33 @@
    1.97      // incorporate any extra invariant piece producing (offset +/- invar) >>> log2(elt)
    1.98      Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
    1.99      Node* aref     = new (_phase->C, 3) URShiftINode(align_to_ref_p.invar(), log2_elt);
   1.100 -    _phase->_igvn.register_new_node_with_optimizer(aref);
   1.101 +    _igvn.register_new_node_with_optimizer(aref);
   1.102      _phase->set_ctrl(aref, pre_ctrl);
   1.103      if (align_to_ref_p.negate_invar()) {
   1.104        e = new (_phase->C, 3) SubINode(e, aref);
   1.105      } else {
   1.106        e = new (_phase->C, 3) AddINode(e, aref);
   1.107      }
   1.108 -    _phase->_igvn.register_new_node_with_optimizer(e);
   1.109 +    _igvn.register_new_node_with_optimizer(e);
   1.110      _phase->set_ctrl(e, pre_ctrl);
   1.111    }
   1.112    if (vw > ObjectAlignmentInBytes) {
   1.113      // incorporate base e +/- base && Mask >>> log2(elt)
   1.114      Node* xbase = new(_phase->C, 2) CastP2XNode(NULL, align_to_ref_p.base());
   1.115 -    _phase->_igvn.register_new_node_with_optimizer(xbase);
   1.116 +    _igvn.register_new_node_with_optimizer(xbase);
   1.117  #ifdef _LP64
   1.118      xbase  = new (_phase->C, 2) ConvL2INode(xbase);
   1.119 -    _phase->_igvn.register_new_node_with_optimizer(xbase);
   1.120 +    _igvn.register_new_node_with_optimizer(xbase);
   1.121  #endif
   1.122      Node* mask = _igvn.intcon(vw-1);
   1.123      Node* masked_xbase  = new (_phase->C, 3) AndINode(xbase, mask);
   1.124 -    _phase->_igvn.register_new_node_with_optimizer(masked_xbase);
   1.125 +    _igvn.register_new_node_with_optimizer(masked_xbase);
   1.126      Node* log2_elt = _igvn.intcon(exact_log2(elt_size));
   1.127      Node* bref     = new (_phase->C, 3) URShiftINode(masked_xbase, log2_elt);
   1.128 -    _phase->_igvn.register_new_node_with_optimizer(bref);
   1.129 +    _igvn.register_new_node_with_optimizer(bref);
   1.130      _phase->set_ctrl(bref, pre_ctrl);
   1.131      e = new (_phase->C, 3) AddINode(e, bref);
   1.132 -    _phase->_igvn.register_new_node_with_optimizer(e);
   1.133 +    _igvn.register_new_node_with_optimizer(e);
   1.134      _phase->set_ctrl(e, pre_ctrl);
   1.135    }
   1.136  
   1.137 @@ -2059,20 +2058,20 @@
   1.138    } else {
   1.139      e = new (_phase->C, 3) AddINode(e, lim0);
   1.140    }
   1.141 -  _phase->_igvn.register_new_node_with_optimizer(e);
   1.142 +  _igvn.register_new_node_with_optimizer(e);
   1.143    _phase->set_ctrl(e, pre_ctrl);
   1.144  
   1.145    if (stride * scale > 0) {
   1.146      // compute V - (e +/- lim0)
   1.147      Node* va  = _igvn.intcon(v_align);
   1.148      e = new (_phase->C, 3) SubINode(va, e);
   1.149 -    _phase->_igvn.register_new_node_with_optimizer(e);
   1.150 +    _igvn.register_new_node_with_optimizer(e);
   1.151      _phase->set_ctrl(e, pre_ctrl);
   1.152    }
   1.153    // compute N = (exp) % V
   1.154    Node* va_msk = _igvn.intcon(v_align - 1);
   1.155    Node* N = new (_phase->C, 3) AndINode(e, va_msk);
   1.156 -  _phase->_igvn.register_new_node_with_optimizer(N);
   1.157 +  _igvn.register_new_node_with_optimizer(N);
   1.158    _phase->set_ctrl(N, pre_ctrl);
   1.159  
   1.160    //   substitute back into (1), so that new limit
   1.161 @@ -2083,12 +2082,12 @@
   1.162    } else {
   1.163      lim = new (_phase->C, 3) AddINode(lim0, N);
   1.164    }
   1.165 -  _phase->_igvn.register_new_node_with_optimizer(lim);
   1.166 +  _igvn.register_new_node_with_optimizer(lim);
   1.167    _phase->set_ctrl(lim, pre_ctrl);
   1.168    Node* constrained =
   1.169      (stride > 0) ? (Node*) new (_phase->C,3) MinINode(lim, orig_limit)
   1.170                   : (Node*) new (_phase->C,3) MaxINode(lim, orig_limit);
   1.171 -  _phase->_igvn.register_new_node_with_optimizer(constrained);
   1.172 +  _igvn.register_new_node_with_optimizer(constrained);
   1.173    _phase->set_ctrl(constrained, pre_ctrl);
   1.174    _igvn.hash_delete(pre_opaq);
   1.175    pre_opaq->set_req(1, constrained);

mercurial