< prev index next >

src/share/vm/opto/superword.cpp

Print this page




3326   }
3327 
3328   int opc = n->Opcode();
3329   if (opc == Op_MulI) {
3330     if (n->in(1) == iv() && n->in(2)->is_Con()) {
3331       _scale = n->in(2)->get_int();
3332       NOT_PRODUCT(_tracer.scaled_iv_4(n, _scale);)
3333       return true;
3334     } else if (n->in(2) == iv() && n->in(1)->is_Con()) {
3335       _scale = n->in(1)->get_int();
3336       NOT_PRODUCT(_tracer.scaled_iv_5(n, _scale);)
3337       return true;
3338     }
3339   } else if (opc == Op_LShiftI) {
3340     if (n->in(1) == iv() && n->in(2)->is_Con()) {
3341       _scale = 1 << n->in(2)->get_int();
3342       NOT_PRODUCT(_tracer.scaled_iv_6(n, _scale);)
3343       return true;
3344     }
3345   } else if (opc == Op_ConvI2L) {





3346     if (scaled_iv_plus_offset(n->in(1))) {
3347       NOT_PRODUCT(_tracer.scaled_iv_7(n);)
3348       return true;
3349     }
3350   } else if (opc == Op_LShiftL) {
3351     if (!has_iv() && _invar == NULL) {
3352       // Need to preserve the current _offset value, so
3353       // create a temporary object for this expression subtree.
3354       // Hacky, so should re-engineer the address pattern match.
3355       NOT_PRODUCT(Tracer::Depth dddd;)
3356       SWPointer tmp(this);
3357       NOT_PRODUCT(_tracer.scaled_iv_8(n, &tmp);)
3358 
3359       if (tmp.scaled_iv_plus_offset(n->in(1))) {
3360         if (tmp._invar == NULL || _slp->do_vector_loop()) {
3361           int mult = 1 << n->in(2)->get_int();
3362           _scale   = tmp._scale  * mult;
3363           _offset += tmp._offset * mult;
3364           NOT_PRODUCT(_tracer.scaled_iv_9(n, _scale, _offset, mult);)
3365           return true;


3420     }
3421   }
3422   if (opc == Op_SubI) {
3423     if (n->in(2)->is_Con() && invariant(n->in(1))) {
3424       _negate_invar = negate;
3425       _invar = n->in(1);
3426       _offset += !negate ? -(n->in(2)->get_int()) : n->in(2)->get_int();
3427       NOT_PRODUCT(_tracer.offset_plus_k_8(n, _invar, _negate_invar, _offset);)
3428       return true;
3429     } else if (n->in(1)->is_Con() && invariant(n->in(2))) {
3430       _offset += negate ? -(n->in(1)->get_int()) : n->in(1)->get_int();
3431       _negate_invar = !negate;
3432       _invar = n->in(2);
3433       NOT_PRODUCT(_tracer.offset_plus_k_9(n, _invar, _negate_invar, _offset);)
3434       return true;
3435     }
3436   }
3437   if (invariant(n)) {
3438     if (opc == Op_ConvI2L) {
3439       n = n->in(1);






3440     }
3441     if (n->bottom_type()->isa_int()) {
3442       _negate_invar = negate;
3443       _invar = n;
3444       NOT_PRODUCT(_tracer.offset_plus_k_10(n, _invar, _negate_invar, _offset);)
3445       return true;
3446     }
3447   }
3448 
3449   NOT_PRODUCT(_tracer.offset_plus_k_11(n);)
3450   return false;
3451 }
3452 
3453 //----------------------------print------------------------
3454 void SWPointer::print() {
3455 #ifndef PRODUCT
3456   tty->print("base: %d  adr: %d  scale: %d  offset: %d  invar: %c%d\n",
3457              _base != NULL ? _base->_idx : 0,
3458              _adr  != NULL ? _adr->_idx  : 0,
3459              _scale, _offset,




3326   }
3327 
3328   int opc = n->Opcode();
3329   if (opc == Op_MulI) {
3330     if (n->in(1) == iv() && n->in(2)->is_Con()) {
3331       _scale = n->in(2)->get_int();
3332       NOT_PRODUCT(_tracer.scaled_iv_4(n, _scale);)
3333       return true;
3334     } else if (n->in(2) == iv() && n->in(1)->is_Con()) {
3335       _scale = n->in(1)->get_int();
3336       NOT_PRODUCT(_tracer.scaled_iv_5(n, _scale);)
3337       return true;
3338     }
3339   } else if (opc == Op_LShiftI) {
3340     if (n->in(1) == iv() && n->in(2)->is_Con()) {
3341       _scale = 1 << n->in(2)->get_int();
3342       NOT_PRODUCT(_tracer.scaled_iv_6(n, _scale);)
3343       return true;
3344     }
3345   } else if (opc == Op_ConvI2L) {
3346     if (n->in(1)->Opcode() == Op_CastII &&
3347         n->in(1)->as_CastII()->has_range_check()) {
3348       // Skip range check dependent CastII nodes
3349       n = n->in(1);
3350     }
3351     if (scaled_iv_plus_offset(n->in(1))) {
3352       NOT_PRODUCT(_tracer.scaled_iv_7(n);)
3353       return true;
3354     }
3355   } else if (opc == Op_LShiftL) {
3356     if (!has_iv() && _invar == NULL) {
3357       // Need to preserve the current _offset value, so
3358       // create a temporary object for this expression subtree.
3359       // Hacky, so should re-engineer the address pattern match.
3360       NOT_PRODUCT(Tracer::Depth dddd;)
3361       SWPointer tmp(this);
3362       NOT_PRODUCT(_tracer.scaled_iv_8(n, &tmp);)
3363 
3364       if (tmp.scaled_iv_plus_offset(n->in(1))) {
3365         if (tmp._invar == NULL || _slp->do_vector_loop()) {
3366           int mult = 1 << n->in(2)->get_int();
3367           _scale   = tmp._scale  * mult;
3368           _offset += tmp._offset * mult;
3369           NOT_PRODUCT(_tracer.scaled_iv_9(n, _scale, _offset, mult);)
3370           return true;


3425     }
3426   }
3427   if (opc == Op_SubI) {
3428     if (n->in(2)->is_Con() && invariant(n->in(1))) {
3429       _negate_invar = negate;
3430       _invar = n->in(1);
3431       _offset += !negate ? -(n->in(2)->get_int()) : n->in(2)->get_int();
3432       NOT_PRODUCT(_tracer.offset_plus_k_8(n, _invar, _negate_invar, _offset);)
3433       return true;
3434     } else if (n->in(1)->is_Con() && invariant(n->in(2))) {
3435       _offset += negate ? -(n->in(1)->get_int()) : n->in(1)->get_int();
3436       _negate_invar = !negate;
3437       _invar = n->in(2);
3438       NOT_PRODUCT(_tracer.offset_plus_k_9(n, _invar, _negate_invar, _offset);)
3439       return true;
3440     }
3441   }
3442   if (invariant(n)) {
3443     if (opc == Op_ConvI2L) {
3444       n = n->in(1);
3445       if (n->Opcode() == Op_CastII &&
3446           n->as_CastII()->has_range_check()) {
3447         // Skip range check dependent CastII nodes
3448         assert(invariant(n), "sanity");
3449         n = n->in(1);
3450       }
3451     }
3452     if (n->bottom_type()->isa_int()) {
3453       _negate_invar = negate;
3454       _invar = n;
3455       NOT_PRODUCT(_tracer.offset_plus_k_10(n, _invar, _negate_invar, _offset);)
3456       return true;
3457     }
3458   }
3459 
3460   NOT_PRODUCT(_tracer.offset_plus_k_11(n);)
3461   return false;
3462 }
3463 
3464 //----------------------------print------------------------
3465 void SWPointer::print() {
3466 #ifndef PRODUCT
3467   tty->print("base: %d  adr: %d  scale: %d  offset: %d  invar: %c%d\n",
3468              _base != NULL ? _base->_idx : 0,
3469              _adr  != NULL ? _adr->_idx  : 0,
3470              _scale, _offset,


< prev index next >